From 7f79735d50820b6ffc6dae76a36306c4cc8fa285 Mon Sep 17 00:00:00 2001 From: M17764017422 <31874069+M17764017422@users.noreply.github.com> Date: Sat, 1 Feb 2020 19:46:14 +0800 Subject: [PATCH 001/159] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=B8=AD=E6=96=87?= =?UTF-8?q?=E4=B9=B1=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修复BaseURL模式下部分图片无法加载 --- .../main/java/io/legado/app/ui/rss/read/ReadRssActivity.kt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/rss/read/ReadRssActivity.kt b/app/src/main/java/io/legado/app/ui/rss/read/ReadRssActivity.kt index 894bed7a9..d0311370c 100644 --- a/app/src/main/java/io/legado/app/ui/rss/read/ReadRssActivity.kt +++ b/app/src/main/java/io/legado/app/ui/rss/read/ReadRssActivity.kt @@ -73,9 +73,9 @@ class ReadRssActivity : VMBaseActivity(R.layout.activity_rss_r val url = NetworkUtils.getAbsoluteURL(it.origin, it.link) val html = viewModel.clHtml(content) if (viewModel.rssSource?.loadWithBaseUrl == true) { - webView.loadDataWithBaseURL(url, html, "text/html", "utf-8", url) + webView.loadDataWithBaseURL(null, html, "text/html", "utf-8", url)//Referer会导致一些有反盗链的图片无法加载,暂时先用null应该还有更好的办法 } else { - webView.loadData(html, "text/html", "utf-8") + webView.loadData(html, "text/html;charset=utf-8", "utf-8")//经测试可以解决中文乱码 } } }) @@ -154,4 +154,4 @@ class ReadRssActivity : VMBaseActivity(R.layout.activity_rss_r } } -} \ No newline at end of file +} From dce2be9f6744ddddab3300f53434f5568fe33517 Mon Sep 17 00:00:00 2001 From: kunfei Date: Sat, 1 Feb 2020 19:55:48 +0800 Subject: [PATCH 002/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/main/bookshelf/BookshelfFragment.kt | 25 ++++++++++++++++--- .../ui/main/bookshelf/BookshelfViewModel.kt | 4 +++ 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/main/bookshelf/BookshelfFragment.kt b/app/src/main/java/io/legado/app/ui/main/bookshelf/BookshelfFragment.kt index 0a8318618..d58e6fd48 100644 --- a/app/src/main/java/io/legado/app/ui/main/bookshelf/BookshelfFragment.kt +++ b/app/src/main/java/io/legado/app/ui/main/bookshelf/BookshelfFragment.kt @@ -16,13 +16,15 @@ import io.legado.app.constant.AppConst import io.legado.app.constant.Bus import io.legado.app.constant.PreferKey import io.legado.app.data.entities.BookGroup -import io.legado.app.lib.dialogs.selector +import io.legado.app.lib.dialogs.* import io.legado.app.lib.theme.ATH import io.legado.app.lib.theme.accentColor +import io.legado.app.lib.theme.view.ATEAutoCompleteTextView import io.legado.app.ui.book.search.SearchActivity import io.legado.app.ui.download.DownloadActivity import io.legado.app.ui.importbook.ImportBookActivity import io.legado.app.utils.* +import kotlinx.android.synthetic.main.dialog_edit_text.view.* import kotlinx.android.synthetic.main.fragment_bookshelf.* import kotlinx.android.synthetic.main.view_tab_layout.* import kotlinx.android.synthetic.main.view_title_bar.* @@ -60,8 +62,7 @@ class BookshelfFragment : VMBaseFragment(R.layout.fragment_b R.id.menu_group_manage -> GroupManageDialog() .show(childFragmentManager, "groupManageDialog") R.id.menu_add_local -> startActivity() - R.id.menu_add_url -> { - } + R.id.menu_add_url -> addBookByUrl() R.id.menu_arrange_bookshelf -> { } R.id.menu_download -> startActivity() @@ -145,6 +146,24 @@ class BookshelfFragment : VMBaseFragment(R.layout.fragment_b } } + private fun addBookByUrl() { + requireContext() + .alert(titleResource = R.string.add_book_url) { + var editText: ATEAutoCompleteTextView? = null + customView { + layoutInflater.inflate(R.layout.dialog_edit_text, null).apply { + editText = edit_view + } + } + okButton { + editText?.text?.toString()?.let { + viewModel.addBookByUrl(it) + } + } + noButton { } + }.show().applyTint() + } + override fun onTabReselected(tab: TabLayout.Tab?) { } diff --git a/app/src/main/java/io/legado/app/ui/main/bookshelf/BookshelfViewModel.kt b/app/src/main/java/io/legado/app/ui/main/bookshelf/BookshelfViewModel.kt index 536329915..50e77a765 100644 --- a/app/src/main/java/io/legado/app/ui/main/bookshelf/BookshelfViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/main/bookshelf/BookshelfViewModel.kt @@ -31,4 +31,8 @@ class BookshelfViewModel(application: Application) : BaseViewModel(application) } } + fun addBookByUrl(bookUrl: String) { + + } + } From 0e84934b5b602b3a56e71d158b9050e17e3dbf48 Mon Sep 17 00:00:00 2001 From: kunfei Date: Sat, 1 Feb 2020 20:12:54 +0800 Subject: [PATCH 003/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/assets/updateLog.md | 5 ++++- .../io/legado/app/ui/main/bookshelf/BookshelfFragment.kt | 2 ++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/app/src/main/assets/updateLog.md b/app/src/main/assets/updateLog.md index 605e0a482..00f7293df 100644 --- a/app/src/main/assets/updateLog.md +++ b/app/src/main/assets/updateLog.md @@ -3,8 +3,11 @@ * 旧版数据导入教程: * 先在旧版阅读(2.x)中进行备份,然后在新版阅读(3.x)【我的】->【备份与恢复】,选择【导入旧版本数据】。 -**2020/01/31** +**2020/02/01** +* merged commit e584606, rss修复BaseURL模式下部分图片无法加载, 修复可能出现的乱码 * 正在写本地导入,还没写完 + +**2020/01/31** * 修复搜索闪退,因为默认线程为0了 **2020/01/30** diff --git a/app/src/main/java/io/legado/app/ui/main/bookshelf/BookshelfFragment.kt b/app/src/main/java/io/legado/app/ui/main/bookshelf/BookshelfFragment.kt index d58e6fd48..237e73567 100644 --- a/app/src/main/java/io/legado/app/ui/main/bookshelf/BookshelfFragment.kt +++ b/app/src/main/java/io/legado/app/ui/main/bookshelf/BookshelfFragment.kt @@ -1,5 +1,6 @@ package io.legado.app.ui.main.bookshelf +import android.annotation.SuppressLint import android.os.Bundle import android.view.Menu import android.view.MenuItem @@ -146,6 +147,7 @@ class BookshelfFragment : VMBaseFragment(R.layout.fragment_b } } + @SuppressLint("InflateParams") private fun addBookByUrl() { requireContext() .alert(titleResource = R.string.add_book_url) { From 9011b95a32d0f4fbea739ad40cb3d7afd2dd72e3 Mon Sep 17 00:00:00 2001 From: kunfei Date: Sat, 1 Feb 2020 21:21:16 +0800 Subject: [PATCH 004/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../io/legado/app/data/dao/BookSourceDao.kt | 3 ++ .../ui/main/bookshelf/BookshelfViewModel.kt | 44 ++++++++++++++++++- 2 files changed, 45 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/io/legado/app/data/dao/BookSourceDao.kt b/app/src/main/java/io/legado/app/data/dao/BookSourceDao.kt index f76ed3d13..159622898 100644 --- a/app/src/main/java/io/legado/app/data/dao/BookSourceDao.kt +++ b/app/src/main/java/io/legado/app/data/dao/BookSourceDao.kt @@ -53,6 +53,9 @@ interface BookSourceDao { @Query("select * from book_sources where enabled = 1 and bookSourceGroup like '%' || :group || '%'") fun getEnabledByGroup(group: String): List + @get:Query("select * from book_sources where bookUrlPattern is not null || bookUrlPattern <> ''") + val hasBookUrlPattern: List + @get:Query("select * from book_sources where bookSourceGroup is null or bookSourceGroup = ''") val noGroup: List diff --git a/app/src/main/java/io/legado/app/ui/main/bookshelf/BookshelfViewModel.kt b/app/src/main/java/io/legado/app/ui/main/bookshelf/BookshelfViewModel.kt index 50e77a765..b41031484 100644 --- a/app/src/main/java/io/legado/app/ui/main/bookshelf/BookshelfViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/main/bookshelf/BookshelfViewModel.kt @@ -2,8 +2,14 @@ package io.legado.app.ui.main.bookshelf import android.app.Application import io.legado.app.App +import io.legado.app.R import io.legado.app.base.BaseViewModel +import io.legado.app.data.entities.Book import io.legado.app.data.entities.BookGroup +import io.legado.app.data.entities.BookSource +import io.legado.app.model.WebBook +import io.legado.app.utils.NetworkUtils +import kotlinx.coroutines.Dispatchers.IO class BookshelfViewModel(application: Application) : BaseViewModel(application) { @@ -31,8 +37,42 @@ class BookshelfViewModel(application: Application) : BaseViewModel(application) } } - fun addBookByUrl(bookUrl: String) { - + fun addBookByUrl(bookUrls: String) { + execute { + var hasBookUrlPattern: List? = null + val urls = bookUrls.split("\n") + for (url in urls) { + val bookUrl = url.trim() + if (bookUrl.isEmpty()) continue + App.db.bookDao().getBook(bookUrl) ?: continue + val baseUrl = NetworkUtils.getBaseUrl(bookUrl) ?: continue + var source = App.db.bookSourceDao().getBookSource(baseUrl) + if (source == null) { + if (hasBookUrlPattern == null) { + hasBookUrlPattern = App.db.bookSourceDao().hasBookUrlPattern + } + hasBookUrlPattern.forEach { bookSource -> + if (bookUrl.matches(bookSource.bookUrlPattern!!.toRegex())) { + source = bookSource + return@forEach + } + } + } + source?.let { bookSource -> + val book = Book(bookUrl = bookUrl) + WebBook(bookSource).getBookInfo(book, this) + .onSuccess(IO) { + it?.let { book -> + App.db.bookDao().insert(book) + } + } + } + } + }.onSuccess { + toast(R.string.success) + }.onError { + toast(it.localizedMessage ?: "ERROR") + } } } From 207d18340fe6212ff20a3ee82b6fc2ec5f883fe3 Mon Sep 17 00:00:00 2001 From: kunfei Date: Sat, 1 Feb 2020 21:25:07 +0800 Subject: [PATCH 005/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/assets/updateLog.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/main/assets/updateLog.md b/app/src/main/assets/updateLog.md index 00f7293df..737637c45 100644 --- a/app/src/main/assets/updateLog.md +++ b/app/src/main/assets/updateLog.md @@ -5,7 +5,8 @@ **2020/02/01** * merged commit e584606, rss修复BaseURL模式下部分图片无法加载, 修复可能出现的乱码 -* 正在写本地导入,还没写完 +* 菜单添加网址功能完成 +* 添加本地书籍完成,还差解析txt文件,目前添加了不能看 **2020/01/31** * 修复搜索闪退,因为默认线程为0了 From 08ce86ba408d73a7975f3f73f9a15a6b241d4e74 Mon Sep 17 00:00:00 2001 From: kunfei Date: Sun, 2 Feb 2020 08:08:19 +0800 Subject: [PATCH 006/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/main/bookshelf/BookshelfViewModel.kt | 28 ++++++++++++++----- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/main/bookshelf/BookshelfViewModel.kt b/app/src/main/java/io/legado/app/ui/main/bookshelf/BookshelfViewModel.kt index b41031484..0c4033587 100644 --- a/app/src/main/java/io/legado/app/ui/main/bookshelf/BookshelfViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/main/bookshelf/BookshelfViewModel.kt @@ -38,6 +38,7 @@ class BookshelfViewModel(application: Application) : BaseViewModel(application) } fun addBookByUrl(bookUrls: String) { + var successCount = 0 execute { var hasBookUrlPattern: List? = null val urls = bookUrls.split("\n") @@ -59,17 +60,30 @@ class BookshelfViewModel(application: Application) : BaseViewModel(application) } } source?.let { bookSource -> - val book = Book(bookUrl = bookUrl) - WebBook(bookSource).getBookInfo(book, this) - .onSuccess(IO) { - it?.let { book -> - App.db.bookDao().insert(book) + val book = Book( + bookUrl = bookUrl, + origin = bookSource.bookSourceUrl, + originName = bookSource.bookSourceName + ) + suspend { + WebBook(bookSource).getBookInfo(book, this) + .onSuccess(IO) { + it?.let { book -> + App.db.bookDao().insert(book) + successCount++ + } + }.onError { + throw Exception(it.localizedMessage) } - } + } } } }.onSuccess { - toast(R.string.success) + if (successCount > 0) { + toast(R.string.success) + } else { + toast("ERROR") + } }.onError { toast(it.localizedMessage ?: "ERROR") } From 7f9defbb098b1873f65ad055c19758ec8a0fa114 Mon Sep 17 00:00:00 2001 From: kunfei Date: Sun, 2 Feb 2020 08:16:04 +0800 Subject: [PATCH 007/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/io/legado/app/ui/main/bookshelf/BookshelfViewModel.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/io/legado/app/ui/main/bookshelf/BookshelfViewModel.kt b/app/src/main/java/io/legado/app/ui/main/bookshelf/BookshelfViewModel.kt index 0c4033587..71e2001a6 100644 --- a/app/src/main/java/io/legado/app/ui/main/bookshelf/BookshelfViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/main/bookshelf/BookshelfViewModel.kt @@ -45,7 +45,7 @@ class BookshelfViewModel(application: Application) : BaseViewModel(application) for (url in urls) { val bookUrl = url.trim() if (bookUrl.isEmpty()) continue - App.db.bookDao().getBook(bookUrl) ?: continue + if (App.db.bookDao().getBook(bookUrl) != null) continue val baseUrl = NetworkUtils.getBaseUrl(bookUrl) ?: continue var source = App.db.bookSourceDao().getBookSource(baseUrl) if (source == null) { From 969356d4ba368e9d781d4a4992e326723382485e Mon Sep 17 00:00:00 2001 From: kunfei Date: Sun, 2 Feb 2020 08:21:33 +0800 Subject: [PATCH 008/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/main/bookshelf/BookshelfViewModel.kt | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/main/bookshelf/BookshelfViewModel.kt b/app/src/main/java/io/legado/app/ui/main/bookshelf/BookshelfViewModel.kt index 71e2001a6..74c963763 100644 --- a/app/src/main/java/io/legado/app/ui/main/bookshelf/BookshelfViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/main/bookshelf/BookshelfViewModel.kt @@ -65,17 +65,15 @@ class BookshelfViewModel(application: Application) : BaseViewModel(application) origin = bookSource.bookSourceUrl, originName = bookSource.bookSourceName ) - suspend { - WebBook(bookSource).getBookInfo(book, this) - .onSuccess(IO) { - it?.let { book -> - App.db.bookDao().insert(book) - successCount++ - } - }.onError { - throw Exception(it.localizedMessage) + WebBook(bookSource).getBookInfo(book, this) + .onSuccess(IO) { + it?.let { book -> + App.db.bookDao().insert(book) + successCount++ } - } + }.onError { + throw Exception(it.localizedMessage) + } } } }.onSuccess { From 4c31435812a0ac11da9dc88efb70b4217e3d0d1a Mon Sep 17 00:00:00 2001 From: kunfei Date: Sun, 2 Feb 2020 08:22:51 +0800 Subject: [PATCH 009/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/assets/updateLog.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/assets/updateLog.md b/app/src/main/assets/updateLog.md index 737637c45..8828a731b 100644 --- a/app/src/main/assets/updateLog.md +++ b/app/src/main/assets/updateLog.md @@ -3,7 +3,7 @@ * 旧版数据导入教程: * 先在旧版阅读(2.x)中进行备份,然后在新版阅读(3.x)【我的】->【备份与恢复】,选择【导入旧版本数据】。 -**2020/02/01** +**2020/02/02** * merged commit e584606, rss修复BaseURL模式下部分图片无法加载, 修复可能出现的乱码 * 菜单添加网址功能完成 * 添加本地书籍完成,还差解析txt文件,目前添加了不能看 From 9e8eed355cffb38373621d1af6454102dda6f9d4 Mon Sep 17 00:00:00 2001 From: kunfei Date: Sun, 2 Feb 2020 10:15:17 +0800 Subject: [PATCH 010/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/io/legado/app/data/entities/Book.kt | 2 +- .../app/model/localBook/AnalyzeTxtFile.kt | 27 ++++++++++++++----- .../app/ui/importbook/ImportBookViewModel.kt | 7 ++++- .../io/legado/app/utils/EncodingDetect.java | 8 +++--- 4 files changed, 31 insertions(+), 13 deletions(-) diff --git a/app/src/main/java/io/legado/app/data/entities/Book.kt b/app/src/main/java/io/legado/app/data/entities/Book.kt index f01d95bce..17198cdda 100644 --- a/app/src/main/java/io/legado/app/data/entities/Book.kt +++ b/app/src/main/java/io/legado/app/data/entities/Book.kt @@ -19,7 +19,7 @@ data class Book( var bookUrl: String = "", // 详情页Url(本地书源存储完整文件路径) var tocUrl: String = "", // 目录页Url (toc=table of Contents) var origin: String = BookType.local, // 书源URL(默认BookType.local) - var originName: String = "", //书源名称 + var originName: String = "", //书源名称 or 本地书籍文件名 var name: String = "", // 书籍名称(书源获取) var author: String = "", // 作者名称(书源获取) override var kind: String? = null, // 分类信息(书源获取) diff --git a/app/src/main/java/io/legado/app/model/localBook/AnalyzeTxtFile.kt b/app/src/main/java/io/legado/app/model/localBook/AnalyzeTxtFile.kt index 6eb5d4a18..148c5c8f6 100644 --- a/app/src/main/java/io/legado/app/model/localBook/AnalyzeTxtFile.kt +++ b/app/src/main/java/io/legado/app/model/localBook/AnalyzeTxtFile.kt @@ -2,20 +2,33 @@ package io.legado.app.model.localBook import android.content.Context import android.net.Uri +import io.legado.app.App import io.legado.app.data.entities.Book +import io.legado.app.utils.DocumentUtils import io.legado.app.utils.EncodingDetect +import io.legado.app.utils.FileUtils +import java.io.File object AnalyzeTxtFile { - + private const val folderName = "bookTxt" + private val cacheFolder: File by lazy { + val rootFile = App.INSTANCE.getExternalFilesDir(null) + ?: App.INSTANCE.externalCacheDir + ?: App.INSTANCE.cacheDir + FileUtils.createFileIfNotExist(rootFile, subDirs = *arrayOf(folderName)) + } fun analyze(context: Context, book: Book) { - context.contentResolver.openInputStream(Uri.parse(book.bookUrl))?.use { stream -> - val rawByteArray = ByteArray(2000) - stream.read(rawByteArray) - book.charset = EncodingDetect.getJavaEncode(rawByteArray) - - + val uri = Uri.parse(book.bookUrl) + val bookFile = FileUtils.getFile(cacheFolder, book.originName, subDirs = *arrayOf()) + if (!bookFile.exists()) { + bookFile.createNewFile() + DocumentUtils.readBytes(context, uri)?.let { + bookFile.writeBytes(it) + } } + book.charset = EncodingDetect.getEncode(bookFile) + } } \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/ui/importbook/ImportBookViewModel.kt b/app/src/main/java/io/legado/app/ui/importbook/ImportBookViewModel.kt index b81167bd9..75d2fc5e0 100644 --- a/app/src/main/java/io/legado/app/ui/importbook/ImportBookViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/importbook/ImportBookViewModel.kt @@ -23,7 +23,12 @@ class ImportBookViewModel(application: Application) : BaseViewModel(application) if (smhStart != -1 && smhEnd != -1) { name = (name.substring(smhStart + 1, smhEnd)) } - val book = Book(bookUrl = uriStr, name = name, author = author) + val book = Book( + bookUrl = uriStr, + name = name, + author = author, + originName = fileName + ) App.db.bookDao().insert(book) } } diff --git a/app/src/main/java/io/legado/app/utils/EncodingDetect.java b/app/src/main/java/io/legado/app/utils/EncodingDetect.java index 9f1aad37b..08b43b228 100644 --- a/app/src/main/java/io/legado/app/utils/EncodingDetect.java +++ b/app/src/main/java/io/legado/app/utils/EncodingDetect.java @@ -62,10 +62,10 @@ public class EncodingDetect { } } catch (Exception ignored) { } - return getJavaEncode(bytes); + return getEncode(bytes); } - public static String getJavaEncode(@NonNull byte[] bytes) { + public static String getEncode(@NonNull byte[] bytes) { int len = bytes.length > 2000 ? 2000 : bytes.length; byte[] cBytes = new byte[len]; System.arraycopy(bytes, 0, cBytes, 0, len); @@ -83,7 +83,7 @@ public class EncodingDetect { /** * 得到文件的编码 */ - public static String getJavaEncode(@NonNull String filePath) { + public static String getEncode(@NonNull String filePath) { BytesEncodingDetect s = new BytesEncodingDetect(); String fileCode = BytesEncodingDetect.javaname[s .detectEncoding(new File(filePath))]; @@ -102,7 +102,7 @@ public class EncodingDetect { /** * 得到文件的编码 */ - public static String getJavaEncode(@NonNull File file) { + public static String getEncode(@NonNull File file) { BytesEncodingDetect s = new BytesEncodingDetect(); String fileCode = BytesEncodingDetect.javaname[s.detectEncoding(file)]; // UTF-16LE 特殊处理 From d47ddef4d7b728cb71591dee3298b50fc3d06031 Mon Sep 17 00:00:00 2001 From: kunfei Date: Sun, 2 Feb 2020 10:57:58 +0800 Subject: [PATCH 011/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/io/legado/app/constant/PreferKey.kt | 4 ++-- app/src/main/java/io/legado/app/help/AppConfig.kt | 6 +++--- .../io/legado/app/model/localBook/AnalyzeTxtFile.kt | 4 ++++ .../main/java/io/legado/app/ui/main/my/MyFragment.kt | 12 ++++++------ 4 files changed, 15 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/io/legado/app/constant/PreferKey.kt b/app/src/main/java/io/legado/app/constant/PreferKey.kt index 1cb5e2edc..3c6046bde 100644 --- a/app/src/main/java/io/legado/app/constant/PreferKey.kt +++ b/app/src/main/java/io/legado/app/constant/PreferKey.kt @@ -1,7 +1,7 @@ package io.legado.app.constant object PreferKey { - + const val themeMode = "themeMode" const val downloadPath = "downloadPath" const val hideStatusBar = "hideStatusBar" const val clickAllNext = "clickAllNext" @@ -21,5 +21,5 @@ object PreferKey { const val backupPath = "backupUri" const val threadCount = "threadCount" const val keepLight = "keep_light" - const val autoDarkMode = "autoDarkMode" + const val webService = "webService" } \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/help/AppConfig.kt b/app/src/main/java/io/legado/app/help/AppConfig.kt index f8eb4f62e..31107ad5f 100644 --- a/app/src/main/java/io/legado/app/help/AppConfig.kt +++ b/app/src/main/java/io/legado/app/help/AppConfig.kt @@ -8,7 +8,7 @@ object AppConfig { var isNightTheme: Boolean get() { - return when (App.INSTANCE.getPrefString("themeMode", "0")) { + return when (App.INSTANCE.getPrefString(PreferKey.themeMode, "0")) { "1" -> false "2" -> true else -> App.INSTANCE.sysIsDarkMode() @@ -16,9 +16,9 @@ object AppConfig { } set(value) { if (value) { - App.INSTANCE.putPrefString("themeMode", "2") + App.INSTANCE.putPrefString(PreferKey.themeMode, "2") } else { - App.INSTANCE.putPrefString("themeMode", "1") + App.INSTANCE.putPrefString(PreferKey.themeMode, "1") } } diff --git a/app/src/main/java/io/legado/app/model/localBook/AnalyzeTxtFile.kt b/app/src/main/java/io/legado/app/model/localBook/AnalyzeTxtFile.kt index 148c5c8f6..96a44e1c5 100644 --- a/app/src/main/java/io/legado/app/model/localBook/AnalyzeTxtFile.kt +++ b/app/src/main/java/io/legado/app/model/localBook/AnalyzeTxtFile.kt @@ -8,6 +8,7 @@ import io.legado.app.utils.DocumentUtils import io.legado.app.utils.EncodingDetect import io.legado.app.utils.FileUtils import java.io.File +import java.io.RandomAccessFile object AnalyzeTxtFile { private const val folderName = "bookTxt" @@ -29,6 +30,9 @@ object AnalyzeTxtFile { } book.charset = EncodingDetect.getEncode(bookFile) + //获取文件流 + val bookStream = RandomAccessFile(bookFile, "r") + } } \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/ui/main/my/MyFragment.kt b/app/src/main/java/io/legado/app/ui/main/my/MyFragment.kt index e8b061144..7e95c1c34 100644 --- a/app/src/main/java/io/legado/app/ui/main/my/MyFragment.kt +++ b/app/src/main/java/io/legado/app/ui/main/my/MyFragment.kt @@ -174,13 +174,13 @@ class MyFragment : BaseFragment(R.layout.fragment_my_config) { override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { if (WebService.isRun) { - putPrefBoolean("webService", true) + putPrefBoolean(PreferKey.webService, true) } else { - putPrefBoolean("webService", false) + putPrefBoolean(PreferKey.webService, false) } addPreferencesFromResource(R.xml.pref_main) observeEvent(Bus.WEB_SERVICE_STOP) { - findPreference("webService")?.let { + findPreference(PreferKey.webService)?.let { it.isChecked = false } } @@ -203,8 +203,8 @@ class MyFragment : BaseFragment(R.layout.fragment_my_config) { override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences?, key: String?) { when (key) { - "themeMode" -> App.INSTANCE.applyDayNight() - "webService" -> { + PreferKey.themeMode -> App.INSTANCE.applyDayNight() + PreferKey.webService -> { if (requireContext().getPrefBoolean("webService")) { WebService.start(requireContext()) toast("正在启动服务\n具体信息查看通知栏") @@ -213,8 +213,8 @@ class MyFragment : BaseFragment(R.layout.fragment_my_config) { toast("服务已停止") } } + PreferKey.downloadPath -> BookHelp.upDownloadPath() "recordLog" -> LogUtils.upLevel() - "downloadPath" -> BookHelp.upDownloadPath() } } From 0ed336ed8d1b2446b3fb63228ae7e8d27baec6c9 Mon Sep 17 00:00:00 2001 From: kunfei Date: Sun, 2 Feb 2020 11:19:41 +0800 Subject: [PATCH 012/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/io/legado/app/ui/main/my/MyFragment.kt | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/main/my/MyFragment.kt b/app/src/main/java/io/legado/app/ui/main/my/MyFragment.kt index 7e95c1c34..fdae803bf 100644 --- a/app/src/main/java/io/legado/app/ui/main/my/MyFragment.kt +++ b/app/src/main/java/io/legado/app/ui/main/my/MyFragment.kt @@ -11,7 +11,6 @@ import android.view.View import androidx.documentfile.provider.DocumentFile import androidx.preference.Preference import androidx.preference.PreferenceFragmentCompat -import androidx.preference.SwitchPreference import io.legado.app.App import io.legado.app.R import io.legado.app.base.BaseFragment @@ -24,6 +23,7 @@ import io.legado.app.help.storage.Backup import io.legado.app.help.storage.Restore import io.legado.app.help.storage.WebDavHelp import io.legado.app.lib.theme.ATH +import io.legado.app.lib.theme.prefs.ATESwitchPreference import io.legado.app.service.WebService import io.legado.app.ui.about.AboutActivity import io.legado.app.ui.about.DonateActivity @@ -179,10 +179,9 @@ class MyFragment : BaseFragment(R.layout.fragment_my_config) { putPrefBoolean(PreferKey.webService, false) } addPreferencesFromResource(R.xml.pref_main) + val webServicePre = findPreference(PreferKey.webService) observeEvent(Bus.WEB_SERVICE_STOP) { - findPreference(PreferKey.webService)?.let { - it.isChecked = false - } + webServicePre?.isChecked = false } } From 864b61ccba0a860755067ab6c805052a0c8353c4 Mon Sep 17 00:00:00 2001 From: kunfei Date: Sun, 2 Feb 2020 12:19:33 +0800 Subject: [PATCH 013/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/io/legado/app/data/AppDatabase.kt | 3 ++- .../io/legado/app/data/dao/TxtTocRuleDao.kt | 24 +++++++++++++++++++ .../io/legado/app/data/entities/TxtTocRule.kt | 14 +++++++++++ 3 files changed, 40 insertions(+), 1 deletion(-) create mode 100644 app/src/main/java/io/legado/app/data/dao/TxtTocRuleDao.kt create mode 100644 app/src/main/java/io/legado/app/data/entities/TxtTocRule.kt diff --git a/app/src/main/java/io/legado/app/data/AppDatabase.kt b/app/src/main/java/io/legado/app/data/AppDatabase.kt index eb44e9381..b5ace94ba 100644 --- a/app/src/main/java/io/legado/app/data/AppDatabase.kt +++ b/app/src/main/java/io/legado/app/data/AppDatabase.kt @@ -16,7 +16,7 @@ import kotlinx.coroutines.launch @Database( entities = [Book::class, BookGroup::class, BookSource::class, BookChapter::class, ReplaceRule::class, SearchBook::class, SearchKeyword::class, Cookie::class, - RssSource::class, Bookmark::class, RssArticle::class, RssStar::class], + RssSource::class, Bookmark::class, RssArticle::class, RssStar::class, TxtTocRule::class], version = 6, exportSchema = true ) @@ -50,4 +50,5 @@ abstract class AppDatabase : RoomDatabase() { abstract fun rssArticleDao(): RssArticleDao abstract fun rssStarDao(): RssStarDao abstract fun cookieDao(): CookieDao + abstract fun txtTocRule(): TxtTocRuleDao } \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/data/dao/TxtTocRuleDao.kt b/app/src/main/java/io/legado/app/data/dao/TxtTocRuleDao.kt new file mode 100644 index 000000000..d0ae20207 --- /dev/null +++ b/app/src/main/java/io/legado/app/data/dao/TxtTocRuleDao.kt @@ -0,0 +1,24 @@ +package io.legado.app.data.dao + +import androidx.room.Dao +import androidx.room.Insert +import androidx.room.OnConflictStrategy +import androidx.room.Query +import io.legado.app.data.entities.TxtTocRule +import retrofit2.http.DELETE + +@Dao +interface TxtTocRuleDao { + + @get:Query("select * from txtTocRules order by serialNumber") + val all: List + + @get:Query("select * from txtTocRules where enable = 1 order by serialNumber") + val enabled: List + + @Insert(onConflict = OnConflictStrategy.REPLACE) + fun insert(vararg rule: TxtTocRule) + + @DELETE + fun delete(vararg rule: TxtTocRule) +} \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/data/entities/TxtTocRule.kt b/app/src/main/java/io/legado/app/data/entities/TxtTocRule.kt new file mode 100644 index 000000000..c9cd51d4d --- /dev/null +++ b/app/src/main/java/io/legado/app/data/entities/TxtTocRule.kt @@ -0,0 +1,14 @@ +package io.legado.app.data.entities + +import androidx.room.Entity +import androidx.room.PrimaryKey + + +@Entity(tableName = "txtTocRules") +data class TxtTocRule( + @PrimaryKey + var name: String = "", + var rule: String = "", + var serialNumber: Int, + var enable: Boolean = true +) \ No newline at end of file From d867dc34354f74b7a98a6674f6097b317eef1e41 Mon Sep 17 00:00:00 2001 From: kunfei Date: Sun, 2 Feb 2020 12:34:47 +0800 Subject: [PATCH 014/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../{txtChapterRule.json => txtTocRule.json} | 0 .../app/model/localBook/AnalyzeTxtFile.kt | 20 +++++++++++++++---- 2 files changed, 16 insertions(+), 4 deletions(-) rename app/src/main/assets/{txtChapterRule.json => txtTocRule.json} (100%) diff --git a/app/src/main/assets/txtChapterRule.json b/app/src/main/assets/txtTocRule.json similarity index 100% rename from app/src/main/assets/txtChapterRule.json rename to app/src/main/assets/txtTocRule.json diff --git a/app/src/main/java/io/legado/app/model/localBook/AnalyzeTxtFile.kt b/app/src/main/java/io/legado/app/model/localBook/AnalyzeTxtFile.kt index 96a44e1c5..9d6777057 100644 --- a/app/src/main/java/io/legado/app/model/localBook/AnalyzeTxtFile.kt +++ b/app/src/main/java/io/legado/app/model/localBook/AnalyzeTxtFile.kt @@ -4,9 +4,8 @@ import android.content.Context import android.net.Uri import io.legado.app.App import io.legado.app.data.entities.Book -import io.legado.app.utils.DocumentUtils -import io.legado.app.utils.EncodingDetect -import io.legado.app.utils.FileUtils +import io.legado.app.data.entities.TxtTocRule +import io.legado.app.utils.* import java.io.File import java.io.RandomAccessFile @@ -29,10 +28,23 @@ object AnalyzeTxtFile { } } book.charset = EncodingDetect.getEncode(bookFile) - + val tocRules = getTocRules() //获取文件流 val bookStream = RandomAccessFile(bookFile, "r") } + + private fun getTocRules(): List { + val rules = App.db.txtTocRule().all + if (rules.isEmpty()) { + App.INSTANCE.assets.open("txtTocRule.json").readBytes().let { byteArray -> + GSON.fromJsonArray(String(byteArray))?.let { + App.db.txtTocRule().insert(*it.toTypedArray()) + return it + } + } + } + return rules + } } \ No newline at end of file From 90d10a907da548b94c3cf0d911ec44103a5208d0 Mon Sep 17 00:00:00 2001 From: kunfei Date: Sun, 2 Feb 2020 13:06:46 +0800 Subject: [PATCH 015/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/model/localBook/AnalyzeTxtFile.kt | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/io/legado/app/model/localBook/AnalyzeTxtFile.kt b/app/src/main/java/io/legado/app/model/localBook/AnalyzeTxtFile.kt index 9d6777057..61693d8f6 100644 --- a/app/src/main/java/io/legado/app/model/localBook/AnalyzeTxtFile.kt +++ b/app/src/main/java/io/legado/app/model/localBook/AnalyzeTxtFile.kt @@ -4,6 +4,7 @@ import android.content.Context import android.net.Uri import io.legado.app.App import io.legado.app.data.entities.Book +import io.legado.app.data.entities.BookChapter import io.legado.app.data.entities.TxtTocRule import io.legado.app.utils.* import java.io.File @@ -28,13 +29,27 @@ object AnalyzeTxtFile { } } book.charset = EncodingDetect.getEncode(bookFile) - val tocRules = getTocRules() + val toc = arrayListOf() //获取文件流 val bookStream = RandomAccessFile(bookFile, "r") + val tocRule = getTocRule(bookStream) + } + private fun getTocRule(bookStream: RandomAccessFile): String? { + val tocRules = getTocRules() + var tocRule: String? = null + //首先获取128k的数据 + val buffer = ByteArray(10240) + val length = bookStream.read(buffer, 0, buffer.size) + for (str in tocRules) { + + } + return tocRule + } + private fun getTocRules(): List { val rules = App.db.txtTocRule().all if (rules.isEmpty()) { From 8c22b09cc24b09bac586f6296e15ed47e79c414f Mon Sep 17 00:00:00 2001 From: kunfei Date: Sun, 2 Feb 2020 14:37:00 +0800 Subject: [PATCH 016/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/model/localBook/AnalyzeTxtFile.kt | 177 +++++++++++++++++- 1 file changed, 168 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/io/legado/app/model/localBook/AnalyzeTxtFile.kt b/app/src/main/java/io/legado/app/model/localBook/AnalyzeTxtFile.kt index 61693d8f6..85c83c514 100644 --- a/app/src/main/java/io/legado/app/model/localBook/AnalyzeTxtFile.kt +++ b/app/src/main/java/io/legado/app/model/localBook/AnalyzeTxtFile.kt @@ -9,9 +9,17 @@ import io.legado.app.data.entities.TxtTocRule import io.legado.app.utils.* import java.io.File import java.io.RandomAccessFile +import java.nio.charset.Charset +import java.util.regex.Matcher +import java.util.regex.Pattern object AnalyzeTxtFile { private const val folderName = "bookTxt" + private const val BLANK: Byte = 0x0a + //默认从文件中获取数据的长度 + private const val BUFFER_SIZE = 512 * 1024 + //没有标题的时候,每个章节的最大长度 + private const val MAX_LENGTH_WITH_NO_CHAPTER = 10 * 1024 private val cacheFolder: File by lazy { val rootFile = App.INSTANCE.getExternalFilesDir(null) ?: App.INSTANCE.externalCacheDir @@ -19,7 +27,7 @@ object AnalyzeTxtFile { FileUtils.createFileIfNotExist(rootFile, subDirs = *arrayOf(folderName)) } - fun analyze(context: Context, book: Book) { + fun analyze(context: Context, book: Book): ArrayList { val uri = Uri.parse(book.bookUrl) val bookFile = FileUtils.getFile(cacheFolder, book.originName, subDirs = *arrayOf()) if (!bookFile.exists()) { @@ -28,26 +36,177 @@ object AnalyzeTxtFile { bookFile.writeBytes(it) } } - book.charset = EncodingDetect.getEncode(bookFile) + val charset = charset(EncodingDetect.getEncode(bookFile)) + book.charset = charset.name() val toc = arrayListOf() //获取文件流 val bookStream = RandomAccessFile(bookFile, "r") - val tocRule = getTocRule(bookStream) + val rulePattern = getTocRule(bookStream, charset) + //加载章节 + val buffer = ByteArray(BUFFER_SIZE) + //获取到的块起始点,在文件中的位置 + var curOffset: Long = 0 + //block的个数 + var blockPos = 0 + //读取的长度 + var length: Int + var allLength = 0 + //获取文件中的数据到buffer,直到没有数据为止 + while (bookStream.read(buffer, 0, buffer.size).also { length = it } > 0) { + ++blockPos + //如果存在Chapter + if (rulePattern != null) { //将数据转换成String + var blockContent = String(buffer, 0, length, charset) + val lastN = blockContent.lastIndexOf("\n") + if (lastN != 0) { + blockContent = blockContent.substring(0, lastN) + length = blockContent.toByteArray(charset).size + allLength += length + bookStream.seek(allLength.toLong()) + } + //当前Block下使过的String的指针 + var seekPos = 0 + //进行正则匹配 + val matcher: Matcher = rulePattern.matcher(blockContent) + //如果存在相应章节 + while (matcher.find()) { //获取匹配到的字符在字符串中的起始位置 + val chapterStart = matcher.start() + //如果 seekPos == 0 && nextChapterPos != 0 表示当前block处前面有一段内容 + //第一种情况一定是序章 第二种情况可能是上一个章节的内容 + if (seekPos == 0 && chapterStart != 0) { //获取当前章节的内容 + val chapterContent = blockContent.substring(seekPos, chapterStart) + //设置指针偏移 + seekPos += chapterContent.length + if (toc.size == 0) { //如果当前没有章节,那么就是序章 + //加入简介 + book.intro = chapterContent + //创建当前章节 + val curChapter = BookChapter() + curChapter.title = matcher.group() + curChapter.start = chapterContent.toByteArray(charset).size.toLong() + toc.add(curChapter) + } else { //否则就block分割之后,上一个章节的剩余内容 + //获取上一章节 + val lastChapter = toc.last() + //将当前段落添加上一章去 + lastChapter.end = + lastChapter.end!! + chapterContent.toByteArray(charset).size + //创建当前章节 + val curChapter = BookChapter() + curChapter.title = matcher.group() + curChapter.start = lastChapter.end + toc.add(curChapter) + } + } else { //是否存在章节 + if (toc.size != 0) { //获取章节内容 + val chapterContent = blockContent.substring(seekPos, matcher.start()) + seekPos += chapterContent.length + //获取上一章节 + val lastChapter = toc.last() + lastChapter.end = + lastChapter.start!! + chapterContent.toByteArray(charset).size + //创建当前章节 + val curChapter = BookChapter() + curChapter.title = matcher.group() + curChapter.start = lastChapter.end + toc.add(curChapter) + } else { //如果章节不存在则创建章节 + val curChapter = BookChapter() + curChapter.title = matcher.group() + curChapter.start = 0L + curChapter.end = 0L + toc.add(curChapter) + } + } + } + } else { //进行本地虚拟分章 + //章节在buffer的偏移量 + var chapterOffset = 0 + //当前剩余可分配的长度 + var strLength = length + //分章的位置 + var chapterPos = 0 + while (strLength > 0) { + ++chapterPos + //是否长度超过一章 + if (strLength > MAX_LENGTH_WITH_NO_CHAPTER) { //在buffer中一章的终止点 + var end = length + //寻找换行符作为终止点 + for (i in chapterOffset + MAX_LENGTH_WITH_NO_CHAPTER until length) { + if (buffer[i] == BLANK) { + end = i + break + } + } + val chapter = BookChapter() + chapter.title = "第${blockPos}章($chapterPos)" + chapter.start = curOffset + chapterOffset + 1 + chapter.end = curOffset + end + toc.add(chapter) + //减去已经被分配的长度 + strLength -= (end - chapterOffset) + //设置偏移的位置 + chapterOffset = end + } else { + val chapter = BookChapter() + chapter.title = "第" + blockPos + "章" + "(" + chapterPos + ")" + chapter.start = curOffset + chapterOffset + 1 + chapter.end = curOffset + length + toc.add(chapter) + strLength = 0 + } + } + } + + //block的偏移点 + curOffset += length.toLong() + + if (rulePattern != null) { //设置上一章的结尾 + val lastChapter = toc.last() + lastChapter.end = curOffset + } + + //当添加的block太多的时候,执行GC + //当添加的block太多的时候,执行GC + if (blockPos % 15 == 0) { + System.gc() + System.runFinalization() + } + } + + for (i in toc.indices) { + val bean = toc[i] + bean.index = i + bean.bookUrl = book.bookUrl + bean.url = (MD5Utils.md5Encode16(book.originName + i + bean.title) ?: "") + } + bookStream.close() + + System.gc() + System.runFinalization() + return toc } - private fun getTocRule(bookStream: RandomAccessFile): String? { + private fun getTocRule(bookStream: RandomAccessFile, charset: Charset): Pattern? { val tocRules = getTocRules() - var tocRule: String? = null + var rulePattern: Pattern? = null //首先获取128k的数据 - val buffer = ByteArray(10240) + val buffer = ByteArray(BUFFER_SIZE / 4) val length = bookStream.read(buffer, 0, buffer.size) - for (str in tocRules) { - + val content = String(buffer, 0, length, charset) + for (tocRule in tocRules) { + val pattern = Pattern.compile(tocRule.rule, Pattern.MULTILINE) + val matcher = pattern.matcher(content) + if (matcher.find()) { + rulePattern = pattern + break + } } - return tocRule + bookStream.seek(0) + return rulePattern } private fun getTocRules(): List { From 325228aab6883b3804a966a453087d807b4e859b Mon Sep 17 00:00:00 2001 From: kunfei Date: Sun, 2 Feb 2020 18:31:25 +0800 Subject: [PATCH 017/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/io/legado/app/ui/rss/read/ReadRssActivity.kt | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/io/legado/app/ui/rss/read/ReadRssActivity.kt b/app/src/main/java/io/legado/app/ui/rss/read/ReadRssActivity.kt index d0311370c..018be1339 100644 --- a/app/src/main/java/io/legado/app/ui/rss/read/ReadRssActivity.kt +++ b/app/src/main/java/io/legado/app/ui/rss/read/ReadRssActivity.kt @@ -73,7 +73,13 @@ class ReadRssActivity : VMBaseActivity(R.layout.activity_rss_r val url = NetworkUtils.getAbsoluteURL(it.origin, it.link) val html = viewModel.clHtml(content) if (viewModel.rssSource?.loadWithBaseUrl == true) { - webView.loadDataWithBaseURL(null, html, "text/html", "utf-8", url)//Referer会导致一些有反盗链的图片无法加载,暂时先用null应该还有更好的办法 + webView.loadDataWithBaseURL( + url, + html, + "text/html", + "utf-8", + url + )//不想用baseUrl进下一个吧 } else { webView.loadData(html, "text/html;charset=utf-8", "utf-8")//经测试可以解决中文乱码 } From 2639db7b6c59b0b19748c9dff7962b1f44a2ac9f Mon Sep 17 00:00:00 2001 From: kunfei Date: Sun, 2 Feb 2020 18:49:28 +0800 Subject: [PATCH 018/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../io/legado/app/ui/rss/read/ReadRssActivity.kt | 2 +- .../io/legado/app/ui/rss/read/ReadRssViewModel.kt | 14 ++++++++++---- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/rss/read/ReadRssActivity.kt b/app/src/main/java/io/legado/app/ui/rss/read/ReadRssActivity.kt index 018be1339..7bbf4e741 100644 --- a/app/src/main/java/io/legado/app/ui/rss/read/ReadRssActivity.kt +++ b/app/src/main/java/io/legado/app/ui/rss/read/ReadRssActivity.kt @@ -79,7 +79,7 @@ class ReadRssActivity : VMBaseActivity(R.layout.activity_rss_r "text/html", "utf-8", url - )//不想用baseUrl进下一个吧 + )//不想用baseUrl进else } else { webView.loadData(html, "text/html;charset=utf-8", "utf-8")//经测试可以解决中文乱码 } diff --git a/app/src/main/java/io/legado/app/ui/rss/read/ReadRssViewModel.kt b/app/src/main/java/io/legado/app/ui/rss/read/ReadRssViewModel.kt index 36a487a6c..a81655c27 100644 --- a/app/src/main/java/io/legado/app/ui/rss/read/ReadRssViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/rss/read/ReadRssViewModel.kt @@ -85,12 +85,18 @@ class ReadRssViewModel(application: Application) : BaseViewModel(application), } fun clHtml(content: String): String { - return """ - $content""" + $content + """.trimIndent() + } } override fun onInit(status: Int) { From 2aa0be91ea7fbe9625c3b34a04bf587742846148 Mon Sep 17 00:00:00 2001 From: kunfei Date: Sun, 2 Feb 2020 20:10:16 +0800 Subject: [PATCH 019/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/io/legado/app/data/entities/Book.kt | 5 ++ .../main/java/io/legado/app/help/BookHelp.kt | 5 +- .../app/model/localBook/AnalyzeTxtFile.kt | 31 ++++++++---- .../io/legado/app/service/help/ReadBook.kt | 1 + .../app/ui/book/read/ReadBookViewModel.kt | 47 ++++++++++++------- 5 files changed, 63 insertions(+), 26 deletions(-) diff --git a/app/src/main/java/io/legado/app/data/entities/Book.kt b/app/src/main/java/io/legado/app/data/entities/Book.kt index 17198cdda..0d853d2cf 100644 --- a/app/src/main/java/io/legado/app/data/entities/Book.kt +++ b/app/src/main/java/io/legado/app/data/entities/Book.kt @@ -10,6 +10,7 @@ import io.legado.app.utils.GSON import io.legado.app.utils.fromJsonObject import kotlinx.android.parcel.IgnoredOnParcel import kotlinx.android.parcel.Parcelize +import java.nio.charset.Charset import kotlin.math.max @Parcelize @@ -81,6 +82,10 @@ data class Book( variable = GSON.toJson(variableMap) } + fun getCharset(): Charset { + return charset(charset ?: "UTF-8") + } + fun toSearchBook(): SearchBook { return SearchBook( name = name, diff --git a/app/src/main/java/io/legado/app/help/BookHelp.kt b/app/src/main/java/io/legado/app/help/BookHelp.kt index 7635df1f7..018b99605 100644 --- a/app/src/main/java/io/legado/app/help/BookHelp.kt +++ b/app/src/main/java/io/legado/app/help/BookHelp.kt @@ -7,6 +7,7 @@ import io.legado.app.constant.PreferKey import io.legado.app.data.entities.Book import io.legado.app.data.entities.BookChapter import io.legado.app.data.entities.ReplaceRule +import io.legado.app.model.localBook.AnalyzeTxtFile import io.legado.app.utils.* import org.apache.commons.text.similarity.JaccardSimilarity import java.io.File @@ -126,7 +127,9 @@ object BookHelp { } fun getContent(book: Book, bookChapter: BookChapter): String? { - if (downloadUri.isDocumentUri(App.INSTANCE)) { + if (book.isLocalBook()) { + AnalyzeTxtFile.getContent(book, bookChapter) + } else if (downloadUri.isDocumentUri(App.INSTANCE)) { DocumentFile.fromTreeUri(App.INSTANCE, downloadUri)?.let { root -> return DocumentUtils.getDirDocument( root, diff --git a/app/src/main/java/io/legado/app/model/localBook/AnalyzeTxtFile.kt b/app/src/main/java/io/legado/app/model/localBook/AnalyzeTxtFile.kt index 85c83c514..35c394251 100644 --- a/app/src/main/java/io/legado/app/model/localBook/AnalyzeTxtFile.kt +++ b/app/src/main/java/io/legado/app/model/localBook/AnalyzeTxtFile.kt @@ -28,14 +28,7 @@ object AnalyzeTxtFile { } fun analyze(context: Context, book: Book): ArrayList { - val uri = Uri.parse(book.bookUrl) - val bookFile = FileUtils.getFile(cacheFolder, book.originName, subDirs = *arrayOf()) - if (!bookFile.exists()) { - bookFile.createNewFile() - DocumentUtils.readBytes(context, uri)?.let { - bookFile.writeBytes(it) - } - } + val bookFile = getBookFile(context, book) val charset = charset(EncodingDetect.getEncode(bookFile)) book.charset = charset.name() val toc = arrayListOf() @@ -189,6 +182,28 @@ object AnalyzeTxtFile { return toc } + fun getContent(book: Book, bookChapter: BookChapter): String { + val bookFile = getBookFile(App.INSTANCE, book) + //获取文件流 + val bookStream = RandomAccessFile(bookFile, "r") + bookStream.seek(bookChapter.start ?: 0) + val extent = (bookChapter.end!! - bookChapter.start!!).toInt() + val content = ByteArray(extent) + bookStream.read(content, 0, extent) + return String(content, book.getCharset()) + } + + private fun getBookFile(context: Context, book: Book): File { + val uri = Uri.parse(book.bookUrl) + val bookFile = FileUtils.getFile(cacheFolder, book.originName, subDirs = *arrayOf()) + if (!bookFile.exists()) { + bookFile.createNewFile() + DocumentUtils.readBytes(context, uri)?.let { + bookFile.writeBytes(it) + } + } + return bookFile + } private fun getTocRule(bookStream: RandomAccessFile, charset: Charset): Pattern? { val tocRules = getTocRules() diff --git a/app/src/main/java/io/legado/app/service/help/ReadBook.kt b/app/src/main/java/io/legado/app/service/help/ReadBook.kt index 451883b55..770b21e18 100644 --- a/app/src/main/java/io/legado/app/service/help/ReadBook.kt +++ b/app/src/main/java/io/legado/app/service/help/ReadBook.kt @@ -197,6 +197,7 @@ object ReadBook { private fun download(index: Int) { book?.let { book -> + if (book.isLocalBook()) return if (addLoading(index)) { Coroutine.async { App.db.bookChapterDao().getChapter(book.bookUrl, index)?.let { chapter -> diff --git a/app/src/main/java/io/legado/app/ui/book/read/ReadBookViewModel.kt b/app/src/main/java/io/legado/app/ui/book/read/ReadBookViewModel.kt index 9b987e505..646aa3702 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/ReadBookViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/ReadBookViewModel.kt @@ -10,6 +10,7 @@ import io.legado.app.data.entities.BookChapter import io.legado.app.help.BookHelp import io.legado.app.help.IntentDataHelp import io.legado.app.model.WebBook +import io.legado.app.model.localBook.AnalyzeTxtFile import io.legado.app.service.BaseReadAloudService import io.legado.app.service.help.ReadAloud import io.legado.app.service.help.ReadBook @@ -79,10 +80,14 @@ class ReadBookViewModel(application: Application) : BaseViewModel(application) { changeDruChapterIndex: ((chapters: List) -> Unit)? = null ) { execute { - ReadBook.webBook?.getBookInfo(book, this) - ?.onSuccess { - loadChapterList(book, changeDruChapterIndex) - } + if (book.isLocalBook()) { + loadChapterList(book, changeDruChapterIndex) + } else { + ReadBook.webBook?.getBookInfo(book, this) + ?.onSuccess { + loadChapterList(book, changeDruChapterIndex) + } + } } } @@ -91,22 +96,30 @@ class ReadBookViewModel(application: Application) : BaseViewModel(application) { changeDruChapterIndex: ((chapters: List) -> Unit)? = null ) { execute { - ReadBook.webBook?.getChapterList(book, this) - ?.onSuccess(IO) { cList -> - if (!cList.isNullOrEmpty()) { - if (changeDruChapterIndex == null) { - App.db.bookChapterDao().insert(*cList.toTypedArray()) - ReadBook.chapterSize = cList.size - ReadBook.loadContent() + if (book.isLocalBook()) { + AnalyzeTxtFile.analyze(context, book).let { + App.db.bookChapterDao().insert(*it.toTypedArray()) + ReadBook.chapterSize = it.size + ReadBook.loadContent() + } + } else { + ReadBook.webBook?.getChapterList(book, this) + ?.onSuccess(IO) { cList -> + if (!cList.isNullOrEmpty()) { + if (changeDruChapterIndex == null) { + App.db.bookChapterDao().insert(*cList.toTypedArray()) + ReadBook.chapterSize = cList.size + ReadBook.loadContent() + } else { + changeDruChapterIndex(cList) + } } else { - changeDruChapterIndex(cList) + toast(R.string.error_load_toc) } - } else { + }?.onError { toast(R.string.error_load_toc) - } - }?.onError { - toast(R.string.error_load_toc) - } ?: autoChangeSource() + } ?: autoChangeSource() + } } } From 9070f610ecfdf45e254ba2c56f554e5084376f91 Mon Sep 17 00:00:00 2001 From: kunfei Date: Sun, 2 Feb 2020 20:11:20 +0800 Subject: [PATCH 020/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/io/legado/app/model/localBook/AnalyzeTxtFile.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/io/legado/app/model/localBook/AnalyzeTxtFile.kt b/app/src/main/java/io/legado/app/model/localBook/AnalyzeTxtFile.kt index 35c394251..2a21a0e5f 100644 --- a/app/src/main/java/io/legado/app/model/localBook/AnalyzeTxtFile.kt +++ b/app/src/main/java/io/legado/app/model/localBook/AnalyzeTxtFile.kt @@ -29,8 +29,8 @@ object AnalyzeTxtFile { fun analyze(context: Context, book: Book): ArrayList { val bookFile = getBookFile(context, book) - val charset = charset(EncodingDetect.getEncode(bookFile)) - book.charset = charset.name() + book.charset = EncodingDetect.getEncode(bookFile) + val charset = book.getCharset() val toc = arrayListOf() //获取文件流 val bookStream = RandomAccessFile(bookFile, "r") From f370e83a3d79a947d8de1913d24cf34f80fa56cc Mon Sep 17 00:00:00 2001 From: kunfei Date: Sun, 2 Feb 2020 20:13:31 +0800 Subject: [PATCH 021/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/io/legado/app/data/entities/Book.kt | 2 +- .../main/java/io/legado/app/model/localBook/AnalyzeTxtFile.kt | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/io/legado/app/data/entities/Book.kt b/app/src/main/java/io/legado/app/data/entities/Book.kt index 0d853d2cf..27f9baec8 100644 --- a/app/src/main/java/io/legado/app/data/entities/Book.kt +++ b/app/src/main/java/io/legado/app/data/entities/Book.kt @@ -82,7 +82,7 @@ data class Book( variable = GSON.toJson(variableMap) } - fun getCharset(): Charset { + fun fileCharset(): Charset { return charset(charset ?: "UTF-8") } diff --git a/app/src/main/java/io/legado/app/model/localBook/AnalyzeTxtFile.kt b/app/src/main/java/io/legado/app/model/localBook/AnalyzeTxtFile.kt index 2a21a0e5f..145558a07 100644 --- a/app/src/main/java/io/legado/app/model/localBook/AnalyzeTxtFile.kt +++ b/app/src/main/java/io/legado/app/model/localBook/AnalyzeTxtFile.kt @@ -30,7 +30,7 @@ object AnalyzeTxtFile { fun analyze(context: Context, book: Book): ArrayList { val bookFile = getBookFile(context, book) book.charset = EncodingDetect.getEncode(bookFile) - val charset = book.getCharset() + val charset = book.fileCharset() val toc = arrayListOf() //获取文件流 val bookStream = RandomAccessFile(bookFile, "r") @@ -190,7 +190,7 @@ object AnalyzeTxtFile { val extent = (bookChapter.end!! - bookChapter.start!!).toInt() val content = ByteArray(extent) bookStream.read(content, 0, extent) - return String(content, book.getCharset()) + return String(content, book.fileCharset()) } private fun getBookFile(context: Context, book: Book): File { From da0db2b6c0fc7808b422af1bc9b8ebd7f3f3536e Mon Sep 17 00:00:00 2001 From: kunfei Date: Sun, 2 Feb 2020 20:15:13 +0800 Subject: [PATCH 022/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/io/legado/app/data/dao/TxtTocRuleDao.kt | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/io/legado/app/data/dao/TxtTocRuleDao.kt b/app/src/main/java/io/legado/app/data/dao/TxtTocRuleDao.kt index d0ae20207..119daa651 100644 --- a/app/src/main/java/io/legado/app/data/dao/TxtTocRuleDao.kt +++ b/app/src/main/java/io/legado/app/data/dao/TxtTocRuleDao.kt @@ -1,11 +1,7 @@ package io.legado.app.data.dao -import androidx.room.Dao -import androidx.room.Insert -import androidx.room.OnConflictStrategy -import androidx.room.Query +import androidx.room.* import io.legado.app.data.entities.TxtTocRule -import retrofit2.http.DELETE @Dao interface TxtTocRuleDao { @@ -19,6 +15,6 @@ interface TxtTocRuleDao { @Insert(onConflict = OnConflictStrategy.REPLACE) fun insert(vararg rule: TxtTocRule) - @DELETE + @Delete fun delete(vararg rule: TxtTocRule) } \ No newline at end of file From 2f3e74c66f3dbe6979acbca4a01866df0f82b8a1 Mon Sep 17 00:00:00 2001 From: kunfei Date: Sun, 2 Feb 2020 20:18:14 +0800 Subject: [PATCH 023/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/io/legado/app/data/AppDatabase.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/io/legado/app/data/AppDatabase.kt b/app/src/main/java/io/legado/app/data/AppDatabase.kt index b5ace94ba..b817927d0 100644 --- a/app/src/main/java/io/legado/app/data/AppDatabase.kt +++ b/app/src/main/java/io/legado/app/data/AppDatabase.kt @@ -17,7 +17,7 @@ import kotlinx.coroutines.launch entities = [Book::class, BookGroup::class, BookSource::class, BookChapter::class, ReplaceRule::class, SearchBook::class, SearchKeyword::class, Cookie::class, RssSource::class, Bookmark::class, RssArticle::class, RssStar::class, TxtTocRule::class], - version = 6, + version = 7, exportSchema = true ) abstract class AppDatabase : RoomDatabase() { From 46d9acbf03c9629064709a455ecdcbcb4e3ca66f Mon Sep 17 00:00:00 2001 From: kunfei Date: Sun, 2 Feb 2020 20:41:42 +0800 Subject: [PATCH 024/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/ui/book/info/BookInfoViewModel.kt | 97 +++++++++++-------- 1 file changed, 57 insertions(+), 40 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/book/info/BookInfoViewModel.kt b/app/src/main/java/io/legado/app/ui/book/info/BookInfoViewModel.kt index 8179c058a..0a54aaeac 100644 --- a/app/src/main/java/io/legado/app/ui/book/info/BookInfoViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/book/info/BookInfoViewModel.kt @@ -11,6 +11,7 @@ import io.legado.app.data.entities.BookChapter import io.legado.app.data.entities.BookGroup import io.legado.app.help.BookHelp import io.legado.app.model.WebBook +import io.legado.app.model.localBook.AnalyzeTxtFile import kotlinx.coroutines.Dispatchers.IO class BookInfoViewModel(application: Application) : BaseViewModel(application) { @@ -55,26 +56,29 @@ class BookInfoViewModel(application: Application) : BaseViewModel(application) { book: Book, changeDruChapterIndex: ((chapters: List) -> Unit)? = null ) { - if (book.isLocalBook()) return execute { - isLoadingData.postValue(true) - App.db.bookSourceDao().getBookSource(book.origin)?.let { bookSource -> - WebBook(bookSource).getBookInfo(book, this) - .onSuccess(IO) { - it?.let { - bookData.postValue(book) - if (inBookshelf) { - App.db.bookDao().update(book) + if (book.isLocalBook()) { + loadChapter(book, changeDruChapterIndex) + } else { + isLoadingData.postValue(true) + App.db.bookSourceDao().getBookSource(book.origin)?.let { bookSource -> + WebBook(bookSource).getBookInfo(book, this) + .onSuccess(IO) { + it?.let { + bookData.postValue(book) + if (inBookshelf) { + App.db.bookDao().update(book) + } + loadChapter(it, changeDruChapterIndex) } - loadChapter(it, changeDruChapterIndex) + }.onError { + isLoadingData.postValue(false) + toast(R.string.error_get_book_info) } - }.onError { - isLoadingData.postValue(false) - toast(R.string.error_get_book_info) - } - } ?: let { - isLoadingData.postValue(false) - toast(R.string.error_no_source) + } ?: let { + isLoadingData.postValue(false) + toast(R.string.error_no_source) + } } } } @@ -85,33 +89,46 @@ class BookInfoViewModel(application: Application) : BaseViewModel(application) { ) { execute { isLoadingData.postValue(true) - App.db.bookSourceDao().getBookSource(book.origin)?.let { bookSource -> - WebBook(bookSource).getChapterList(book, this) - .onSuccess(IO) { - it?.let { - if (it.isNotEmpty()) { - if (inBookshelf) { - App.db.bookDao().update(book) - App.db.bookChapterDao().insert(*it.toTypedArray()) - } - if (changeDruChapterIndex == null) { - chapterListData.postValue(it) - isLoadingData.postValue(false) + if (book.isLocalBook()) { + AnalyzeTxtFile.analyze(context, book).let { + App.db.bookDao().update(book) + App.db.bookChapterDao().insert(*it.toTypedArray()) + if (changeDruChapterIndex == null) { + chapterListData.postValue(it) + isLoadingData.postValue(false) + } else { + changeDruChapterIndex(it) + } + } + } else { + App.db.bookSourceDao().getBookSource(book.origin)?.let { bookSource -> + WebBook(bookSource).getChapterList(book, this) + .onSuccess(IO) { + it?.let { + if (it.isNotEmpty()) { + if (inBookshelf) { + App.db.bookDao().update(book) + App.db.bookChapterDao().insert(*it.toTypedArray()) + } + if (changeDruChapterIndex == null) { + chapterListData.postValue(it) + isLoadingData.postValue(false) + } else { + changeDruChapterIndex(it) + } } else { - changeDruChapterIndex(it) + isLoadingData.postValue(false) + toast(R.string.chapter_list_empty) } - } else { - isLoadingData.postValue(false) - toast(R.string.chapter_list_empty) } + }.onError { + isLoadingData.postValue(false) + toast(R.string.error_get_chapter_list) } - }.onError { - isLoadingData.postValue(false) - toast(R.string.error_get_chapter_list) - } - } ?: let { - isLoadingData.postValue(false) - toast(R.string.error_no_source) + } ?: let { + isLoadingData.postValue(false) + toast(R.string.error_no_source) + } } } } From a2a0c03d53527a67b99b8abc0673f2ebadecdbb6 Mon Sep 17 00:00:00 2001 From: kunfei Date: Sun, 2 Feb 2020 21:18:07 +0800 Subject: [PATCH 025/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/io/legado/app/help/BookHelp.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/io/legado/app/help/BookHelp.kt b/app/src/main/java/io/legado/app/help/BookHelp.kt index 018b99605..2f916adbe 100644 --- a/app/src/main/java/io/legado/app/help/BookHelp.kt +++ b/app/src/main/java/io/legado/app/help/BookHelp.kt @@ -128,7 +128,7 @@ object BookHelp { fun getContent(book: Book, bookChapter: BookChapter): String? { if (book.isLocalBook()) { - AnalyzeTxtFile.getContent(book, bookChapter) + return AnalyzeTxtFile.getContent(book, bookChapter) } else if (downloadUri.isDocumentUri(App.INSTANCE)) { DocumentFile.fromTreeUri(App.INSTANCE, downloadUri)?.let { root -> return DocumentUtils.getDirDocument( From c9cc9a617874c188deb8253f928c6efc57187c6d Mon Sep 17 00:00:00 2001 From: kunfei Date: Sun, 2 Feb 2020 21:19:13 +0800 Subject: [PATCH 026/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/io/legado/app/help/BookHelp.kt | 26 ++++++++++++------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/io/legado/app/help/BookHelp.kt b/app/src/main/java/io/legado/app/help/BookHelp.kt index 2f916adbe..0cdb7e1e8 100644 --- a/app/src/main/java/io/legado/app/help/BookHelp.kt +++ b/app/src/main/java/io/legado/app/help/BookHelp.kt @@ -108,20 +108,26 @@ object BookHelp { } fun hasContent(book: Book, bookChapter: BookChapter): Boolean { - if (downloadUri.isDocumentUri(App.INSTANCE)) { - DocumentFile.fromTreeUri(App.INSTANCE, downloadUri)?.let { root -> - return DocumentUtils.exists( - root, + when { + book.isLocalBook() -> { + return true + } + downloadUri.isDocumentUri(App.INSTANCE) -> { + DocumentFile.fromTreeUri(App.INSTANCE, downloadUri)?.let { root -> + return DocumentUtils.exists( + root, + "${bookChapterName(bookChapter)}.nb", + subDirs = *arrayOf(cacheFolderName, bookFolderName(book)) + ) + } + } + else -> { + return FileUtils.exists( + File(downloadPath), "${bookChapterName(bookChapter)}.nb", subDirs = *arrayOf(cacheFolderName, bookFolderName(book)) ) } - } else { - return FileUtils.exists( - File(downloadPath), - "${bookChapterName(bookChapter)}.nb", - subDirs = *arrayOf(cacheFolderName, bookFolderName(book)) - ) } return false } From c043b16fa6fd49b2e9e2f58342ae87c1d818bd7a Mon Sep 17 00:00:00 2001 From: kunfei Date: Sun, 2 Feb 2020 21:21:05 +0800 Subject: [PATCH 027/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/io/legado/app/help/BookHelp.kt | 66 +++++++++++-------- 1 file changed, 37 insertions(+), 29 deletions(-) diff --git a/app/src/main/java/io/legado/app/help/BookHelp.kt b/app/src/main/java/io/legado/app/help/BookHelp.kt index 0cdb7e1e8..7071579ea 100644 --- a/app/src/main/java/io/legado/app/help/BookHelp.kt +++ b/app/src/main/java/io/legado/app/help/BookHelp.kt @@ -133,44 +133,52 @@ object BookHelp { } fun getContent(book: Book, bookChapter: BookChapter): String? { - if (book.isLocalBook()) { - return AnalyzeTxtFile.getContent(book, bookChapter) - } else if (downloadUri.isDocumentUri(App.INSTANCE)) { - DocumentFile.fromTreeUri(App.INSTANCE, downloadUri)?.let { root -> - return DocumentUtils.getDirDocument( - root, - subDirs = *arrayOf(cacheFolderName, bookFolderName(book)) - )?.findFile("${bookChapterName(bookChapter)}.nb") - ?.uri?.readText(App.INSTANCE) + when { + book.isLocalBook() -> { + return AnalyzeTxtFile.getContent(book, bookChapter) } - } else { - val file = FileUtils.getFile( - File(downloadPath), - "${bookChapterName(bookChapter)}.nb", - subDirs = *arrayOf(cacheFolderName, bookFolderName(book)) - ) - if (file.exists()) { - return file.readText() + downloadUri.isDocumentUri(App.INSTANCE) -> { + DocumentFile.fromTreeUri(App.INSTANCE, downloadUri)?.let { root -> + return DocumentUtils.getDirDocument( + root, + subDirs = *arrayOf(cacheFolderName, bookFolderName(book)) + )?.findFile("${bookChapterName(bookChapter)}.nb") + ?.uri?.readText(App.INSTANCE) + } + } + else -> { + val file = FileUtils.getFile( + File(downloadPath), + "${bookChapterName(bookChapter)}.nb", + subDirs = *arrayOf(cacheFolderName, bookFolderName(book)) + ) + if (file.exists()) { + return file.readText() + } } } return null } fun delContent(book: Book, bookChapter: BookChapter) { - if (downloadUri.isDocumentUri(App.INSTANCE)) { - DocumentFile.fromTreeUri(App.INSTANCE, downloadUri)?.let { root -> - DocumentUtils.getDirDocument( - root, + when { + book.isLocalBook() -> return + downloadUri.isDocumentUri(App.INSTANCE) -> { + DocumentFile.fromTreeUri(App.INSTANCE, downloadUri)?.let { root -> + DocumentUtils.getDirDocument( + root, + subDirs = *arrayOf(cacheFolderName, bookFolderName(book)) + )?.findFile("${bookChapterName(bookChapter)}.nb") + ?.delete() + } + } + else -> { + FileUtils.createFileIfNotExist( + File(downloadPath), + "${bookChapterName(bookChapter)}.nb", subDirs = *arrayOf(cacheFolderName, bookFolderName(book)) - )?.findFile("${bookChapterName(bookChapter)}.nb") - ?.delete() + ).delete() } - } else { - FileUtils.createFileIfNotExist( - File(downloadPath), - "${bookChapterName(bookChapter)}.nb", - subDirs = *arrayOf(cacheFolderName, bookFolderName(book)) - ).delete() } } From 23e0d446679043ce85eeacb4a99c80dc0f3c80cf Mon Sep 17 00:00:00 2001 From: kunfei Date: Sun, 2 Feb 2020 21:25:10 +0800 Subject: [PATCH 028/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/io/legado/app/model/localBook/AnalyzeTxtFile.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/io/legado/app/model/localBook/AnalyzeTxtFile.kt b/app/src/main/java/io/legado/app/model/localBook/AnalyzeTxtFile.kt index 145558a07..30f172615 100644 --- a/app/src/main/java/io/legado/app/model/localBook/AnalyzeTxtFile.kt +++ b/app/src/main/java/io/legado/app/model/localBook/AnalyzeTxtFile.kt @@ -168,14 +168,14 @@ object AnalyzeTxtFile { System.runFinalization() } } - + bookStream.close() for (i in toc.indices) { val bean = toc[i] bean.index = i bean.bookUrl = book.bookUrl bean.url = (MD5Utils.md5Encode16(book.originName + i + bean.title) ?: "") } - bookStream.close() + book.latestChapterTitle = toc.last().title System.gc() System.runFinalization() From d261d25330235037fea62d934e833a1425be3fbb Mon Sep 17 00:00:00 2001 From: kunfei Date: Sun, 2 Feb 2020 21:31:07 +0800 Subject: [PATCH 029/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/io/legado/app/ui/book/read/ReadBookActivity.kt | 3 +++ .../main/java/io/legado/app/ui/book/read/ReadBookViewModel.kt | 2 +- app/src/main/res/menu/read_book.xml | 4 ++-- app/src/main/res/values/strings.xml | 2 +- 4 files changed, 7 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/book/read/ReadBookActivity.kt b/app/src/main/java/io/legado/app/ui/book/read/ReadBookActivity.kt index 7437c3cae..f11f3c835 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/ReadBookActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/ReadBookActivity.kt @@ -219,6 +219,9 @@ class ReadBookActivity : VMBaseActivity(R.layout.activity_boo R.id.menu_copy_text -> { } + R.id.menu_update_toc -> ReadBook.book?.let { + viewModel.loadChapterList(it) + } } return super.onCompatOptionsItemSelected(item) } diff --git a/app/src/main/java/io/legado/app/ui/book/read/ReadBookViewModel.kt b/app/src/main/java/io/legado/app/ui/book/read/ReadBookViewModel.kt index 646aa3702..553ab5ede 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/ReadBookViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/ReadBookViewModel.kt @@ -91,7 +91,7 @@ class ReadBookViewModel(application: Application) : BaseViewModel(application) { } } - private fun loadChapterList( + fun loadChapterList( book: Book, changeDruChapterIndex: ((chapters: List) -> Unit)? = null ) { diff --git a/app/src/main/res/menu/read_book.xml b/app/src/main/res/menu/read_book.xml index 2994a6dbe..18d024862 100644 --- a/app/src/main/res/menu/read_book.xml +++ b/app/src/main/res/menu/read_book.xml @@ -80,9 +80,9 @@ app:showAsAction="never" /> 常见问题 显示所有发现 关闭则只显示勾选源的发现 - 更新目录 + 更新目录 txt目录正则 设置编码 倒序-顺序 From f6daceb5c3c0bf0283a7c7a07f22872f44f14121 Mon Sep 17 00:00:00 2001 From: kunfei Date: Sun, 2 Feb 2020 21:32:53 +0800 Subject: [PATCH 030/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/io/legado/app/ui/book/read/ReadBookViewModel.kt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/src/main/java/io/legado/app/ui/book/read/ReadBookViewModel.kt b/app/src/main/java/io/legado/app/ui/book/read/ReadBookViewModel.kt index 553ab5ede..bb4ef95f0 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/ReadBookViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/ReadBookViewModel.kt @@ -99,6 +99,7 @@ class ReadBookViewModel(application: Application) : BaseViewModel(application) { if (book.isLocalBook()) { AnalyzeTxtFile.analyze(context, book).let { App.db.bookChapterDao().insert(*it.toTypedArray()) + App.db.bookDao().update(book) ReadBook.chapterSize = it.size ReadBook.loadContent() } @@ -108,6 +109,7 @@ class ReadBookViewModel(application: Application) : BaseViewModel(application) { if (!cList.isNullOrEmpty()) { if (changeDruChapterIndex == null) { App.db.bookChapterDao().insert(*cList.toTypedArray()) + App.db.bookDao().update(book) ReadBook.chapterSize = cList.size ReadBook.loadContent() } else { From 4dde81e9e906633b0aa3dd6897577d191cb26681 Mon Sep 17 00:00:00 2001 From: kunfei Date: Sun, 2 Feb 2020 21:36:53 +0800 Subject: [PATCH 031/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/assets/updateLog.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/src/main/assets/updateLog.md b/app/src/main/assets/updateLog.md index 8828a731b..b56be4258 100644 --- a/app/src/main/assets/updateLog.md +++ b/app/src/main/assets/updateLog.md @@ -3,10 +3,12 @@ * 旧版数据导入教程: * 先在旧版阅读(2.x)中进行备份,然后在新版阅读(3.x)【我的】->【备份与恢复】,选择【导入旧版本数据】。 +**2020/02/03** +* 添加本地书籍完成,解析txt文件完成,本地txt可以看了 + **2020/02/02** * merged commit e584606, rss修复BaseURL模式下部分图片无法加载, 修复可能出现的乱码 * 菜单添加网址功能完成 -* 添加本地书籍完成,还差解析txt文件,目前添加了不能看 **2020/01/31** * 修复搜索闪退,因为默认线程为0了 From 1ab80749fbd4c1ef5b715af4edfabf62e8f13546 Mon Sep 17 00:00:00 2001 From: kunfei Date: Mon, 3 Feb 2020 08:42:04 +0800 Subject: [PATCH 032/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/io/legado/app/ui/main/MainActivity.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/java/io/legado/app/ui/main/MainActivity.kt b/app/src/main/java/io/legado/app/ui/main/MainActivity.kt index bdaf72031..f3a1a4a05 100644 --- a/app/src/main/java/io/legado/app/ui/main/MainActivity.kt +++ b/app/src/main/java/io/legado/app/ui/main/MainActivity.kt @@ -86,6 +86,7 @@ class MainActivity : VMBaseActivity(R.layout.activity_main), } override fun onPageSelected(position: Int) { + view_pager_main.hideSoftInput() pagePosition = position when (position) { 0, 1, 3 -> bottom_navigation_view.menu.getItem(position).isChecked = true From 15955676f2c7fc80e386977bad4d585b2896f304 Mon Sep 17 00:00:00 2001 From: kunfei Date: Mon, 3 Feb 2020 08:43:09 +0800 Subject: [PATCH 033/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/assets/updateLog.md | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/assets/updateLog.md b/app/src/main/assets/updateLog.md index b56be4258..ab1238f8a 100644 --- a/app/src/main/assets/updateLog.md +++ b/app/src/main/assets/updateLog.md @@ -4,6 +4,7 @@ * 先在旧版阅读(2.x)中进行备份,然后在新版阅读(3.x)【我的】->【备份与恢复】,选择【导入旧版本数据】。 **2020/02/03** +* 主界面切换时自动隐藏键盘 * 添加本地书籍完成,解析txt文件完成,本地txt可以看了 **2020/02/02** From a964823df80a31cfd0123b42b1c6b66b7768692c Mon Sep 17 00:00:00 2001 From: kunfei Date: Mon, 3 Feb 2020 09:21:16 +0800 Subject: [PATCH 034/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/io/legado/app/constant/PreferKey.kt | 1 + app/src/main/java/io/legado/app/help/storage/Restore.kt | 2 ++ app/src/main/java/io/legado/app/ui/main/MainActivity.kt | 4 ++-- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/io/legado/app/constant/PreferKey.kt b/app/src/main/java/io/legado/app/constant/PreferKey.kt index 3c6046bde..ef572f1f3 100644 --- a/app/src/main/java/io/legado/app/constant/PreferKey.kt +++ b/app/src/main/java/io/legado/app/constant/PreferKey.kt @@ -1,6 +1,7 @@ package io.legado.app.constant object PreferKey { + const val versionCode = "versionCode" const val themeMode = "themeMode" const val downloadPath = "downloadPath" const val hideStatusBar = "hideStatusBar" diff --git a/app/src/main/java/io/legado/app/help/storage/Restore.kt b/app/src/main/java/io/legado/app/help/storage/Restore.kt index 3f7110a54..4385d6282 100644 --- a/app/src/main/java/io/legado/app/help/storage/Restore.kt +++ b/app/src/main/java/io/legado/app/help/storage/Restore.kt @@ -10,6 +10,7 @@ import com.jayway.jsonpath.Option import com.jayway.jsonpath.ParseContext import io.legado.app.App import io.legado.app.constant.AppConst +import io.legado.app.constant.PreferKey import io.legado.app.data.entities.* import io.legado.app.help.ReadBookConfig import io.legado.app.utils.* @@ -117,6 +118,7 @@ object Restore { is String -> edit.putString(it.key, value) else -> Unit } + edit.putInt(PreferKey.versionCode, App.INSTANCE.versionCode) edit.commit() } } diff --git a/app/src/main/java/io/legado/app/ui/main/MainActivity.kt b/app/src/main/java/io/legado/app/ui/main/MainActivity.kt index f3a1a4a05..5d9fee452 100644 --- a/app/src/main/java/io/legado/app/ui/main/MainActivity.kt +++ b/app/src/main/java/io/legado/app/ui/main/MainActivity.kt @@ -77,8 +77,8 @@ class MainActivity : VMBaseActivity(R.layout.activity_main), } private fun upVersion() { - if (getPrefInt("versionCode") != App.INSTANCE.versionCode) { - putPrefInt("versionCode", App.INSTANCE.versionCode) + if (getPrefInt(PreferKey.versionCode) != App.INSTANCE.versionCode) { + putPrefInt(PreferKey.versionCode, App.INSTANCE.versionCode) if (!BuildConfig.DEBUG) { UpdateLog().show(supportFragmentManager, "updateLog") } From ce738b3ff6f3a1292be59c4da909e7959bd815d2 Mon Sep 17 00:00:00 2001 From: kunfei Date: Mon, 3 Feb 2020 09:53:54 +0800 Subject: [PATCH 035/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/io/legado/app/ui/README.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/README.md b/app/src/main/java/io/legado/app/ui/README.md index a1a7a2313..9809241ec 100644 --- a/app/src/main/java/io/legado/app/ui/README.md +++ b/app/src/main/java/io/legado/app/ui/README.md @@ -6,17 +6,17 @@ * book\read 书籍阅读界面 * book\search 搜索书籍界面 * book\source 搜索书源界面 -* changecover 封面换源界面 -* changesource 换源界面 -* chapterlist 目录界面 +* changeCover 封面换源界面 +* changeSource 换源界面 +* chapterList 目录界面 * config 配置界面 * download 下载界面 * explore 发现界面 -* filechooser 文件选择界面 -* importbook 书籍导入界面 +* fileChooser 文件选择界面 +* importBook 书籍导入界面 * main 主界面 -* qrcode 二维码扫描界面 -* replacerule 替换净化界面 +* qrCode 二维码扫描界面 +* replaceRule 替换净化界面 * rss\article 订阅条目界面 * rss\read 订阅阅读界面 * rss\source 订阅源界面 From 71903c290f658ec5288bf8ecef78caad997f2bb9 Mon Sep 17 00:00:00 2001 From: kunfei Date: Mon, 3 Feb 2020 10:00:38 +0800 Subject: [PATCH 036/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/io/legado/app/service/README.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/io/legado/app/service/README.md b/app/src/main/java/io/legado/app/service/README.md index 0b66f70aa..64c4ca44c 100644 --- a/app/src/main/java/io/legado/app/service/README.md +++ b/app/src/main/java/io/legado/app/service/README.md @@ -1 +1,7 @@ -## android服务 \ No newline at end of file +## android服务 +* AudioPlayService 音频播放服务 +* CheckSourceService 书源检测服务 +* DownloadService 缓存服务 +* HttpReadAloudService 在线朗读服务 +* TTSReadAloudService tts朗读服务 +* WebService web服务 \ No newline at end of file From a9b5d52b4c1290e265c0684e460e43c9620fb28d Mon Sep 17 00:00:00 2001 From: kunfei Date: Mon, 3 Feb 2020 10:02:07 +0800 Subject: [PATCH 037/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/io/legado/app/data/README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/io/legado/app/data/README.md b/app/src/main/java/io/legado/app/data/README.md index 18061b12d..ec1ddefbe 100644 --- a/app/src/main/java/io/legado/app/data/README.md +++ b/app/src/main/java/io/legado/app/data/README.md @@ -1 +1,3 @@ -## 存储数据用 \ No newline at end of file +## 存储数据用 +* dao 数据操作 +* entities 数据模型 \ No newline at end of file From bf2f12d7adc8d00cf214bca6455a555d94b273e1 Mon Sep 17 00:00:00 2001 From: kunfei Date: Mon, 3 Feb 2020 10:09:37 +0800 Subject: [PATCH 038/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/io/legado/app/README.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 app/src/main/java/io/legado/app/README.md diff --git a/app/src/main/java/io/legado/app/README.md b/app/src/main/java/io/legado/app/README.md new file mode 100644 index 000000000..b23d4196d --- /dev/null +++ b/app/src/main/java/io/legado/app/README.md @@ -0,0 +1,12 @@ +## 文件结构介绍 + +* base 基类 +* constant 常量 +* data 数据 +* help 帮助 +* lib 库 +* model 解析 +* receiver 广播侦听 +* service 服务 +* ui 界面 +* web web服务 \ No newline at end of file From 37c7a4fdad41bbb6f084c804905d627c9aaae4a1 Mon Sep 17 00:00:00 2001 From: kunfei Date: Mon, 3 Feb 2020 10:14:46 +0800 Subject: [PATCH 039/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/io/legado/app/web/ReadMe.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/io/legado/app/web/ReadMe.md b/app/src/main/java/io/legado/app/web/ReadMe.md index cd5544c3e..aee2e2dc6 100644 --- a/app/src/main/java/io/legado/app/web/ReadMe.md +++ b/app/src/main/java/io/legado/app/web/ReadMe.md @@ -1 +1,5 @@ -# web服务 \ No newline at end of file +# web服务 + +* controller 数据操作 +* HttpServer http服务 +* WebSocketServer 持续通讯服务 \ No newline at end of file From 8ffa73f269f04843291f1141f6092b7343d12b92 Mon Sep 17 00:00:00 2001 From: kunfei Date: Mon, 3 Feb 2020 10:19:05 +0800 Subject: [PATCH 040/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/io/legado/app/model/localBook/AnalyzeTxtFile.kt | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/io/legado/app/model/localBook/AnalyzeTxtFile.kt b/app/src/main/java/io/legado/app/model/localBook/AnalyzeTxtFile.kt index 30f172615..82ec88179 100644 --- a/app/src/main/java/io/legado/app/model/localBook/AnalyzeTxtFile.kt +++ b/app/src/main/java/io/legado/app/model/localBook/AnalyzeTxtFile.kt @@ -34,7 +34,7 @@ object AnalyzeTxtFile { val toc = arrayListOf() //获取文件流 val bookStream = RandomAccessFile(bookFile, "r") - val rulePattern = getTocRule(bookStream, charset) + val rulePattern = getTocRule(book, bookStream, charset) //加载章节 val buffer = ByteArray(BUFFER_SIZE) @@ -205,7 +205,7 @@ object AnalyzeTxtFile { return bookFile } - private fun getTocRule(bookStream: RandomAccessFile, charset: Charset): Pattern? { + private fun getTocRule(book: Book, bookStream: RandomAccessFile, charset: Charset): Pattern? { val tocRules = getTocRules() var rulePattern: Pattern? = null //首先获取128k的数据 @@ -216,6 +216,7 @@ object AnalyzeTxtFile { val pattern = Pattern.compile(tocRule.rule, Pattern.MULTILINE) val matcher = pattern.matcher(content) if (matcher.find()) { + book.tocUrl = tocRule.rule rulePattern = pattern break } From 1e569347055a41db36e6031c119691828e7f93ea Mon Sep 17 00:00:00 2001 From: kunfei Date: Mon, 3 Feb 2020 11:10:37 +0800 Subject: [PATCH 041/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/io/legado/app/ui/book/read/config/MoreConfigDialog.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/app/src/main/java/io/legado/app/ui/book/read/config/MoreConfigDialog.kt b/app/src/main/java/io/legado/app/ui/book/read/config/MoreConfigDialog.kt index 0eac917a1..3251cfc94 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/config/MoreConfigDialog.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/config/MoreConfigDialog.kt @@ -94,7 +94,6 @@ class MoreConfigDialog : DialogFragment() { when (key) { PreferKey.hideStatusBar -> postEvent(Bus.UP_CONFIG, true) PreferKey.hideNavigationBar -> postEvent(Bus.UP_CONFIG, true) - PreferKey.clickAllNext -> postEvent(Bus.UP_CONFIG, true) PreferKey.keepLight -> postEvent(PreferKey.keepLight, true) } } From d42e687ba322a47e93131b4a9619a25b23769e36 Mon Sep 17 00:00:00 2001 From: kunfei Date: Mon, 3 Feb 2020 11:19:59 +0800 Subject: [PATCH 042/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/io/legado/app/help/AppConfig.kt | 2 ++ .../legado/app/ui/book/read/page/delegate/PageDelegate.kt | 6 +++--- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/io/legado/app/help/AppConfig.kt b/app/src/main/java/io/legado/app/help/AppConfig.kt index 31107ad5f..002fee5ff 100644 --- a/app/src/main/java/io/legado/app/help/AppConfig.kt +++ b/app/src/main/java/io/legado/app/help/AppConfig.kt @@ -52,4 +52,6 @@ object AppConfig { val isEInkMode: Boolean get() = App.INSTANCE.getPrefBoolean("isEInkMode") + + val clickAllNext: Boolean get() = App.INSTANCE.getPrefBoolean(PreferKey.clickAllNext, false) } diff --git a/app/src/main/java/io/legado/app/ui/book/read/page/delegate/PageDelegate.kt b/app/src/main/java/io/legado/app/ui/book/read/page/delegate/PageDelegate.kt index e5ccf1b65..e4cbf9560 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/page/delegate/PageDelegate.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/page/delegate/PageDelegate.kt @@ -9,10 +9,9 @@ import android.widget.Scroller import androidx.annotation.CallSuper import androidx.interpolator.view.animation.FastOutLinearInInterpolator import com.google.android.material.snackbar.Snackbar -import io.legado.app.constant.PreferKey +import io.legado.app.help.AppConfig import io.legado.app.ui.book.read.page.ContentView import io.legado.app.ui.book.read.page.PageView -import io.legado.app.utils.getPrefBoolean import io.legado.app.utils.screenshot import io.legado.app.utils.snackbar import kotlin.math.abs @@ -256,7 +255,8 @@ abstract class PageDelegate(protected val pageView: PageView) { setTouchPoint(x, y) } else { bitmap = if (x > viewWidth / 2 || - pageView.context.getPrefBoolean(PreferKey.clickAllNext, false)) { + AppConfig.clickAllNext + ) { //设置动画方向 if (!hasNext()) { return true From 1d3bcac3d78b18b1e366002c7f49ee0a10d799ce Mon Sep 17 00:00:00 2001 From: kunfei Date: Mon, 3 Feb 2020 11:24:52 +0800 Subject: [PATCH 043/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/res/menu/read_book.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/menu/read_book.xml b/app/src/main/res/menu/read_book.xml index 18d024862..a67fd0fb6 100644 --- a/app/src/main/res/menu/read_book.xml +++ b/app/src/main/res/menu/read_book.xml @@ -41,7 +41,7 @@ Date: Mon, 3 Feb 2020 11:42:00 +0800 Subject: [PATCH 044/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/ui/book/read/ReadBookActivity.kt | 21 +++++++++++++++++-- .../ui/book/read/config/ReadAloudDialog.kt | 4 ++-- 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/book/read/ReadBookActivity.kt b/app/src/main/java/io/legado/app/ui/book/read/ReadBookActivity.kt index f11f3c835..ee387edb8 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/ReadBookActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/ReadBookActivity.kt @@ -67,6 +67,7 @@ class ReadBookActivity : VMBaseActivity(R.layout.activity_boo private val requestCodeChapterList = 568 private val requestCodeEditSource = 111 private val requestCodeReplace = 312 + private var replaceUseMenu: MenuItem? = null override val viewModel: ReadBookViewModel get() = getViewModel(ReadBookViewModel::class.java) @@ -85,7 +86,10 @@ class ReadBookActivity : VMBaseActivity(R.layout.activity_boo initView() upScreenTimeOut() ReadBook.callBack = this - ReadBook.titleDate.observe(this, Observer { title_bar.title = it }) + ReadBook.titleDate.observe(this, Observer { + title_bar.title = it + upMenu() + }) viewModel.initData(intent) } @@ -143,9 +147,18 @@ class ReadBookActivity : VMBaseActivity(R.layout.activity_boo override fun onCompatCreateOptionsMenu(menu: Menu): Boolean { menuInflater.inflate(R.menu.read_book, menu) + replaceUseMenu = menu.findItem(R.id.menu_enable_replace) + upMenu() return super.onCompatCreateOptionsMenu(menu) } + private fun upMenu() { + ReadBook.book?.let { + replaceUseMenu?.isChecked = it.useReplaceRule + } + + } + /** * 菜单 */ @@ -222,6 +235,10 @@ class ReadBookActivity : VMBaseActivity(R.layout.activity_boo R.id.menu_update_toc -> ReadBook.book?.let { viewModel.loadChapterList(it) } + R.id.menu_enable_replace -> ReadBook.book?.let { + it.useReplaceRule = !it.useReplaceRule + replaceUseMenu?.isChecked = it.useReplaceRule + } } return super.onCompatOptionsItemSelected(item) } @@ -378,7 +395,7 @@ class ReadBookActivity : VMBaseActivity(R.layout.activity_boo seek_read_page.progress = ReadBook.durPageIndex } - override fun showMenu() { + override fun showMenuBar() { read_menu.runMenuIn() } diff --git a/app/src/main/java/io/legado/app/ui/book/read/config/ReadAloudDialog.kt b/app/src/main/java/io/legado/app/ui/book/read/config/ReadAloudDialog.kt index a20ac2efe..f464d99b2 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/config/ReadAloudDialog.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/config/ReadAloudDialog.kt @@ -101,7 +101,7 @@ class ReadAloudDialog : DialogFragment() { } private fun initOnClick() { - iv_menu.onClick { callBack?.showMenu(); dismiss() } + iv_menu.onClick { callBack?.showMenuBar(); dismiss() } iv_other_config.onClick { ReadAloudConfigDialog().show(childFragmentManager, "readAloudConfigDialog") } @@ -135,7 +135,7 @@ class ReadAloudDialog : DialogFragment() { } interface CallBack { - fun showMenu() + fun showMenuBar() fun openChapterList() fun onClickReadAloud() fun finish() From 7824d938551ae4a87aac0c0335ab68a2e8f29867 Mon Sep 17 00:00:00 2001 From: kunfei Date: Mon, 3 Feb 2020 12:25:07 +0800 Subject: [PATCH 045/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/io/legado/app/data/entities/Book.kt | 4 ++ .../io/legado/app/service/help/ReadBook.kt | 1 + .../app/ui/book/read/ReadBookActivity.kt | 37 +++++++++++++++---- app/src/main/res/menu/read_book.xml | 2 +- 4 files changed, 35 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/io/legado/app/data/entities/Book.kt b/app/src/main/java/io/legado/app/data/entities/Book.kt index 27f9baec8..0c43860f0 100644 --- a/app/src/main/java/io/legado/app/data/entities/Book.kt +++ b/app/src/main/java/io/legado/app/data/entities/Book.kt @@ -53,6 +53,10 @@ data class Book( return origin == BookType.local } + fun isTxt(): Boolean { + return isLocalBook() && originName.endsWith(".txt", true) + } + @Ignore @IgnoredOnParcel override var variableMap: HashMap? = null diff --git a/app/src/main/java/io/legado/app/service/help/ReadBook.kt b/app/src/main/java/io/legado/app/service/help/ReadBook.kt index 770b21e18..f5227f731 100644 --- a/app/src/main/java/io/legado/app/service/help/ReadBook.kt +++ b/app/src/main/java/io/legado/app/service/help/ReadBook.kt @@ -39,6 +39,7 @@ object ReadBook { durChapterIndex = book.durChapterIndex durPageIndex = book.durChapterPos isLocalBook = book.origin == BookType.local + webBook = null App.db.bookSourceDao().getBookSource(book.origin)?.let { webBook = WebBook(it) } diff --git a/app/src/main/java/io/legado/app/ui/book/read/ReadBookActivity.kt b/app/src/main/java/io/legado/app/ui/book/read/ReadBookActivity.kt index ee387edb8..60057a622 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/ReadBookActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/ReadBookActivity.kt @@ -13,7 +13,9 @@ import android.view.Menu import android.view.MenuItem import android.view.View import android.widget.EditText +import androidx.core.view.get import androidx.core.view.isVisible +import androidx.core.view.size import androidx.lifecycle.Observer import com.jaredrummler.android.colorpicker.ColorPickerDialogListener import io.legado.app.App @@ -67,7 +69,7 @@ class ReadBookActivity : VMBaseActivity(R.layout.activity_boo private val requestCodeChapterList = 568 private val requestCodeEditSource = 111 private val requestCodeReplace = 312 - private var replaceUseMenu: MenuItem? = null + private var menu: Menu? = null override val viewModel: ReadBookViewModel get() = getViewModel(ReadBookViewModel::class.java) @@ -147,16 +149,34 @@ class ReadBookActivity : VMBaseActivity(R.layout.activity_boo override fun onCompatCreateOptionsMenu(menu: Menu): Boolean { menuInflater.inflate(R.menu.read_book, menu) - replaceUseMenu = menu.findItem(R.id.menu_enable_replace) - upMenu() return super.onCompatCreateOptionsMenu(menu) } + override fun onPrepareOptionsMenu(menu: Menu?): Boolean { + this.menu = menu + upMenu() + return super.onPrepareOptionsMenu(menu) + } + private fun upMenu() { - ReadBook.book?.let { - replaceUseMenu?.isChecked = it.useReplaceRule + menu?.let { menu -> + ReadBook.book?.let { book -> + val onLine = !book.isLocalBook() + for (i in 0 until menu.size) { + val item = menu[i] + when (item.groupId) { + R.id.menu_group_on_line -> item.isVisible = onLine + R.id.menu_group_local -> item.isVisible = !onLine + R.id.menu_group_text -> item.isVisible = book.isTxt() + R.id.menu_group_login -> + item.isVisible = !ReadBook.webBook?.bookSource?.loginUrl.isNullOrEmpty() + else -> if (item.itemId == R.id.menu_enable_replace) { + item.isChecked = book.useReplaceRule + } + } + } + } } - } /** @@ -221,7 +241,8 @@ class ReadBookActivity : VMBaseActivity(R.layout.activity_boo ReadBook.durChapterIndex, ReadBook.durPageIndex, textChapter!!.title, - editContent) + editContent + ) App.db.bookmarkDao().insert(bookmark) } } @@ -237,7 +258,7 @@ class ReadBookActivity : VMBaseActivity(R.layout.activity_boo } R.id.menu_enable_replace -> ReadBook.book?.let { it.useReplaceRule = !it.useReplaceRule - replaceUseMenu?.isChecked = it.useReplaceRule + menu?.findItem(R.id.menu_enable_replace)?.isChecked = it.useReplaceRule } } return super.onCompatOptionsItemSelected(item) diff --git a/app/src/main/res/menu/read_book.xml b/app/src/main/res/menu/read_book.xml index a67fd0fb6..b27cd41ff 100644 --- a/app/src/main/res/menu/read_book.xml +++ b/app/src/main/res/menu/read_book.xml @@ -3,7 +3,7 @@ xmlns:tools="http://schemas.android.com/tools" tools:context=".ui.main.MainActivity"> - + Date: Mon, 3 Feb 2020 13:07:16 +0800 Subject: [PATCH 046/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/io/legado/app/ui/config/OtherConfigFragment.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/java/io/legado/app/ui/config/OtherConfigFragment.kt b/app/src/main/java/io/legado/app/ui/config/OtherConfigFragment.kt index 7a0d7fb0f..c865aeae6 100644 --- a/app/src/main/java/io/legado/app/ui/config/OtherConfigFragment.kt +++ b/app/src/main/java/io/legado/app/ui/config/OtherConfigFragment.kt @@ -188,6 +188,7 @@ class OtherConfigFragment : PreferenceFragmentCompat(), Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION ) putPrefString(PreferKey.downloadPath, uri.toString()) + BookHelp.upDownloadPath() } } } From 1503fadbee1079f74d38e31f10524d4de1357ec0 Mon Sep 17 00:00:00 2001 From: kunfei Date: Mon, 3 Feb 2020 13:52:45 +0800 Subject: [PATCH 047/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/io/legado/app/ui/config/BackupConfigFragment.kt | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/config/BackupConfigFragment.kt b/app/src/main/java/io/legado/app/ui/config/BackupConfigFragment.kt index d403324fe..10c787bac 100644 --- a/app/src/main/java/io/legado/app/ui/config/BackupConfigFragment.kt +++ b/app/src/main/java/io/legado/app/ui/config/BackupConfigFragment.kt @@ -47,10 +47,7 @@ class BackupConfigFragment : PreferenceFragmentCompat(), fun bindPreferenceSummaryToValue(preference: Preference?) { preference?.apply { onPreferenceChangeListener = this@BackupConfigFragment - onPreferenceChange( - this, - context.getPrefString(key) - ) + onPreferenceChange(this, context.getPrefString(key)) } } addPreferencesFromResource(R.xml.pref_config_backup) From 6c92f21a2682f1db8c73f0d1a7002c227eeb8eb8 Mon Sep 17 00:00:00 2001 From: kunfei Date: Mon, 3 Feb 2020 15:22:02 +0800 Subject: [PATCH 048/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../io/legado/app/ui/changecover/ChangeCoverDialog.kt | 4 ++-- .../legado/app/ui/changecover/ChangeCoverViewModel.kt | 11 +++++++++++ .../java/io/legado/app/ui/changecover/CoverAdapter.kt | 3 +++ .../legado/app/ui/changesource/ChangeSourceDialog.kt | 6 +----- .../app/ui/changesource/ChangeSourceViewModel.kt | 4 ++-- 5 files changed, 19 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/changecover/ChangeCoverDialog.kt b/app/src/main/java/io/legado/app/ui/changecover/ChangeCoverDialog.kt index f566cbbbb..0eb939fe4 100644 --- a/app/src/main/java/io/legado/app/ui/changecover/ChangeCoverDialog.kt +++ b/app/src/main/java/io/legado/app/ui/changecover/ChangeCoverDialog.kt @@ -13,7 +13,7 @@ import io.legado.app.utils.getViewModel import kotlinx.android.synthetic.main.dialog_change_source.* -class ChangeCoverDialog : DialogFragment() { +class ChangeCoverDialog : DialogFragment(), ChangeCoverViewModel.CallBack { companion object { const val tag = "changeCoverDialog" @@ -32,7 +32,7 @@ class ChangeCoverDialog : DialogFragment() { private var callBack: CallBack? = null private lateinit var viewModel: ChangeCoverViewModel - private lateinit var adapter: CoverAdapter + override lateinit var adapter: CoverAdapter override fun onStart() { super.onStart() diff --git a/app/src/main/java/io/legado/app/ui/changecover/ChangeCoverViewModel.kt b/app/src/main/java/io/legado/app/ui/changecover/ChangeCoverViewModel.kt index 5f12c56b2..b38ced035 100644 --- a/app/src/main/java/io/legado/app/ui/changecover/ChangeCoverViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/changecover/ChangeCoverViewModel.kt @@ -1,6 +1,7 @@ package io.legado.app.ui.changecover import android.app.Application +import io.legado.app.App import io.legado.app.base.BaseViewModel class ChangeCoverViewModel(application: Application) : BaseViewModel(application) { @@ -8,5 +9,15 @@ class ChangeCoverViewModel(application: Application) : BaseViewModel(application var name: String = "" var author: String = "" + fun initData() { + execute { + App.db.searchBookDao().getByNameAuthorEnable(name, author).let { + } + } + } + + interface CallBack { + var adapter: CoverAdapter + } } \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/ui/changecover/CoverAdapter.kt b/app/src/main/java/io/legado/app/ui/changecover/CoverAdapter.kt index 408acbeb4..0290d7749 100644 --- a/app/src/main/java/io/legado/app/ui/changecover/CoverAdapter.kt +++ b/app/src/main/java/io/legado/app/ui/changecover/CoverAdapter.kt @@ -22,4 +22,7 @@ class CoverAdapter(context: Context) : } } + interface CallBack { + fun changeTo() + } } \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/ui/changesource/ChangeSourceDialog.kt b/app/src/main/java/io/legado/app/ui/changesource/ChangeSourceDialog.kt index edf3057a3..1097a936c 100644 --- a/app/src/main/java/io/legado/app/ui/changesource/ChangeSourceDialog.kt +++ b/app/src/main/java/io/legado/app/ui/changesource/ChangeSourceDialog.kt @@ -40,7 +40,7 @@ class ChangeSourceDialog : DialogFragment(), private var callBack: CallBack? = null private lateinit var viewModel: ChangeSourceViewModel - private lateinit var changeSourceAdapter: ChangeSourceAdapter + override lateinit var changeSourceAdapter: ChangeSourceAdapter override fun onStart() { super.onStart() @@ -139,10 +139,6 @@ class ChangeSourceDialog : DialogFragment(), override val bookUrl: String? get() = callBack?.oldBook?.bookUrl - override fun adapter(): ChangeSourceAdapter { - return changeSourceAdapter - } - interface CallBack { val oldBook: Book? fun changeTo(book: Book) diff --git a/app/src/main/java/io/legado/app/ui/changesource/ChangeSourceViewModel.kt b/app/src/main/java/io/legado/app/ui/changesource/ChangeSourceViewModel.kt index 3b16a4359..cccdd0e71 100644 --- a/app/src/main/java/io/legado/app/ui/changesource/ChangeSourceViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/changesource/ChangeSourceViewModel.kt @@ -40,7 +40,7 @@ class ChangeSourceViewModel(application: Application) : BaseViewModel(applicatio private fun upAdapter() { execute { - callBack?.adapter()?.let { + callBack?.changeSourceAdapter?.let { val books = searchBooks.toList() books.sorted() val diffResult = DiffUtil.calculateDiff(DiffCallBack(it.getItems(), books)) @@ -131,7 +131,7 @@ class ChangeSourceViewModel(application: Application) : BaseViewModel(applicatio } interface CallBack { - fun adapter(): ChangeSourceAdapter + var changeSourceAdapter: ChangeSourceAdapter } override fun onCleared() { From 24359939167395e3f3695c45191abbba0380d032 Mon Sep 17 00:00:00 2001 From: kunfei Date: Mon, 3 Feb 2020 15:25:29 +0800 Subject: [PATCH 049/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/io/legado/app/ui/changecover/ChangeCoverDialog.kt | 1 + .../java/io/legado/app/ui/changecover/ChangeCoverViewModel.kt | 2 +- .../java/io/legado/app/ui/changesource/ChangeSourceDialog.kt | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/changecover/ChangeCoverDialog.kt b/app/src/main/java/io/legado/app/ui/changecover/ChangeCoverDialog.kt index 0eb939fe4..4d3176695 100644 --- a/app/src/main/java/io/legado/app/ui/changecover/ChangeCoverDialog.kt +++ b/app/src/main/java/io/legado/app/ui/changecover/ChangeCoverDialog.kt @@ -47,6 +47,7 @@ class ChangeCoverDialog : DialogFragment(), ChangeCoverViewModel.CallBack { savedInstanceState: Bundle? ): View? { viewModel = getViewModel(ChangeCoverViewModel::class.java) + viewModel.callBack = this return inflater.inflate(R.layout.dialog_change_source, container) } diff --git a/app/src/main/java/io/legado/app/ui/changecover/ChangeCoverViewModel.kt b/app/src/main/java/io/legado/app/ui/changecover/ChangeCoverViewModel.kt index b38ced035..4e59d4d00 100644 --- a/app/src/main/java/io/legado/app/ui/changecover/ChangeCoverViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/changecover/ChangeCoverViewModel.kt @@ -5,7 +5,7 @@ import io.legado.app.App import io.legado.app.base.BaseViewModel class ChangeCoverViewModel(application: Application) : BaseViewModel(application) { - + var callBack: CallBack? = null var name: String = "" var author: String = "" diff --git a/app/src/main/java/io/legado/app/ui/changesource/ChangeSourceDialog.kt b/app/src/main/java/io/legado/app/ui/changesource/ChangeSourceDialog.kt index 1097a936c..be039e6d0 100644 --- a/app/src/main/java/io/legado/app/ui/changesource/ChangeSourceDialog.kt +++ b/app/src/main/java/io/legado/app/ui/changesource/ChangeSourceDialog.kt @@ -55,6 +55,7 @@ class ChangeSourceDialog : DialogFragment(), savedInstanceState: Bundle? ): View? { viewModel = getViewModel(ChangeSourceViewModel::class.java) + viewModel.callBack = this return inflater.inflate(R.layout.dialog_change_source, container) } @@ -92,7 +93,6 @@ class ChangeSourceDialog : DialogFragment(), DividerItemDecoration(requireContext(), LinearLayout.VERTICAL) ) recycler_view.adapter = changeSourceAdapter - viewModel.callBack = this } private fun initSearchView() { From 5e754a31301bef89e9fa3dc9348343f5e8cc1aff Mon Sep 17 00:00:00 2001 From: kunfei Date: Mon, 3 Feb 2020 18:50:45 +0800 Subject: [PATCH 050/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../io/legado/app/data/dao/SearchBookDao.kt | 8 ++++++++ .../app/ui/changecover/ChangeCoverDialog.kt | 1 + .../app/ui/changecover/ChangeCoverViewModel.kt | 18 ++++++++++++++++-- .../ui/changesource/ChangeSourceViewModel.kt | 10 +++++----- 4 files changed, 30 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/io/legado/app/data/dao/SearchBookDao.kt b/app/src/main/java/io/legado/app/data/dao/SearchBookDao.kt index 7e623bfcc..fd3f69951 100644 --- a/app/src/main/java/io/legado/app/data/dao/SearchBookDao.kt +++ b/app/src/main/java/io/legado/app/data/dao/SearchBookDao.kt @@ -28,6 +28,14 @@ interface SearchBookDao { @Query("select * from searchBooks where name = :name and author = :author and origin in (select bookSourceUrl from book_sources where enabled = 1) order by originOrder") fun getByNameAuthorEnable(name: String, author: String): List + @Query( + """select * from searchBooks + where name = :name and author = :author and origin in (select bookSourceUrl from book_sources where enabled = 1) + and coverUrl is not null and coverUrl <> '' + order by originOrder""" + ) + fun getEnableHasCover(name: String, author: String): List + @Insert(onConflict = OnConflictStrategy.REPLACE) fun insert(vararg searchBook: SearchBook): List diff --git a/app/src/main/java/io/legado/app/ui/changecover/ChangeCoverDialog.kt b/app/src/main/java/io/legado/app/ui/changecover/ChangeCoverDialog.kt index 4d3176695..cc8554a7f 100644 --- a/app/src/main/java/io/legado/app/ui/changecover/ChangeCoverDialog.kt +++ b/app/src/main/java/io/legado/app/ui/changecover/ChangeCoverDialog.kt @@ -66,6 +66,7 @@ class ChangeCoverDialog : DialogFragment(), ChangeCoverViewModel.CallBack { recycler_view.layoutManager = GridLayoutManager(requireContext(), 3) adapter = CoverAdapter(requireContext()) recycler_view.adapter = adapter + viewModel.initData() } interface CallBack { diff --git a/app/src/main/java/io/legado/app/ui/changecover/ChangeCoverViewModel.kt b/app/src/main/java/io/legado/app/ui/changecover/ChangeCoverViewModel.kt index 4e59d4d00..6c5fb759b 100644 --- a/app/src/main/java/io/legado/app/ui/changecover/ChangeCoverViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/changecover/ChangeCoverViewModel.kt @@ -3,20 +3,34 @@ package io.legado.app.ui.changecover import android.app.Application import io.legado.app.App import io.legado.app.base.BaseViewModel +import io.legado.app.help.AppConfig +import kotlinx.coroutines.asCoroutineDispatcher +import java.util.concurrent.Executors class ChangeCoverViewModel(application: Application) : BaseViewModel(application) { + private var searchPool = + Executors.newFixedThreadPool(AppConfig.threadCount).asCoroutineDispatcher() var callBack: CallBack? = null var name: String = "" var author: String = "" fun initData() { execute { - App.db.searchBookDao().getByNameAuthorEnable(name, author).let { - + App.db.searchBookDao().getEnableHasCover(name, author).let { + callBack?.adapter?.setItems(it) } } } + fun search() { + + } + + override fun onCleared() { + super.onCleared() + searchPool.close() + } + interface CallBack { var adapter: CoverAdapter } diff --git a/app/src/main/java/io/legado/app/ui/changesource/ChangeSourceViewModel.kt b/app/src/main/java/io/legado/app/ui/changesource/ChangeSourceViewModel.kt index cccdd0e71..1b6a4e679 100644 --- a/app/src/main/java/io/legado/app/ui/changesource/ChangeSourceViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/changesource/ChangeSourceViewModel.kt @@ -42,7 +42,6 @@ class ChangeSourceViewModel(application: Application) : BaseViewModel(applicatio execute { callBack?.changeSourceAdapter?.let { val books = searchBooks.toList() - books.sorted() val diffResult = DiffUtil.calculateDiff(DiffCallBack(it.getItems(), books)) withContext(Main) { synchronized(this) { @@ -130,12 +129,13 @@ class ChangeSourceViewModel(application: Application) : BaseViewModel(applicatio } } - interface CallBack { - var changeSourceAdapter: ChangeSourceAdapter - } - override fun onCleared() { super.onCleared() searchPool.close() } + + interface CallBack { + var changeSourceAdapter: ChangeSourceAdapter + } + } \ No newline at end of file From 3c3654f2781a52b14fae92c78ecd090067fd1154 Mon Sep 17 00:00:00 2001 From: kunfei Date: Mon, 3 Feb 2020 18:54:27 +0800 Subject: [PATCH 051/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../io/legado/app/ui/book/info/BookInfoActivity.kt | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/io/legado/app/ui/book/info/BookInfoActivity.kt b/app/src/main/java/io/legado/app/ui/book/info/BookInfoActivity.kt index fb689519c..0c1713246 100644 --- a/app/src/main/java/io/legado/app/ui/book/info/BookInfoActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/info/BookInfoActivity.kt @@ -24,6 +24,7 @@ import io.legado.app.ui.audio.AudioPlayActivity import io.legado.app.ui.book.info.edit.BookInfoEditActivity import io.legado.app.ui.book.read.ReadBookActivity import io.legado.app.ui.book.source.edit.BookSourceEditActivity +import io.legado.app.ui.changecover.ChangeCoverDialog import io.legado.app.ui.changesource.ChangeSourceDialog import io.legado.app.ui.chapterlist.ChapterListActivity import io.legado.app.utils.getViewModel @@ -40,7 +41,8 @@ class BookInfoActivity : VMBaseActivity(R.layout.activity_book_info, theme = Theme.Dark), GroupSelectDialog.CallBack, ChapterListAdapter.CallBack, - ChangeSourceDialog.CallBack { + ChangeSourceDialog.CallBack, + ChangeCoverDialog.CallBack { private val requestCodeChapterList = 568 private val requestCodeSourceEdit = 562 @@ -184,6 +186,9 @@ class BookInfoActivity : } private fun initOnClick() { + iv_cover.onClick { + + } tv_read.onClick { viewModel.bookData.value?.let { readBook(it) @@ -276,6 +281,13 @@ class BookInfoActivity : viewModel.changeTo(book) } + override fun coverChangeTo(coverUrl: String) { + viewModel.bookData.value?.let { + it.coverUrl = coverUrl + viewModel.saveBook() + } + } + override fun openChapter(chapter: BookChapter) { if (chapter.index != viewModel.durChapterIndex) { viewModel.bookData.value?.let { From 3c2e0f53de61ce0f4b4f00fc77f4afe3c5764af1 Mon Sep 17 00:00:00 2001 From: kunfei Date: Mon, 3 Feb 2020 18:56:51 +0800 Subject: [PATCH 052/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/ui/book/info/BookInfoActivity.kt | 27 +++++++++++-------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/book/info/BookInfoActivity.kt b/app/src/main/java/io/legado/app/ui/book/info/BookInfoActivity.kt index 0c1713246..9a829baa8 100644 --- a/app/src/main/java/io/legado/app/ui/book/info/BookInfoActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/info/BookInfoActivity.kt @@ -112,23 +112,13 @@ class BookInfoActivity : } private fun showBook(book: Book) { + showCover(book) tv_name.text = book.name tv_author.text = getString(R.string.author_show, book.author) tv_origin.text = getString(R.string.origin_show, book.originName) tv_lasted.text = getString(R.string.lasted_show, book.latestChapterTitle) tv_toc.text = getString(R.string.toc_s, book.latestChapterTitle) tv_intro.text = book.getDisplayIntro() - book.getDisplayCover()?.let { - ImageLoader.load(this, it) - .centerCrop() - .into(iv_cover) - ImageLoader.load(this, it) - .transition(DrawableTransitionOptions.withCrossFade(1500)) - .thumbnail(defaultCover()) - .centerCrop() - .apply(bitmapTransform(BlurTransformation(this, 25))) - .into(bg_book) //模糊、渐变、缩小效果 - } val kinds = book.getKindList() if (kinds.isEmpty()) { ll_kind.gone() @@ -161,6 +151,20 @@ class BookInfoActivity : } } + private fun showCover(book: Book) { + book.getDisplayCover()?.let { + ImageLoader.load(this, it) + .centerCrop() + .into(iv_cover) + ImageLoader.load(this, it) + .transition(DrawableTransitionOptions.withCrossFade(1500)) + .thumbnail(defaultCover()) + .centerCrop() + .apply(bitmapTransform(BlurTransformation(this, 25))) + .into(bg_book) //模糊、渐变、缩小效果 + } + } + private fun showChapter(chapterList: List) { viewModel.bookData.value?.let { if (it.durChapterIndex < chapterList.size) { @@ -285,6 +289,7 @@ class BookInfoActivity : viewModel.bookData.value?.let { it.coverUrl = coverUrl viewModel.saveBook() + showCover(it) } } From f09dda0e8a00297ad082d7d362030818c8f4dbeb Mon Sep 17 00:00:00 2001 From: kunfei Date: Mon, 3 Feb 2020 19:39:35 +0800 Subject: [PATCH 053/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/io/legado/app/ui/book/info/BookInfoActivity.kt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/io/legado/app/ui/book/info/BookInfoActivity.kt b/app/src/main/java/io/legado/app/ui/book/info/BookInfoActivity.kt index 9a829baa8..6f5c23d67 100644 --- a/app/src/main/java/io/legado/app/ui/book/info/BookInfoActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/info/BookInfoActivity.kt @@ -191,7 +191,9 @@ class BookInfoActivity : private fun initOnClick() { iv_cover.onClick { - + viewModel.bookData.value?.let { + ChangeCoverDialog.show(supportFragmentManager, it.name, it.author) + } } tv_read.onClick { viewModel.bookData.value?.let { From d1d91d95d76ffa9efe8df0b807ba56ba444765b2 Mon Sep 17 00:00:00 2001 From: kunfei Date: Mon, 3 Feb 2020 19:59:37 +0800 Subject: [PATCH 054/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/ui/changecover/ChangeCoverDialog.kt | 6 +++- .../ui/changecover/ChangeCoverViewModel.kt | 31 +++++++++++++++++++ .../legado/app/ui/changecover/CoverAdapter.kt | 4 +++ .../app/ui/changesource/ChangeSourceDialog.kt | 2 +- 4 files changed, 41 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/changecover/ChangeCoverDialog.kt b/app/src/main/java/io/legado/app/ui/changecover/ChangeCoverDialog.kt index cc8554a7f..24ecbd7f0 100644 --- a/app/src/main/java/io/legado/app/ui/changecover/ChangeCoverDialog.kt +++ b/app/src/main/java/io/legado/app/ui/changecover/ChangeCoverDialog.kt @@ -7,6 +7,7 @@ import android.view.View import android.view.ViewGroup import androidx.fragment.app.DialogFragment import androidx.fragment.app.FragmentManager +import androidx.lifecycle.Observer import androidx.recyclerview.widget.GridLayoutManager import io.legado.app.R import io.legado.app.utils.getViewModel @@ -46,6 +47,7 @@ class ChangeCoverDialog : DialogFragment(), ChangeCoverViewModel.CallBack { container: ViewGroup?, savedInstanceState: Bundle? ): View? { + callBack = activity as? CallBack viewModel = getViewModel(ChangeCoverViewModel::class.java) viewModel.callBack = this return inflater.inflate(R.layout.dialog_change_source, container) @@ -53,7 +55,9 @@ class ChangeCoverDialog : DialogFragment(), ChangeCoverViewModel.CallBack { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - callBack = activity as? CallBack + viewModel.searchStateData.observe(this, Observer { + refresh_progress_bar.isAutoLoading = it + }) tool_bar.setTitle(R.string.change_cover_source) arguments?.let { bundle -> bundle.getString("name")?.let { diff --git a/app/src/main/java/io/legado/app/ui/changecover/ChangeCoverViewModel.kt b/app/src/main/java/io/legado/app/ui/changecover/ChangeCoverViewModel.kt index 6c5fb759b..066fdf99c 100644 --- a/app/src/main/java/io/legado/app/ui/changecover/ChangeCoverViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/changecover/ChangeCoverViewModel.kt @@ -1,9 +1,13 @@ package io.legado.app.ui.changecover import android.app.Application +import androidx.lifecycle.MutableLiveData import io.legado.app.App import io.legado.app.base.BaseViewModel import io.legado.app.help.AppConfig +import io.legado.app.help.coroutine.Coroutine +import io.legado.app.model.WebBook +import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.asCoroutineDispatcher import java.util.concurrent.Executors @@ -13,17 +17,44 @@ class ChangeCoverViewModel(application: Application) : BaseViewModel(application var callBack: CallBack? = null var name: String = "" var author: String = "" + private var task: Coroutine<*>? = null + val searchStateData = MutableLiveData() fun initData() { execute { App.db.searchBookDao().getEnableHasCover(name, author).let { callBack?.adapter?.setItems(it) + search() } } } fun search() { + task = execute { + searchStateData.postValue(true) + val bookSourceList = App.db.bookSourceDao().allEnabled + for (item in bookSourceList) { + //task取消时自动取消 by (scope = this@execute) + WebBook(item).searchBook(name, scope = this@execute, context = searchPool) + .timeout(30000L) + .onSuccess(Dispatchers.IO) { + if (it != null && it.isNotEmpty()) { + val searchBook = it[0] + if (searchBook.name == name && searchBook.author == author) { + callBack?.adapter?.let { adapter -> + if (!adapter.getItems().contains(searchBook)) { + adapter.addItem(searchBook) + } + } + } + } + } + } + } + task?.invokeOnCompletion { + searchStateData.postValue(false) + } } override fun onCleared() { diff --git a/app/src/main/java/io/legado/app/ui/changecover/CoverAdapter.kt b/app/src/main/java/io/legado/app/ui/changecover/CoverAdapter.kt index 0290d7749..ba250a8a2 100644 --- a/app/src/main/java/io/legado/app/ui/changecover/CoverAdapter.kt +++ b/app/src/main/java/io/legado/app/ui/changecover/CoverAdapter.kt @@ -7,6 +7,7 @@ import io.legado.app.base.adapter.SimpleRecyclerAdapter import io.legado.app.data.entities.SearchBook import io.legado.app.help.ImageLoader import kotlinx.android.synthetic.main.item_cover.view.* +import org.jetbrains.anko.sdk27.listeners.onClick class CoverAdapter(context: Context) : SimpleRecyclerAdapter(context, R.layout.item_cover) { @@ -19,6 +20,9 @@ class CoverAdapter(context: Context) : .into(iv_cover) } tv_source.text = item.originName + onClick { + + } } } diff --git a/app/src/main/java/io/legado/app/ui/changesource/ChangeSourceDialog.kt b/app/src/main/java/io/legado/app/ui/changesource/ChangeSourceDialog.kt index be039e6d0..c05e171b1 100644 --- a/app/src/main/java/io/legado/app/ui/changesource/ChangeSourceDialog.kt +++ b/app/src/main/java/io/legado/app/ui/changesource/ChangeSourceDialog.kt @@ -54,6 +54,7 @@ class ChangeSourceDialog : DialogFragment(), container: ViewGroup?, savedInstanceState: Bundle? ): View? { + callBack = activity as? CallBack viewModel = getViewModel(ChangeSourceViewModel::class.java) viewModel.callBack = this return inflater.inflate(R.layout.dialog_change_source, container) @@ -61,7 +62,6 @@ class ChangeSourceDialog : DialogFragment(), override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - callBack = activity as? CallBack viewModel.searchStateData.observe(viewLifecycleOwner, Observer { refresh_progress_bar.isAutoLoading = it }) From 85dfd302749ef965c8664442f4d4f8ad754382f9 Mon Sep 17 00:00:00 2001 From: kunfei Date: Mon, 3 Feb 2020 20:14:32 +0800 Subject: [PATCH 055/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../io/legado/app/ui/changecover/ChangeCoverViewModel.kt | 7 +++++-- .../main/java/io/legado/app/ui/changecover/CoverAdapter.kt | 1 + app/src/main/res/layout/item_cover.xml | 1 - 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/changecover/ChangeCoverViewModel.kt b/app/src/main/java/io/legado/app/ui/changecover/ChangeCoverViewModel.kt index 066fdf99c..f2b351c68 100644 --- a/app/src/main/java/io/legado/app/ui/changecover/ChangeCoverViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/changecover/ChangeCoverViewModel.kt @@ -22,10 +22,13 @@ class ChangeCoverViewModel(application: Application) : BaseViewModel(application fun initData() { execute { - App.db.searchBookDao().getEnableHasCover(name, author).let { + App.db.searchBookDao().getEnableHasCover(name, author) + }.onSuccess { + it?.let { callBack?.adapter?.setItems(it) - search() } + }.onFinally { + search() } } diff --git a/app/src/main/java/io/legado/app/ui/changecover/CoverAdapter.kt b/app/src/main/java/io/legado/app/ui/changecover/CoverAdapter.kt index ba250a8a2..f952a8b20 100644 --- a/app/src/main/java/io/legado/app/ui/changecover/CoverAdapter.kt +++ b/app/src/main/java/io/legado/app/ui/changecover/CoverAdapter.kt @@ -16,6 +16,7 @@ class CoverAdapter(context: Context) : with(holder.itemView) { item.coverUrl?.let { ImageLoader.load(context, it) + .error(R.drawable.image_cover_default) .centerCrop() .into(iv_cover) } diff --git a/app/src/main/res/layout/item_cover.xml b/app/src/main/res/layout/item_cover.xml index 018b5f2f8..b80cf9b6c 100644 --- a/app/src/main/res/layout/item_cover.xml +++ b/app/src/main/res/layout/item_cover.xml @@ -15,7 +15,6 @@ android:layout_height="100dp" android:contentDescription="@string/img_cover" android:scaleType="centerCrop" - android:src="@drawable/image_cover_default" android:transitionName="img_cover" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" From bed1bc8f7ab5e9179b8a74e750c72f1246442bba Mon Sep 17 00:00:00 2001 From: kunfei Date: Mon, 3 Feb 2020 20:26:07 +0800 Subject: [PATCH 056/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../io/legado/app/ui/changecover/ChangeCoverViewModel.kt | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/io/legado/app/ui/changecover/ChangeCoverViewModel.kt b/app/src/main/java/io/legado/app/ui/changecover/ChangeCoverViewModel.kt index f2b351c68..5469717bd 100644 --- a/app/src/main/java/io/legado/app/ui/changecover/ChangeCoverViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/changecover/ChangeCoverViewModel.kt @@ -8,7 +8,9 @@ import io.legado.app.help.AppConfig import io.legado.app.help.coroutine.Coroutine import io.legado.app.model.WebBook import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.Dispatchers.Main import kotlinx.coroutines.asCoroutineDispatcher +import kotlinx.coroutines.withContext import java.util.concurrent.Executors class ChangeCoverViewModel(application: Application) : BaseViewModel(application) { @@ -44,9 +46,12 @@ class ChangeCoverViewModel(application: Application) : BaseViewModel(application if (it != null && it.isNotEmpty()) { val searchBook = it[0] if (searchBook.name == name && searchBook.author == author) { + App.db.searchBookDao().insert(searchBook) callBack?.adapter?.let { adapter -> if (!adapter.getItems().contains(searchBook)) { - adapter.addItem(searchBook) + withContext(Main) { + adapter.addItem(searchBook) + } } } } From 0ff380e183b1e756729b369a0a013f534c83c4ca Mon Sep 17 00:00:00 2001 From: kunfei Date: Mon, 3 Feb 2020 20:32:03 +0800 Subject: [PATCH 057/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/io/legado/app/ui/changecover/ChangeCoverViewModel.kt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/changecover/ChangeCoverViewModel.kt b/app/src/main/java/io/legado/app/ui/changecover/ChangeCoverViewModel.kt index 5469717bd..27899a44c 100644 --- a/app/src/main/java/io/legado/app/ui/changecover/ChangeCoverViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/changecover/ChangeCoverViewModel.kt @@ -8,7 +8,6 @@ import io.legado.app.help.AppConfig import io.legado.app.help.coroutine.Coroutine import io.legado.app.model.WebBook import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.Dispatchers.Main import kotlinx.coroutines.asCoroutineDispatcher import kotlinx.coroutines.withContext import java.util.concurrent.Executors @@ -49,7 +48,7 @@ class ChangeCoverViewModel(application: Application) : BaseViewModel(application App.db.searchBookDao().insert(searchBook) callBack?.adapter?.let { adapter -> if (!adapter.getItems().contains(searchBook)) { - withContext(Main) { + withContext(Dispatchers.Main) { adapter.addItem(searchBook) } } From 682712cc842b73e82c39054f50cd2e2a6bf9fe91 Mon Sep 17 00:00:00 2001 From: kunfei Date: Mon, 3 Feb 2020 20:43:09 +0800 Subject: [PATCH 058/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/res/layout/item_cover.xml | 19 ++++++------------- 1 file changed, 6 insertions(+), 13 deletions(-) diff --git a/app/src/main/res/layout/item_cover.xml b/app/src/main/res/layout/item_cover.xml index b80cf9b6c..9956e4bd1 100644 --- a/app/src/main/res/layout/item_cover.xml +++ b/app/src/main/res/layout/item_cover.xml @@ -1,13 +1,12 @@ - + android:orientation="vertical"> - \ No newline at end of file + \ No newline at end of file From 7f2ba54d9d38facc36799485ee96a9bfbf3f9d0f Mon Sep 17 00:00:00 2001 From: kunfei Date: Mon, 3 Feb 2020 20:47:33 +0800 Subject: [PATCH 059/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../io/legado/app/ui/changecover/ChangeCoverDialog.kt | 10 ++++++++-- .../legado/app/ui/changecover/ChangeCoverViewModel.kt | 4 +++- .../java/io/legado/app/ui/changecover/CoverAdapter.kt | 6 +++--- 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/changecover/ChangeCoverDialog.kt b/app/src/main/java/io/legado/app/ui/changecover/ChangeCoverDialog.kt index 24ecbd7f0..73486159d 100644 --- a/app/src/main/java/io/legado/app/ui/changecover/ChangeCoverDialog.kt +++ b/app/src/main/java/io/legado/app/ui/changecover/ChangeCoverDialog.kt @@ -14,7 +14,9 @@ import io.legado.app.utils.getViewModel import kotlinx.android.synthetic.main.dialog_change_source.* -class ChangeCoverDialog : DialogFragment(), ChangeCoverViewModel.CallBack { +class ChangeCoverDialog : DialogFragment(), + ChangeCoverViewModel.CallBack, + CoverAdapter.CallBack { companion object { const val tag = "changeCoverDialog" @@ -68,11 +70,15 @@ class ChangeCoverDialog : DialogFragment(), ChangeCoverViewModel.CallBack { } } recycler_view.layoutManager = GridLayoutManager(requireContext(), 3) - adapter = CoverAdapter(requireContext()) + adapter = CoverAdapter(requireContext(), this) recycler_view.adapter = adapter viewModel.initData() } + override fun changeTo(coverUrl: String) { + callBack?.coverChangeTo(coverUrl) + } + interface CallBack { fun coverChangeTo(coverUrl: String) } diff --git a/app/src/main/java/io/legado/app/ui/changecover/ChangeCoverViewModel.kt b/app/src/main/java/io/legado/app/ui/changecover/ChangeCoverViewModel.kt index 27899a44c..d8ed01d9f 100644 --- a/app/src/main/java/io/legado/app/ui/changecover/ChangeCoverViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/changecover/ChangeCoverViewModel.kt @@ -44,7 +44,9 @@ class ChangeCoverViewModel(application: Application) : BaseViewModel(application .onSuccess(Dispatchers.IO) { if (it != null && it.isNotEmpty()) { val searchBook = it[0] - if (searchBook.name == name && searchBook.author == author) { + if (searchBook.name == name && searchBook.author == author + && !searchBook.coverUrl.isNullOrEmpty() + ) { App.db.searchBookDao().insert(searchBook) callBack?.adapter?.let { adapter -> if (!adapter.getItems().contains(searchBook)) { diff --git a/app/src/main/java/io/legado/app/ui/changecover/CoverAdapter.kt b/app/src/main/java/io/legado/app/ui/changecover/CoverAdapter.kt index f952a8b20..884e4adff 100644 --- a/app/src/main/java/io/legado/app/ui/changecover/CoverAdapter.kt +++ b/app/src/main/java/io/legado/app/ui/changecover/CoverAdapter.kt @@ -9,7 +9,7 @@ import io.legado.app.help.ImageLoader import kotlinx.android.synthetic.main.item_cover.view.* import org.jetbrains.anko.sdk27.listeners.onClick -class CoverAdapter(context: Context) : +class CoverAdapter(context: Context, val callBack: CallBack) : SimpleRecyclerAdapter(context, R.layout.item_cover) { override fun convert(holder: ItemViewHolder, item: SearchBook, payloads: MutableList) { @@ -22,12 +22,12 @@ class CoverAdapter(context: Context) : } tv_source.text = item.originName onClick { - + callBack.changeTo(item.coverUrl!!) } } } interface CallBack { - fun changeTo() + fun changeTo(coverUrl: String) } } \ No newline at end of file From 303d234ece494daad06cf5d7c67bbb24483e8833 Mon Sep 17 00:00:00 2001 From: kunfei Date: Mon, 3 Feb 2020 21:18:02 +0800 Subject: [PATCH 060/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/ui/widget/image/CoverImageView.kt | 28 +++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/widget/image/CoverImageView.kt b/app/src/main/java/io/legado/app/ui/widget/image/CoverImageView.kt index 289790a1a..2db34ef74 100644 --- a/app/src/main/java/io/legado/app/ui/widget/image/CoverImageView.kt +++ b/app/src/main/java/io/legado/app/ui/widget/image/CoverImageView.kt @@ -4,18 +4,31 @@ import android.annotation.SuppressLint import android.content.Context import android.graphics.Canvas import android.graphics.Path +import android.text.TextPaint import android.util.AttributeSet +import io.legado.app.utils.dp class CoverImageView : androidx.appcompat.widget.AppCompatImageView { internal var width: Float = 0.toFloat() internal var height: Float = 0.toFloat() + private val textPaint = TextPaint() + private var name: String? = null + constructor(context: Context) : super(context) constructor(context: Context, attrs: AttributeSet) : super(context, attrs) - constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int) : super(context, attrs, defStyleAttr) + constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int) : super( + context, + attrs, + defStyleAttr + ) + + init { + textPaint.textSize = 13.dp.toFloat() + } override fun onLayout(changed: Boolean, left: Int, top: Int, right: Int, bottom: Int) { super.onLayout(changed, left, top, right, bottom) @@ -26,7 +39,10 @@ class CoverImageView : androidx.appcompat.widget.AppCompatImageView { override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) { val measuredWidth = MeasureSpec.getSize(widthMeasureSpec) val measuredHeight = measuredWidth * 7 / 5 - super.onMeasure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(measuredHeight, MeasureSpec.EXACTLY)) + super.onMeasure( + widthMeasureSpec, + MeasureSpec.makeMeasureSpec(measuredHeight, MeasureSpec.EXACTLY) + ) } override fun onDraw(canvas: Canvas) { @@ -47,6 +63,14 @@ class CoverImageView : androidx.appcompat.widget.AppCompatImageView { canvas.clipPath(path) } super.onDraw(canvas) + name?.let { + canvas.drawText(it, width / 3, height * 2 / 3, textPaint) + } + } + + fun setName(name: String) { + this.name = name + invalidate() } fun setHeight(height: Int) { From da891e122732f767eca8761a6fff9a45da7656ab Mon Sep 17 00:00:00 2001 From: kunfei Date: Mon, 3 Feb 2020 21:55:41 +0800 Subject: [PATCH 061/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/ui/book/info/BookInfoActivity.kt | 28 ++++----- .../main/bookshelf/books/BooksAdapterGrid.kt | 9 +-- .../main/bookshelf/books/BooksAdapterList.kt | 9 +-- .../app/ui/widget/image/CoverImageView.kt | 59 +++++++++++++++---- 4 files changed, 62 insertions(+), 43 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/book/info/BookInfoActivity.kt b/app/src/main/java/io/legado/app/ui/book/info/BookInfoActivity.kt index 6f5c23d67..37d8c6d3f 100644 --- a/app/src/main/java/io/legado/app/ui/book/info/BookInfoActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/info/BookInfoActivity.kt @@ -106,11 +106,6 @@ class BookInfoActivity : return super.onMenuOpened(featureId, menu) } - private fun defaultCover(): RequestBuilder { - return ImageLoader.load(this, R.drawable.image_cover_default) - .apply(bitmapTransform(BlurTransformation(this, 25))) - } - private fun showBook(book: Book) { showCover(book) tv_name.text = book.name @@ -152,17 +147,18 @@ class BookInfoActivity : } private fun showCover(book: Book) { - book.getDisplayCover()?.let { - ImageLoader.load(this, it) - .centerCrop() - .into(iv_cover) - ImageLoader.load(this, it) - .transition(DrawableTransitionOptions.withCrossFade(1500)) - .thumbnail(defaultCover()) - .centerCrop() - .apply(bitmapTransform(BlurTransformation(this, 25))) - .into(bg_book) //模糊、渐变、缩小效果 - } + iv_cover.load(book.getDisplayCover(), book.name) + ImageLoader.load(this, book.getDisplayCover()) + .transition(DrawableTransitionOptions.withCrossFade(1500)) + .thumbnail(defaultCover()) + .centerCrop() + .apply(bitmapTransform(BlurTransformation(this, 25))) + .into(bg_book) //模糊、渐变、缩小效果 + } + + private fun defaultCover(): RequestBuilder { + return ImageLoader.load(this, R.drawable.image_cover_default) + .apply(bitmapTransform(BlurTransformation(this, 25))) } private fun showChapter(chapterList: List) { diff --git a/app/src/main/java/io/legado/app/ui/main/bookshelf/books/BooksAdapterGrid.kt b/app/src/main/java/io/legado/app/ui/main/bookshelf/books/BooksAdapterGrid.kt index f6761ce78..5cc19d9fc 100644 --- a/app/src/main/java/io/legado/app/ui/main/bookshelf/books/BooksAdapterGrid.kt +++ b/app/src/main/java/io/legado/app/ui/main/bookshelf/books/BooksAdapterGrid.kt @@ -5,7 +5,6 @@ import io.legado.app.R import io.legado.app.base.adapter.ItemViewHolder import io.legado.app.constant.BookType import io.legado.app.data.entities.Book -import io.legado.app.help.ImageLoader import io.legado.app.lib.theme.ATH import io.legado.app.utils.invisible import kotlinx.android.synthetic.main.item_bookshelf_grid.view.* @@ -21,13 +20,7 @@ class BooksAdapterGrid(context: Context, private val callBack: CallBack) : ATH.applyBackgroundTint(this) tv_name.text = item.name bv_author.text = item.author - item.getDisplayCover()?.let { - ImageLoader.load(context, it)//Glide自动识别http://和file:// - .placeholder(R.drawable.image_cover_default) - .error(R.drawable.image_cover_default) - .centerCrop() - .into(iv_cover) - } + iv_cover.load(item.getDisplayCover(), item.name) onClick { callBack.open(item) } onLongClick { callBack.openBookInfo(item) diff --git a/app/src/main/java/io/legado/app/ui/main/bookshelf/books/BooksAdapterList.kt b/app/src/main/java/io/legado/app/ui/main/bookshelf/books/BooksAdapterList.kt index 133f865d9..948b9128e 100644 --- a/app/src/main/java/io/legado/app/ui/main/bookshelf/books/BooksAdapterList.kt +++ b/app/src/main/java/io/legado/app/ui/main/bookshelf/books/BooksAdapterList.kt @@ -5,7 +5,6 @@ import io.legado.app.R import io.legado.app.base.adapter.ItemViewHolder import io.legado.app.constant.BookType import io.legado.app.data.entities.Book -import io.legado.app.help.ImageLoader import io.legado.app.lib.theme.ATH import io.legado.app.utils.invisible import kotlinx.android.synthetic.main.item_bookshelf_list.view.* @@ -23,13 +22,7 @@ class BooksAdapterList(context: Context, private val callBack: CallBack) : tv_author.text = item.author tv_read.text = item.durChapterTitle tv_last.text = item.latestChapterTitle - item.getDisplayCover()?.let { - ImageLoader.load(context, it)//Glide自动识别http://和file:// - .placeholder(R.drawable.image_cover_default) - .error(R.drawable.image_cover_default) - .centerCrop() - .into(iv_cover) - } + iv_cover.load(item.getDisplayCover(), item.name) onClick { callBack.open(item) } onLongClick { callBack.openBookInfo(item) diff --git a/app/src/main/java/io/legado/app/ui/widget/image/CoverImageView.kt b/app/src/main/java/io/legado/app/ui/widget/image/CoverImageView.kt index 2db34ef74..8e520d222 100644 --- a/app/src/main/java/io/legado/app/ui/widget/image/CoverImageView.kt +++ b/app/src/main/java/io/legado/app/ui/widget/image/CoverImageView.kt @@ -4,9 +4,15 @@ import android.annotation.SuppressLint import android.content.Context import android.graphics.Canvas import android.graphics.Path +import android.graphics.drawable.Drawable import android.text.TextPaint import android.util.AttributeSet -import io.legado.app.utils.dp +import com.bumptech.glide.load.DataSource +import com.bumptech.glide.load.engine.GlideException +import com.bumptech.glide.request.RequestListener +import com.bumptech.glide.request.target.Target +import io.legado.app.R +import io.legado.app.help.ImageLoader class CoverImageView : androidx.appcompat.widget.AppCompatImageView { @@ -26,16 +32,6 @@ class CoverImageView : androidx.appcompat.widget.AppCompatImageView { defStyleAttr ) - init { - textPaint.textSize = 13.dp.toFloat() - } - - override fun onLayout(changed: Boolean, left: Int, top: Int, right: Int, bottom: Int) { - super.onLayout(changed, left, top, right, bottom) - width = getWidth().toFloat() - height = getHeight().toFloat() - } - override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) { val measuredWidth = MeasureSpec.getSize(widthMeasureSpec) val measuredHeight = measuredWidth * 7 / 5 @@ -45,6 +41,13 @@ class CoverImageView : androidx.appcompat.widget.AppCompatImageView { ) } + override fun onLayout(changed: Boolean, left: Int, top: Int, right: Int, bottom: Int) { + super.onLayout(changed, left, top, right, bottom) + width = getWidth().toFloat() + height = getHeight().toFloat() + textPaint.textSize = width / 9 + } + override fun onDraw(canvas: Canvas) { if (width >= 10 && height > 10) { @SuppressLint("DrawAllocation") @@ -77,4 +80,38 @@ class CoverImageView : androidx.appcompat.widget.AppCompatImageView { val width = height * 5 / 7 minimumWidth = width } + + fun load(path: String?, name: String) { + if (path.isNullOrEmpty()) { + setName(name) + } else { + ImageLoader.load(context, path)//Glide自动识别http://和file:// + .placeholder(R.drawable.image_cover_default) + .error(R.drawable.image_cover_default) + .listener(object : RequestListener { + override fun onLoadFailed( + e: GlideException?, + model: Any?, + target: Target?, + isFirstResource: Boolean + ): Boolean { + setName(name) + return false + } + + override fun onResourceReady( + resource: Drawable?, + model: Any?, + target: Target?, + dataSource: DataSource?, + isFirstResource: Boolean + ): Boolean { + return false + } + + }) + .centerCrop() + .into(this) + } + } } From 150d1b15bc71ead3b397dc6b434f9c78b88524d6 Mon Sep 17 00:00:00 2001 From: kunfei Date: Mon, 3 Feb 2020 21:59:34 +0800 Subject: [PATCH 062/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../legado/app/ui/book/info/edit/BookInfoEditActivity.kt | 7 ++----- .../java/io/legado/app/ui/book/search/SearchAdapter.kt | 8 +------- .../java/io/legado/app/ui/widget/image/CoverImageView.kt | 5 +++-- 3 files changed, 6 insertions(+), 14 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/book/info/edit/BookInfoEditActivity.kt b/app/src/main/java/io/legado/app/ui/book/info/edit/BookInfoEditActivity.kt index a4e420af1..9f7b387f2 100644 --- a/app/src/main/java/io/legado/app/ui/book/info/edit/BookInfoEditActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/info/edit/BookInfoEditActivity.kt @@ -8,7 +8,6 @@ import androidx.lifecycle.Observer import io.legado.app.R import io.legado.app.base.VMBaseActivity import io.legado.app.data.entities.Book -import io.legado.app.help.ImageLoader import io.legado.app.ui.changecover.ChangeCoverDialog import io.legado.app.utils.getViewModel import kotlinx.android.synthetic.main.activity_book_info_edit.* @@ -59,10 +58,8 @@ class BookInfoEditActivity : } private fun upCover() { - viewModel.book?.getDisplayCover()?.let { - ImageLoader.load(this, it) - .centerCrop() - .into(iv_cover) + viewModel.book.let { + iv_cover.load(it?.getDisplayCover(), it?.name) } } diff --git a/app/src/main/java/io/legado/app/ui/book/search/SearchAdapter.kt b/app/src/main/java/io/legado/app/ui/book/search/SearchAdapter.kt index 04d2e46f8..49127927f 100644 --- a/app/src/main/java/io/legado/app/ui/book/search/SearchAdapter.kt +++ b/app/src/main/java/io/legado/app/ui/book/search/SearchAdapter.kt @@ -67,13 +67,7 @@ class SearchAdapter(context: Context, val callBack: CallBack) : } } } - searchBook.coverUrl.let { - ImageLoader.load(context, it)//Glide自动识别http://和file:// - .placeholder(R.drawable.image_cover_default) - .error(R.drawable.image_cover_default) - .centerCrop() - .into(iv_cover) - } + iv_cover.load(searchBook.coverUrl, searchBook.name) onClick { callBack.showBookInfo(searchBook.name, searchBook.author) } diff --git a/app/src/main/java/io/legado/app/ui/widget/image/CoverImageView.kt b/app/src/main/java/io/legado/app/ui/widget/image/CoverImageView.kt index 8e520d222..33cb24b43 100644 --- a/app/src/main/java/io/legado/app/ui/widget/image/CoverImageView.kt +++ b/app/src/main/java/io/legado/app/ui/widget/image/CoverImageView.kt @@ -71,7 +71,7 @@ class CoverImageView : androidx.appcompat.widget.AppCompatImageView { } } - fun setName(name: String) { + fun setName(name: String?) { this.name = name invalidate() } @@ -81,7 +81,7 @@ class CoverImageView : androidx.appcompat.widget.AppCompatImageView { minimumWidth = width } - fun load(path: String?, name: String) { + fun load(path: String?, name: String?) { if (path.isNullOrEmpty()) { setName(name) } else { @@ -106,6 +106,7 @@ class CoverImageView : androidx.appcompat.widget.AppCompatImageView { dataSource: DataSource?, isFirstResource: Boolean ): Boolean { + setName(null) return false } From 5feebce678c9e375180c0bc21876635031076357 Mon Sep 17 00:00:00 2001 From: kunfei Date: Mon, 3 Feb 2020 22:01:26 +0800 Subject: [PATCH 063/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/io/legado/app/ui/explore/ExploreShowAdapter.kt | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/explore/ExploreShowAdapter.kt b/app/src/main/java/io/legado/app/ui/explore/ExploreShowAdapter.kt index d25e7f255..9afad2422 100644 --- a/app/src/main/java/io/legado/app/ui/explore/ExploreShowAdapter.kt +++ b/app/src/main/java/io/legado/app/ui/explore/ExploreShowAdapter.kt @@ -6,7 +6,6 @@ import io.legado.app.base.adapter.ItemViewHolder import io.legado.app.base.adapter.SimpleRecyclerAdapter import io.legado.app.data.entities.Book import io.legado.app.data.entities.SearchBook -import io.legado.app.help.ImageLoader import io.legado.app.utils.gone import io.legado.app.utils.visible import kotlinx.android.synthetic.main.item_bookshelf_list.view.iv_cover @@ -58,13 +57,7 @@ class ExploreShowAdapter(context: Context, val callBack: CallBack) : } } } - item.coverUrl.let { - ImageLoader.load(context, it)//Glide自动识别http://和file:// - .placeholder(R.drawable.image_cover_default) - .error(R.drawable.image_cover_default) - .centerCrop() - .into(iv_cover) - } + iv_cover.load(item.coverUrl, item.name) onClick { callBack.showBookInfo(item.toBook()) } From 88482d25d7cec430fde3f7ae5442c32ad2254842 Mon Sep 17 00:00:00 2001 From: kunfei Date: Mon, 3 Feb 2020 22:02:16 +0800 Subject: [PATCH 064/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/io/legado/app/ui/changecover/CoverAdapter.kt | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/changecover/CoverAdapter.kt b/app/src/main/java/io/legado/app/ui/changecover/CoverAdapter.kt index 884e4adff..e6934675d 100644 --- a/app/src/main/java/io/legado/app/ui/changecover/CoverAdapter.kt +++ b/app/src/main/java/io/legado/app/ui/changecover/CoverAdapter.kt @@ -5,7 +5,6 @@ import io.legado.app.R import io.legado.app.base.adapter.ItemViewHolder import io.legado.app.base.adapter.SimpleRecyclerAdapter import io.legado.app.data.entities.SearchBook -import io.legado.app.help.ImageLoader import kotlinx.android.synthetic.main.item_cover.view.* import org.jetbrains.anko.sdk27.listeners.onClick @@ -14,12 +13,7 @@ class CoverAdapter(context: Context, val callBack: CallBack) : override fun convert(holder: ItemViewHolder, item: SearchBook, payloads: MutableList) { with(holder.itemView) { - item.coverUrl?.let { - ImageLoader.load(context, it) - .error(R.drawable.image_cover_default) - .centerCrop() - .into(iv_cover) - } + iv_cover.load(item.coverUrl, item.name) tv_source.text = item.originName onClick { callBack.changeTo(item.coverUrl!!) From 12f49e3df3754115daa37280d0fbe370170cba39 Mon Sep 17 00:00:00 2001 From: kunfei Date: Mon, 3 Feb 2020 22:12:28 +0800 Subject: [PATCH 065/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/io/legado/app/ui/widget/image/CoverImageView.kt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/src/main/java/io/legado/app/ui/widget/image/CoverImageView.kt b/app/src/main/java/io/legado/app/ui/widget/image/CoverImageView.kt index 33cb24b43..eb82ad0d5 100644 --- a/app/src/main/java/io/legado/app/ui/widget/image/CoverImageView.kt +++ b/app/src/main/java/io/legado/app/ui/widget/image/CoverImageView.kt @@ -4,6 +4,7 @@ import android.annotation.SuppressLint import android.content.Context import android.graphics.Canvas import android.graphics.Path +import android.graphics.Typeface import android.graphics.drawable.Drawable import android.text.TextPaint import android.util.AttributeSet @@ -46,6 +47,7 @@ class CoverImageView : androidx.appcompat.widget.AppCompatImageView { width = getWidth().toFloat() height = getHeight().toFloat() textPaint.textSize = width / 9 + textPaint.typeface = Typeface.DEFAULT_BOLD } override fun onDraw(canvas: Canvas) { From c8a47f789150f683d4219db6eb00274dccae195d Mon Sep 17 00:00:00 2001 From: kunfei Date: Mon, 3 Feb 2020 22:38:37 +0800 Subject: [PATCH 066/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/ui/widget/image/CoverImageView.kt | 20 +++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/widget/image/CoverImageView.kt b/app/src/main/java/io/legado/app/ui/widget/image/CoverImageView.kt index eb82ad0d5..06cefd274 100644 --- a/app/src/main/java/io/legado/app/ui/widget/image/CoverImageView.kt +++ b/app/src/main/java/io/legado/app/ui/widget/image/CoverImageView.kt @@ -2,9 +2,7 @@ package io.legado.app.ui.widget.image import android.annotation.SuppressLint import android.content.Context -import android.graphics.Canvas -import android.graphics.Path -import android.graphics.Typeface +import android.graphics.* import android.graphics.drawable.Drawable import android.text.TextPaint import android.util.AttributeSet @@ -33,6 +31,11 @@ class CoverImageView : androidx.appcompat.widget.AppCompatImageView { defStyleAttr ) + init { + textPaint.typeface = Typeface.DEFAULT_BOLD + textPaint.isAntiAlias = true + } + override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) { val measuredWidth = MeasureSpec.getSize(widthMeasureSpec) val measuredHeight = measuredWidth * 7 / 5 @@ -46,8 +49,8 @@ class CoverImageView : androidx.appcompat.widget.AppCompatImageView { super.onLayout(changed, left, top, right, bottom) width = getWidth().toFloat() height = getHeight().toFloat() - textPaint.textSize = width / 9 - textPaint.typeface = Typeface.DEFAULT_BOLD + textPaint.textSize = width / 8 + textPaint.strokeWidth = textPaint.textSize / 10 } override fun onDraw(canvas: Canvas) { @@ -69,7 +72,12 @@ class CoverImageView : androidx.appcompat.widget.AppCompatImageView { } super.onDraw(canvas) name?.let { - canvas.drawText(it, width / 3, height * 2 / 3, textPaint) + textPaint.color = Color.WHITE + textPaint.style = Paint.Style.STROKE + canvas.drawText(it, width / 6, height * 2 / 3, textPaint) + textPaint.color = Color.BLACK + textPaint.style = Paint.Style.FILL + canvas.drawText(it, width / 6, height * 2 / 3, textPaint) } } From 9acd86f556d4ca830fb3c18bee5f414b88ac9c80 Mon Sep 17 00:00:00 2001 From: kunfei Date: Tue, 4 Feb 2020 08:40:56 +0800 Subject: [PATCH 067/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/ui/book/info/BookInfoActivity.kt | 2 +- .../ui/book/info/edit/BookInfoEditActivity.kt | 2 +- .../app/ui/book/search/SearchAdapter.kt | 2 +- .../legado/app/ui/changecover/CoverAdapter.kt | 2 +- .../app/ui/explore/ExploreShowAdapter.kt | 2 +- .../main/bookshelf/books/BooksAdapterGrid.kt | 2 +- .../main/bookshelf/books/BooksAdapterList.kt | 2 +- .../app/ui/widget/image/CoverImageView.kt | 66 +++++++++---------- 8 files changed, 39 insertions(+), 41 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/book/info/BookInfoActivity.kt b/app/src/main/java/io/legado/app/ui/book/info/BookInfoActivity.kt index 37d8c6d3f..6b0e5433f 100644 --- a/app/src/main/java/io/legado/app/ui/book/info/BookInfoActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/info/BookInfoActivity.kt @@ -147,7 +147,7 @@ class BookInfoActivity : } private fun showCover(book: Book) { - iv_cover.load(book.getDisplayCover(), book.name) + iv_cover.load(book.getDisplayCover(), book.name, book.author) ImageLoader.load(this, book.getDisplayCover()) .transition(DrawableTransitionOptions.withCrossFade(1500)) .thumbnail(defaultCover()) diff --git a/app/src/main/java/io/legado/app/ui/book/info/edit/BookInfoEditActivity.kt b/app/src/main/java/io/legado/app/ui/book/info/edit/BookInfoEditActivity.kt index 9f7b387f2..6bcae9257 100644 --- a/app/src/main/java/io/legado/app/ui/book/info/edit/BookInfoEditActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/info/edit/BookInfoEditActivity.kt @@ -59,7 +59,7 @@ class BookInfoEditActivity : private fun upCover() { viewModel.book.let { - iv_cover.load(it?.getDisplayCover(), it?.name) + iv_cover.load(it?.getDisplayCover(), it?.name, it?.author) } } diff --git a/app/src/main/java/io/legado/app/ui/book/search/SearchAdapter.kt b/app/src/main/java/io/legado/app/ui/book/search/SearchAdapter.kt index 49127927f..4a725e854 100644 --- a/app/src/main/java/io/legado/app/ui/book/search/SearchAdapter.kt +++ b/app/src/main/java/io/legado/app/ui/book/search/SearchAdapter.kt @@ -67,7 +67,7 @@ class SearchAdapter(context: Context, val callBack: CallBack) : } } } - iv_cover.load(searchBook.coverUrl, searchBook.name) + iv_cover.load(searchBook.coverUrl, searchBook.name, searchBook.author) onClick { callBack.showBookInfo(searchBook.name, searchBook.author) } diff --git a/app/src/main/java/io/legado/app/ui/changecover/CoverAdapter.kt b/app/src/main/java/io/legado/app/ui/changecover/CoverAdapter.kt index e6934675d..a26c21f57 100644 --- a/app/src/main/java/io/legado/app/ui/changecover/CoverAdapter.kt +++ b/app/src/main/java/io/legado/app/ui/changecover/CoverAdapter.kt @@ -13,7 +13,7 @@ class CoverAdapter(context: Context, val callBack: CallBack) : override fun convert(holder: ItemViewHolder, item: SearchBook, payloads: MutableList) { with(holder.itemView) { - iv_cover.load(item.coverUrl, item.name) + iv_cover.load(item.coverUrl, item.name, item.author) tv_source.text = item.originName onClick { callBack.changeTo(item.coverUrl!!) diff --git a/app/src/main/java/io/legado/app/ui/explore/ExploreShowAdapter.kt b/app/src/main/java/io/legado/app/ui/explore/ExploreShowAdapter.kt index 9afad2422..8e2fcf5e8 100644 --- a/app/src/main/java/io/legado/app/ui/explore/ExploreShowAdapter.kt +++ b/app/src/main/java/io/legado/app/ui/explore/ExploreShowAdapter.kt @@ -57,7 +57,7 @@ class ExploreShowAdapter(context: Context, val callBack: CallBack) : } } } - iv_cover.load(item.coverUrl, item.name) + iv_cover.load(item.coverUrl, item.name, item.author) onClick { callBack.showBookInfo(item.toBook()) } diff --git a/app/src/main/java/io/legado/app/ui/main/bookshelf/books/BooksAdapterGrid.kt b/app/src/main/java/io/legado/app/ui/main/bookshelf/books/BooksAdapterGrid.kt index 5cc19d9fc..ffb608f4f 100644 --- a/app/src/main/java/io/legado/app/ui/main/bookshelf/books/BooksAdapterGrid.kt +++ b/app/src/main/java/io/legado/app/ui/main/bookshelf/books/BooksAdapterGrid.kt @@ -20,7 +20,7 @@ class BooksAdapterGrid(context: Context, private val callBack: CallBack) : ATH.applyBackgroundTint(this) tv_name.text = item.name bv_author.text = item.author - iv_cover.load(item.getDisplayCover(), item.name) + iv_cover.load(item.getDisplayCover(), item.name, item.author) onClick { callBack.open(item) } onLongClick { callBack.openBookInfo(item) diff --git a/app/src/main/java/io/legado/app/ui/main/bookshelf/books/BooksAdapterList.kt b/app/src/main/java/io/legado/app/ui/main/bookshelf/books/BooksAdapterList.kt index 948b9128e..71b70f0c2 100644 --- a/app/src/main/java/io/legado/app/ui/main/bookshelf/books/BooksAdapterList.kt +++ b/app/src/main/java/io/legado/app/ui/main/bookshelf/books/BooksAdapterList.kt @@ -22,7 +22,7 @@ class BooksAdapterList(context: Context, private val callBack: CallBack) : tv_author.text = item.author tv_read.text = item.durChapterTitle tv_last.text = item.latestChapterTitle - iv_cover.load(item.getDisplayCover(), item.name) + iv_cover.load(item.getDisplayCover(), item.name, item.author) onClick { callBack.open(item) } onLongClick { callBack.openBookInfo(item) diff --git a/app/src/main/java/io/legado/app/ui/widget/image/CoverImageView.kt b/app/src/main/java/io/legado/app/ui/widget/image/CoverImageView.kt index 06cefd274..2f7bfb74e 100644 --- a/app/src/main/java/io/legado/app/ui/widget/image/CoverImageView.kt +++ b/app/src/main/java/io/legado/app/ui/widget/image/CoverImageView.kt @@ -20,6 +20,7 @@ class CoverImageView : androidx.appcompat.widget.AppCompatImageView { private val textPaint = TextPaint() private var name: String? = null + private var author: String? = null constructor(context: Context) : super(context) @@ -81,8 +82,9 @@ class CoverImageView : androidx.appcompat.widget.AppCompatImageView { } } - fun setName(name: String?) { + fun setName(name: String?, author: String?) { this.name = name + this.author = author invalidate() } @@ -91,38 +93,34 @@ class CoverImageView : androidx.appcompat.widget.AppCompatImageView { minimumWidth = width } - fun load(path: String?, name: String?) { - if (path.isNullOrEmpty()) { - setName(name) - } else { - ImageLoader.load(context, path)//Glide自动识别http://和file:// - .placeholder(R.drawable.image_cover_default) - .error(R.drawable.image_cover_default) - .listener(object : RequestListener { - override fun onLoadFailed( - e: GlideException?, - model: Any?, - target: Target?, - isFirstResource: Boolean - ): Boolean { - setName(name) - return false - } - - override fun onResourceReady( - resource: Drawable?, - model: Any?, - target: Target?, - dataSource: DataSource?, - isFirstResource: Boolean - ): Boolean { - setName(null) - return false - } - - }) - .centerCrop() - .into(this) - } + fun load(path: String?, name: String?, author: String?) { + ImageLoader.load(context, path)//Glide自动识别http://和file:// + .placeholder(R.drawable.image_cover_default) + .error(R.drawable.image_cover_default) + .listener(object : RequestListener { + override fun onLoadFailed( + e: GlideException?, + model: Any?, + target: Target?, + isFirstResource: Boolean + ): Boolean { + setName(name, author) + return false + } + + override fun onResourceReady( + resource: Drawable?, + model: Any?, + target: Target?, + dataSource: DataSource?, + isFirstResource: Boolean + ): Boolean { + setName(null, null) + return false + } + + }) + .centerCrop() + .into(this) } } From a34697b5404da7415cd9a448dd0421ca6dc04824 Mon Sep 17 00:00:00 2001 From: kunfei Date: Tue, 4 Feb 2020 09:05:02 +0800 Subject: [PATCH 068/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../legado/app/ui/widget/image/CoverImageView.kt | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/widget/image/CoverImageView.kt b/app/src/main/java/io/legado/app/ui/widget/image/CoverImageView.kt index 2f7bfb74e..a494f9ca9 100644 --- a/app/src/main/java/io/legado/app/ui/widget/image/CoverImageView.kt +++ b/app/src/main/java/io/legado/app/ui/widget/image/CoverImageView.kt @@ -35,6 +35,8 @@ class CoverImageView : androidx.appcompat.widget.AppCompatImageView { init { textPaint.typeface = Typeface.DEFAULT_BOLD textPaint.isAntiAlias = true + textPaint.textAlign = Paint.Align.CENTER + textPaint.textSkewX = -0.2f } override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) { @@ -50,7 +52,7 @@ class CoverImageView : androidx.appcompat.widget.AppCompatImageView { super.onLayout(changed, left, top, right, bottom) width = getWidth().toFloat() height = getHeight().toFloat() - textPaint.textSize = width / 8 + textPaint.textSize = width / 6 textPaint.strokeWidth = textPaint.textSize / 10 } @@ -75,15 +77,20 @@ class CoverImageView : androidx.appcompat.widget.AppCompatImageView { name?.let { textPaint.color = Color.WHITE textPaint.style = Paint.Style.STROKE - canvas.drawText(it, width / 6, height * 2 / 3, textPaint) + canvas.drawText(it, width / 2, height * 3 / 5, textPaint) textPaint.color = Color.BLACK textPaint.style = Paint.Style.FILL - canvas.drawText(it, width / 6, height * 2 / 3, textPaint) + canvas.drawText(it, width / 2, height * 3 / 5, textPaint) } } fun setName(name: String?, author: String?) { - this.name = name + this.name = + when { + name == null -> null + name.length > 5 -> name.substring(0, 4) + "…" + else -> name + } this.author = author invalidate() } From d6367e716fb88246ba3f393d6089c67b5367688e Mon Sep 17 00:00:00 2001 From: kunfei Date: Tue, 4 Feb 2020 09:30:33 +0800 Subject: [PATCH 069/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/ui/widget/image/CoverImageView.kt | 53 +++++++++++++------ 1 file changed, 38 insertions(+), 15 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/widget/image/CoverImageView.kt b/app/src/main/java/io/legado/app/ui/widget/image/CoverImageView.kt index a494f9ca9..014280a7a 100644 --- a/app/src/main/java/io/legado/app/ui/widget/image/CoverImageView.kt +++ b/app/src/main/java/io/legado/app/ui/widget/image/CoverImageView.kt @@ -17,8 +17,10 @@ import io.legado.app.help.ImageLoader class CoverImageView : androidx.appcompat.widget.AppCompatImageView { internal var width: Float = 0.toFloat() internal var height: Float = 0.toFloat() - - private val textPaint = TextPaint() + private var nameHeight = 0f + private var authorHeight = 0f + private val namePaint = TextPaint() + private val authorPaint = TextPaint() private var name: String? = null private var author: String? = null @@ -33,10 +35,14 @@ class CoverImageView : androidx.appcompat.widget.AppCompatImageView { ) init { - textPaint.typeface = Typeface.DEFAULT_BOLD - textPaint.isAntiAlias = true - textPaint.textAlign = Paint.Align.CENTER - textPaint.textSkewX = -0.2f + namePaint.typeface = Typeface.DEFAULT_BOLD + namePaint.isAntiAlias = true + namePaint.textAlign = Paint.Align.CENTER + namePaint.textSkewX = -0.2f + authorPaint.typeface = Typeface.DEFAULT + authorPaint.isAntiAlias = true + authorPaint.textAlign = Paint.Align.CENTER + authorPaint.textSkewX = -0.1f } override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) { @@ -52,8 +58,12 @@ class CoverImageView : androidx.appcompat.widget.AppCompatImageView { super.onLayout(changed, left, top, right, bottom) width = getWidth().toFloat() height = getHeight().toFloat() - textPaint.textSize = width / 6 - textPaint.strokeWidth = textPaint.textSize / 10 + namePaint.textSize = width / 6 + namePaint.strokeWidth = namePaint.textSize / 10 + authorPaint.textSize = width / 9 + authorPaint.strokeWidth = authorPaint.textSize / 10 + nameHeight = height * 3 / 5 + authorHeight = nameHeight + authorPaint.fontSpacing } override fun onDraw(canvas: Canvas) { @@ -75,12 +85,20 @@ class CoverImageView : androidx.appcompat.widget.AppCompatImageView { } super.onDraw(canvas) name?.let { - textPaint.color = Color.WHITE - textPaint.style = Paint.Style.STROKE - canvas.drawText(it, width / 2, height * 3 / 5, textPaint) - textPaint.color = Color.BLACK - textPaint.style = Paint.Style.FILL - canvas.drawText(it, width / 2, height * 3 / 5, textPaint) + namePaint.color = Color.WHITE + namePaint.style = Paint.Style.STROKE + canvas.drawText(it, width / 2, nameHeight, namePaint) + namePaint.color = Color.BLACK + namePaint.style = Paint.Style.FILL + canvas.drawText(it, width / 2, nameHeight, namePaint) + } + author?.let { + authorPaint.color = Color.WHITE + authorPaint.style = Paint.Style.STROKE + canvas.drawText(it, width / 2, authorHeight, authorPaint) + authorPaint.color = Color.BLACK + authorPaint.style = Paint.Style.FILL + canvas.drawText(it, width / 2, authorHeight, authorPaint) } } @@ -91,7 +109,12 @@ class CoverImageView : androidx.appcompat.widget.AppCompatImageView { name.length > 5 -> name.substring(0, 4) + "…" else -> name } - this.author = author + this.author = + when { + author == null -> null + author.length > 8 -> author.substring(0, 7) + "…" + else -> author + } invalidate() } From e5bd78d50118484545a57c5deed8b5cccef95068 Mon Sep 17 00:00:00 2001 From: kunfei Date: Tue, 4 Feb 2020 09:52:28 +0800 Subject: [PATCH 070/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/ui/widget/image/CoverImageView.kt | 6 +++--- .../main/res/drawable/image_cover_default.jpg | Bin 6927 -> 11323 bytes 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/widget/image/CoverImageView.kt b/app/src/main/java/io/legado/app/ui/widget/image/CoverImageView.kt index 014280a7a..64e61508b 100644 --- a/app/src/main/java/io/legado/app/ui/widget/image/CoverImageView.kt +++ b/app/src/main/java/io/legado/app/ui/widget/image/CoverImageView.kt @@ -62,7 +62,7 @@ class CoverImageView : androidx.appcompat.widget.AppCompatImageView { namePaint.strokeWidth = namePaint.textSize / 10 authorPaint.textSize = width / 9 authorPaint.strokeWidth = authorPaint.textSize / 10 - nameHeight = height * 3 / 5 + nameHeight = height / 2 authorHeight = nameHeight + authorPaint.fontSpacing } @@ -88,7 +88,7 @@ class CoverImageView : androidx.appcompat.widget.AppCompatImageView { namePaint.color = Color.WHITE namePaint.style = Paint.Style.STROKE canvas.drawText(it, width / 2, nameHeight, namePaint) - namePaint.color = Color.BLACK + namePaint.color = Color.RED namePaint.style = Paint.Style.FILL canvas.drawText(it, width / 2, nameHeight, namePaint) } @@ -96,7 +96,7 @@ class CoverImageView : androidx.appcompat.widget.AppCompatImageView { authorPaint.color = Color.WHITE authorPaint.style = Paint.Style.STROKE canvas.drawText(it, width / 2, authorHeight, authorPaint) - authorPaint.color = Color.BLACK + authorPaint.color = Color.RED authorPaint.style = Paint.Style.FILL canvas.drawText(it, width / 2, authorHeight, authorPaint) } diff --git a/app/src/main/res/drawable/image_cover_default.jpg b/app/src/main/res/drawable/image_cover_default.jpg index 6504a4e7e8857ff417e2564aec97897265ef3289..0b502033cdc6c48b811d9880eaadf55438cb965b 100644 GIT binary patch literal 11323 zcmb8VcTm$$)IRzN3B5`aloB9Fkq%O&wo!Ob)ea_6z?Cv?wo~wzg1%LsmgU|s$AOHYe7vO3d z&;+O{Darr0Qc_-b{|D5R)YLT8*Nv8e<^~-t9StKpBmXT^Sm3Wx`hXh1UL2Z2$m+ z{s+MS0}u%qLP|z{J*db4fWX%vfslg1q}LMx5XlW504&Ll$a+~)&6~t zS!0n5wa+JQ;~mBVlga-d;{Rp+|1kf*#3DBU5)u;7H8C0Z|JuD~2J=Wl7>(7RG4Xm; zkuoP<(}phYUrhlt*M_f0Zvd*mh5Bq?yMssG6hZW^Fw#+@hTWQ)M6>?qfVo&tj)R9x zT+*&+-NGYqCF?&gm2Qjy-9RnF_KeEVDUGaBfSfqI(qV;UZ_=fRgk0cs zihx~KxWnJ!E(j#?If@Pr3NZrrT}E3bY)?mDuW;!h_|hMkax>0gDOWmnVFR$&AbeQir|TsjHhZ7SH{mpvcRD)$F=Qzw zyy=!(s)i6H?V|)GPt4Vutk|jdJ)8ZlB)k0>aS9(!DYXpsHHIP}yAPE!c2RLA^9eJP zS}Ej8v>EOPW;YFu4C0&(%k;nGs#t_g!NtyuQS;$9dY&h{iEu8Skxx++s6?b0zY7_1 zE3r~b@RS@{)qJNbzZ1|c2&LIuZ>BrBeWuO6pTooqJl?)9?V-8Eb>Hxh;3fB5YOor| zIABWhaRit`Jlm}$4c!`{X>k&mf(Cyc(5b#11(oTOxXnVXZ7@6UO*U|90%50_K2~vg z(vTIsy%zOCg<`==W0=8IOwCo zZp%J?DYr?sAYprgqjw2oYS`#I;dWSHz-?`?d%!GgD)F~pO*Dr^(@{+AMNL|fZ#-~} z_dYaO++*)Z<1NO=(N@iBt4dAvIBuOob)v)b{b3Lz}n=vXN3y~Pg{rC2p&xVACYY*HxC+*&sL&(P9U zc=ffVVtFpD3#!7In(8Kx2#D@>U_(X4hl0zxFaLrZCQ;iTjPS#`1@4D`v+RGPX}gHB zJLNoZxLJyjH>3Ddp<8MajBMQHFZE&5N1Cf7 zy_wok>3m0@!Y$97Jbd1GA$Ys>`})8woataU(An;AHvBh|No->8ENAd-q$g-4YYF46 zgh3~G!MQuRo)p=24{0Qb$a?y+5mu)jkB|-Yo5;^*h3_8ZdYs1sj^IkJ$1av8YfpoY zVqb-sH}H9Cg>=d8uM9OAF-YBS+ItSO&~K{W;a$A~{^fzpQeQs*nBpQ}MG%^tjbl*q zcwBcvv*0x#66q*H&;Dk(PE@k^=zbH2iTgKA8Nb|{k)kstdtOeaBZEpI4f1Q4`h6tKc>uu>-F3q@0(cdH7GAw$Vem zpt_+A@r;sxA{E1^&KNl6udd|dWc&*f^@=BxGuO9FEZj}lcqADHCQ7WZDG9H9wY)cjSw%+X5%-ykb zFsnaZ@+sxLcIRW7a=RHLSoz}VP~F{;CG*~eYIyp{2(kTzU@`yA=f{Hh_7|dUxk|ue z67-we2laGwT5#s}AkmJ8@vik|_oqhzkeiW__GI!H^!X+V z5a8(;ln3ZkGsZc?8*LuvFyA=vooRI2O!hcHi;K>THJ&vnM;I#wTmiJa=%~mmAf4gC zYEKv_bSeX*<|}gBW~fFLPsJrGr_Qs4-=N&ZH+(V9Qal!w5r;%(2~iuVi_+b5b&ps0u-btTwwWw)IP4po?*Iz)D>WM5KJF1%2 z1_+2a&Wrix-kCsEKrposA`&1Kt_hDF5qnU|S5x}*!1W5yP&-Oz zpZM&)wKK%reSMN~Xs)phx~C5gKml_FJjKZ`e}czZhi=UOY8?H{q~*Obgv zUnpZpZnz0Kf%=TUExrxNUrixVu_s1QTyJdX?FQ!$^u!a(FU++s(G`b+p9ymmyh{w_ zFlS@F|H{A7SO5H&oimKpDS(q6Lmiw_i~XZ*e%dt*@6J^{`{`#-2^BC$JX77F3o!hx z{X+b`{_nPuV^pFWh_Wv3*ljXP`$sZEpy8^v+``KH2;q#$xhEXx%$v>^f(8Y6ci%gX z)2Fc<+;j@lwUYRS%HzCcx*pDN^)keU1kts3d^_?XCj>91meX7TV|U(wR|PC5=6z}S zg1OArzpw+C)*`vi9Mhq%2dTrGdBoPo zC`t3xY`)|rR=&$R4k_0dcb^iovUujkkGv16{A(%4z0KEUJ7#e@t7>d(q1NaIzYB*D zyVWFF^r*a%Pq?(FF9bIg-HDWz|C;b$AE8I0>%!Q8Qg;x1#)Zp%)8AUxsG_y}^rpx8 z@8Zk+zMrlZ+N~*WtZFaOR;9g<(9teSaGHow8NXAE^;rNI^U3tyZxT7W8(QmaohNt z%Va2h)5S0AZ>Qe-u$&)>m%h7N44@8fn!VW~a1(><4k&V4$Jb`N`o=E2wS1+TReCDj z3g-u8`(Xu*Zp`2v0SRXM9bd*P!0Oj>WxVD#ifx7`Tdi$`rXxH%WB^pqtxng`ec1nF z#;PK<q!mYTNkxh z$~Iji;PG|d8z=-~)C2zPF9{~>+sZwbId`j?Fn_#ko7%0E&%KXtEO3{zIITCjZsNel z%gkpgi=S_)59QR#l5n@aEAiwZgTq#}p^-GZoSRJuTJd%n2c_`(;a7R#3Y{ulIb4E9 z_tCc14}uR2t8P>Yc;1ycA2Mn8=Gc;bcKICM<_l#H^mgLHsBR9#+EIi;Y9(}89LReN<=wN#-&GC~nmsfx(g^D@TTjG4UDSupI zR`1c&`>FTiqc5d4R%baskf-k1y)4=g%|B7AbDM6o1`*N2g{q>6ZBmthM?wAg?a*?B z4v|PP_SkZa1JZr?K7gj>!2Nb>rb7xc-a=si&f56XFpy=Y)bKrtNf*Ae&t4ivuTznz zl_m@b4Wzj)RZt#_ckx{`;iJ#%@&=mj=fur7e)q}WRBw4dMz24jB`OT{*Q~S|dsMpl zf*7tY00|0Cek7#JfBr#txP5%Nhi-CtCm1a^gAV7~waBQZ^!)RLoF2=zK2`MF>qJJe zmfP6GnU)ytC>5ek!|`V&o7=6l`0oHov(U0z%v|W^iw@dqlg(!$T-NZx1DCcL>_R0z z&#A>y2iWcZPLGdv&1r_Uw7-k8AvJmB6pYA&EKtUDn=3IP$#$gt3JJo@ARuZ-8_s|C z)Q*;4EF9M0jWTKLO*+DgxCbcA+=HIoOp>s5AL|JJrU~#x`ajNQ164v+?g5lZkr3~J zoI7FGiG$v=zY??8TYPgdotV`g=`IR+xWgOtzQqQ=U5zSkI#TJO7HiHU$MpZoSnfEW z)F9F~#O5u%|AVA@n!k;c@8*lGSE8esY^hOr`{0kYgjbzD3NG^Z3SiP=BY8UiXAOsO z!dw9l9?GpRjJO;AR4CEVggf_5sHd$mTYW!M8%} z0zqSX)ijx--Mgs*Dnd=ZV$&o&E})RU$&3*HlyX6hu`(WE;|VEsRsRn({O7Ok^^IG7 zyy;Q!DI-+*VN=X$;-66(R6g~aD?m2$c32}{(jw=>omyqxN1ojHe1;fn^Imud)!i{W z2$2%00f2aD7_ndpCl}$#vPq7$Rr-`yBq%ipBXV0Ni`HW%NXr8Kk8*1)1X}<3iI}Li?Gqb=_#?T#FM)?@$eso)@p41dgICQX5`-@ zPt(YcP~sSfKO9RbK$5|*oBB4bUPel$UHW{jx`Fu@%D8CSESH0PjOxX4&+fx_&j31( z7NPik(K)$&<9HB1l|zK2XAxhTQjm-8^599BdVf-vg&0pAxP2)RJ>y`b)LR0+QJp$L za@z%naKFcTVfluC4{E>c(x7yN$N!o4m9*$*X$<#3ltXa9CjG zh%^(Z-k}%t%Th6;3Bfl2CF8Q|Zzv<}j}bG?XA6@W)*~LXd^C#)W+4yLp`UwQ@Cc&t zj$YHZ-TKdTE$J659}RlY@b6(>cq8XIP1C+<@5fU}=#(69DNT>xOw%p09y;*O^CJ}ay$U`a1XaOfsX-k3>>O_dhb)=|CYL#a zGRp6QRzdD#(9Z_s0?ER3s7G=jiEH6u2FYof44k9!5`smoL9A&En?|15-;+*_O?0(q zbz-BFM5rshC5tmCr#PSgi zq)I)a1J1woSUth4?$a;yE1yWxxBWG$*FkPc=;}lN|vu1r`>Llc+fNdcNrf@oonJ$9VkJ`F?qWCc)dn3T0()OhgzZA!-KJvcO zkwIBr-&ZVJ>EMNIF3R1t#Avt4)9r_q%U6KNkvK|^tuKV6m~tHJXD#68buN>z=-Upk z@prNk%ld(?9-gBYC<+|tmRXODXScSdcBMP8bXO{SJt)I4&@5(L3{OYK8Lw|l$38~Q zNa3co#PxciFEhEGm>G#X1J>SYP^rVmV3Dcs=q+>kd6Fu@zFcc>p)I+~#wZ)cub$e1 z7HJQM3E`W)Y2xC%)lUbEpeZY~Jlb#c=;lHcC!?*&GbxuaJ)=#jo`Z51zfd9{)KBdy zq0I8wGj0Wz;y@(@_yo86nb}>vr3c-V^zv*a^`6*79~FwndUh`CTL*mq6||&9p;yls zzn`MAEkV2>cc1WwnQUG$zJW)Cm84AhXfQ-ob)d)&O!n{2yUZ7B0aS@K+YEE_L;D8o z?>aFOeCc2eOUYWRS!t=ck24HHHqtY?-s6Awd0lJ_cg(FAgO}tu`eqio=I#v|wLYfa zBxyrq?C^@tdh3RMMl=))$??afl1|`l&cgiGio-%D>yi>&253Fj$n032(_&16bY}*f zQ|UOXR0j_kspSJ>9Q((f(cbm004z!& z(62b_f#+8v%wn7az8vFeN=^bxT^a8WJ8z8~04YJM6~?4GDU;66Oq?WuUZwag-vSD# zq^BC)&PjTz1Am{Q2^hA3KO3VUG=(hnWNEQFPHvE=q7WjNPkNX~i#)eLV91}7Jgv%h z92)p*8gZX-nzehKdHD_N{(ym1X9IckvWrLBg6APzKz?M${H6`r%1G}R6HFcgP}827 zka`9f40~Q|z~H3W0rkbz8W^OS1Elg?SDNm<%o4AKmW;Hz_^C1Job`>*3OUS~_sK9b z3^Y`rcz|Y5t@Ehx_2QaERn~wI7|J<#KOIJ4E9QAA2)1Y9%C!T4?FUjgJuTc0^hGnT zHO3cUwR!f7{+K?Br*T_@R#?x4KT1Hl%^^Rjy6FmFGd7~&8r?EXen7HZ8)eKUzmWPhnzB*P4SZe$y zT}s@bg2y2sH2esDVZD$gE0uA!g~<^{c4B7ORHYnOL z=814lG}9=BO=&9J4k~s;{7nV0%PjJwQHpR-)``fVlFFfyLdP2f=#P@g?X0|yx9r}g zzonOk5?1sOrOzagb_!-}?z>U})+P>U>m8jHt|cN@Bw~W8k@U^k!}}e<2U={MZSBqw z)2xZiRCWk%SJfqCJ9uG-yY_Z#Wr-k9Luwyy!jyp!6Sv_>N$_QGGNf&I$(oC+aEy6p zuMO{MKUefXMY&^8mn3qx9-z-%BeFO(jFe@DM%}1lfii7|gW@UQ&L0sbZ1ezKDMV8D zmm*iH0yGd=Vy6RHC;}$Q*>^Q-YPt*2{SpO(&?Z(T_<(FQQ{ucsE>mJ1<@pnvSPO90 z31?9rLa!2&**?@V#<&p(^MMTZc#a~yBe6&G7L6z|vvB@B&?+i1$( zr=N<(+|n6kO9!0(`4M#M7C##LBgVr!!eL|!nx5@IvwjSWR=^I|C$vW&G)u{HVRWk zmGUbJ5X$kMW**F9$I$4Dqrw?!kFMJRVUI)hksqla$lArL-L`crQpBLiqx!uJxSg`~ zO#XIo(;J!N_7FCmnyjfGlCA*Mq1@KX3$A?qh=Ulbq-4^#lGE3khIwZXLyA-s_UUrU zbUT9CY61@}^rtsvN4?N}$@wD)$}z1}avs9ZzLy27XXuK%OUf@-1Amv)WTZxn!N}}O zMjnxB?h9zVAfpglZ9n>F*x`-P6-j^eEY8AvI~AymO20=FKwD5O_|a(C zTEZ3kUvhwB`x<^{T6%YPD&ge*nGvfGW{93oGJzkk85Dxm*h04r zXcXw_pfQf5Z+_k*9QIkZcqe+%EjnA`7PkNRNO)Wf_@wqaIzqxUxAgS2wnpD7R{v3r zezM83uNqTUuJ^g3shG+nxh#1`c7zOatsq!&D!y%?M2aPxMK^@8B^+BCvrTh36fQL@ zpQ*B*bTt(jUMsV~3zRV0n}&nxz}qhoy83?ThZJLM80O?M#Ea_(Ny+S%Dp3RZif6i3 zZ;SKc+aQhIgIMjnSKK-FX2}}Ki+ZvnI8`P+IgH)EdHUZKfx=h7z(z`G!6s{R#g`v4 zA_Sa;i-R#^_?%|gobNa5eAMgnFPrsVax(n0vD75X;CtVyeOHA(m1>@P?_7@YJ2D z*pY~g=XIv*+QZlyoZjXL{4BkyLEb}jTQ}bExBf!+z$I5CC<7h})nd5s^@N*t^TT0~ z+_zTO$F1(GXE#x4AhRC?Z09?gp5NhC!&C6x)r?qda_)=~oT>q3rbSvrM#YzYOCMeH zqX(n1%`6E@0Jzqtvgbow)WSGOsIeRj-^?$UUaJUPJRWuW{V$j(Wb%@gv^JTjbsJCP z|1Oj8_GtU53X^zVq&li5T3qDv`9VUQkI+eiW!wuGsX_Rg;B}7t?d@npgHZbbLhzj{wMwYNh z(EuSK*>oYp2mrrcK!n|0|J0JGtlfW8F*r+hV0DIf!kQat)QyBsM@m`YfORgnbzAh?g-*6&G=sHjZz7!p$*~k%KFX$-F z0!%^_z*XC7$VzXk+03MegoXmidVN9RGV05kW?rHEI4p-M(tL>&q$ z4wA*Vgs-VVnIxWSW8+9kh zc6c+_RZj9CgG-XPch#0#-z}EXRhRz?<{Y*9t@!)sQ*iq56;O=cAHkwQgd_}b=QG2H zgpg~cdppEr&m*)cIjd zD)*bk~TnPY#>G0b|pod%Wrra8%UQ%$1txHh|DjF+Z zO)i>?jeoBfdjsEzNKWOJ1@@z(&E-hDpex+?&WIay|J~=htCjL^gaE+=!5B1fU*JQw z+!-cVpnOHZ01KKC>W^IZr|?uihe<_BlTYDTO4t6G<>1T7&1rJmHjy|u^a_yAB{Swh zLJ9nt%#nB09AAXXfX$LJ1J)b!u^=rn2xmOhRWMg5^cz(|irb?bFA@As$l(aa4{&38 zqBwDo(($~c%}cz+dRVEmTXWFx#rc3!FKF_JD-d1KW?RW8s^7*weY%T$T7&m>7bKPL z50fXY{?GC0{_~)F9V0$=C8c|9(Imk|Wca!m$fgT;nSV zQ7?n&s`plXiuC(qKN04tycd3a==?~SrGouI{L`jw*KSQ4Dmb~d^R#-OJN`f2$NSX( zRb&rC&XpF|5~UR#r9s!b@7SlFC!7uF+xUE2v3brtop+D zzh&UNY_5xEKZhnaK801}v04c=j?FeZOf~a%5&0D(vqo6T3bdt1o;14+nPs@N%NAqjD#wyj z^ryHW?HVGo9{t@q-y9%hbuQ!#`~G*L+u7F;Qf}BM!s+~(P$cM_{Q71f)$-=`KUr$f zE%#!o0L*QynMUgr8^|KLIidLb`F&O4zQSKVK0ilYHr;YTR z$5bV4Q;>E$A=MLSA?!v;j(6hrt@sdmcvCSx{>u*W18ja{H#v#;NHL)QV=ez6CH-z% z#kDx|$7Wl<(B;=wAXnR;JwY7Ym-lIALb=A5Q8$-bS5Y-Zx8e{H!Ow3k^;8q)ilvx} zM=W5`B9`j%{v4L$xYt(tb3_-D>4pqNa3cb4B#Dujm{lku9fl$4(mewpV z_XYR2htP?43T@llNIThuBaXAt+y%ef8#W7XGg^c?&OqGn&D?FTfDeO39#=puwYCn9 z`er0lDyN=B2+6QWsi7{WfnwxX>3m3gK1LxqeNd!cO!3HpM~wiWdVuP&^EfeP!f(_Q z!i+uh(T&(2sT;9GloQkqaI2esl=Jf?>$dPu15tiocYfaST*Rk*1JV2mIp7NLj>jrg ztgKq4aH}I3n<9kZ*V(OtpkjYUpG^f(<87li$^0G;4qdN_(8)TVD3o2H2_i73aNR7! z31NxFhShmv0TbJ)Qem)jC|J3Kl?ZlASn@@S9~SFmBt3S(q>}EbbGEHj*SpLTAUr&R z0kMv-=B|>ZxKteCUUB=;`KDZny__ke{sqk4@NKdDr5zPV)e*6EB-xqo?)$a7KR5w4 zDUO?1+pZVM)Q(mkG}2`v5vlexk`<+C+yf=_iz?&YdXD+@rp^wV75rLVot$?K+AVxq zkFpBt#4O@spb9RF8Oil8UC<1Ndxft8Zj3h5#j eZ=!NlHa_?N{!N1qJsmX_%f_P5B4T_s`F{YUB+ah? literal 6927 zcmb7{cTm&8xAwnuh*AwrLX#i~0aTiyHz^4{ARR@iK|#6#(gg*P5}I_7gx;itB3)WU zqy#}AAkwP^L7K?r_r7=L-hc1eo!Omv&VJ4_yR$p9XJ5`105-G^N(Z2#q5|~J8*nxY zXaV%Jbo6wz^z?M}3=H&)AT|()i3tQ|VZF%44d&tD26J&;<`)&b%qIfj;u4Y&61ge{ z7l-o-N?wB2_ph@V;35sxxn~-7Kn?gz+9DN@4rCz~0md!W=M%cz zlSG+~Q-hB+>0rCOMWNy9M3yFD4<$k*{@5Mkm@h@bSGUX>!$Gy{(rX+oM*(@CM>lB=zphD^ol`*ptYrOeo zg+C!axVOT7=cYoUg2FVrdAG~?W4^iRKbda1!7d^@2tBq{*Av_^29~nMeh(>=&}NUNK6dt= zI!xT|ahdi;1eQcn62>TLOCW)Jr_DlaO8*c-{sU0uUq}R|DSdE8I`FS$W*OF z8-_A{&x5`VhpC(a-)awCgX|E>Zuz$Ce=pyf*7}crgzSRL_9% zy*NeaPosY}p>FdJ^FKMwKtKA}!8{o^v`l*-7~UD2&TboI;hPnI{V#LdKZS`El{@_n z_SGhieaAJLVm-4DS*_x-!a--)&_d771b z5VK6gMUf;?-4x2{X}Q(Ry zSvY06)AW+;$gi{_B{nN+bv0UJeJVUA_@RyUaTs+h5n1 z35~+~HlPbe%)JC4(zhp&XRT>5ITkr4?g7FCl;Sy55){B*GU~5ATDJ5Q3-WTZ#^dv8 z#K7i8ZZTzEDD$z_kcyCEj+H)>X3^TTOj^YTHe+pp;FGVXup)iWh4>>A%8d+4%HEsDC3>i|7k7 z#Y>`0u+b=aQ~w`jXy=ZN(@Mz+=>@EJ=^$eKyM;YCW|6?>Zpt>*gvcdRzuR~jI^$~WS>Jw)~{%>@I zUOKPCv*r7lFdvmIb7!eudzx+Ro8Qd~WSNvVB9`vR%SQdDlPm3pL`)Ld3SpBr$`Z;d zmLQ&Z!PM|G3n|Rx#?>L`gfHILkA6cr#eAp-*YX&dsB8V7)=0j(fTcqk)&zplD z_58R_F_Ke83NH;4CRgkg{yPosrc+*j^2<`SRK*5;vrB@mEbDn=d% zWhWLLJ&5UF9r6_4)5)tJS^~d+!q}K#FVHY`?Q~HoJ=q#CLNIG@qhz*JE?X7Vc*j3_ z-uT4HBDVz{!1aad5KF^Jlk)4UZK{B6miZ$yY0eQx&d za~qUyNhQQKk&~1=vsE;|$B=OO<=n^bTi;4fOEc@feE;Q4SS@JThf+Z#YfT6>!f>H~ zi_*F?#8+~v_KE6ML*wz7?paO*6$nnJnge=dKV#Kp&= zTFYivC2AL@?T9wEhOLUD_>zq-I=Z{fu4O0WR#|Ijo?z6eDx<&cXSWFF``Y79(QmJd zg8KCf1JNdL^Ds$Xic8cvBu}f1C(OP6%Zf4YU9{eRu;!tI3pM~gz7yk~)AHF1sfnvx ze7}=oC^H~jw6o9&&5o{!3fz>L0qWqAr8;U8QNA9F;METyK2dQOoz3bQ)YK85csOts z?H9P&w`e1a*S0O}e_GartJ%0GtOY4zDCr2w`EBuB_k{qg80kUWz8tuV$3=6z$??DA zMeyUlk?7v1(W10|%xW?cr(j;|_4)T{-0cc&_bTY$*zujJ*VV}TCBYxCKDFjygofyg z+YCA0aa;Vk`?j{MeReLk&W);zE5thU@A}Rns;Q+vH9pNBmX0Jo6&JI76ZHI>oWSyt zIr-!+sdm<{jnGG)RH!k;9*k~x?FA0`<0W~zx{(+RqiPxib^;pp9HI|NG;U2B@pm`K z6u(1G&)RH^yzbMUt1xm<1hH9On_P=A66)~$H-F(GvhsaA<;ma|vLllbY5gx-%p4WM~1YOI>9>v;>?nuBG&#A$ARxJx8?7zWN}BOeJ?CaC{gFps5g zDnv!_O3CwCVTJYd0O*4Ez-o?YXB=Lhv%jBC&NnLm;rNkg(j`8G-|}kq>GkgjzYPJu z&+o3kxic`6Nru)H1_g(vK0Oxu+~1exo&H0(ZEL>B3aN8 zp23xO9Up-4^8IqUm97BBFLn%!ZThtYw6#20si8n$+Naphyip6Puln;P(76~7TLCe+ zccNP%ej`W4Hxn8C{0`qaS{G^JX23jwIQ;fqXExRf`UVA?Cv_efNfLQnJ@N0wa|7O~ z+=xby0+b02F)2CE3VD(1GT(JV#e)sk|7=^5xMk<1eot)Qj73F~EM5>y1g(-BP(R!TJw+c}`@0C$3HDq4U_j zo^f^)p9VuQt8XMC`|_7LLCY%R+i^09oR5yemcv|$U5(NWT@KRZI0PJBmy?GN>qD1- zXdrRx+rNq_xkI&j{a!HdF1#UiC>@|oW`q9H?#BYit|Ab9WW}#rkhR4KpfCYm-^LzC z+mEsL$e+sDuiP@(vc2`7qO$x6NQa7%PF=9MJa!m4&F3(B%=xYy5*?80^GtS#DX$@C zNtsPU8Nsv8qTB8^Y0v9GY|Xegi+PTDl|8XIS#TrXDQB;ACg{?L!nhr@w4V5ZgT_sL zb^=r))(iX4(!&4JeCoAZYL!QcPe1ZhgsAI#+d^~M*JsMKu=mALqv09QC#i>R((`cj zq(UwyrzB?ivYY`y8Svtm^bG#SN>O9gI*y1r-Gqrh3DMUc4>cfCl6Q^+ZmqIidXCcr zL7kRP77KWOQ9q2`eAb`;+Xb3rt%WaTpK5aFcxx);FMs|On2`=UL7bNRIPWqOUc_~x zTrP|h1$;~cbfg*h>tKbZcgV;8I6p1yVar@DKc*cJM%(0xTG8L~z5~#diGfYlu@9#%NtM}DwR##f6ol82v%|%{#=UN&RGTeV$w*wA&C~?7 zO{Goz0UWc$pH0!p^jQxX77iLZHUI1xaY#I>Q6+f@uTZb^Y%?>G1lk-}B7}foP>Ms4 zHUiE#Pq;!?>^H!*$uT5uv6|eDTH*Oc-}{R0M! zJ{*DgsL76121(sqX$hH{v3P&Q?;yRj3Vx7J)dEPA^}I<=N@;@l#+!X*y!lnma9r~{ zHxrx3(0i(Zi2?#=DYWKo7wyvgOTKR``FL_d*%MR5}V<`7!2PW~6I$i}JFC%*I ztdb4M+g@YI_HBmbkwMRZi6(i?iE%HVO6ZQlCz<>>ZVfx`S=|?kxb5bA-8Xp>B>3)E zvn}QwwdM*J`GaA-!>FKasx@mzz3R;#$4mPwwYJXaPhNUE-J7uW+a#l(Z_H;g{661G zP|v`30=5tN?iV%$)v7D+FR-CxL&9n#9_KQi5G_(?{cb8T(*3}K+(j+U1=4|0881(T{UQhL%3-)4nB)J2pcyUg65`f^D$bts5sxR$h?!x<=X_IR!MI*Q?@;V=oLis3=&Om-P1EE)mpE;;eh+;y)RREf z4bQN_+*R433tdpSK9D1z=<-%yzNVEz<~Z`6uuT8H=>|nkrgH=caXJW7;uBDVG&MmL za*+#JO`A%+*;)S*E$%*>)?!hty26KGGX7z$0`Q}{IPd-A^OsvQ@9z*_y1~*NQ=Az; z`;a(}A$UT=Qxm$vg6OB{?jL#i_I>5es_XJblP7Wb)=gtPF)hqA%)gYDHC$Z(u>2jP z#qbT+cxsvo?}>&yk{+Wv&62E@Wp}fUu=t!ylZIfitV`x!0&uyn^957Z_-ChgYF9$u zDq1-1^tns3XVO9hj8w)^YbD^=M5oRO3l(%O;^N%$>}NuWmhH!GEurSM>@%RW(yv=A zYJ|G1L$$kU`g^Mu+Dcf4j>FFEgGc3V6GR^?rT|?Ca}Tf_=J?uMS+H}WjeSw{Z*!y| zfP$CJ|H*k;&R~sdxpM}*zh@akU;l9VhP;#BupY-_?b#MIfTw8|P_Zum zsK)S-C%!Lgk%gGZn|l7h`cj)bO9-dx0uP&SF!=Vk-tjO*O&t&a;gWA2U-N3nEBMQ9 zF&moLI3tVCRVzuVP_~>gb6)QXY%!U!Y_YdYkjBP-bo`e8+#-xs$S~2>=hpM9$h3D? zjOJG0Jm@F<3}U}cJ4BxtV}DWaaD>dP`NlO@1~NDCxllaC#U_|YBZqjt4)vdBKu@rI zTnAr+ZQA4tRNnTXkr!OjwLF}EaB166W3G*c{MZ`j^r_9AuIj*Iw>t@!`vICmou5Td zAi-UJJ~E!EVX8op`GtPb6UL?f1f9X|~ zUbDh#S;SX|0os%OlgD(O;aMj=J8D%mm2)*d)rM&2)Y=FEbxlkvPKRD`MK`OusEhw{ zM(VBc$TJIZ1@ zVk@HsP@Jz}X)v6Rp^WwzUjRrl-mf&mz_p&LyNFniaeA(2VWyWc=vTszP$2b}HdiPd zKnz^y7RDy}faz+gyOvsMXuY73M`402{xH5T52 zIm9{lz542;7%yIwLzE~@WhZ9pR{b945pXv!<6>b$R&V;6!ltotP;Wb&#sPS=b=hm? z?R*a5R-7Z)kd;1JT~y&V%+wGRGtQeJB-zIl0a{o9=huTXb%q03+iW4RVY z*h$!C9zpg~N-pCroO7S^O1+#Z0}$nshVl{3%U0uY;*hk1=x@WMSR8P2EWWId|5m z$CGl78CA3;I};Sg6HYrVU1f=1$)gSa2%5(>LDP#3k->rBe34X`BlzJN;9ea8VSzCf zI0(Qw_hi}nw~!>+5Bdfzxg>@wFQv2bPRAMg(`izAq4OW?OvSuDczI7nB^*_{`?q{C z6NooyJVL`M9Dzp_Z*Hs{x|UQArBk%aDKmCStW4J5Zj*BG6zjOs?~lCsUWPmK(m*d+ zb=V)?jK?<{<@zXI z{Rw^;BW!T2O6BzZl&HZBrqOz%z-UMJlt$YSE#4zALBeMayq@`U9ga`4aOuZ!KFfM# zHjOM!d+p?hY3$a20Mb)RL~`nL9G~9<8$X8@Ir7Bmx=+YprP~&rxX^xyM}?3{e;ddl zps=6<3AxPUQN`NU*lNKQ0#|GBuYUTa1g>eiaqb@K$g5-D5WUuS>yWkgNh)y{gaSBn z4pv{UpQ_Gh5f#`or3TRyDNkP--gQ85wcP5ai}h1}wkf3B8lmRnc0Rg(!u0omsjWDY z`Vy*i!HlXQ!PbI7rM&foz{2Khc`4iU!5e|S88L0|I>4GoGttrd*@+WTR8qhU?;3e2 z$$iF!&1Etuzn%GhK!gs+#arZ=Ha_3SPDh^m0QDf3^xaF9j(MHMOyL!eubjts*Md{WcQ{mOO zzw`f`r&vDkmikXE7r*+7Qea!qq$F1Pvi23JGr%i=GGrvfZ|r$zoP$Zou?GB4DbCgn z6T<{7eHRDk{Yj{7cD%?=dfKEFGZmHPleX6G<_n@5Yl;J?YqAXWm$CqjzSSh_0t0QG z6ok;Idh%xIo-A{&y}HnL=v!k3EmUfh$QkhU0RMc;k}`4aqo4B`5F=RXcR Date: Tue, 4 Feb 2020 10:05:53 +0800 Subject: [PATCH 071/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/assets/updateLog.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/src/main/assets/updateLog.md b/app/src/main/assets/updateLog.md index ab1238f8a..cc98be492 100644 --- a/app/src/main/assets/updateLog.md +++ b/app/src/main/assets/updateLog.md @@ -3,9 +3,11 @@ * 旧版数据导入教程: * 先在旧版阅读(2.x)中进行备份,然后在新版阅读(3.x)【我的】->【备份与恢复】,选择【导入旧版本数据】。 -**2020/02/03** +**2020/02/04** * 主界面切换时自动隐藏键盘 * 添加本地书籍完成,解析txt文件完成,本地txt可以看了 +* 封面换源,书籍信息界面点击封面弹出封面换源界面 +* 默认封面绘制书名和作者 **2020/02/02** * merged commit e584606, rss修复BaseURL模式下部分图片无法加载, 修复可能出现的乱码 From c1cb5fb0d74bf29704cc7d2c9ea16bed48e900f7 Mon Sep 17 00:00:00 2001 From: kunfei Date: Tue, 4 Feb 2020 10:34:08 +0800 Subject: [PATCH 072/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/io/legado/app/constant/PreferKey.kt | 3 +++ .../java/io/legado/app/service/BaseReadAloudService.kt | 7 ++----- .../java/io/legado/app/service/HttpReadAloudService.kt | 3 ++- .../main/java/io/legado/app/service/help/ReadAloud.kt | 3 ++- .../app/ui/book/read/config/ReadAloudConfigDialog.kt | 9 +++++---- 5 files changed, 14 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/io/legado/app/constant/PreferKey.kt b/app/src/main/java/io/legado/app/constant/PreferKey.kt index ef572f1f3..1bfd5b634 100644 --- a/app/src/main/java/io/legado/app/constant/PreferKey.kt +++ b/app/src/main/java/io/legado/app/constant/PreferKey.kt @@ -8,6 +8,9 @@ object PreferKey { const val clickAllNext = "clickAllNext" const val hideNavigationBar = "hideNavigationBar" const val precisionSearch = "precisionSearch" + const val readAloudOnLine = "readAloudOnLine" + const val readAloudByPage = "readAloudByPage" + const val ttsSpeechPer = "ttsSpeechPer" const val prevKey = "prevKeyCode" const val nextKey = "nextKeyCode" const val showRss = "showRss" diff --git a/app/src/main/java/io/legado/app/service/BaseReadAloudService.kt b/app/src/main/java/io/legado/app/service/BaseReadAloudService.kt index c657f621e..45915fd1d 100644 --- a/app/src/main/java/io/legado/app/service/BaseReadAloudService.kt +++ b/app/src/main/java/io/legado/app/service/BaseReadAloudService.kt @@ -16,10 +16,7 @@ import androidx.core.app.NotificationCompat import io.legado.app.App import io.legado.app.R import io.legado.app.base.BaseService -import io.legado.app.constant.Action -import io.legado.app.constant.AppConst -import io.legado.app.constant.Bus -import io.legado.app.constant.Status +import io.legado.app.constant.* import io.legado.app.help.IntentDataHelp import io.legado.app.help.IntentHelp import io.legado.app.help.MediaHelp @@ -111,7 +108,7 @@ abstract class BaseReadAloudService : BaseService(), nowSpeak = 0 readAloudNumber = textChapter.getReadLength(pageIndex) contentList.clear() - if (getPrefBoolean("readAloudByPage")) { + if (getPrefBoolean(PreferKey.readAloudByPage)) { for (index in pageIndex..textChapter.lastIndex()) { textChapter.page(index)?.text?.split("\n")?.let { contentList.addAll(it) diff --git a/app/src/main/java/io/legado/app/service/HttpReadAloudService.kt b/app/src/main/java/io/legado/app/service/HttpReadAloudService.kt index 9e1fe70cd..8dc5c3927 100644 --- a/app/src/main/java/io/legado/app/service/HttpReadAloudService.kt +++ b/app/src/main/java/io/legado/app/service/HttpReadAloudService.kt @@ -3,6 +3,7 @@ package io.legado.app.service import android.app.PendingIntent import android.media.MediaPlayer import io.legado.app.constant.Bus +import io.legado.app.constant.PreferKey import io.legado.app.help.IntentHelp import io.legado.app.help.http.HttpHelper import io.legado.app.help.http.api.HttpPostApi @@ -107,7 +108,7 @@ class HttpReadAloudService : BaseReadAloudService(), return mapOf( Pair("tex", encodeTwo(content)), Pair("spd", ((getPrefInt("ttsSpeechRate", 25) + 5) / 5).toString()), - Pair("per", getPrefString("ttsSpeechPer") ?: "0"), + Pair("per", getPrefString(PreferKey.ttsSpeechPer) ?: "0"), Pair("cuid", "baidu_speech_demo"), Pair("idx", "1"), Pair("cod", "2"), diff --git a/app/src/main/java/io/legado/app/service/help/ReadAloud.kt b/app/src/main/java/io/legado/app/service/help/ReadAloud.kt index d2a789a5a..49285eeff 100644 --- a/app/src/main/java/io/legado/app/service/help/ReadAloud.kt +++ b/app/src/main/java/io/legado/app/service/help/ReadAloud.kt @@ -4,6 +4,7 @@ import android.content.Context import android.content.Intent import io.legado.app.App import io.legado.app.constant.Action +import io.legado.app.constant.PreferKey import io.legado.app.service.BaseReadAloudService import io.legado.app.service.HttpReadAloudService import io.legado.app.service.TTSReadAloudService @@ -13,7 +14,7 @@ object ReadAloud { var aloudClass: Class<*> = getReadAloudClass() fun getReadAloudClass(): Class<*> { - return if (App.INSTANCE.getPrefBoolean("readAloudOnLine")) { + return if (App.INSTANCE.getPrefBoolean(PreferKey.readAloudOnLine)) { HttpReadAloudService::class.java } else { TTSReadAloudService::class.java diff --git a/app/src/main/java/io/legado/app/ui/book/read/config/ReadAloudConfigDialog.kt b/app/src/main/java/io/legado/app/ui/book/read/config/ReadAloudConfigDialog.kt index 0d066dd54..6dcd2b341 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/config/ReadAloudConfigDialog.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/config/ReadAloudConfigDialog.kt @@ -13,6 +13,7 @@ import androidx.preference.Preference import androidx.preference.PreferenceFragmentCompat import io.legado.app.R import io.legado.app.constant.Bus +import io.legado.app.constant.PreferKey import io.legado.app.lib.theme.ATH import io.legado.app.service.BaseReadAloudService import io.legado.app.service.help.ReadAloud @@ -68,7 +69,7 @@ class ReadAloudConfigDialog : DialogFragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) ATH.applyEdgeEffectColor(listView) - bindPreferenceSummaryToValue(findPreference("ttsSpeechPer")) + bindPreferenceSummaryToValue(findPreference(PreferKey.ttsSpeechPer)) } override fun onResume() { @@ -86,18 +87,18 @@ class ReadAloudConfigDialog : DialogFragment() { key: String? ) { when (key) { - "readAloudByPage" -> { + PreferKey.readAloudByPage -> { if (BaseReadAloudService.isRun) { postEvent(Bus.MEDIA_BUTTON, false) } } - "readAloudOnLine" -> { + PreferKey.readAloudOnLine -> { if (BaseReadAloudService.isRun) { ReadAloud.stop(requireContext()) ReadAloud.aloudClass = ReadAloud.getReadAloudClass() } } - "ttsSpeechPer" -> ReadAloud.upTtsSpeechRate(requireContext()) + PreferKey.ttsSpeechPer -> ReadAloud.upTtsSpeechRate(requireContext()) } } From 6422bd511c7f61327637345b87e5adfb1bd1213e Mon Sep 17 00:00:00 2001 From: kunfei Date: Tue, 4 Feb 2020 10:38:37 +0800 Subject: [PATCH 073/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/ui/book/read/config/ReadAloudConfigDialog.kt | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/book/read/config/ReadAloudConfigDialog.kt b/app/src/main/java/io/legado/app/ui/book/read/config/ReadAloudConfigDialog.kt index 6dcd2b341..14f5c0b9b 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/config/ReadAloudConfigDialog.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/config/ReadAloudConfigDialog.kt @@ -93,10 +93,8 @@ class ReadAloudConfigDialog : DialogFragment() { } } PreferKey.readAloudOnLine -> { - if (BaseReadAloudService.isRun) { - ReadAloud.stop(requireContext()) - ReadAloud.aloudClass = ReadAloud.getReadAloudClass() - } + ReadAloud.stop(requireContext()) + ReadAloud.aloudClass = ReadAloud.getReadAloudClass() } PreferKey.ttsSpeechPer -> ReadAloud.upTtsSpeechRate(requireContext()) } @@ -113,7 +111,7 @@ class ReadAloudConfigDialog : DialogFragment() { // For all other preferences, set the summary to the value's preference?.summary = stringValue } - return true + return false } private fun bindPreferenceSummaryToValue(preference: Preference?) { From 662b7df35b97561e47e3b3b9a12984fd7c50f7a2 Mon Sep 17 00:00:00 2001 From: kunfei Date: Tue, 4 Feb 2020 10:55:44 +0800 Subject: [PATCH 074/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/io/legado/app/help/ImageLoader.kt | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/io/legado/app/help/ImageLoader.kt b/app/src/main/java/io/legado/app/help/ImageLoader.kt index 26a9063d6..3d4272e9e 100644 --- a/app/src/main/java/io/legado/app/help/ImageLoader.kt +++ b/app/src/main/java/io/legado/app/help/ImageLoader.kt @@ -12,13 +12,15 @@ import java.io.File object ImageLoader { fun load(context: Context, path: String?): RequestBuilder { - if (path?.startsWith("http", true) == true) { - return Glide.with(context).load(path) + return when { + path.isNullOrEmpty() -> Glide.with(context).load(path) + path.startsWith("http", true) -> Glide.with(context).load(path) + else -> try { + Glide.with(context).load(File(path)) + } catch (e: Exception) { + Glide.with(context).load(path) + } } - kotlin.runCatching { - return Glide.with(context).load(File(path)) - } - return Glide.with(context).load(path) } fun load(context: Context, @DrawableRes resId: Int?): RequestBuilder { From 07aac1e0a999e74fb0955d795c981bec99726cf0 Mon Sep 17 00:00:00 2001 From: kunfei Date: Tue, 4 Feb 2020 11:05:04 +0800 Subject: [PATCH 075/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/io/legado/app/ui/changecover/ChangeCoverDialog.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/java/io/legado/app/ui/changecover/ChangeCoverDialog.kt b/app/src/main/java/io/legado/app/ui/changecover/ChangeCoverDialog.kt index 73486159d..d1c081f76 100644 --- a/app/src/main/java/io/legado/app/ui/changecover/ChangeCoverDialog.kt +++ b/app/src/main/java/io/legado/app/ui/changecover/ChangeCoverDialog.kt @@ -77,6 +77,7 @@ class ChangeCoverDialog : DialogFragment(), override fun changeTo(coverUrl: String) { callBack?.coverChangeTo(coverUrl) + dismiss() } interface CallBack { From 101dcbde839757940db393d8a0845665c2e0811a Mon Sep 17 00:00:00 2001 From: kunfei Date: Tue, 4 Feb 2020 11:35:24 +0800 Subject: [PATCH 076/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../legado/app/service/BaseReadAloudService.kt | 2 +- .../legado/app/service/HttpReadAloudService.kt | 16 ++++++++++++++-- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/io/legado/app/service/BaseReadAloudService.kt b/app/src/main/java/io/legado/app/service/BaseReadAloudService.kt index 45915fd1d..74a5980f9 100644 --- a/app/src/main/java/io/legado/app/service/BaseReadAloudService.kt +++ b/app/src/main/java/io/legado/app/service/BaseReadAloudService.kt @@ -40,7 +40,7 @@ abstract class BaseReadAloudService : BaseService(), } } - private val handler = Handler() + val handler = Handler() private lateinit var audioManager: AudioManager private var mFocusRequest: AudioFocusRequest? = null private var broadcastReceiver: BroadcastReceiver? = null diff --git a/app/src/main/java/io/legado/app/service/HttpReadAloudService.kt b/app/src/main/java/io/legado/app/service/HttpReadAloudService.kt index 8dc5c3927..7cbfb0b50 100644 --- a/app/src/main/java/io/legado/app/service/HttpReadAloudService.kt +++ b/app/src/main/java/io/legado/app/service/HttpReadAloudService.kt @@ -8,7 +8,10 @@ import io.legado.app.help.IntentHelp import io.legado.app.help.http.HttpHelper import io.legado.app.help.http.api.HttpPostApi import io.legado.app.service.help.ReadBook -import io.legado.app.utils.* +import io.legado.app.utils.FileUtils +import io.legado.app.utils.getPrefInt +import io.legado.app.utils.getPrefString +import io.legado.app.utils.postEvent import kotlinx.coroutines.Dispatchers.IO import kotlinx.coroutines.Job import kotlinx.coroutines.isActive @@ -94,6 +97,7 @@ class HttpReadAloudService : BaseReadAloudService(), mediaPlayer.reset() mediaPlayer.setDataSource(fd) mediaPlayer.prepareAsync() + postEvent(Bus.TTS_START, readAloudNumber + 1) } catch (e: Exception) { e.printStackTrace() } @@ -182,11 +186,19 @@ class HttpReadAloudService : BaseReadAloudService(), } override fun onError(mp: MediaPlayer?, what: Int, extra: Int): Boolean { + handler.postDelayed({ + readAloudNumber += contentList[nowSpeak].length + 1 + if (nowSpeak < contentList.lastIndex) { + nowSpeak++ + play() + } else { + nextChapter() + } + }, 1000) return true } override fun onCompletion(mp: MediaPlayer?) { - LogUtils.d("播放完成", contentList[nowSpeak]) readAloudNumber += contentList[nowSpeak].length + 1 if (nowSpeak < contentList.lastIndex) { nowSpeak++ From 20134f757e0f577b1169107ce0e256e3a4d0e853 Mon Sep 17 00:00:00 2001 From: kunfei Date: Tue, 4 Feb 2020 11:50:08 +0800 Subject: [PATCH 077/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/io/legado/app/service/HttpReadAloudService.kt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/src/main/java/io/legado/app/service/HttpReadAloudService.kt b/app/src/main/java/io/legado/app/service/HttpReadAloudService.kt index 7cbfb0b50..cb8ed973b 100644 --- a/app/src/main/java/io/legado/app/service/HttpReadAloudService.kt +++ b/app/src/main/java/io/legado/app/service/HttpReadAloudService.kt @@ -41,6 +41,7 @@ class HttpReadAloudService : BaseReadAloudService(), override fun onDestroy() { super.onDestroy() + job?.cancel() mediaPlayer.release() } @@ -48,6 +49,7 @@ class HttpReadAloudService : BaseReadAloudService(), mediaPlayer.reset() job?.cancel() playingIndex = -1 + nowSpeak = 0 super.newReadAloud(dataKey, play) } From 5522533bc1578d7ee64bf62667f10ebb40463bbd Mon Sep 17 00:00:00 2001 From: kunfei Date: Tue, 4 Feb 2020 11:58:05 +0800 Subject: [PATCH 078/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/io/legado/app/service/HttpReadAloudService.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/io/legado/app/service/HttpReadAloudService.kt b/app/src/main/java/io/legado/app/service/HttpReadAloudService.kt index cb8ed973b..34e74859e 100644 --- a/app/src/main/java/io/legado/app/service/HttpReadAloudService.kt +++ b/app/src/main/java/io/legado/app/service/HttpReadAloudService.kt @@ -80,7 +80,7 @@ class HttpReadAloudService : BaseReadAloudService(), if (bytes != null && isActive) { val file = getSpeakFile(index) file.writeBytes(bytes) - if (index == nowSpeak) { + if (index == nowSpeak && !pause) { playAudio(FileInputStream(file).fd) } } From 1dd1ad163bff976b71be477230bc13f4ebc686f6 Mon Sep 17 00:00:00 2001 From: kunfei Date: Tue, 4 Feb 2020 11:58:32 +0800 Subject: [PATCH 079/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/io/legado/app/service/HttpReadAloudService.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/io/legado/app/service/HttpReadAloudService.kt b/app/src/main/java/io/legado/app/service/HttpReadAloudService.kt index 34e74859e..cb8ed973b 100644 --- a/app/src/main/java/io/legado/app/service/HttpReadAloudService.kt +++ b/app/src/main/java/io/legado/app/service/HttpReadAloudService.kt @@ -80,7 +80,7 @@ class HttpReadAloudService : BaseReadAloudService(), if (bytes != null && isActive) { val file = getSpeakFile(index) file.writeBytes(bytes) - if (index == nowSpeak && !pause) { + if (index == nowSpeak) { playAudio(FileInputStream(file).fd) } } From b705edc5c8116b5b0be50fc8d01f0f352ac01436 Mon Sep 17 00:00:00 2001 From: kunfei Date: Tue, 4 Feb 2020 12:16:43 +0800 Subject: [PATCH 080/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/io/legado/app/service/HttpReadAloudService.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/app/src/main/java/io/legado/app/service/HttpReadAloudService.kt b/app/src/main/java/io/legado/app/service/HttpReadAloudService.kt index cb8ed973b..33d05fd11 100644 --- a/app/src/main/java/io/legado/app/service/HttpReadAloudService.kt +++ b/app/src/main/java/io/legado/app/service/HttpReadAloudService.kt @@ -49,7 +49,6 @@ class HttpReadAloudService : BaseReadAloudService(), mediaPlayer.reset() job?.cancel() playingIndex = -1 - nowSpeak = 0 super.newReadAloud(dataKey, play) } From 096bccd4d850c28522df80a757f4b12f2bd140d7 Mon Sep 17 00:00:00 2001 From: kunfei Date: Tue, 4 Feb 2020 12:27:01 +0800 Subject: [PATCH 081/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/io/legado/app/service/HttpReadAloudService.kt | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/io/legado/app/service/HttpReadAloudService.kt b/app/src/main/java/io/legado/app/service/HttpReadAloudService.kt index 33d05fd11..f8048af54 100644 --- a/app/src/main/java/io/legado/app/service/HttpReadAloudService.kt +++ b/app/src/main/java/io/legado/app/service/HttpReadAloudService.kt @@ -141,7 +141,11 @@ class HttpReadAloudService : BaseReadAloudService(), override fun resumeReadAloud() { super.resumeReadAloud() - mediaPlayer.start() + if (playingIndex == -1) { + play() + } else { + mediaPlayer.start() + } } override fun upSpeechRate(reset: Boolean) { From 8b5864fd32c97ca99dbc205d58395eb3c99f5566 Mon Sep 17 00:00:00 2001 From: kunfei Date: Tue, 4 Feb 2020 12:29:30 +0800 Subject: [PATCH 082/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/assets/updateLog.md | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/assets/updateLog.md b/app/src/main/assets/updateLog.md index cc98be492..aafd1d243 100644 --- a/app/src/main/assets/updateLog.md +++ b/app/src/main/assets/updateLog.md @@ -8,6 +8,7 @@ * 添加本地书籍完成,解析txt文件完成,本地txt可以看了 * 封面换源,书籍信息界面点击封面弹出封面换源界面 * 默认封面绘制书名和作者 +* 修复在线朗读遇到单独标点,停止朗读的问题 **2020/02/02** * merged commit e584606, rss修复BaseURL模式下部分图片无法加载, 修复可能出现的乱码 From abc1f597a6325337a45e750d522bc74498d77b6e Mon Sep 17 00:00:00 2001 From: kunfei Date: Tue, 4 Feb 2020 13:06:26 +0800 Subject: [PATCH 083/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../io/legado/app/service/BaseReadAloudService.kt | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/io/legado/app/service/BaseReadAloudService.kt b/app/src/main/java/io/legado/app/service/BaseReadAloudService.kt index 74a5980f9..5603da72c 100644 --- a/app/src/main/java/io/legado/app/service/BaseReadAloudService.kt +++ b/app/src/main/java/io/legado/app/service/BaseReadAloudService.kt @@ -40,18 +40,18 @@ abstract class BaseReadAloudService : BaseService(), } } - val handler = Handler() + internal val handler = Handler() private lateinit var audioManager: AudioManager private var mFocusRequest: AudioFocusRequest? = null private var broadcastReceiver: BroadcastReceiver? = null private var mediaSessionCompat: MediaSessionCompat? = null private var title: String = "" private var subtitle: String = "" - val contentList = arrayListOf() - var nowSpeak: Int = 0 - var readAloudNumber: Int = 0 - var textChapter: TextChapter? = null - var pageIndex = 0 + internal val contentList = arrayListOf() + internal var nowSpeak: Int = 0 + internal var readAloudNumber: Int = 0 + internal var textChapter: TextChapter? = null + internal var pageIndex = 0 private val dsRunnable: Runnable = Runnable { doDs() } override fun onCreate() { From 228289b6756e22339075ab81367cc387b3ccccfd Mon Sep 17 00:00:00 2001 From: kunfei Date: Tue, 4 Feb 2020 13:14:30 +0800 Subject: [PATCH 084/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../legado/app/model/localBook/LocalBook.kt | 30 +++++++++++++++++++ .../app/ui/importbook/ImportBookViewModel.kt | 21 ++----------- 2 files changed, 32 insertions(+), 19 deletions(-) create mode 100644 app/src/main/java/io/legado/app/model/localBook/LocalBook.kt diff --git a/app/src/main/java/io/legado/app/model/localBook/LocalBook.kt b/app/src/main/java/io/legado/app/model/localBook/LocalBook.kt new file mode 100644 index 000000000..e17c08603 --- /dev/null +++ b/app/src/main/java/io/legado/app/model/localBook/LocalBook.kt @@ -0,0 +1,30 @@ +package io.legado.app.model.localBook + +import androidx.documentfile.provider.DocumentFile +import io.legado.app.App +import io.legado.app.data.entities.Book + + +object LocalBook { + + fun importFile(doc: DocumentFile) { + doc.name?.let { fileName -> + val str = fileName.substringBeforeLast(".") + var name = str.substringBefore("作者") + val author = str.substringAfter("作者") + val smhStart = name.indexOf("《") + val smhEnd = name.indexOf("》") + if (smhStart != -1 && smhEnd != -1) { + name = (name.substring(smhStart + 1, smhEnd)) + } + val book = Book( + bookUrl = doc.uri.toString(), + name = name, + author = author, + originName = fileName + ) + App.db.bookDao().insert(book) + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/ui/importbook/ImportBookViewModel.kt b/app/src/main/java/io/legado/app/ui/importbook/ImportBookViewModel.kt index 75d2fc5e0..1250da682 100644 --- a/app/src/main/java/io/legado/app/ui/importbook/ImportBookViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/importbook/ImportBookViewModel.kt @@ -3,9 +3,8 @@ package io.legado.app.ui.importbook import android.app.Application import android.net.Uri import androidx.documentfile.provider.DocumentFile -import io.legado.app.App import io.legado.app.base.BaseViewModel -import io.legado.app.data.entities.Book +import io.legado.app.model.localBook.LocalBook class ImportBookViewModel(application: Application) : BaseViewModel(application) { @@ -14,23 +13,7 @@ class ImportBookViewModel(application: Application) : BaseViewModel(application) execute { uriList.forEach { uriStr -> DocumentFile.fromSingleUri(context, Uri.parse(uriStr))?.let { doc -> - doc.name?.let { fileName -> - val str = fileName.substringBeforeLast(".") - var name = str.substringBefore("作者") - val author = str.substringAfter("作者") - val smhStart = name.indexOf("《") - val smhEnd = name.indexOf("》") - if (smhStart != -1 && smhEnd != -1) { - name = (name.substring(smhStart + 1, smhEnd)) - } - val book = Book( - bookUrl = uriStr, - name = name, - author = author, - originName = fileName - ) - App.db.bookDao().insert(book) - } + LocalBook.importFile(doc) } } }.onFinally { From 40a8c6f17411928b00f9e64d785a34e8f36e948f Mon Sep 17 00:00:00 2001 From: kunfei Date: Tue, 4 Feb 2020 13:16:17 +0800 Subject: [PATCH 085/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/io/legado/app/model/localBook/LocalBook.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/io/legado/app/model/localBook/LocalBook.kt b/app/src/main/java/io/legado/app/model/localBook/LocalBook.kt index e17c08603..44ee337b2 100644 --- a/app/src/main/java/io/legado/app/model/localBook/LocalBook.kt +++ b/app/src/main/java/io/legado/app/model/localBook/LocalBook.kt @@ -11,7 +11,7 @@ object LocalBook { doc.name?.let { fileName -> val str = fileName.substringBeforeLast(".") var name = str.substringBefore("作者") - val author = str.substringAfter("作者") + val author = str.substringAfter("作者", "") val smhStart = name.indexOf("《") val smhEnd = name.indexOf("》") if (smhStart != -1 && smhEnd != -1) { From 501a9273dce32b943829856b9422b0395f191bb9 Mon Sep 17 00:00:00 2001 From: kunfei Date: Tue, 4 Feb 2020 14:08:25 +0800 Subject: [PATCH 086/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../io/legado/app/ui/widget/image/CoverImageView.kt | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/widget/image/CoverImageView.kt b/app/src/main/java/io/legado/app/ui/widget/image/CoverImageView.kt index 64e61508b..3d5d65d02 100644 --- a/app/src/main/java/io/legado/app/ui/widget/image/CoverImageView.kt +++ b/app/src/main/java/io/legado/app/ui/widget/image/CoverImageView.kt @@ -23,6 +23,7 @@ class CoverImageView : androidx.appcompat.widget.AppCompatImageView { private val authorPaint = TextPaint() private var name: String? = null private var author: String? = null + private var loadField = false constructor(context: Context) : super(context) @@ -84,6 +85,7 @@ class CoverImageView : androidx.appcompat.widget.AppCompatImageView { canvas.clipPath(path) } super.onDraw(canvas) + if (!loadField) return name?.let { namePaint.color = Color.WHITE namePaint.style = Paint.Style.STROKE @@ -102,7 +104,7 @@ class CoverImageView : androidx.appcompat.widget.AppCompatImageView { } } - fun setName(name: String?, author: String?) { + fun setText(name: String?, author: String?) { this.name = when { name == null -> null @@ -115,7 +117,6 @@ class CoverImageView : androidx.appcompat.widget.AppCompatImageView { author.length > 8 -> author.substring(0, 7) + "…" else -> author } - invalidate() } fun setHeight(height: Int) { @@ -124,6 +125,7 @@ class CoverImageView : androidx.appcompat.widget.AppCompatImageView { } fun load(path: String?, name: String?, author: String?) { + setText(name, author) ImageLoader.load(context, path)//Glide自动识别http://和file:// .placeholder(R.drawable.image_cover_default) .error(R.drawable.image_cover_default) @@ -134,7 +136,7 @@ class CoverImageView : androidx.appcompat.widget.AppCompatImageView { target: Target?, isFirstResource: Boolean ): Boolean { - setName(name, author) + loadField = true return false } @@ -145,7 +147,7 @@ class CoverImageView : androidx.appcompat.widget.AppCompatImageView { dataSource: DataSource?, isFirstResource: Boolean ): Boolean { - setName(null, null) + loadField = false return false } From b9f37c2601e13d4136ca5e8fe5a97dc43cfbd231 Mon Sep 17 00:00:00 2001 From: kunfei Date: Tue, 4 Feb 2020 14:11:37 +0800 Subject: [PATCH 087/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bookshelf/books/{BooksAdapter.kt => BaseBooksAdapter.kt} | 2 +- .../io/legado/app/ui/main/bookshelf/books/BooksAdapterGrid.kt | 2 +- .../io/legado/app/ui/main/bookshelf/books/BooksAdapterList.kt | 2 +- .../legado/app/ui/main/bookshelf/books/BooksDiffCallBack.kt | 1 + .../io/legado/app/ui/main/bookshelf/books/BooksFragment.kt | 4 ++-- 5 files changed, 6 insertions(+), 5 deletions(-) rename app/src/main/java/io/legado/app/ui/main/bookshelf/books/{BooksAdapter.kt => BaseBooksAdapter.kt} (90%) diff --git a/app/src/main/java/io/legado/app/ui/main/bookshelf/books/BooksAdapter.kt b/app/src/main/java/io/legado/app/ui/main/bookshelf/books/BaseBooksAdapter.kt similarity index 90% rename from app/src/main/java/io/legado/app/ui/main/bookshelf/books/BooksAdapter.kt rename to app/src/main/java/io/legado/app/ui/main/bookshelf/books/BaseBooksAdapter.kt index c8f085b74..9103d3c3c 100644 --- a/app/src/main/java/io/legado/app/ui/main/bookshelf/books/BooksAdapter.kt +++ b/app/src/main/java/io/legado/app/ui/main/bookshelf/books/BaseBooksAdapter.kt @@ -4,7 +4,7 @@ import android.content.Context import io.legado.app.base.adapter.SimpleRecyclerAdapter import io.legado.app.data.entities.Book -abstract class BooksAdapter(context: Context, layoutId: Int) : +abstract class BaseBooksAdapter(context: Context, layoutId: Int) : SimpleRecyclerAdapter(context, layoutId) { fun notification(bookUrl: String) { diff --git a/app/src/main/java/io/legado/app/ui/main/bookshelf/books/BooksAdapterGrid.kt b/app/src/main/java/io/legado/app/ui/main/bookshelf/books/BooksAdapterGrid.kt index ffb608f4f..92a47d790 100644 --- a/app/src/main/java/io/legado/app/ui/main/bookshelf/books/BooksAdapterGrid.kt +++ b/app/src/main/java/io/legado/app/ui/main/bookshelf/books/BooksAdapterGrid.kt @@ -12,7 +12,7 @@ import org.jetbrains.anko.sdk27.listeners.onClick import org.jetbrains.anko.sdk27.listeners.onLongClick class BooksAdapterGrid(context: Context, private val callBack: CallBack) : - BooksAdapter(context, R.layout.item_bookshelf_grid) { + BaseBooksAdapter(context, R.layout.item_bookshelf_grid) { override fun convert(holder: ItemViewHolder, item: Book, payloads: MutableList) { with(holder.itemView) { diff --git a/app/src/main/java/io/legado/app/ui/main/bookshelf/books/BooksAdapterList.kt b/app/src/main/java/io/legado/app/ui/main/bookshelf/books/BooksAdapterList.kt index 71b70f0c2..b35d6fd21 100644 --- a/app/src/main/java/io/legado/app/ui/main/bookshelf/books/BooksAdapterList.kt +++ b/app/src/main/java/io/legado/app/ui/main/bookshelf/books/BooksAdapterList.kt @@ -12,7 +12,7 @@ import org.jetbrains.anko.sdk27.listeners.onClick import org.jetbrains.anko.sdk27.listeners.onLongClick class BooksAdapterList(context: Context, private val callBack: CallBack) : - BooksAdapter(context, R.layout.item_bookshelf_list) { + BaseBooksAdapter(context, R.layout.item_bookshelf_list) { override fun convert(holder: ItemViewHolder, item: Book, payloads: MutableList) { with(holder.itemView) { diff --git a/app/src/main/java/io/legado/app/ui/main/bookshelf/books/BooksDiffCallBack.kt b/app/src/main/java/io/legado/app/ui/main/bookshelf/books/BooksDiffCallBack.kt index 45ad277f2..fc4358f5e 100644 --- a/app/src/main/java/io/legado/app/ui/main/bookshelf/books/BooksDiffCallBack.kt +++ b/app/src/main/java/io/legado/app/ui/main/bookshelf/books/BooksDiffCallBack.kt @@ -23,6 +23,7 @@ class BooksDiffCallBack(private val oldItems: List, private val newItems: val oldItem = oldItems[oldItemPosition] val newItem = newItems[newItemPosition] return oldItem.name == newItem.name + && oldItem.author == newItem.author && oldItem.durChapterTitle == newItem.durChapterTitle && oldItem.latestChapterTitle == newItem.latestChapterTitle && oldItem.getDisplayCover() == newItem.getDisplayCover() diff --git a/app/src/main/java/io/legado/app/ui/main/bookshelf/books/BooksFragment.kt b/app/src/main/java/io/legado/app/ui/main/bookshelf/books/BooksFragment.kt index 0ee866fde..2b92d361b 100644 --- a/app/src/main/java/io/legado/app/ui/main/bookshelf/books/BooksFragment.kt +++ b/app/src/main/java/io/legado/app/ui/main/bookshelf/books/BooksFragment.kt @@ -29,7 +29,7 @@ import org.jetbrains.anko.startActivity class BooksFragment : BaseFragment(R.layout.fragment_books), - BooksAdapter.CallBack { + BaseBooksAdapter.CallBack { companion object { fun newInstance(position: Int, groupId: Int): BooksFragment { @@ -43,7 +43,7 @@ class BooksFragment : BaseFragment(R.layout.fragment_books), } private lateinit var activityViewModel: MainViewModel - private lateinit var booksAdapter: BooksAdapter + private lateinit var booksAdapter: BaseBooksAdapter private var bookshelfLiveData: LiveData>? = null private var position = 0 private var groupId = -1 From 5987b2c2e20d9d8cf0e313705e7b3a0f93429b71 Mon Sep 17 00:00:00 2001 From: kunfei Date: Tue, 4 Feb 2020 14:21:37 +0800 Subject: [PATCH 088/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/ui/widget/image/CoverImageView.kt | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/widget/image/CoverImageView.kt b/app/src/main/java/io/legado/app/ui/widget/image/CoverImageView.kt index 3d5d65d02..f20ace6ce 100644 --- a/app/src/main/java/io/legado/app/ui/widget/image/CoverImageView.kt +++ b/app/src/main/java/io/legado/app/ui/widget/image/CoverImageView.kt @@ -23,7 +23,7 @@ class CoverImageView : androidx.appcompat.widget.AppCompatImageView { private val authorPaint = TextPaint() private var name: String? = null private var author: String? = null - private var loadField = false + private var loadFailed = false constructor(context: Context) : super(context) @@ -85,7 +85,7 @@ class CoverImageView : androidx.appcompat.widget.AppCompatImageView { canvas.clipPath(path) } super.onDraw(canvas) - if (!loadField) return + if (!loadFailed) return name?.let { namePaint.color = Color.WHITE namePaint.style = Paint.Style.STROKE @@ -104,7 +104,12 @@ class CoverImageView : androidx.appcompat.widget.AppCompatImageView { } } - fun setText(name: String?, author: String?) { + fun setHeight(height: Int) { + val width = height * 5 / 7 + minimumWidth = width + } + + private fun setText(name: String?, author: String?) { this.name = when { name == null -> null @@ -119,11 +124,6 @@ class CoverImageView : androidx.appcompat.widget.AppCompatImageView { } } - fun setHeight(height: Int) { - val width = height * 5 / 7 - minimumWidth = width - } - fun load(path: String?, name: String?, author: String?) { setText(name, author) ImageLoader.load(context, path)//Glide自动识别http://和file:// @@ -136,7 +136,7 @@ class CoverImageView : androidx.appcompat.widget.AppCompatImageView { target: Target?, isFirstResource: Boolean ): Boolean { - loadField = true + loadFailed = true return false } @@ -147,7 +147,7 @@ class CoverImageView : androidx.appcompat.widget.AppCompatImageView { dataSource: DataSource?, isFirstResource: Boolean ): Boolean { - loadField = false + loadFailed = false return false } From c2fd24836ce049eeb70b6ae2ebc6307886956a97 Mon Sep 17 00:00:00 2001 From: kunfei Date: Tue, 4 Feb 2020 20:15:25 +0800 Subject: [PATCH 089/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/io/legado/app/ui/config/BackupConfigFragment.kt | 4 +++- .../main/java/io/legado/app/ui/config/OtherConfigFragment.kt | 3 ++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/config/BackupConfigFragment.kt b/app/src/main/java/io/legado/app/ui/config/BackupConfigFragment.kt index 10c787bac..39c711974 100644 --- a/app/src/main/java/io/legado/app/ui/config/BackupConfigFragment.kt +++ b/app/src/main/java/io/legado/app/ui/config/BackupConfigFragment.kt @@ -108,7 +108,7 @@ class BackupConfigFragment : PreferenceFragmentCompat(), } else -> preference?.summary = newValue?.toString() } - return true + return false } override fun onPreferenceTreeClick(preference: Preference?): Boolean { @@ -305,6 +305,7 @@ class BackupConfigFragment : PreferenceFragmentCompat(), Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION ) putPrefString(PreferKey.backupPath, uri.toString()) + findPreference(PreferKey.backupPath)?.summary = uri.toString() launch { Backup.backup(requireContext(), uri) } @@ -317,6 +318,7 @@ class BackupConfigFragment : PreferenceFragmentCompat(), Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION ) putPrefString(PreferKey.backupPath, uri.toString()) + findPreference(PreferKey.backupPath)?.summary = uri.toString() launch { Restore.restore(requireContext(), uri) toast(R.string.restore_success) diff --git a/app/src/main/java/io/legado/app/ui/config/OtherConfigFragment.kt b/app/src/main/java/io/legado/app/ui/config/OtherConfigFragment.kt index c865aeae6..ccfc88116 100644 --- a/app/src/main/java/io/legado/app/ui/config/OtherConfigFragment.kt +++ b/app/src/main/java/io/legado/app/ui/config/OtherConfigFragment.kt @@ -106,7 +106,7 @@ class OtherConfigFragment : PreferenceFragmentCompat(), getString(R.string.threads_num, stringValue) else -> preference?.summary = stringValue } - return true + return false } private fun bindPreferenceSummaryToValue(preference: Preference?) { @@ -188,6 +188,7 @@ class OtherConfigFragment : PreferenceFragmentCompat(), Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION ) putPrefString(PreferKey.downloadPath, uri.toString()) + findPreference(PreferKey.downloadPath)?.summary = uri.toString() BookHelp.upDownloadPath() } } From 2469983166a01b123d8789af24778cfba9a6e3c8 Mon Sep 17 00:00:00 2001 From: kunfei Date: Tue, 4 Feb 2020 20:46:12 +0800 Subject: [PATCH 090/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/io/legado/app/help/BookHelp.kt | 12 ++++++------ .../java/io/legado/app/utils/StringExtensions.kt | 5 ++--- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/io/legado/app/help/BookHelp.kt b/app/src/main/java/io/legado/app/help/BookHelp.kt index 7071579ea..b9bf8d11c 100644 --- a/app/src/main/java/io/legado/app/help/BookHelp.kt +++ b/app/src/main/java/io/legado/app/help/BookHelp.kt @@ -38,7 +38,7 @@ object BookHelp { } fun clearCache() { - if (downloadUri.isDocumentUri(App.INSTANCE)) { + if (downloadPath.isContentPath()) { DocumentFile.fromTreeUri(App.INSTANCE, downloadUri) ?.findFile(cacheFolderName) ?.delete() @@ -55,7 +55,7 @@ object BookHelp { @Synchronized fun saveContent(book: Book, bookChapter: BookChapter, content: String) { if (content.isEmpty()) return - if (downloadUri.isDocumentUri(App.INSTANCE)) { + if (downloadPath.isContentPath()) { DocumentFile.fromTreeUri(App.INSTANCE, downloadUri)?.let { root -> DocumentUtils.getDirDocument( root, @@ -91,7 +91,7 @@ object BookHelp { } fun getChapterCount(book: Book): Int { - if (downloadUri.isDocumentUri(App.INSTANCE)) { + if (downloadPath.isContentPath()) { DocumentFile.fromTreeUri(App.INSTANCE, downloadUri)?.let { root -> return DocumentUtils.createFolderIfNotExist( root, @@ -112,7 +112,7 @@ object BookHelp { book.isLocalBook() -> { return true } - downloadUri.isDocumentUri(App.INSTANCE) -> { + downloadPath.isContentPath() -> { DocumentFile.fromTreeUri(App.INSTANCE, downloadUri)?.let { root -> return DocumentUtils.exists( root, @@ -137,7 +137,7 @@ object BookHelp { book.isLocalBook() -> { return AnalyzeTxtFile.getContent(book, bookChapter) } - downloadUri.isDocumentUri(App.INSTANCE) -> { + downloadPath.isContentPath() -> { DocumentFile.fromTreeUri(App.INSTANCE, downloadUri)?.let { root -> return DocumentUtils.getDirDocument( root, @@ -163,7 +163,7 @@ object BookHelp { fun delContent(book: Book, bookChapter: BookChapter) { when { book.isLocalBook() -> return - downloadUri.isDocumentUri(App.INSTANCE) -> { + downloadPath.isContentPath() -> { DocumentFile.fromTreeUri(App.INSTANCE, downloadUri)?.let { root -> DocumentUtils.getDirDocument( root, diff --git a/app/src/main/java/io/legado/app/utils/StringExtensions.kt b/app/src/main/java/io/legado/app/utils/StringExtensions.kt index 19319d3ba..02faf53c3 100644 --- a/app/src/main/java/io/legado/app/utils/StringExtensions.kt +++ b/app/src/main/java/io/legado/app/utils/StringExtensions.kt @@ -4,6 +4,8 @@ package io.legado.app.utils fun String?.safeTrim() = if (this.isNullOrBlank()) null else this.trim() +fun String?.isContentPath(): Boolean = this?.startsWith("content://") == true + fun String?.isAbsUrl() = this?.let { it.startsWith("http://", true) @@ -48,7 +50,4 @@ fun String.splitNotBlank(regex: Regex, limit: Int = 0): Array = run { this.split(regex, limit).map { it.trim() }.filterNot { it.isBlank() }.toTypedArray() } -fun String.startWithIgnoreCase(start: String): Boolean { - return if (this.isBlank()) false else startsWith(start, true) -} From 2d2adfc8efe8b061bfd19efe377f0d7c2b5010cb Mon Sep 17 00:00:00 2001 From: kunfei Date: Tue, 4 Feb 2020 20:57:57 +0800 Subject: [PATCH 091/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/io/legado/app/help/BookHelp.kt | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/io/legado/app/help/BookHelp.kt b/app/src/main/java/io/legado/app/help/BookHelp.kt index b9bf8d11c..fa6b63c39 100644 --- a/app/src/main/java/io/legado/app/help/BookHelp.kt +++ b/app/src/main/java/io/legado/app/help/BookHelp.kt @@ -60,10 +60,12 @@ object BookHelp { DocumentUtils.getDirDocument( root, subDirs = *arrayOf(cacheFolderName, bookFolderName(book)) - )?.listFiles()?.forEach { - if (it.name?.startsWith(String.format("%05d", bookChapter.index)) == true) { - it.delete() - return@forEach + )?.uri?.let { uri -> + DocumentUtils.listFiles(App.INSTANCE, uri).forEach { + if (it.name.startsWith(String.format("%05d", bookChapter.index))) { + DocumentFile.fromSingleUri(App.INSTANCE, it.uri)?.delete() + return@forEach + } } } DocumentUtils.createFileIfNotExist( From 2ee88e1bea366b8ccc7483a362acc5b7dc488d96 Mon Sep 17 00:00:00 2001 From: kunfei Date: Tue, 4 Feb 2020 21:00:40 +0800 Subject: [PATCH 092/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/assets/updateLog.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/src/main/assets/updateLog.md b/app/src/main/assets/updateLog.md index aafd1d243..1f7f9e874 100644 --- a/app/src/main/assets/updateLog.md +++ b/app/src/main/assets/updateLog.md @@ -3,6 +3,9 @@ * 旧版数据导入教程: * 先在旧版阅读(2.x)中进行备份,然后在新版阅读(3.x)【我的】->【备份与恢复】,选择【导入旧版本数据】。 +**2020/02/05** +* 修复bug + **2020/02/04** * 主界面切换时自动隐藏键盘 * 添加本地书籍完成,解析txt文件完成,本地txt可以看了 From 7269ca40a91ce8c3be77a5ec8b96d2be2e21f7c4 Mon Sep 17 00:00:00 2001 From: kunfei Date: Tue, 4 Feb 2020 21:02:37 +0800 Subject: [PATCH 093/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/io/legado/app/utils/UriExtensions.kt | 4 ---- 1 file changed, 4 deletions(-) diff --git a/app/src/main/java/io/legado/app/utils/UriExtensions.kt b/app/src/main/java/io/legado/app/utils/UriExtensions.kt index 49b76b439..4062c74df 100644 --- a/app/src/main/java/io/legado/app/utils/UriExtensions.kt +++ b/app/src/main/java/io/legado/app/utils/UriExtensions.kt @@ -5,10 +5,6 @@ import android.net.Uri import androidx.documentfile.provider.DocumentFile import java.io.File -fun Uri.isDocumentUri(context: Context): Boolean { - return DocumentFile.isDocumentUri(context, this) -} - @Throws(Exception::class) fun Uri.readBytes(context: Context): ByteArray? { if (DocumentFile.isDocumentUri(context, this)) { From 6c9a63fb097a589b8a99985241f662b4a71c93bd Mon Sep 17 00:00:00 2001 From: kunfei Date: Tue, 4 Feb 2020 21:12:42 +0800 Subject: [PATCH 094/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/AndroidManifest.xml | 1 + .../app/ui/rss/favorites/RssFavoritesActivity.kt | 16 ++++++++++++++++ .../main/res/layout/activity_rss_favorites.xml | 7 +++++++ 3 files changed, 24 insertions(+) create mode 100644 app/src/main/java/io/legado/app/ui/rss/favorites/RssFavoritesActivity.kt create mode 100644 app/src/main/res/layout/activity_rss_favorites.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 23f5edd36..4be71d133 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -103,6 +103,7 @@ + + + + \ No newline at end of file From e6ea59aaff500a2e89d8bc2f9a0af4ea037e6acc Mon Sep 17 00:00:00 2001 From: kunfei Date: Tue, 4 Feb 2020 21:19:42 +0800 Subject: [PATCH 095/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/io/legado/app/ui/main/rss/RssFragment.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/main/rss/RssFragment.kt b/app/src/main/java/io/legado/app/ui/main/rss/RssFragment.kt index 0ec49f315..b0ad73f2e 100644 --- a/app/src/main/java/io/legado/app/ui/main/rss/RssFragment.kt +++ b/app/src/main/java/io/legado/app/ui/main/rss/RssFragment.kt @@ -13,6 +13,7 @@ import io.legado.app.data.entities.RssSource import io.legado.app.lib.theme.ATH import io.legado.app.ui.main.MainViewModel import io.legado.app.ui.rss.article.RssArticlesActivity +import io.legado.app.ui.rss.favorites.RssFavoritesActivity import io.legado.app.ui.rss.source.manage.RssSourceActivity import io.legado.app.utils.getViewModelOfActivity import io.legado.app.utils.startActivity @@ -38,8 +39,7 @@ class RssFragment : BaseFragment(R.layout.fragment_rss), super.onCompatOptionsItemSelected(item) when (item.itemId) { R.id.menu_rss_config -> startActivity() - R.id.menu_rss_star -> { - } + R.id.menu_rss_star -> startActivity() } } From cd4f3fe161f01c06988569f880e85eff62913eaa Mon Sep 17 00:00:00 2001 From: kunfei Date: Tue, 4 Feb 2020 21:25:29 +0800 Subject: [PATCH 096/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../legado/app/ui/rss/read/ReadRssActivity.kt | 4 +-- .../res/layout/activity_rss_favorites.xml | 30 ++++++++++++++++--- app/src/main/res/menu/main_rss.xml | 2 +- app/src/main/res/menu/rss_read.xml | 2 +- app/src/main/res/values/strings.xml | 7 +++-- 5 files changed, 34 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/rss/read/ReadRssActivity.kt b/app/src/main/java/io/legado/app/ui/rss/read/ReadRssActivity.kt index 7bbf4e741..ffb5c4994 100644 --- a/app/src/main/java/io/legado/app/ui/rss/read/ReadRssActivity.kt +++ b/app/src/main/java/io/legado/app/ui/rss/read/ReadRssActivity.kt @@ -101,10 +101,10 @@ class ReadRssActivity : VMBaseActivity(R.layout.activity_rss_r override fun upStarMenu() { if (viewModel.star) { starMenuItem?.setIcon(R.drawable.ic_star) - starMenuItem?.setTitle(R.string.y_store_up) + starMenuItem?.setTitle(R.string.in_favorites) } else { starMenuItem?.setIcon(R.drawable.ic_star_border) - starMenuItem?.setTitle(R.string.w_store_up) + starMenuItem?.setTitle(R.string.out_favorites) } DrawableUtils.setTint(starMenuItem?.icon, primaryTextColor) } diff --git a/app/src/main/res/layout/activity_rss_favorites.xml b/app/src/main/res/layout/activity_rss_favorites.xml index d829e291c..5b80c0714 100644 --- a/app/src/main/res/layout/activity_rss_favorites.xml +++ b/app/src/main/res/layout/activity_rss_favorites.xml @@ -1,7 +1,29 @@ - + android:layout_height="match_parent" + android:orientation="vertical"> - \ No newline at end of file + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/menu/main_rss.xml b/app/src/main/res/menu/main_rss.xml index 4403621bd..97343e877 100644 --- a/app/src/main/res/menu/main_rss.xml +++ b/app/src/main/res/menu/main_rss.xml @@ -5,7 +5,7 @@ diff --git a/app/src/main/res/menu/rss_read.xml b/app/src/main/res/menu/rss_read.xml index f32d01d2e..7afb7f128 100644 --- a/app/src/main/res/menu/rss_read.xml +++ b/app/src/main/res/menu/rss_read.xml @@ -4,7 +4,7 @@ diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index b5d27918a..8b283bb42 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -33,9 +33,10 @@ 启用 替换净化-搜索 书架 - 收藏 - 已收藏 - 未收藏 + 收藏夹 + 收藏 + 已收藏 + 未收藏 订阅 全部 最近阅读 From 83c2be867d218854b4f3c49690de59d34c387094 Mon Sep 17 00:00:00 2001 From: kunfei Date: Tue, 4 Feb 2020 21:38:19 +0800 Subject: [PATCH 097/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/rss/favorites/RssFavoritesActivity.kt | 44 ++++++++++++- .../ui/rss/favorites/RssFavoritesAdapter.kt | 64 +++++++++++++++++++ .../res/layout/activity_rss_favorites.xml | 16 ++--- 3 files changed, 113 insertions(+), 11 deletions(-) create mode 100644 app/src/main/java/io/legado/app/ui/rss/favorites/RssFavoritesAdapter.kt diff --git a/app/src/main/java/io/legado/app/ui/rss/favorites/RssFavoritesActivity.kt b/app/src/main/java/io/legado/app/ui/rss/favorites/RssFavoritesActivity.kt index 96bc3f99a..0188fe104 100644 --- a/app/src/main/java/io/legado/app/ui/rss/favorites/RssFavoritesActivity.kt +++ b/app/src/main/java/io/legado/app/ui/rss/favorites/RssFavoritesActivity.kt @@ -1,16 +1,58 @@ package io.legado.app.ui.rss.favorites import android.os.Bundle +import androidx.core.content.ContextCompat +import androidx.lifecycle.LiveData +import androidx.lifecycle.Observer +import androidx.recyclerview.widget.DividerItemDecoration +import androidx.recyclerview.widget.LinearLayoutManager +import io.legado.app.App import io.legado.app.R import io.legado.app.base.BaseActivity +import io.legado.app.data.entities.RssStar +import io.legado.app.lib.theme.ATH +import io.legado.app.ui.rss.read.ReadRssActivity +import kotlinx.android.synthetic.main.view_refresh_recycler.* +import org.jetbrains.anko.startActivity -class RssFavoritesActivity : BaseActivity(R.layout.activity_rss_favorites) { +class RssFavoritesActivity : BaseActivity(R.layout.activity_rss_favorites), + RssFavoritesAdapter.CallBack { + private var liveData: LiveData>? = null + private lateinit var adapter: RssFavoritesAdapter override fun onActivityCreated(savedInstanceState: Bundle?) { + initView() + initData() + } + private fun initView() { + ATH.applyEdgeEffectColor(recycler_view) + recycler_view.layoutManager = LinearLayoutManager(this) + recycler_view.addItemDecoration( + DividerItemDecoration(this, DividerItemDecoration.VERTICAL).apply { + ContextCompat.getDrawable(baseContext, R.drawable.ic_divider)?.let { + this.setDrawable(it) + } + }) + adapter = RssFavoritesAdapter(this, this) + recycler_view.adapter = adapter } + private fun initData() { + liveData?.removeObservers(this) + liveData = App.db.rssStarDao().liveAll() + liveData?.observe(this, Observer { + adapter.setItems(it) + }) + } + override fun readRss(rssStar: RssStar) { + startActivity( + Pair("title", rssStar.title), + Pair("origin", rssStar.origin), + Pair("link", rssStar.link) + ) + } } \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/ui/rss/favorites/RssFavoritesAdapter.kt b/app/src/main/java/io/legado/app/ui/rss/favorites/RssFavoritesAdapter.kt new file mode 100644 index 000000000..2cb607df5 --- /dev/null +++ b/app/src/main/java/io/legado/app/ui/rss/favorites/RssFavoritesAdapter.kt @@ -0,0 +1,64 @@ +package io.legado.app.ui.rss.favorites + +import android.content.Context +import android.graphics.drawable.Drawable +import com.bumptech.glide.load.DataSource +import com.bumptech.glide.load.engine.GlideException +import com.bumptech.glide.request.RequestListener +import com.bumptech.glide.request.target.Target +import io.legado.app.R +import io.legado.app.base.adapter.ItemViewHolder +import io.legado.app.base.adapter.SimpleRecyclerAdapter +import io.legado.app.data.entities.RssStar +import io.legado.app.help.ImageLoader +import io.legado.app.utils.gone +import io.legado.app.utils.visible +import kotlinx.android.synthetic.main.item_rss_article.view.* +import org.jetbrains.anko.sdk27.listeners.onClick + +class RssFavoritesAdapter(context: Context, val callBack: CallBack) : + SimpleRecyclerAdapter(context, R.layout.item_rss_article) { + + override fun convert(holder: ItemViewHolder, item: RssStar, payloads: MutableList) { + with(holder.itemView) { + tv_title.text = item.title + tv_pub_date.text = item.pubDate + onClick { + callBack.readRss(item) + } + if (item.image.isNullOrBlank()) { + image_view.gone() + } else { + ImageLoader.load(context, item.image) + .addListener(object : RequestListener { + override fun onLoadFailed( + e: GlideException?, + model: Any?, + target: Target?, + isFirstResource: Boolean + ): Boolean { + image_view.gone() + return false + } + + override fun onResourceReady( + resource: Drawable?, + model: Any?, + target: Target?, + dataSource: DataSource?, + isFirstResource: Boolean + ): Boolean { + image_view.visible() + return false + } + + }) + .into(image_view) + } + } + } + + interface CallBack { + fun readRss(rssStar: RssStar) + } +} \ No newline at end of file diff --git a/app/src/main/res/layout/activity_rss_favorites.xml b/app/src/main/res/layout/activity_rss_favorites.xml index 5b80c0714..7740c1981 100644 --- a/app/src/main/res/layout/activity_rss_favorites.xml +++ b/app/src/main/res/layout/activity_rss_favorites.xml @@ -1,6 +1,7 @@ @@ -12,18 +13,13 @@ app:title="@string/favorites" app:layout_constraintTop_toTopOf="parent" /> - - - - - + app:layout_constraintTop_toBottomOf="@id/title_bar" + app:layout_constraintVertical_bias="0.0" + tools:layout_editor_absoluteX="0dp" /> \ No newline at end of file From f408209565ab8eee7fbcde764bace6df1e0cee3c Mon Sep 17 00:00:00 2001 From: M17764017422 <31874069+M17764017422@users.noreply.github.com> Date: Tue, 4 Feb 2020 21:42:13 +0800 Subject: [PATCH 098/159] =?UTF-8?q?=E6=B8=85=E7=90=86=E6=9C=97=E8=AF=BB?= =?UTF-8?q?=E6=9D=82=E9=9F=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/io/legado/app/ui/rss/read/ReadRssActivity.kt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/io/legado/app/ui/rss/read/ReadRssActivity.kt b/app/src/main/java/io/legado/app/ui/rss/read/ReadRssActivity.kt index ffb5c4994..d497ccb06 100644 --- a/app/src/main/java/io/legado/app/ui/rss/read/ReadRssActivity.kt +++ b/app/src/main/java/io/legado/app/ui/rss/read/ReadRssActivity.kt @@ -155,7 +155,9 @@ class ReadRssActivity : VMBaseActivity(R.layout.activity_rss_r webView.settings.javaScriptEnabled = true webView.evaluateJavascript("document.documentElement.outerHTML") { val html = StringEscapeUtils.unescapeJson(it) - viewModel.readAloud(Jsoup.clean(html, Whitelist.none())) + val 需读内容 = Jsoup.clean(html, Whitelist.none()).replace(Regex("""&\w+;"""),"").trim()//朗读过程中总是听到一些杂音,清理一下 + //longToast(需读内容)调试一下 + viewModel.readAloud(需读内容) } } } From 8892da54689ed5ed75c9b5e4ed52e6c58911b286 Mon Sep 17 00:00:00 2001 From: kunfei Date: Tue, 4 Feb 2020 21:57:05 +0800 Subject: [PATCH 099/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../io/legado/app/ui/rss/read/ReadRssActivity.kt | 12 ++++++++---- .../io/legado/app/ui/rss/read/ReadRssViewModel.kt | 3 ++- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/rss/read/ReadRssActivity.kt b/app/src/main/java/io/legado/app/ui/rss/read/ReadRssActivity.kt index ffb5c4994..af113b5c0 100644 --- a/app/src/main/java/io/legado/app/ui/rss/read/ReadRssActivity.kt +++ b/app/src/main/java/io/legado/app/ui/rss/read/ReadRssActivity.kt @@ -40,15 +40,19 @@ class ReadRssActivity : VMBaseActivity(R.layout.activity_rss_r override fun onCompatCreateOptionsMenu(menu: Menu): Boolean { menuInflater.inflate(R.menu.rss_read, menu) - starMenuItem = menu.findItem(R.id.menu_rss_star) - ttsMenuItem = menu.findItem(R.id.menu_aloud) - upStarMenu() return super.onCompatCreateOptionsMenu(menu) } + override fun onPrepareOptionsMenu(menu: Menu?): Boolean { + starMenuItem = menu?.findItem(R.id.menu_rss_star) + ttsMenuItem = menu?.findItem(R.id.menu_aloud) + upStarMenu() + return super.onPrepareOptionsMenu(menu) + } + override fun onCompatOptionsItemSelected(item: MenuItem): Boolean { when (item.itemId) { - R.id.menu_rss_star -> viewModel.star() + R.id.menu_rss_star -> viewModel.favorite() R.id.menu_share_it -> viewModel.rssArticle?.let { shareText("链接分享", it.link) } diff --git a/app/src/main/java/io/legado/app/ui/rss/read/ReadRssViewModel.kt b/app/src/main/java/io/legado/app/ui/rss/read/ReadRssViewModel.kt index a81655c27..0ace44358 100644 --- a/app/src/main/java/io/legado/app/ui/rss/read/ReadRssViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/rss/read/ReadRssViewModel.kt @@ -70,7 +70,7 @@ class ReadRssViewModel(application: Application) : BaseViewModel(application), } } - fun star() { + fun favorite() { execute { rssArticle?.let { if (star) { @@ -78,6 +78,7 @@ class ReadRssViewModel(application: Application) : BaseViewModel(application), } else { App.db.rssStarDao().insert(it.toStar()) } + star = !star } }.onSuccess { callBack?.upStarMenu() From 29bebf4995f2fd328c5d53f15d62c909ee384530 Mon Sep 17 00:00:00 2001 From: kunfei Date: Tue, 4 Feb 2020 22:18:43 +0800 Subject: [PATCH 100/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/assets/updateLog.md | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/assets/updateLog.md b/app/src/main/assets/updateLog.md index 1f7f9e874..c703795e9 100644 --- a/app/src/main/assets/updateLog.md +++ b/app/src/main/assets/updateLog.md @@ -5,6 +5,7 @@ **2020/02/05** * 修复bug +* Rss收藏功能完成 **2020/02/04** * 主界面切换时自动隐藏键盘 From 3d1a8eb281de7f511af5ccb0ccfd5a70f53e8289 Mon Sep 17 00:00:00 2001 From: kunfei Date: Wed, 5 Feb 2020 10:42:45 +0800 Subject: [PATCH 101/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/io/legado/app/data/AppDatabase.kt | 5 +++-- .../main/java/io/legado/app/data/dao/RssArticleDao.kt | 10 +++++++++- .../java/io/legado/app/data/entities/RssReadRecord.kt | 7 +++++++ .../legado/app/ui/rss/article/RssArticlesViewModel.kt | 4 ++-- 4 files changed, 21 insertions(+), 5 deletions(-) create mode 100644 app/src/main/java/io/legado/app/data/entities/RssReadRecord.kt diff --git a/app/src/main/java/io/legado/app/data/AppDatabase.kt b/app/src/main/java/io/legado/app/data/AppDatabase.kt index b817927d0..e548f4584 100644 --- a/app/src/main/java/io/legado/app/data/AppDatabase.kt +++ b/app/src/main/java/io/legado/app/data/AppDatabase.kt @@ -16,8 +16,9 @@ import kotlinx.coroutines.launch @Database( entities = [Book::class, BookGroup::class, BookSource::class, BookChapter::class, ReplaceRule::class, SearchBook::class, SearchKeyword::class, Cookie::class, - RssSource::class, Bookmark::class, RssArticle::class, RssStar::class, TxtTocRule::class], - version = 7, + RssSource::class, Bookmark::class, RssArticle::class, RssReadRecord::class, + RssStar::class, TxtTocRule::class], + version = 8, exportSchema = true ) abstract class AppDatabase : RoomDatabase() { diff --git a/app/src/main/java/io/legado/app/data/dao/RssArticleDao.kt b/app/src/main/java/io/legado/app/data/dao/RssArticleDao.kt index 247a5be6e..ea5bb1ad8 100644 --- a/app/src/main/java/io/legado/app/data/dao/RssArticleDao.kt +++ b/app/src/main/java/io/legado/app/data/dao/RssArticleDao.kt @@ -3,6 +3,7 @@ package io.legado.app.data.dao import androidx.lifecycle.LiveData import androidx.room.* import io.legado.app.data.entities.RssArticle +import io.legado.app.data.entities.RssReadRecord @Dao interface RssArticleDao { @@ -10,7 +11,11 @@ interface RssArticleDao { @Query("select * from rssArticles where origin = :origin and link = :link") fun get(origin: String, link: String): RssArticle? - @Query("select * from rssArticles where origin = :origin order by `order` desc") + @Query( + """select t1.link, t1.origin, t1.`order`, t1.title, t1.content, t1.description, t1.image, t1.pubDate, ifNull(t2.read, 0) as read + from rssArticles as t1 left join rssReadRecords as t2 + on t1.link = t2.record where origin = :origin order by `order` desc""" + ) fun liveByOrigin(origin: String): LiveData> @Insert(onConflict = OnConflictStrategy.REPLACE) @@ -24,4 +29,7 @@ interface RssArticleDao { @Query("delete from rssArticles where origin = :origin") fun delete(origin: String) + + @Insert(onConflict = OnConflictStrategy.IGNORE) + fun insertRecord(vararg rssReadRecord: RssReadRecord) } \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/data/entities/RssReadRecord.kt b/app/src/main/java/io/legado/app/data/entities/RssReadRecord.kt new file mode 100644 index 000000000..edbb4c15d --- /dev/null +++ b/app/src/main/java/io/legado/app/data/entities/RssReadRecord.kt @@ -0,0 +1,7 @@ +package io.legado.app.data.entities + +import androidx.room.Entity +import androidx.room.PrimaryKey + +@Entity(tableName = "rssReadRecords") +data class RssReadRecord(@PrimaryKey val record: String, val read: Boolean = true) \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/ui/rss/article/RssArticlesViewModel.kt b/app/src/main/java/io/legado/app/ui/rss/article/RssArticlesViewModel.kt index 8a93301b9..42bc5c2d4 100644 --- a/app/src/main/java/io/legado/app/ui/rss/article/RssArticlesViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/rss/article/RssArticlesViewModel.kt @@ -6,6 +6,7 @@ import androidx.lifecycle.MutableLiveData import io.legado.app.App import io.legado.app.base.BaseViewModel import io.legado.app.data.entities.RssArticle +import io.legado.app.data.entities.RssReadRecord import io.legado.app.data.entities.RssSource import io.legado.app.model.Rss import kotlinx.coroutines.Dispatchers.IO @@ -101,8 +102,7 @@ class RssArticlesViewModel(application: Application) : BaseViewModel(application fun read(rssArticle: RssArticle) { execute { - rssArticle.read = true - App.db.rssArticleDao().update(rssArticle) + App.db.rssArticleDao().insertRecord(RssReadRecord(rssArticle.link)) } } From 8501b6a35f2bb465912402080efbf6469c4925f3 Mon Sep 17 00:00:00 2001 From: kunfei Date: Wed, 5 Feb 2020 10:43:38 +0800 Subject: [PATCH 102/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/assets/updateLog.md | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/assets/updateLog.md b/app/src/main/assets/updateLog.md index c703795e9..50ee128dc 100644 --- a/app/src/main/assets/updateLog.md +++ b/app/src/main/assets/updateLog.md @@ -6,6 +6,7 @@ **2020/02/05** * 修复bug * Rss收藏功能完成 +* Rss已读标记不会再丢失 **2020/02/04** * 主界面切换时自动隐藏键盘 From 8db7c3943f3cd171d5217bbfce0eab168d0b12ac Mon Sep 17 00:00:00 2001 From: kunfei Date: Wed, 5 Feb 2020 12:18:45 +0800 Subject: [PATCH 103/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/io/legado/app/data/dao/BookDao.kt | 2 +- .../io/legado/app/data/dao/BookGroupDao.kt | 4 +- .../io/legado/app/data/dao/RssArticleDao.kt | 2 + .../java/io/legado/app/data/dao/RssStarDao.kt | 3 ++ .../java/io/legado/app/help/storage/Backup.kt | 50 ++++++------------- .../app/web/controller/BookshelfController.kt | 2 +- 6 files changed, 24 insertions(+), 39 deletions(-) diff --git a/app/src/main/java/io/legado/app/data/dao/BookDao.kt b/app/src/main/java/io/legado/app/data/dao/BookDao.kt index 303be7d5c..cbd0f61ce 100644 --- a/app/src/main/java/io/legado/app/data/dao/BookDao.kt +++ b/app/src/main/java/io/legado/app/data/dao/BookDao.kt @@ -45,7 +45,7 @@ interface BookDao { val hasUpdateBooks: List @get:Query("SELECT * FROM books") - val allBooks: List + val all: List @get:Query("SELECT * FROM books where type = 0 ORDER BY durChapterTime DESC limit 1") val lastReadBook: Book? diff --git a/app/src/main/java/io/legado/app/data/dao/BookGroupDao.kt b/app/src/main/java/io/legado/app/data/dao/BookGroupDao.kt index b06e7ac9e..af15188bb 100644 --- a/app/src/main/java/io/legado/app/data/dao/BookGroupDao.kt +++ b/app/src/main/java/io/legado/app/data/dao/BookGroupDao.kt @@ -19,8 +19,8 @@ interface BookGroupDao { @get:Query("SELECT MAX(`order`) FROM book_groups") val maxOrder: Int - @Query("SELECT * FROM book_groups ORDER BY `order`") - fun all(): List + @get:Query("SELECT * FROM book_groups ORDER BY `order`") + val all: List @Insert(onConflict = OnConflictStrategy.REPLACE) fun insert(vararg bookGroup: BookGroup) diff --git a/app/src/main/java/io/legado/app/data/dao/RssArticleDao.kt b/app/src/main/java/io/legado/app/data/dao/RssArticleDao.kt index ea5bb1ad8..fbf3c3611 100644 --- a/app/src/main/java/io/legado/app/data/dao/RssArticleDao.kt +++ b/app/src/main/java/io/legado/app/data/dao/RssArticleDao.kt @@ -32,4 +32,6 @@ interface RssArticleDao { @Insert(onConflict = OnConflictStrategy.IGNORE) fun insertRecord(vararg rssReadRecord: RssReadRecord) + + } \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/data/dao/RssStarDao.kt b/app/src/main/java/io/legado/app/data/dao/RssStarDao.kt index 87e527f75..faaf85b9f 100644 --- a/app/src/main/java/io/legado/app/data/dao/RssStarDao.kt +++ b/app/src/main/java/io/legado/app/data/dao/RssStarDao.kt @@ -7,6 +7,9 @@ import io.legado.app.data.entities.RssStar @Dao interface RssStarDao { + @get:Query("select * from rssStars order by starTime desc") + val all: List + @Query("select * from rssStars where origin = :origin and link = :link") fun get(origin: String, link: String): RssStar? diff --git a/app/src/main/java/io/legado/app/help/storage/Backup.kt b/app/src/main/java/io/legado/app/help/storage/Backup.kt index fd28eea7f..d8fc7e4a3 100644 --- a/app/src/main/java/io/legado/app/help/storage/Backup.kt +++ b/app/src/main/java/io/legado/app/help/storage/Backup.kt @@ -36,6 +36,7 @@ object Backup { "bookGroup.json", "bookSource.json", "rssSource.json", + "rssStar.json", "replaceRule.json", ReadBookConfig.readConfigFileName, "config.xml" @@ -44,41 +45,13 @@ object Backup { suspend fun backup(context: Context, uri: Uri?) { withContext(IO) { - App.db.bookDao().allBooks.let { - if (it.isNotEmpty()) { - val json = GSON.toJson(it) - FileUtils.createFileIfNotExist(backupPath + File.separator + "bookshelf.json") - .writeText(json) - } - } - App.db.bookGroupDao().all().let { - if (it.isNotEmpty()) { - val json = GSON.toJson(it) - FileUtils.createFileIfNotExist(backupPath + File.separator + "bookGroup.json") - .writeText(json) - } - } - App.db.bookSourceDao().all.let { - if (it.isNotEmpty()) { - val json = GSON.toJson(it) - FileUtils.createFileIfNotExist(backupPath + File.separator + "bookSource.json") - .writeText(json) - } - } - App.db.rssSourceDao().all.let { - if (it.isNotEmpty()) { - val json = GSON.toJson(it) - FileUtils.createFileIfNotExist(backupPath + File.separator + "rssSource.json") - .writeText(json) - } - } - App.db.replaceRuleDao().all.let { - if (it.isNotEmpty()) { - val json = GSON.toJson(it) - FileUtils.createFileIfNotExist(backupPath + File.separator + "replaceRule.json") - .writeText(json) - } - } + writeListToJson(App.db.bookDao().all, "bookshelf.json", backupPath) + writeListToJson(App.db.bookGroupDao().all, "bookGroup.json", backupPath) + writeListToJson(App.db.bookSourceDao().all, "bookSource.json", backupPath) + writeListToJson(App.db.rssSourceDao().all, "rssSource.json", backupPath) + writeListToJson(App.db.rssStarDao().all, "rssStar.json", backupPath) + writeListToJson(App.db.replaceRuleDao().all, "replaceRule.json", backupPath) + GSON.toJson(ReadBookConfig.configList)?.let { FileUtils.createFileIfNotExist(backupPath + File.separator + ReadBookConfig.readConfigFileName) .writeText(it) @@ -106,6 +79,13 @@ object Backup { } } + private fun writeListToJson(list: List, fileName: String, path: String) { + if (list.isNotEmpty()) { + val json = GSON.toJson(list) + FileUtils.createFileIfNotExist(path + File.separator + fileName).writeText(json) + } + } + private fun copyBackup(context: Context, uri: Uri) { DocumentFile.fromTreeUri(context, uri)?.let { treeDoc -> for (fileName in backupFileNames) { diff --git a/app/src/main/java/io/legado/app/web/controller/BookshelfController.kt b/app/src/main/java/io/legado/app/web/controller/BookshelfController.kt index 87bcb3e1c..961407998 100644 --- a/app/src/main/java/io/legado/app/web/controller/BookshelfController.kt +++ b/app/src/main/java/io/legado/app/web/controller/BookshelfController.kt @@ -13,7 +13,7 @@ class BookshelfController { val bookshelf: ReturnData get() { - val books = App.db.bookDao().allBooks + val books = App.db.bookDao().all val returnData = ReturnData() return if (books.isEmpty()) { returnData.setErrorMsg("还没有添加小说") From 72bf906bd6ade0c7ed9466537f753adb2d007c16 Mon Sep 17 00:00:00 2001 From: kunfei Date: Wed, 5 Feb 2020 12:53:29 +0800 Subject: [PATCH 104/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/io/legado/app/help/storage/Backup.kt | 1 - .../io/legado/app/help/storage/OldBook.kt | 55 +++++++++ .../io/legado/app/help/storage/Restore.kt | 110 +++++------------- 3 files changed, 84 insertions(+), 82 deletions(-) create mode 100644 app/src/main/java/io/legado/app/help/storage/OldBook.kt diff --git a/app/src/main/java/io/legado/app/help/storage/Backup.kt b/app/src/main/java/io/legado/app/help/storage/Backup.kt index d8fc7e4a3..30e77eab6 100644 --- a/app/src/main/java/io/legado/app/help/storage/Backup.kt +++ b/app/src/main/java/io/legado/app/help/storage/Backup.kt @@ -51,7 +51,6 @@ object Backup { writeListToJson(App.db.rssSourceDao().all, "rssSource.json", backupPath) writeListToJson(App.db.rssStarDao().all, "rssStar.json", backupPath) writeListToJson(App.db.replaceRuleDao().all, "replaceRule.json", backupPath) - GSON.toJson(ReadBookConfig.configList)?.let { FileUtils.createFileIfNotExist(backupPath + File.separator + ReadBookConfig.readConfigFileName) .writeText(it) diff --git a/app/src/main/java/io/legado/app/help/storage/OldBook.kt b/app/src/main/java/io/legado/app/help/storage/OldBook.kt new file mode 100644 index 000000000..f8321973c --- /dev/null +++ b/app/src/main/java/io/legado/app/help/storage/OldBook.kt @@ -0,0 +1,55 @@ +package io.legado.app.help.storage + +import android.util.Log +import io.legado.app.App +import io.legado.app.constant.AppConst +import io.legado.app.data.entities.Book +import io.legado.app.utils.readBool +import io.legado.app.utils.readInt +import io.legado.app.utils.readLong +import io.legado.app.utils.readString + +object OldBook { + + fun toNewBook(json: String): List { + val books = mutableListOf() + val items: List> = Restore.jsonPath.parse(json).read("$") + val existingBooks = App.db.bookDao().allBookUrls.toSet() + for (item in items) { + val jsonItem = Restore.jsonPath.parse(item) + val book = Book() + book.bookUrl = jsonItem.readString("$.noteUrl") ?: "" + if (book.bookUrl.isBlank()) continue + book.name = jsonItem.readString("$.bookInfoBean.name") ?: "" + if (book.bookUrl in existingBooks) { + Log.d(AppConst.APP_TAG, "Found existing book: ${book.name}") + continue + } + book.origin = jsonItem.readString("$.tag") ?: "" + book.originName = jsonItem.readString("$.bookInfoBean.origin") ?: "" + book.author = jsonItem.readString("$.bookInfoBean.author") ?: "" + book.type = + if (jsonItem.readString("$.bookInfoBean.bookSourceType") == "AUDIO") 1 else 0 + book.tocUrl = jsonItem.readString("$.bookInfoBean.chapterUrl") ?: book.bookUrl + book.coverUrl = jsonItem.readString("$.bookInfoBean.coverUrl") + book.customCoverUrl = jsonItem.readString("$.customCoverPath") + book.lastCheckTime = jsonItem.readLong("$.bookInfoBean.finalRefreshData") ?: 0 + book.canUpdate = jsonItem.readBool("$.allowUpdate") == true + book.totalChapterNum = jsonItem.readInt("$.chapterListSize") ?: 0 + book.durChapterIndex = jsonItem.readInt("$.durChapter") ?: 0 + book.durChapterTitle = jsonItem.readString("$.durChapterName") + book.durChapterPos = jsonItem.readInt("$.durChapterPage") ?: 0 + book.durChapterTime = jsonItem.readLong("$.finalDate") ?: 0 + book.group = jsonItem.readInt("$.group") ?: 0 + book.intro = jsonItem.readString("$.bookInfoBean.introduce") + book.latestChapterTitle = jsonItem.readString("$.lastChapterName") + book.lastCheckCount = jsonItem.readInt("$.newChapters") ?: 0 + book.order = jsonItem.readInt("$.serialNumber") ?: 0 + book.useReplaceRule = jsonItem.readBool("$.useReplaceRule") == true + book.variable = jsonItem.readString("$.variable") + books.add(book) + } + return books + } + +} \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/help/storage/Restore.kt b/app/src/main/java/io/legado/app/help/storage/Restore.kt index 4385d6282..ee58fffbd 100644 --- a/app/src/main/java/io/legado/app/help/storage/Restore.kt +++ b/app/src/main/java/io/legado/app/help/storage/Restore.kt @@ -2,18 +2,19 @@ package io.legado.app.help.storage import android.content.Context import android.net.Uri -import android.util.Log import androidx.documentfile.provider.DocumentFile import com.jayway.jsonpath.Configuration import com.jayway.jsonpath.JsonPath import com.jayway.jsonpath.Option import com.jayway.jsonpath.ParseContext import io.legado.app.App -import io.legado.app.constant.AppConst import io.legado.app.constant.PreferKey import io.legado.app.data.entities.* import io.legado.app.help.ReadBookConfig -import io.legado.app.utils.* +import io.legado.app.utils.DocumentUtils +import io.legado.app.utils.FileUtils +import io.legado.app.utils.GSON +import io.legado.app.utils.fromJsonArray import kotlinx.coroutines.Dispatchers.IO import kotlinx.coroutines.Dispatchers.Main import kotlinx.coroutines.GlobalScope @@ -50,51 +51,23 @@ object Restore { suspend fun restore(path: String) { withContext(IO) { - try { - val file = FileUtils.createFileIfNotExist(path + File.separator + "bookshelf.json") - val json = file.readText() - GSON.fromJsonArray(json)?.let { - App.db.bookDao().insert(*it.toTypedArray()) - } - } catch (e: Exception) { - e.printStackTrace() + fileToListT(path, "bookshelf.json")?.let { + App.db.bookDao().insert(*it.toTypedArray()) } - try { - val file = FileUtils.createFileIfNotExist(path + File.separator + "bookGroup.json") - val json = file.readText() - GSON.fromJsonArray(json)?.let { - App.db.bookGroupDao().insert(*it.toTypedArray()) - } - } catch (e: Exception) { - e.printStackTrace() + fileToListT(path, "bookGroup.json")?.let { + App.db.bookGroupDao().insert(*it.toTypedArray()) } - try { - val file = FileUtils.createFileIfNotExist(path + File.separator + "bookSource.json") - val json = file.readText() - GSON.fromJsonArray(json)?.let { - App.db.bookSourceDao().insert(*it.toTypedArray()) - } - } catch (e: Exception) { - e.printStackTrace() + fileToListT(path, "bookSource.json")?.let { + App.db.bookSourceDao().insert(*it.toTypedArray()) } - try { - val file = FileUtils.createFileIfNotExist(path + File.separator + "rssSource.json") - val json = file.readText() - GSON.fromJsonArray(json)?.let { - App.db.rssSourceDao().insert(*it.toTypedArray()) - } - } catch (e: Exception) { - e.printStackTrace() + fileToListT(path, "rssSource.json")?.let { + App.db.rssSourceDao().insert(*it.toTypedArray()) } - try { - val file = - FileUtils.createFileIfNotExist(path + File.separator + "replaceRule.json") - val json = file.readText() - GSON.fromJsonArray(json)?.let { - App.db.replaceRuleDao().insert(*it.toTypedArray()) - } - } catch (e: Exception) { - e.printStackTrace() + fileToListT(path, "rssStar.json")?.let { + App.db.rssStarDao().insert(*it.toTypedArray()) + } + fileToListT(path, "replaceRule.json")?.let { + App.db.replaceRuleDao().insert(*it.toTypedArray()) } try { val file = @@ -124,6 +97,17 @@ object Restore { } } + private inline fun fileToListT(path: String, fileName: String): List? { + try { + val file = FileUtils.createFileIfNotExist(path + File.separator + fileName) + val json = file.readText() + return GSON.fromJsonArray(json) + } catch (e: Exception) { + e.printStackTrace() + } + return null + } + fun importYueDuData(context: Context) { GlobalScope.launch(IO) { try {// 导入书架 @@ -171,43 +155,7 @@ object Restore { } fun importOldBookshelf(json: String): Int { - val books = mutableListOf() - val items: List> = jsonPath.parse(json).read("$") - val existingBooks = App.db.bookDao().allBookUrls.toSet() - for (item in items) { - val jsonItem = jsonPath.parse(item) - val book = Book() - book.bookUrl = jsonItem.readString("$.noteUrl") ?: "" - if (book.bookUrl.isBlank()) continue - book.name = jsonItem.readString("$.bookInfoBean.name") ?: "" - if (book.bookUrl in existingBooks) { - Log.d(AppConst.APP_TAG, "Found existing book: ${book.name}") - continue - } - book.origin = jsonItem.readString("$.tag") ?: "" - book.originName = jsonItem.readString("$.bookInfoBean.origin") ?: "" - book.author = jsonItem.readString("$.bookInfoBean.author") ?: "" - book.type = - if (jsonItem.readString("$.bookInfoBean.bookSourceType") == "AUDIO") 1 else 0 - book.tocUrl = jsonItem.readString("$.bookInfoBean.chapterUrl") ?: book.bookUrl - book.coverUrl = jsonItem.readString("$.bookInfoBean.coverUrl") - book.customCoverUrl = jsonItem.readString("$.customCoverPath") - book.lastCheckTime = jsonItem.readLong("$.bookInfoBean.finalRefreshData") ?: 0 - book.canUpdate = jsonItem.readBool("$.allowUpdate") == true - book.totalChapterNum = jsonItem.readInt("$.chapterListSize") ?: 0 - book.durChapterIndex = jsonItem.readInt("$.durChapter") ?: 0 - book.durChapterTitle = jsonItem.readString("$.durChapterName") - book.durChapterPos = jsonItem.readInt("$.durChapterPage") ?: 0 - book.durChapterTime = jsonItem.readLong("$.finalDate") ?: 0 - book.group = jsonItem.readInt("$.group") ?: 0 - book.intro = jsonItem.readString("$.bookInfoBean.introduce") - book.latestChapterTitle = jsonItem.readString("$.lastChapterName") - book.lastCheckCount = jsonItem.readInt("$.newChapters") ?: 0 - book.order = jsonItem.readInt("$.serialNumber") ?: 0 - book.useReplaceRule = jsonItem.readBool("$.useReplaceRule") == true - book.variable = jsonItem.readString("$.variable") - books.add(book) - } + val books = OldBook.toNewBook(json) App.db.bookDao().insert(*books.toTypedArray()) return books.size } From f37c24e550a88788d6aa25ac738d8d0ddf73612b Mon Sep 17 00:00:00 2001 From: kunfei Date: Wed, 5 Feb 2020 13:10:02 +0800 Subject: [PATCH 105/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/io/legado/app/help/storage/WebDavHelp.kt | 8 +++++--- .../java/io/legado/app/ui/config/BackupConfigFragment.kt | 4 +++- app/src/main/java/io/legado/app/ui/main/my/MyFragment.kt | 4 +++- 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/io/legado/app/help/storage/WebDavHelp.kt b/app/src/main/java/io/legado/app/help/storage/WebDavHelp.kt index fb2e09a15..abd7a8a8a 100644 --- a/app/src/main/java/io/legado/app/help/storage/WebDavHelp.kt +++ b/app/src/main/java/io/legado/app/help/storage/WebDavHelp.kt @@ -54,12 +54,12 @@ object WebDavHelp { return names } - suspend fun showRestoreDialog(context: Context): Boolean { + suspend fun showRestoreDialog(context: Context, restoreSuccess: () -> Unit): Boolean { val names = withContext(IO) { getWebDavFileNames() } return if (names.isNotEmpty()) { context.selector(title = "选择恢复文件", items = names) { _, index -> if (index in 0 until names.size) { - restoreWebDav(names[index]) + restoreWebDav(names[index], restoreSuccess) } } true @@ -68,7 +68,7 @@ object WebDavHelp { } } - private fun restoreWebDav(name: String) { + private fun restoreWebDav(name: String, success: () -> Unit) { Coroutine.async { getWebDavUrl()?.let { val file = WebDav(it + "legado/" + name) @@ -77,6 +77,8 @@ object WebDavHelp { ZipUtils.unzipFile(zipFilePath, unzipFilesPath) Restore.restore(unzipFilesPath) } + }.onSuccess { + success.invoke() } } diff --git a/app/src/main/java/io/legado/app/ui/config/BackupConfigFragment.kt b/app/src/main/java/io/legado/app/ui/config/BackupConfigFragment.kt index 39c711974..2f153da3f 100644 --- a/app/src/main/java/io/legado/app/ui/config/BackupConfigFragment.kt +++ b/app/src/main/java/io/legado/app/ui/config/BackupConfigFragment.kt @@ -158,7 +158,9 @@ class BackupConfigFragment : PreferenceFragmentCompat(), fun restore() { launch { - if (!WebDavHelp.showRestoreDialog(requireContext())) { + if (!WebDavHelp.showRestoreDialog(requireContext()) { + toast(R.string.restore_success) + }) { val backupPath = getPrefString(PreferKey.backupPath) if (backupPath?.isNotEmpty() == true) { val uri = Uri.parse(backupPath) diff --git a/app/src/main/java/io/legado/app/ui/main/my/MyFragment.kt b/app/src/main/java/io/legado/app/ui/main/my/MyFragment.kt index fdae803bf..2c515dbb7 100644 --- a/app/src/main/java/io/legado/app/ui/main/my/MyFragment.kt +++ b/app/src/main/java/io/legado/app/ui/main/my/MyFragment.kt @@ -100,7 +100,9 @@ class MyFragment : BaseFragment(R.layout.fragment_my_config) { fun restore() { launch { - if (!WebDavHelp.showRestoreDialog(requireContext())) { + if (!WebDavHelp.showRestoreDialog(requireContext()) { + toast(R.string.restore_success) + }) { val backupPath = getPrefString(PreferKey.backupPath) if (backupPath?.isNotEmpty() == true) { val uri = Uri.parse(backupPath) From 5a20999017bf45c823be5344010d2a26ba91d6d6 Mon Sep 17 00:00:00 2001 From: kunfei Date: Wed, 5 Feb 2020 13:28:45 +0800 Subject: [PATCH 106/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/io/legado/app/ui/rss/read/ReadRssActivity.kt | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/rss/read/ReadRssActivity.kt b/app/src/main/java/io/legado/app/ui/rss/read/ReadRssActivity.kt index 494ea37bb..86d6e9ee8 100644 --- a/app/src/main/java/io/legado/app/ui/rss/read/ReadRssActivity.kt +++ b/app/src/main/java/io/legado/app/ui/rss/read/ReadRssActivity.kt @@ -159,9 +159,10 @@ class ReadRssActivity : VMBaseActivity(R.layout.activity_rss_r webView.settings.javaScriptEnabled = true webView.evaluateJavascript("document.documentElement.outerHTML") { val html = StringEscapeUtils.unescapeJson(it) - val 需读内容 = Jsoup.clean(html, Whitelist.none()).replace(Regex("""&\w+;"""),"").trim()//朗读过程中总是听到一些杂音,清理一下 + val text = Jsoup.clean(html, Whitelist.none()).replace(Regex("""&\w+;"""), "") + .trim()//朗读过程中总是听到一些杂音,清理一下 //longToast(需读内容)调试一下 - viewModel.readAloud(需读内容) + viewModel.readAloud(text) } } } From 7c48e5b5016ed029e9c639a970b4a824828d57e2 Mon Sep 17 00:00:00 2001 From: kunfei Date: Wed, 5 Feb 2020 13:29:30 +0800 Subject: [PATCH 107/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/io/legado/app/ui/rss/read/ReadRssActivity.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/io/legado/app/ui/rss/read/ReadRssActivity.kt b/app/src/main/java/io/legado/app/ui/rss/read/ReadRssActivity.kt index 86d6e9ee8..d5d9b9b66 100644 --- a/app/src/main/java/io/legado/app/ui/rss/read/ReadRssActivity.kt +++ b/app/src/main/java/io/legado/app/ui/rss/read/ReadRssActivity.kt @@ -159,7 +159,8 @@ class ReadRssActivity : VMBaseActivity(R.layout.activity_rss_r webView.settings.javaScriptEnabled = true webView.evaluateJavascript("document.documentElement.outerHTML") { val html = StringEscapeUtils.unescapeJson(it) - val text = Jsoup.clean(html, Whitelist.none()).replace(Regex("""&\w+;"""), "") + val text = Jsoup.clean(html, Whitelist.none()) + .replace(Regex("""&\w+;"""), "") .trim()//朗读过程中总是听到一些杂音,清理一下 //longToast(需读内容)调试一下 viewModel.readAloud(text) From e8c105cddc6ffa2e33f302be1ebf38bf896d6aa8 Mon Sep 17 00:00:00 2001 From: kunfei Date: Wed, 5 Feb 2020 13:41:49 +0800 Subject: [PATCH 108/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/io/legado/app/model/webBook/BookChapterList.kt | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/app/src/main/java/io/legado/app/model/webBook/BookChapterList.kt b/app/src/main/java/io/legado/app/model/webBook/BookChapterList.kt index 82f06e54a..8c92ae7ed 100644 --- a/app/src/main/java/io/legado/app/model/webBook/BookChapterList.kt +++ b/app/src/main/java/io/legado/app/model/webBook/BookChapterList.kt @@ -100,6 +100,11 @@ object BookChapterList { item.index = index } book.latestChapterTitle = chapterList.last().title + if (book.durChapterIndex < chapterList.size) { + book.durChapterTitle = chapterList[book.durChapterIndex].title + } else { + book.durChapterTitle = book.latestChapterTitle + } if (book.totalChapterNum < chapterList.size) { book.lastCheckCount = chapterList.size - book.totalChapterNum } From a6df28d421ca50e87cf6366bf195551412572b43 Mon Sep 17 00:00:00 2001 From: kunfei Date: Wed, 5 Feb 2020 15:31:17 +0800 Subject: [PATCH 109/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../io/legado/app/service/CheckSourceService.kt | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/io/legado/app/service/CheckSourceService.kt b/app/src/main/java/io/legado/app/service/CheckSourceService.kt index 5fa36c1ba..ba36d1e8b 100644 --- a/app/src/main/java/io/legado/app/service/CheckSourceService.kt +++ b/app/src/main/java/io/legado/app/service/CheckSourceService.kt @@ -7,23 +7,34 @@ import io.legado.app.base.BaseService import io.legado.app.constant.Action import io.legado.app.constant.AppConst import io.legado.app.data.entities.BookSource +import io.legado.app.help.AppConfig import io.legado.app.help.IntentHelp import io.legado.app.ui.book.source.manage.BookSourceActivity +import kotlinx.coroutines.asCoroutineDispatcher +import java.util.concurrent.Executors class CheckSourceService : BaseService() { - + private var searchPool = + Executors.newFixedThreadPool(AppConfig.threadCount).asCoroutineDispatcher() private var sourceList: List? = null override fun onCreate() { super.onCreate() + updateNotification(0, getString(R.string.start)) } override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { + when (intent?.action) { + Action.start -> { + } + else -> stopSelf() + } return super.onStartCommand(intent, flags, startId) } override fun onDestroy() { super.onDestroy() + searchPool.close() } /** From 4ea7526edfa24e2d3f8bd6eafb8e58ec1ab06ead Mon Sep 17 00:00:00 2001 From: kunfei Date: Wed, 5 Feb 2020 15:57:05 +0800 Subject: [PATCH 110/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/res/anim/moprogress_bottom_in.xml | 8 -------- app/src/main/res/anim/moprogress_bottom_out.xml | 9 --------- app/src/main/res/anim/moprogress_in.xml | 17 ----------------- .../res/anim/moprogress_in_bottom_right.xml | 17 ----------------- .../main/res/anim/moprogress_in_top_right.xml | 17 ----------------- app/src/main/res/anim/moprogress_out.xml | 17 ----------------- .../res/anim/moprogress_out_bottom_right.xml | 17 ----------------- .../main/res/anim/moprogress_out_top_right.xml | 17 ----------------- 8 files changed, 119 deletions(-) delete mode 100644 app/src/main/res/anim/moprogress_bottom_in.xml delete mode 100644 app/src/main/res/anim/moprogress_bottom_out.xml delete mode 100644 app/src/main/res/anim/moprogress_in.xml delete mode 100644 app/src/main/res/anim/moprogress_in_bottom_right.xml delete mode 100644 app/src/main/res/anim/moprogress_in_top_right.xml delete mode 100644 app/src/main/res/anim/moprogress_out.xml delete mode 100644 app/src/main/res/anim/moprogress_out_bottom_right.xml delete mode 100644 app/src/main/res/anim/moprogress_out_top_right.xml diff --git a/app/src/main/res/anim/moprogress_bottom_in.xml b/app/src/main/res/anim/moprogress_bottom_in.xml deleted file mode 100644 index 59904f594..000000000 --- a/app/src/main/res/anim/moprogress_bottom_in.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/anim/moprogress_bottom_out.xml b/app/src/main/res/anim/moprogress_bottom_out.xml deleted file mode 100644 index 2348594fc..000000000 --- a/app/src/main/res/anim/moprogress_bottom_out.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/anim/moprogress_in.xml b/app/src/main/res/anim/moprogress_in.xml deleted file mode 100644 index 8e922153b..000000000 --- a/app/src/main/res/anim/moprogress_in.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/anim/moprogress_in_bottom_right.xml b/app/src/main/res/anim/moprogress_in_bottom_right.xml deleted file mode 100644 index 93348f5a8..000000000 --- a/app/src/main/res/anim/moprogress_in_bottom_right.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/anim/moprogress_in_top_right.xml b/app/src/main/res/anim/moprogress_in_top_right.xml deleted file mode 100644 index 81bb2e919..000000000 --- a/app/src/main/res/anim/moprogress_in_top_right.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/anim/moprogress_out.xml b/app/src/main/res/anim/moprogress_out.xml deleted file mode 100644 index 546619cc2..000000000 --- a/app/src/main/res/anim/moprogress_out.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/anim/moprogress_out_bottom_right.xml b/app/src/main/res/anim/moprogress_out_bottom_right.xml deleted file mode 100644 index d0d1eaffa..000000000 --- a/app/src/main/res/anim/moprogress_out_bottom_right.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/anim/moprogress_out_top_right.xml b/app/src/main/res/anim/moprogress_out_top_right.xml deleted file mode 100644 index 310b29d7e..000000000 --- a/app/src/main/res/anim/moprogress_out_top_right.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - \ No newline at end of file From d87f85754b3067ee2d4c39d1996e1cdd9c4da51b Mon Sep 17 00:00:00 2001 From: kunfei Date: Wed, 5 Feb 2020 16:12:57 +0800 Subject: [PATCH 111/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../io/legado/app/ui/book/read/config/BgTextConfigDialog.kt | 4 ++-- .../io/legado/app/ui/book/read/config/MoreConfigDialog.kt | 4 ++-- .../io/legado/app/ui/book/read/config/PaddingConfigDialog.kt | 2 -- .../java/io/legado/app/ui/book/read/config/ReadStyleDialog.kt | 4 ++-- 4 files changed, 6 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/book/read/config/BgTextConfigDialog.kt b/app/src/main/java/io/legado/app/ui/book/read/config/BgTextConfigDialog.kt index 8fe683273..5d61aefe1 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/config/BgTextConfigDialog.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/config/BgTextConfigDialog.kt @@ -54,8 +54,8 @@ class BgTextConfigDialog : DialogFragment() { it.windowManager?.defaultDisplay?.getMetrics(dm) } dialog?.window?.let { - it.setBackgroundDrawableResource(R.color.transparent) - it.decorView.setPadding(0, 0, 0, 0) + it.setBackgroundDrawableResource(R.color.background) + it.decorView.setPadding(0, 5, 0, 0) val attr = it.attributes attr.dimAmount = 0.0f attr.gravity = Gravity.BOTTOM diff --git a/app/src/main/java/io/legado/app/ui/book/read/config/MoreConfigDialog.kt b/app/src/main/java/io/legado/app/ui/book/read/config/MoreConfigDialog.kt index 3251cfc94..e18f32c0b 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/config/MoreConfigDialog.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/config/MoreConfigDialog.kt @@ -29,8 +29,8 @@ class MoreConfigDialog : DialogFragment() { it.windowManager?.defaultDisplay?.getMetrics(dm) } dialog?.window?.let { - it.setBackgroundDrawableResource(R.color.transparent) - it.decorView.setPadding(0, 0, 0, 0) + it.setBackgroundDrawableResource(R.color.background) + it.decorView.setPadding(0, 5, 0, 0) val attr = it.attributes attr.dimAmount = 0.0f attr.gravity = Gravity.BOTTOM diff --git a/app/src/main/java/io/legado/app/ui/book/read/config/PaddingConfigDialog.kt b/app/src/main/java/io/legado/app/ui/book/read/config/PaddingConfigDialog.kt index fe04055e9..19ce7e100 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/config/PaddingConfigDialog.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/config/PaddingConfigDialog.kt @@ -26,8 +26,6 @@ class PaddingConfigDialog : DialogFragment() { it.windowManager?.defaultDisplay?.getMetrics(dm) } dialog?.window?.let { - it.setBackgroundDrawableResource(R.color.transparent) - it.decorView.setPadding(0, 0, 0, 0) val attr = it.attributes attr.dimAmount = 0.0f it.attributes = attr diff --git a/app/src/main/java/io/legado/app/ui/book/read/config/ReadStyleDialog.kt b/app/src/main/java/io/legado/app/ui/book/read/config/ReadStyleDialog.kt index 3bc5060b0..8a1327a85 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/config/ReadStyleDialog.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/config/ReadStyleDialog.kt @@ -37,8 +37,8 @@ class ReadStyleDialog : DialogFragment(), FontSelectDialog.CallBack { it.windowManager?.defaultDisplay?.getMetrics(dm) } dialog?.window?.let { - it.setBackgroundDrawableResource(R.color.transparent) - it.decorView.setPadding(0, 0, 0, 0) + it.setBackgroundDrawableResource(R.color.background) + it.decorView.setPadding(0, 5, 0, 0) val attr = it.attributes attr.dimAmount = 0.0f attr.gravity = Gravity.BOTTOM From 4839c853fe1df564c5caeba0a95c2f34654071f6 Mon Sep 17 00:00:00 2001 From: kunfei Date: Wed, 5 Feb 2020 16:15:09 +0800 Subject: [PATCH 112/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/res/layout/dialog_read_aloud.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/res/layout/dialog_read_aloud.xml b/app/src/main/res/layout/dialog_read_aloud.xml index 5cc10c6c3..37c5cc0d6 100644 --- a/app/src/main/res/layout/dialog_read_aloud.xml +++ b/app/src/main/res/layout/dialog_read_aloud.xml @@ -57,6 +57,7 @@ + Date: Wed, 5 Feb 2020 16:46:32 +0800 Subject: [PATCH 113/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/res/layout/dialog_page_key.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/res/layout/dialog_page_key.xml b/app/src/main/res/layout/dialog_page_key.xml index 9ee5fd289..9ec5d3d06 100644 --- a/app/src/main/res/layout/dialog_page_key.xml +++ b/app/src/main/res/layout/dialog_page_key.xml @@ -3,6 +3,7 @@ android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" + android:background="@color/background" android:padding="16dp"> Date: Wed, 5 Feb 2020 17:18:40 +0800 Subject: [PATCH 114/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../io/legado/app/lib/theme/TintHelper.kt | 5 +- .../app/ui/chapterlist/BookmarkFragment.kt | 4 +- .../app/ui/explore/ExploreShowViewModel.kt | 2 +- .../app/ui/filechooser/adapter/FileAdapter.kt | 2 +- .../app/ui/filechooser/adapter/PathAdapter.kt | 1 + .../app/ui/filechooser/utils/FileUtils.kt | 40 ++--- .../explosion_field/ExplosionAnimator.kt | 10 +- .../widget/recycler/scroller/FastScroller.kt | 23 ++- .../java/io/legado/app/utils/Snackbars.kt | 158 +++--------------- .../main/java/io/legado/app/utils/Toasts.kt | 8 +- 10 files changed, 63 insertions(+), 190 deletions(-) diff --git a/app/src/main/java/io/legado/app/lib/theme/TintHelper.kt b/app/src/main/java/io/legado/app/lib/theme/TintHelper.kt index 7b3653eb2..f7b52aa61 100644 --- a/app/src/main/java/io/legado/app/lib/theme/TintHelper.kt +++ b/app/src/main/java/io/legado/app/lib/theme/TintHelper.kt @@ -254,11 +254,10 @@ object TintHelper { if (!skipIndeterminate) progressBar.indeterminateTintList = sl } else { - val mode = PorterDuff.Mode.SRC_IN if (!skipIndeterminate && progressBar.indeterminateDrawable != null) - progressBar.indeterminateDrawable.setColorFilter(color, mode) + progressBar.indeterminateDrawable.setTint(color) if (progressBar.progressDrawable != null) - progressBar.progressDrawable.setColorFilter(color, mode) + progressBar.progressDrawable.setTint(color) } } diff --git a/app/src/main/java/io/legado/app/ui/chapterlist/BookmarkFragment.kt b/app/src/main/java/io/legado/app/ui/chapterlist/BookmarkFragment.kt index 803fe2e11..77eaad04f 100644 --- a/app/src/main/java/io/legado/app/ui/chapterlist/BookmarkFragment.kt +++ b/app/src/main/java/io/legado/app/ui/chapterlist/BookmarkFragment.kt @@ -74,8 +74,6 @@ class BookmarkFragment : VMBaseFragment(R.layout.fragment_ } override fun delBookmark(bookmark: Bookmark) { - bookmark?.let { - App.db.bookmarkDao().delByBookmark(it.bookUrl, it.chapterName) - } + App.db.bookmarkDao().delByBookmark(bookmark.bookUrl, bookmark.chapterName) } } \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/ui/explore/ExploreShowViewModel.kt b/app/src/main/java/io/legado/app/ui/explore/ExploreShowViewModel.kt index cf7ea9ebc..849b1ca87 100644 --- a/app/src/main/java/io/legado/app/ui/explore/ExploreShowViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/explore/ExploreShowViewModel.kt @@ -21,7 +21,7 @@ class ExploreShowViewModel(application: Application) : BaseViewModel(application execute { val sourceUrl = intent.getStringExtra("sourceUrl") exploreUrl = intent.getStringExtra("exploreUrl") - if (bookSource == null) { + if (bookSource == null && sourceUrl != null) { bookSource = App.db.bookSourceDao().getBookSource(sourceUrl) } explore() diff --git a/app/src/main/java/io/legado/app/ui/filechooser/adapter/FileAdapter.kt b/app/src/main/java/io/legado/app/ui/filechooser/adapter/FileAdapter.kt index a34c705b9..da58d501a 100644 --- a/app/src/main/java/io/legado/app/ui/filechooser/adapter/FileAdapter.kt +++ b/app/src/main/java/io/legado/app/ui/filechooser/adapter/FileAdapter.kt @@ -64,7 +64,7 @@ class FileAdapter(context: Context, val callBack: CallBack) : fileParent.icon = upIcon fileParent.name = DIR_PARENT fileParent.size = 0 - fileParent.path = File(path).parent + fileParent.path = File(path).parent ?: "" data.add(fileParent) } currentPath?.let { currentPath -> diff --git a/app/src/main/java/io/legado/app/ui/filechooser/adapter/PathAdapter.kt b/app/src/main/java/io/legado/app/ui/filechooser/adapter/PathAdapter.kt index afa8ab4e6..b735ef5da 100644 --- a/app/src/main/java/io/legado/app/ui/filechooser/adapter/PathAdapter.kt +++ b/app/src/main/java/io/legado/app/ui/filechooser/adapter/PathAdapter.kt @@ -15,6 +15,7 @@ import java.util.* class PathAdapter(context: Context, val callBack: CallBack) : SimpleRecyclerAdapter(context, R.layout.item_path_filepicker) { private val paths = LinkedList() + @Suppress("DEPRECATION") private val sdCardDirectory = Environment.getExternalStorageDirectory().absolutePath private val arrowIcon = ConvertUtils.toDrawable(FilePickerIcon.getARROW()) diff --git a/app/src/main/java/io/legado/app/ui/filechooser/utils/FileUtils.kt b/app/src/main/java/io/legado/app/ui/filechooser/utils/FileUtils.kt index 71e838cae..f06054bb4 100644 --- a/app/src/main/java/io/legado/app/ui/filechooser/utils/FileUtils.kt +++ b/app/src/main/java/io/legado/app/ui/filechooser/utils/FileUtils.kt @@ -34,13 +34,13 @@ object FileUtils { * 将目录分隔符统一为平台默认的分隔符,并为目录结尾添加分隔符 */ fun separator(path: String): String { - var path = path + var path1 = path val separator = File.separator - path = path.replace("\\", separator) - if (!path.endsWith(separator)) { - path += separator + path1 = path1.replace("\\", separator) + if (!path1.endsWith(separator)) { + path1 += separator } - return path + return path1 } fun closeSilently(c: Closeable?) { @@ -62,7 +62,7 @@ object FileUtils { startDirPath: String, excludeDirs: Array? = null, @SortType sortType: Int = BY_NAME_ASC ): Array { - var excludeDirs = excludeDirs + var excludeDirs1 = excludeDirs val dirList = ArrayList() val startDir = File(startDirPath) if (!startDir.isDirectory) { @@ -75,12 +75,12 @@ object FileUtils { f.isDirectory }) ?: return arrayOfNulls(0) - if (excludeDirs == null) { - excludeDirs = arrayOfNulls(0) + if (excludeDirs1 == null) { + excludeDirs1 = arrayOfNulls(0) } for (dir in dirs) { val file = dir.absoluteFile - if (!excludeDirs.contentDeepToString().contains(file.name)) { + if (!excludeDirs1.contentDeepToString().contains(file.name)) { dirList.add(file) } } @@ -191,7 +191,7 @@ object FileUtils { */ fun listFiles(startDirPath: String, allowExtensions: Array): Array? { val file = File(startDirPath) - return file.listFiles { dir, name -> + return file.listFiles { _, name -> //返回当前目录所有以某些扩展名结尾的文件 val extension = getExtension(name) allowExtensions.contentDeepToString().contains(extension) @@ -294,10 +294,8 @@ object FileUtils { bis.close() bos.close() } else if (src.isDirectory) { - val files = src.listFiles() - tar.mkdirs() - for (file in files) { + src.listFiles()?.forEach { file -> copy(file.absoluteFile, File(tar.absoluteFile, file.name)) } } @@ -399,18 +397,16 @@ object FileUtils { fun writeBytes(filepath: String, data: ByteArray): Boolean { val file = File(filepath) var fos: FileOutputStream? = null - try { + return try { if (!file.exists()) { - - file.parentFile.mkdirs() - + file.parentFile?.mkdirs() file.createNewFile() } fos = FileOutputStream(filepath) fos.write(data) - return true + true } catch (e: IOException) { - return false + false } finally { closeSilently(fos) } @@ -422,16 +418,16 @@ object FileUtils { fun appendText(path: String, content: String): Boolean { val file = File(path) var writer: FileWriter? = null - try { + return try { if (!file.exists()) { file.createNewFile() } writer = FileWriter(file, true) writer.write(content) - return true + true } catch (e: IOException) { - return false + false } finally { closeSilently(writer) } diff --git a/app/src/main/java/io/legado/app/ui/widget/anima/explosion_field/ExplosionAnimator.kt b/app/src/main/java/io/legado/app/ui/widget/anima/explosion_field/ExplosionAnimator.kt index 28bb1602a..9b80b1825 100644 --- a/app/src/main/java/io/legado/app/ui/widget/anima/explosion_field/ExplosionAnimator.kt +++ b/app/src/main/java/io/legado/app/ui/widget/anima/explosion_field/ExplosionAnimator.kt @@ -23,13 +23,11 @@ import java.util.* class ExplosionAnimator(private val mContainer: View, bitmap: Bitmap, bound: Rect) : ValueAnimator() { - private val mPaint: Paint + private val mPaint: Paint = Paint() private val mParticles: Array - private val mBound: Rect + private val mBound: Rect = Rect(bound) init { - mPaint = Paint() - mBound = Rect(bound) val partLen = 15 mParticles = arrayOfNulls(partLen * partLen) val random = Random(System.currentTimeMillis()) @@ -97,7 +95,7 @@ class ExplosionAnimator(private val mContainer: View, bitmap: Bitmap, bound: Rec override fun start() { super.start() - mContainer.invalidate(mBound) + mContainer.invalidate() } private inner class Particle { @@ -141,7 +139,7 @@ class ExplosionAnimator(private val mContainer: View, bitmap: Bitmap, bound: Rec internal var DEFAULT_DURATION: Long = 0x400 private val DEFAULT_INTERPOLATOR = AccelerateInterpolator(0.6f) - private val END_VALUE = 1.4f + private const val END_VALUE = 1.4f private val X = Utils.dp2Px(5).toFloat() private val Y = Utils.dp2Px(20).toFloat() private val V = Utils.dp2Px(2).toFloat() diff --git a/app/src/main/java/io/legado/app/ui/widget/recycler/scroller/FastScroller.kt b/app/src/main/java/io/legado/app/ui/widget/recycler/scroller/FastScroller.kt index 25af39c6a..20f638d61 100644 --- a/app/src/main/java/io/legado/app/ui/widget/recycler/scroller/FastScroller.kt +++ b/app/src/main/java/io/legado/app/ui/widget/recycler/scroller/FastScroller.kt @@ -482,18 +482,17 @@ class FastScroller : LinearLayout { var showTrack = true if (attrs != null) { val typedArray = context.obtainStyledAttributes(attrs, R.styleable.FastScroller, 0, 0) - if (typedArray != null) { - try { - bubbleColor = typedArray.getColor(R.styleable.FastScroller_bubbleColor, bubbleColor) - handleColor = typedArray.getColor(R.styleable.FastScroller_handleColor, handleColor) - trackColor = typedArray.getColor(R.styleable.FastScroller_trackColor, trackColor) - textColor = typedArray.getColor(R.styleable.FastScroller_bubbleTextColor, textColor) - fadeScrollbar = typedArray.getBoolean(R.styleable.FastScroller_fadeScrollbar, fadeScrollbar) - showBubble = typedArray.getBoolean(R.styleable.FastScroller_showBubble, showBubble) - showTrack = typedArray.getBoolean(R.styleable.FastScroller_showTrack, showTrack) - } finally { - typedArray.recycle() - } + try { + bubbleColor = typedArray.getColor(R.styleable.FastScroller_bubbleColor, bubbleColor) + handleColor = typedArray.getColor(R.styleable.FastScroller_handleColor, handleColor) + trackColor = typedArray.getColor(R.styleable.FastScroller_trackColor, trackColor) + textColor = typedArray.getColor(R.styleable.FastScroller_bubbleTextColor, textColor) + fadeScrollbar = + typedArray.getBoolean(R.styleable.FastScroller_fadeScrollbar, fadeScrollbar) + showBubble = typedArray.getBoolean(R.styleable.FastScroller_showBubble, showBubble) + showTrack = typedArray.getBoolean(R.styleable.FastScroller_showTrack, showTrack) + } finally { + typedArray.recycle() } } setTrackColor(trackColor) diff --git a/app/src/main/java/io/legado/app/utils/Snackbars.kt b/app/src/main/java/io/legado/app/utils/Snackbars.kt index f60def01f..2706bd7ca 100644 --- a/app/src/main/java/io/legado/app/utils/Snackbars.kt +++ b/app/src/main/java/io/legado/app/utils/Snackbars.kt @@ -4,139 +4,13 @@ import android.view.View import androidx.annotation.StringRes import com.google.android.material.snackbar.Snackbar -/** - * Display the Snackbar with the [Snackbar.LENGTH_SHORT] duration. - * - * @param message the message text resource. - */ -@Deprecated("Use 'View.snackbar(Int)' instead.", ReplaceWith("view.snackbar(message)")) -inline fun snackbar(view: View, message: Int) = Snackbar - .make(view, message, Snackbar.LENGTH_SHORT) - .apply { show() } - -/** - * Display Snackbar with the [Snackbar.LENGTH_LONG] duration. - * - * @param message the message text resource. - */ -@Deprecated("Use 'View.longSnackbar(Int)' instead.", ReplaceWith("view.longSnackbar(message)")) -inline fun longSnackbar(view: View, message: Int) = Snackbar - .make(view, message, Snackbar.LENGTH_LONG) - .apply { show() } - -/** - * Display Snackbar with the [Snackbar.LENGTH_INDEFINITE] duration. - * - * @param message the message text resource. - */ -@Deprecated("Use 'View.indefiniteSnackbar(Int)' instead.", ReplaceWith("view.indefiniteSnackbar(message)")) -inline fun indefiniteSnackbar(view: View, message: Int) = Snackbar - .make(view, message, Snackbar.LENGTH_INDEFINITE) - .apply { show() } - -/** - * Display the Snackbar with the [Snackbar.LENGTH_SHORT] duration. - * - * @param message the message text. - */ -@Deprecated("Use 'View.snackbar(CharSequence)' instead.", ReplaceWith("view.snackbar(message)")) -inline fun snackbar(view: View, message: CharSequence) = Snackbar - .make(view, message, Snackbar.LENGTH_SHORT) - .apply { show() } - -/** - * Display Snackbar with the [Snackbar.LENGTH_LONG] duration. - * - * @param message the message text. - */ -@Deprecated("Use 'View.longSnackbar(CharSequence)' instead.", ReplaceWith("view.longSnackbar(message)")) -inline fun longSnackbar(view: View, message: CharSequence) = Snackbar - .make(view, message, Snackbar.LENGTH_LONG) - .apply { show() } - -/** - * Display Snackbar with the [Snackbar.LENGTH_INDEFINITE] duration. - * - * @param message the message text. - */ -@Deprecated("Use 'View.indefiniteSnackbar(CharSequence)' instead.", ReplaceWith("view.indefiniteSnackbar(message)")) -inline fun indefiniteSnackbar(view: View, message: CharSequence) = Snackbar - .make(view, message, Snackbar.LENGTH_INDEFINITE) - .apply { show() } - -/** - * Display the Snackbar with the [Snackbar.LENGTH_SHORT] duration. - * - * @param message the message text resource. - */ -@Deprecated("Use 'View.snackbar(Int, Int, (View) -> Unit)' instead.", ReplaceWith("view.snackbar(message, actionText, action)")) -inline fun snackbar(view: View, message: Int, actionText: Int, noinline action: (View) -> Unit) = Snackbar - .make(view, message, Snackbar.LENGTH_SHORT) - .setAction(actionText, action) - .apply { show() } - -/** - * Display Snackbar with the [Snackbar.LENGTH_LONG] duration. - * - * @param message the message text resource. - */ -@Deprecated("Use 'View.longSnackbar(Int, Int, (View) -> Unit)' instead.", ReplaceWith("view.longSnackbar(message, actionText, action)")) -inline fun longSnackbar(view: View, message: Int, actionText: Int, noinline action: (View) -> Unit) = Snackbar - .make(view, message, Snackbar.LENGTH_LONG) - .setAction(actionText, action) - .apply { show() } - -/** - * Display Snackbar with the [Snackbar.LENGTH_INDEFINITE] duration. - * - * @param message the message text resource. - */ -@Deprecated("Use 'View.indefiniteSnackbar(Int, Int, (View) -> Unit)' instead.", ReplaceWith("view.indefiniteSnackbar(message, actionText, action)")) -inline fun indefiniteSnackbar(view: View, message: Int, actionText: Int, noinline action: (View) -> Unit) = Snackbar - .make(view, message, Snackbar.LENGTH_INDEFINITE) - .setAction(actionText, action) - .apply { show() } - -/** - * Display the Snackbar with the [Snackbar.LENGTH_SHORT] duration. - * - * @param message the message text. - */ -@Deprecated("Use 'View.snackbar(CharSequence, CharSequence, (View) -> Unit)' instead.", ReplaceWith("view.snackbar(message, actionText, action)")) -inline fun snackbar(view: View, message: CharSequence, actionText: CharSequence, noinline action: (View) -> Unit) = Snackbar - .make(view, message, Snackbar.LENGTH_SHORT) - .setAction(actionText, action) - .apply { show() } - -/** - * Display Snackbar with the [Snackbar.LENGTH_LONG] duration. - * - * @param message the message text. - */ -@Deprecated("Use 'View.longSnackbar(CharSequence, CharSequence, (View) -> Unit)' instead.", ReplaceWith("view.longSnackbar(message, actionText, action)")) -inline fun longSnackbar(view: View, message: CharSequence, actionText: CharSequence, noinline action: (View) -> Unit) = Snackbar - .make(view, message, Snackbar.LENGTH_LONG) - .setAction(actionText, action) - .apply { show() } - -/** - * Display Snackbar with the [Snackbar.LENGTH_INDEFINITE] duration. - * - * @param message the message text. - */ -@Deprecated("Use 'View.indefiniteSnackbar(CharSequence, CharSequence, (View) -> Unit)' instead.", ReplaceWith("view.indefiniteSnackbar(message, actionText, action)")) -inline fun indefiniteSnackbar(view: View, message: CharSequence, actionText: CharSequence, noinline action: (View) -> Unit) = Snackbar - .make(view, message, Snackbar.LENGTH_INDEFINITE) - .setAction(actionText, action) - .apply { show() } - /** * Display the Snackbar with the [Snackbar.LENGTH_SHORT] duration. * * @param message the message text resource. */ @JvmName("snackbar2") -inline fun View.snackbar(@StringRes message: Int) = Snackbar +fun View.snackbar(@StringRes message: Int) = Snackbar .make(this, message, Snackbar.LENGTH_SHORT) .apply { show() } @@ -146,7 +20,7 @@ inline fun View.snackbar(@StringRes message: Int) = Snackbar * @param message the message text resource. */ @JvmName("longSnackbar2") -inline fun View.longSnackbar(@StringRes message: Int) = Snackbar +fun View.longSnackbar(@StringRes message: Int) = Snackbar .make(this, message, Snackbar.LENGTH_LONG) .apply { show() } @@ -156,7 +30,7 @@ inline fun View.longSnackbar(@StringRes message: Int) = Snackbar * @param message the message text resource. */ @JvmName("indefiniteSnackbar2") -inline fun View.indefiniteSnackbar(@StringRes message: Int) = Snackbar +fun View.indefiniteSnackbar(@StringRes message: Int) = Snackbar .make(this, message, Snackbar.LENGTH_INDEFINITE) .apply { show() } @@ -166,7 +40,7 @@ inline fun View.indefiniteSnackbar(@StringRes message: Int) = Snackbar * @param message the message text. */ @JvmName("snackbar2") -inline fun View.snackbar(message: CharSequence) = Snackbar +fun View.snackbar(message: CharSequence) = Snackbar .make(this, message, Snackbar.LENGTH_SHORT) .apply { show() } @@ -176,7 +50,7 @@ inline fun View.snackbar(message: CharSequence) = Snackbar * @param message the message text. */ @JvmName("longSnackbar2") -inline fun View.longSnackbar(message: CharSequence) = Snackbar +fun View.longSnackbar(message: CharSequence) = Snackbar .make(this, message, Snackbar.LENGTH_LONG) .apply { show() } @@ -186,7 +60,7 @@ inline fun View.longSnackbar(message: CharSequence) = Snackbar * @param message the message text. */ @JvmName("indefiniteSnackbar2") -inline fun View.indefiniteSnackbar(message: CharSequence) = Snackbar +fun View.indefiniteSnackbar(message: CharSequence) = Snackbar .make(this, message, Snackbar.LENGTH_INDEFINITE) .apply { show() } @@ -196,7 +70,7 @@ inline fun View.indefiniteSnackbar(message: CharSequence) = Snackbar * @param message the message text resource. */ @JvmName("snackbar2") -inline fun View.snackbar(message: Int, @StringRes actionText: Int, noinline action: (View) -> Unit) = Snackbar +fun View.snackbar(message: Int, @StringRes actionText: Int, action: (View) -> Unit) = Snackbar .make(this, message, Snackbar.LENGTH_SHORT) .setAction(actionText, action) .apply { show() } @@ -207,7 +81,8 @@ inline fun View.snackbar(message: Int, @StringRes actionText: Int, noinline acti * @param message the message text resource. */ @JvmName("longSnackbar2") -inline fun View.longSnackbar(@StringRes message: Int, @StringRes actionText: Int, noinline action: (View) -> Unit) = Snackbar +fun View.longSnackbar(@StringRes message: Int, @StringRes actionText: Int, action: (View) -> Unit) = + Snackbar .make(this, message, Snackbar.LENGTH_LONG) .setAction(actionText, action) .apply { show() } @@ -218,7 +93,8 @@ inline fun View.longSnackbar(@StringRes message: Int, @StringRes actionText: Int * @param message the message text resource. */ @JvmName("indefiniteSnackbar2") -inline fun View.indefiniteSnackbar(@StringRes message: Int, @StringRes actionText: Int, noinline action: (View) -> Unit) = Snackbar +fun View.indefiniteSnackbar(@StringRes message: Int, @StringRes actionText: Int, action: (View) -> Unit) = + Snackbar .make(this, message, Snackbar.LENGTH_INDEFINITE) .setAction(actionText, action) .apply { show() } @@ -229,7 +105,8 @@ inline fun View.indefiniteSnackbar(@StringRes message: Int, @StringRes actionTex * @param message the message text. */ @JvmName("snackbar2") -inline fun View.snackbar(message: CharSequence, actionText: CharSequence, noinline action: (View) -> Unit) = Snackbar +fun View.snackbar(message: CharSequence, actionText: CharSequence, action: (View) -> Unit) = + Snackbar .make(this, message, Snackbar.LENGTH_SHORT) .setAction(actionText, action) .apply { show() } @@ -240,7 +117,8 @@ inline fun View.snackbar(message: CharSequence, actionText: CharSequence, noinli * @param message the message text. */ @JvmName("longSnackbar2") -inline fun View.longSnackbar(message: CharSequence, actionText: CharSequence, noinline action: (View) -> Unit) = Snackbar +fun View.longSnackbar(message: CharSequence, actionText: CharSequence, action: (View) -> Unit) = + Snackbar .make(this, message, Snackbar.LENGTH_LONG) .setAction(actionText, action) .apply { show() } @@ -251,7 +129,11 @@ inline fun View.longSnackbar(message: CharSequence, actionText: CharSequence, no * @param message the message text. */ @JvmName("indefiniteSnackbar2") -inline fun View.indefiniteSnackbar(message: CharSequence, actionText: CharSequence, noinline action: (View) -> Unit) = Snackbar +fun View.indefiniteSnackbar( + message: CharSequence, + actionText: CharSequence, + action: (View) -> Unit +) = Snackbar .make(this, message, Snackbar.LENGTH_INDEFINITE) .setAction(actionText, action) .apply { show() } \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/utils/Toasts.kt b/app/src/main/java/io/legado/app/utils/Toasts.kt index 16c032fa0..4348b4daf 100644 --- a/app/src/main/java/io/legado/app/utils/Toasts.kt +++ b/app/src/main/java/io/legado/app/utils/Toasts.kt @@ -11,25 +11,25 @@ import org.jetbrains.anko.toast * * @param message the message text resource. */ -inline fun Fragment.toast(message: Int) = requireActivity().toast(message) +fun Fragment.toast(message: Int) = requireActivity().toast(message) /** * Display the simple Toast message with the [Toast.LENGTH_SHORT] duration. * * @param message the message text. */ -inline fun Fragment.toast(message: CharSequence) = requireActivity().toast(message) +fun Fragment.toast(message: CharSequence) = requireActivity().toast(message) /** * Display the simple Toast message with the [Toast.LENGTH_LONG] duration. * * @param message the message text resource. */ -inline fun Fragment.longToast(message: Int) = requireActivity().longToast(message) +fun Fragment.longToast(message: Int) = requireActivity().longToast(message) /** * Display the simple Toast message with the [Toast.LENGTH_LONG] duration. * * @param message the message text. */ -inline fun Fragment.longToast(message: CharSequence) = requireActivity().longToast(message) +fun Fragment.longToast(message: CharSequence) = requireActivity().longToast(message) From 7c25389a4dc9b917afdbb4e1dad75839091dfe14 Mon Sep 17 00:00:00 2001 From: kunfei Date: Wed, 5 Feb 2020 17:30:18 +0800 Subject: [PATCH 115/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../io/legado/app/ui/book/search/HistoryKeyAdapter.kt | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/book/search/HistoryKeyAdapter.kt b/app/src/main/java/io/legado/app/ui/book/search/HistoryKeyAdapter.kt index 213157e90..2be9e6409 100644 --- a/app/src/main/java/io/legado/app/ui/book/search/HistoryKeyAdapter.kt +++ b/app/src/main/java/io/legado/app/ui/book/search/HistoryKeyAdapter.kt @@ -1,6 +1,5 @@ package io.legado.app.ui.book.search -import android.content.Context import io.legado.app.App import io.legado.app.R import io.legado.app.base.adapter.ItemViewHolder @@ -15,8 +14,10 @@ import org.jetbrains.anko.sdk27.listeners.onClick import org.jetbrains.anko.sdk27.listeners.onLongClick -class HistoryKeyAdapter(context: Context, val callBack: CallBack) : - SimpleRecyclerAdapter(context, R.layout.item_text) { +class HistoryKeyAdapter(activity: SearchActivity, val callBack: CallBack) : + SimpleRecyclerAdapter(activity, R.layout.item_text) { + + private val explosionField = ExplosionField.attach2Window(activity) override fun convert(holder: ItemViewHolder, item: SearchKeyword, payloads: MutableList) { with(holder.itemView) { @@ -26,7 +27,7 @@ class HistoryKeyAdapter(context: Context, val callBack: CallBack) : } onLongClick { it?.let { - ExplosionField(context).explode(it, true) + explosionField.explode(it, true) } GlobalScope.launch(IO) { App.db.searchKeywordDao().delete(item) From 232ca67c37cd1d78bc4c88772957d9efbfbde77a Mon Sep 17 00:00:00 2001 From: kunfei Date: Wed, 5 Feb 2020 17:39:39 +0800 Subject: [PATCH 116/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../anima/explosion_field/ExplosionField.kt | 190 +----------------- .../anima/explosion_field/ExplosionView.kt | 173 ++++++++++++++++ 2 files changed, 183 insertions(+), 180 deletions(-) create mode 100644 app/src/main/java/io/legado/app/ui/widget/anima/explosion_field/ExplosionView.kt diff --git a/app/src/main/java/io/legado/app/ui/widget/anima/explosion_field/ExplosionField.kt b/app/src/main/java/io/legado/app/ui/widget/anima/explosion_field/ExplosionField.kt index 1332a3969..9b014b7d2 100644 --- a/app/src/main/java/io/legado/app/ui/widget/anima/explosion_field/ExplosionField.kt +++ b/app/src/main/java/io/legado/app/ui/widget/anima/explosion_field/ExplosionField.kt @@ -1,191 +1,21 @@ -/* - * Copyright (C) 2015 tyrantgit - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ package io.legado.app.ui.widget.anima.explosion_field -import android.animation.Animator -import android.animation.AnimatorListenerAdapter -import android.animation.ValueAnimator import android.app.Activity -import android.content.Context -import android.graphics.Bitmap -import android.graphics.Canvas -import android.graphics.Rect -import android.media.MediaPlayer -import android.util.AttributeSet -import android.util.Log import android.view.View import android.view.ViewGroup import android.view.Window -import java.util.* +object ExplosionField { -class ExplosionField : View { - - private var customDuration = ExplosionAnimator.DEFAULT_DURATION - private var idPlayAnimationEffect = 0 - private var mZAnimatorListener: OnAnimatorListener? = null - private var mOnClickListener: View.OnClickListener? = null - - private val mExplosions = ArrayList() - private val mExpandInset = IntArray(2) - - constructor(context: Context) : super(context) { - init() - } - - constructor(context: Context, attrs: AttributeSet) : super(context, attrs) { - init() - } - - constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int) : super( - context, - attrs, - defStyleAttr - ) { - init() - } - - private fun init() { - - Arrays.fill(mExpandInset, Utils.dp2Px(32)) - } - - override fun onDraw(canvas: Canvas) { - super.onDraw(canvas) - for (explosion in mExplosions) { - explosion.draw(canvas) - } - } - - fun playSoundAnimationEffect(id: Int) { - this.idPlayAnimationEffect = id - } - - fun setCustomDuration(customDuration: Long) { - this.customDuration = customDuration - } - - fun addActionEvent(ievents: OnAnimatorListener) { - this.mZAnimatorListener = ievents - } - - - fun expandExplosionBound(dx: Int, dy: Int) { - mExpandInset[0] = dx - mExpandInset[1] = dy - } - - @JvmOverloads - fun explode(bitmap: Bitmap?, bound: Rect, startDelay: Long, view: View? = null) { - val currentDuration = customDuration - val explosion = ExplosionAnimator(this, bitmap!!, bound) - explosion.addListener(object : AnimatorListenerAdapter() { - override fun onAnimationEnd(animation: Animator) { - mExplosions.remove(animation) - if (view != null) { - view.scaleX = 1f - view.scaleY = 1f - view.alpha = 1f - view.setOnClickListener(mOnClickListener)//set event - - } - } - }) - explosion.startDelay = startDelay - explosion.duration = currentDuration - mExplosions.add(explosion) - explosion.start() - } - - @JvmOverloads - fun explode(view: View, restartState: Boolean? = false) { - - val r = Rect() - view.getGlobalVisibleRect(r) - val location = IntArray(2) - getLocationOnScreen(location) - // getLocationInWindow(location); - // view.getLocationInWindow(location); - r.offset(-location[0], -location[1]) - r.inset(-mExpandInset[0], -mExpandInset[1]) - val startDelay = 100 - val animator = ValueAnimator.ofFloat(0f, 1f).setDuration(150) - animator.addUpdateListener(object : ValueAnimator.AnimatorUpdateListener { - - internal var random = Random() - - override fun onAnimationUpdate(animation: ValueAnimator) { - view.translationX = (random.nextFloat() - 0.5f) * view.width.toFloat() * 0.05f - view.translationY = (random.nextFloat() - 0.5f) * view.height.toFloat() * 0.05f - } - }) - - animator.addListener(object : Animator.AnimatorListener { - override fun onAnimationStart(animator: Animator) { - if (idPlayAnimationEffect != 0) - MediaPlayer.create(context, idPlayAnimationEffect).start() - } - - override fun onAnimationEnd(animator: Animator) { - if (mZAnimatorListener != null) { - mZAnimatorListener!!.onAnimationEnd(animator, this@ExplosionField) - } - } - - override fun onAnimationCancel(animator: Animator) { - Log.i("PRUEBA", "CANCEL") - } - - override fun onAnimationRepeat(animator: Animator) { - Log.i("PRUEBA", "REPEAT") - } - }) - - animator.start() - view.animate().setDuration(150).setStartDelay(startDelay.toLong()).scaleX(0f).scaleY(0f) - .alpha(0f).start() - if (restartState!!) - explode(Utils.createBitmapFromView(view), r, startDelay.toLong(), view) - else - explode(Utils.createBitmapFromView(view), r, startDelay.toLong()) - - } - - fun clear() { - mExplosions.clear() - invalidate() - } - - override fun setOnClickListener(mOnClickListener: View.OnClickListener?) { - this.mOnClickListener = mOnClickListener - } - - companion object { - - fun attach2Window(activity: Activity): ExplosionField { - val rootView = activity.findViewById(Window.ID_ANDROID_CONTENT) as ViewGroup - val explosionField = ExplosionField(activity) - rootView.addView( - explosionField, ViewGroup.LayoutParams( - ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT - ) + fun attach2Window(activity: Activity): ExplosionView { + val rootView = activity.findViewById(Window.ID_ANDROID_CONTENT) as ViewGroup + val explosionField = ExplosionView(activity) + rootView.addView( + explosionField, ViewGroup.LayoutParams( + ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT ) - return explosionField - } + ) + return explosionField } - -} +} \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/ui/widget/anima/explosion_field/ExplosionView.kt b/app/src/main/java/io/legado/app/ui/widget/anima/explosion_field/ExplosionView.kt new file mode 100644 index 000000000..c79695a51 --- /dev/null +++ b/app/src/main/java/io/legado/app/ui/widget/anima/explosion_field/ExplosionView.kt @@ -0,0 +1,173 @@ +/* + * Copyright (C) 2015 tyrantgit + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package io.legado.app.ui.widget.anima.explosion_field + +import android.animation.Animator +import android.animation.AnimatorListenerAdapter +import android.animation.ValueAnimator +import android.content.Context +import android.graphics.Bitmap +import android.graphics.Canvas +import android.graphics.Rect +import android.media.MediaPlayer +import android.util.AttributeSet +import android.util.Log +import android.view.View +import java.util.* + + +class ExplosionView : View { + + private var customDuration = ExplosionAnimator.DEFAULT_DURATION + private var idPlayAnimationEffect = 0 + private var mZAnimatorListener: OnAnimatorListener? = null + private var mOnClickListener: OnClickListener? = null + + private val mExplosions = ArrayList() + private val mExpandInset = IntArray(2) + + constructor(context: Context) : super(context) { + init() + } + + constructor(context: Context, attrs: AttributeSet) : super(context, attrs) { + init() + } + + constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int) : super( + context, + attrs, + defStyleAttr + ) { + init() + } + + private fun init() { + + Arrays.fill(mExpandInset, Utils.dp2Px(32)) + } + + override fun onDraw(canvas: Canvas) { + super.onDraw(canvas) + for (explosion in mExplosions) { + explosion.draw(canvas) + } + } + + fun playSoundAnimationEffect(id: Int) { + this.idPlayAnimationEffect = id + } + + fun setCustomDuration(customDuration: Long) { + this.customDuration = customDuration + } + + fun addActionEvent(ievents: OnAnimatorListener) { + this.mZAnimatorListener = ievents + } + + + fun expandExplosionBound(dx: Int, dy: Int) { + mExpandInset[0] = dx + mExpandInset[1] = dy + } + + @JvmOverloads + fun explode(bitmap: Bitmap?, bound: Rect, startDelay: Long, view: View? = null) { + val currentDuration = customDuration + val explosion = ExplosionAnimator(this, bitmap!!, bound) + explosion.addListener(object : AnimatorListenerAdapter() { + override fun onAnimationEnd(animation: Animator) { + mExplosions.remove(animation) + if (view != null) { + view.scaleX = 1f + view.scaleY = 1f + view.alpha = 1f + view.setOnClickListener(mOnClickListener)//set event + + } + } + }) + explosion.startDelay = startDelay + explosion.duration = currentDuration + mExplosions.add(explosion) + explosion.start() + } + + @JvmOverloads + fun explode(view: View, restartState: Boolean? = false) { + + val r = Rect() + view.getGlobalVisibleRect(r) + val location = IntArray(2) + getLocationOnScreen(location) + // getLocationInWindow(location); + // view.getLocationInWindow(location); + r.offset(-location[0], -location[1]) + r.inset(-mExpandInset[0], -mExpandInset[1]) + val startDelay = 100 + val animator = ValueAnimator.ofFloat(0f, 1f).setDuration(150) + animator.addUpdateListener(object : ValueAnimator.AnimatorUpdateListener { + + var random = Random() + + override fun onAnimationUpdate(animation: ValueAnimator) { + view.translationX = (random.nextFloat() - 0.5f) * view.width.toFloat() * 0.05f + view.translationY = (random.nextFloat() - 0.5f) * view.height.toFloat() * 0.05f + } + }) + + animator.addListener(object : Animator.AnimatorListener { + override fun onAnimationStart(animator: Animator) { + if (idPlayAnimationEffect != 0) + MediaPlayer.create(context, idPlayAnimationEffect).start() + } + + override fun onAnimationEnd(animator: Animator) { + if (mZAnimatorListener != null) { + mZAnimatorListener!!.onAnimationEnd(animator, this@ExplosionView) + } + } + + override fun onAnimationCancel(animator: Animator) { + Log.i("PRUEBA", "CANCEL") + } + + override fun onAnimationRepeat(animator: Animator) { + Log.i("PRUEBA", "REPEAT") + } + }) + + animator.start() + view.animate().setDuration(150).setStartDelay(startDelay.toLong()).scaleX(0f).scaleY(0f) + .alpha(0f).start() + if (restartState!!) + explode(Utils.createBitmapFromView(view), r, startDelay.toLong(), view) + else + explode(Utils.createBitmapFromView(view), r, startDelay.toLong()) + + } + + fun clear() { + mExplosions.clear() + invalidate() + } + + override fun setOnClickListener(mOnClickListener: OnClickListener?) { + this.mOnClickListener = mOnClickListener + } + +} From 1e185b0ee939889fc917e9e5d8a68ca0b0f6b596 Mon Sep 17 00:00:00 2001 From: kunfei Date: Wed, 5 Feb 2020 18:10:11 +0800 Subject: [PATCH 117/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/constant/{Bus.kt => EventBus.kt} | 2 +- .../constant/{Action.kt => IntentAction.kt} | 2 +- .../app/receiver/MediaButtonReceiver.kt | 6 +- .../app/receiver/TimeElectricityReceiver.kt | 6 +- .../io/legado/app/service/AudioPlayService.kt | 56 +++++++++---------- .../app/service/BaseReadAloudService.kt | 34 +++++------ .../legado/app/service/CheckSourceService.kt | 25 ++++++++- .../io/legado/app/service/DownloadService.kt | 14 ++--- .../app/service/HttpReadAloudService.kt | 6 +- .../legado/app/service/TTSReadAloudService.kt | 6 +- .../java/io/legado/app/service/WebService.kt | 12 ++-- .../io/legado/app/service/help/AudioPlay.kt | 18 +++--- .../io/legado/app/service/help/Download.kt | 4 +- .../io/legado/app/service/help/ReadAloud.kt | 18 +++--- .../legado/app/ui/audio/AudioPlayActivity.kt | 14 ++--- .../app/ui/book/read/ReadBookActivity.kt | 22 ++++---- .../ui/book/read/config/BgTextConfigDialog.kt | 8 +-- .../ui/book/read/config/MoreConfigDialog.kt | 6 +- .../book/read/config/PaddingConfigDialog.kt | 26 ++++----- .../book/read/config/ReadAloudConfigDialog.kt | 4 +- .../ui/book/read/config/ReadAloudDialog.kt | 6 +- .../ui/book/read/config/ReadStyleDialog.kt | 28 +++++----- .../read/page/ContentSelectActionCallback.kt | 4 +- .../app/ui/config/OtherConfigFragment.kt | 4 +- .../app/ui/config/ThemeConfigFragment.kt | 4 +- .../app/ui/download/DownloadActivity.kt | 4 +- .../io/legado/app/ui/main/MainActivity.kt | 6 +- .../io/legado/app/ui/main/MainViewModel.kt | 8 +-- .../ui/main/bookshelf/BookshelfFragment.kt | 4 +- .../ui/main/bookshelf/books/BooksFragment.kt | 4 +- .../io/legado/app/ui/main/my/MyFragment.kt | 4 +- 31 files changed, 192 insertions(+), 173 deletions(-) rename app/src/main/java/io/legado/app/constant/{Bus.kt => EventBus.kt} (97%) rename app/src/main/java/io/legado/app/constant/{Action.kt => IntentAction.kt} (96%) diff --git a/app/src/main/java/io/legado/app/constant/Bus.kt b/app/src/main/java/io/legado/app/constant/EventBus.kt similarity index 97% rename from app/src/main/java/io/legado/app/constant/Bus.kt rename to app/src/main/java/io/legado/app/constant/EventBus.kt index eb1dd14dd..3fc80e3ac 100644 --- a/app/src/main/java/io/legado/app/constant/Bus.kt +++ b/app/src/main/java/io/legado/app/constant/EventBus.kt @@ -1,6 +1,6 @@ package io.legado.app.constant -object Bus { +object EventBus { const val MEDIA_BUTTON = "mediaButton" const val RECREATE = "RECREATE" const val UP_BOOK = "sourceDebugLog" diff --git a/app/src/main/java/io/legado/app/constant/Action.kt b/app/src/main/java/io/legado/app/constant/IntentAction.kt similarity index 96% rename from app/src/main/java/io/legado/app/constant/Action.kt rename to app/src/main/java/io/legado/app/constant/IntentAction.kt index a13a8cca3..0dffe87a1 100644 --- a/app/src/main/java/io/legado/app/constant/Action.kt +++ b/app/src/main/java/io/legado/app/constant/IntentAction.kt @@ -1,6 +1,6 @@ package io.legado.app.constant -object Action { +object IntentAction { const val start = "start" const val play = "play" const val stop = "stop" diff --git a/app/src/main/java/io/legado/app/receiver/MediaButtonReceiver.kt b/app/src/main/java/io/legado/app/receiver/MediaButtonReceiver.kt index 5cc36a680..12083c652 100644 --- a/app/src/main/java/io/legado/app/receiver/MediaButtonReceiver.kt +++ b/app/src/main/java/io/legado/app/receiver/MediaButtonReceiver.kt @@ -5,7 +5,7 @@ import android.content.Context import android.content.Intent import android.view.KeyEvent import io.legado.app.App -import io.legado.app.constant.Bus +import io.legado.app.constant.EventBus import io.legado.app.data.entities.Book import io.legado.app.help.ActivityHelp import io.legado.app.ui.audio.AudioPlayActivity @@ -51,9 +51,9 @@ class MediaButtonReceiver : BroadcastReceiver() { private fun readAloud(context: Context) { when { ActivityHelp.isExist(AudioPlayActivity::class.java) -> - postEvent(Bus.MEDIA_BUTTON, true) + postEvent(EventBus.MEDIA_BUTTON, true) ActivityHelp.isExist(ReadBookActivity::class.java) -> - postEvent(Bus.MEDIA_BUTTON, true) + postEvent(EventBus.MEDIA_BUTTON, true) else -> { GlobalScope.launch(Main) { val lastBook: Book? = withContext(IO) { diff --git a/app/src/main/java/io/legado/app/receiver/TimeElectricityReceiver.kt b/app/src/main/java/io/legado/app/receiver/TimeElectricityReceiver.kt index 613db4fe4..765d05b3e 100644 --- a/app/src/main/java/io/legado/app/receiver/TimeElectricityReceiver.kt +++ b/app/src/main/java/io/legado/app/receiver/TimeElectricityReceiver.kt @@ -5,7 +5,7 @@ import android.content.Context import android.content.Intent import android.content.IntentFilter import android.os.BatteryManager -import io.legado.app.constant.Bus +import io.legado.app.constant.EventBus import io.legado.app.utils.postEvent @@ -28,11 +28,11 @@ class TimeElectricityReceiver : BroadcastReceiver() { intent?.action?.let { when (it) { Intent.ACTION_TIME_TICK -> { - postEvent(Bus.TIME_CHANGED, "") + postEvent(EventBus.TIME_CHANGED, "") } Intent.ACTION_BATTERY_CHANGED -> { val level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1) - postEvent(Bus.BATTERY_CHANGED, level) + postEvent(EventBus.BATTERY_CHANGED, level) } } } diff --git a/app/src/main/java/io/legado/app/service/AudioPlayService.kt b/app/src/main/java/io/legado/app/service/AudioPlayService.kt index ef2638c29..c165f3142 100644 --- a/app/src/main/java/io/legado/app/service/AudioPlayService.kt +++ b/app/src/main/java/io/legado/app/service/AudioPlayService.kt @@ -18,9 +18,9 @@ import androidx.core.app.NotificationCompat import io.legado.app.App import io.legado.app.R import io.legado.app.base.BaseService -import io.legado.app.constant.Action +import io.legado.app.constant.IntentAction import io.legado.app.constant.AppConst -import io.legado.app.constant.Bus +import io.legado.app.constant.EventBus import io.legado.app.constant.Status import io.legado.app.data.entities.BookChapter import io.legado.app.help.BookHelp @@ -81,21 +81,21 @@ class AudioPlayService : BaseService(), override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { intent?.action?.let { action -> when (action) { - Action.play -> { + IntentAction.play -> { AudioPlay.book?.let { title = it.name position = it.durChapterPos loadContent(it.durChapterIndex) } } - Action.pause -> pause(true) - Action.resume -> resume() - Action.prev -> moveToPrev() - Action.next -> moveToNext() - Action.adjustSpeed -> upSpeed(intent.getFloatExtra("adjust", 1f)) - Action.addTimer -> addTimer() - Action.setTimer -> setTimer(intent.getIntExtra("minute", 0)) - Action.adjustProgress -> adjustProgress(intent.getIntExtra("position", position)) + IntentAction.pause -> pause(true) + IntentAction.resume -> resume() + IntentAction.prev -> moveToPrev() + IntentAction.next -> moveToNext() + IntentAction.adjustSpeed -> upSpeed(intent.getFloatExtra("adjust", 1f)) + IntentAction.addTimer -> addTimer() + IntentAction.setTimer -> setTimer(intent.getIntExtra("minute", 0)) + IntentAction.adjustProgress -> adjustProgress(intent.getIntExtra("position", position)) else -> stopSelf() } } @@ -112,7 +112,7 @@ class AudioPlayService : BaseService(), unregisterReceiver(broadcastReceiver) upMediaSessionPlaybackState(PlaybackStateCompat.STATE_STOPPED) AudioPlay.status = Status.STOP - postEvent(Bus.AUDIO_STATE, Status.STOP) + postEvent(EventBus.AUDIO_STATE, Status.STOP) } private fun play() { @@ -120,7 +120,7 @@ class AudioPlayService : BaseService(), if (requestFocus()) { try { AudioPlay.status = Status.PLAY - postEvent(Bus.AUDIO_STATE, Status.PLAY) + postEvent(EventBus.AUDIO_STATE, Status.PLAY) mediaPlayer.reset() val analyzeUrl = AnalyzeUrl(url, headerMapF = AudioPlay.headers(), useWebView = true) @@ -146,7 +146,7 @@ class AudioPlayService : BaseService(), mediaPlayer.pause() upMediaSessionPlaybackState(PlaybackStateCompat.STATE_PAUSED) AudioPlay.status = Status.PAUSE - postEvent(Bus.AUDIO_STATE, Status.PAUSE) + postEvent(EventBus.AUDIO_STATE, Status.PAUSE) upNotification() } } @@ -159,7 +159,7 @@ class AudioPlayService : BaseService(), handler.postDelayed(mpRunnable, 1000) upMediaSessionPlaybackState(PlaybackStateCompat.STATE_PLAYING) AudioPlay.status = Status.PLAY - postEvent(Bus.AUDIO_STATE, Status.PLAY) + postEvent(EventBus.AUDIO_STATE, Status.PLAY) upNotification() } @@ -178,7 +178,7 @@ class AudioPlayService : BaseService(), if (isPlaying) { playbackParams = playbackParams.apply { speed += adjust } } - postEvent(Bus.AUDIO_SPEED, playbackParams.speed) + postEvent(EventBus.AUDIO_SPEED, playbackParams.speed) } } } @@ -191,7 +191,7 @@ class AudioPlayService : BaseService(), if (pause) return mediaPlayer.start() mediaPlayer.seekTo(position) - postEvent(Bus.AUDIO_SIZE, mediaPlayer.duration) + postEvent(EventBus.AUDIO_SIZE, mediaPlayer.duration) bookChapter?.let { it.end = mediaPlayer.duration.toLong() } @@ -205,7 +205,7 @@ class AudioPlayService : BaseService(), override fun onError(mp: MediaPlayer?, what: Int, extra: Int): Boolean { if (!mediaPlayer.isPlaying) { AudioPlay.status = Status.STOP - postEvent(Bus.AUDIO_STATE, Status.STOP) + postEvent(EventBus.AUDIO_STATE, Status.STOP) launch { toast("error: $what $extra $url") } } return true @@ -238,7 +238,7 @@ class AudioPlayService : BaseService(), handler.removeCallbacks(dsRunnable) handler.postDelayed(dsRunnable, 60000) } - postEvent(Bus.TTS_DS, timeMinute) + postEvent(EventBus.TTS_DS, timeMinute) upNotification() } @@ -247,7 +247,7 @@ class AudioPlayService : BaseService(), */ private fun upPlayProgress() { saveProgress() - postEvent(Bus.AUDIO_PROGRESS, mediaPlayer.currentPosition) + postEvent(EventBus.AUDIO_PROGRESS, mediaPlayer.currentPosition) handler.postDelayed(mpRunnable, 1000) } @@ -260,9 +260,9 @@ class AudioPlayService : BaseService(), if (index == AudioPlay.durChapterIndex) { bookChapter = chapter subtitle = chapter.title - postEvent(Bus.AUDIO_SUB_TITLE, subtitle) - postEvent(Bus.AUDIO_SIZE, chapter.end?.toInt() ?: 0) - postEvent(Bus.AUDIO_PROGRESS, position) + postEvent(EventBus.AUDIO_SUB_TITLE, subtitle) + postEvent(EventBus.AUDIO_SIZE, chapter.end?.toInt() ?: 0) + postEvent(EventBus.AUDIO_PROGRESS, position) } loadContent(chapter) } ?: removeLoading(index) @@ -376,7 +376,7 @@ class AudioPlayService : BaseService(), handler.postDelayed(dsRunnable, 60000) } } - postEvent(Bus.TTS_DS, timeMinute) + postEvent(EventBus.TTS_DS, timeMinute) upNotification() } @@ -485,24 +485,24 @@ class AudioPlayService : BaseService(), builder.addAction( R.drawable.ic_play_24dp, getString(R.string.resume), - thisPendingIntent(Action.resume) + thisPendingIntent(IntentAction.resume) ) } else { builder.addAction( R.drawable.ic_pause_24dp, getString(R.string.pause), - thisPendingIntent(Action.pause) + thisPendingIntent(IntentAction.pause) ) } builder.addAction( R.drawable.ic_stop_black_24dp, getString(R.string.stop), - thisPendingIntent(Action.stop) + thisPendingIntent(IntentAction.stop) ) builder.addAction( R.drawable.ic_time_add_24dp, getString(R.string.set_timer), - thisPendingIntent(Action.addTimer) + thisPendingIntent(IntentAction.addTimer) ) builder.setStyle( androidx.media.app.NotificationCompat.MediaStyle() diff --git a/app/src/main/java/io/legado/app/service/BaseReadAloudService.kt b/app/src/main/java/io/legado/app/service/BaseReadAloudService.kt index 5603da72c..cb946d145 100644 --- a/app/src/main/java/io/legado/app/service/BaseReadAloudService.kt +++ b/app/src/main/java/io/legado/app/service/BaseReadAloudService.kt @@ -70,7 +70,7 @@ abstract class BaseReadAloudService : BaseService(), isRun = false pause = true unregisterReceiver(broadcastReceiver) - postEvent(Bus.ALOUD_STATE, Status.STOP) + postEvent(EventBus.ALOUD_STATE, Status.STOP) upMediaSessionPlaybackState(PlaybackStateCompat.STATE_STOPPED) mediaSessionCompat?.release() } @@ -78,7 +78,7 @@ abstract class BaseReadAloudService : BaseService(), override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { intent?.action?.let { action -> when (action) { - Action.play -> { + IntentAction.play -> { title = intent.getStringExtra("title") ?: "" subtitle = intent.getStringExtra("subtitle") ?: "" pageIndex = intent.getIntExtra("pageIndex", 0) @@ -87,13 +87,13 @@ abstract class BaseReadAloudService : BaseService(), intent.getBooleanExtra("play", true) ) } - Action.pause -> pauseReadAloud(true) - Action.resume -> resumeReadAloud() - Action.upTtsSpeechRate -> upSpeechRate(true) - Action.prevParagraph -> prevP() - Action.nextParagraph -> nextP() - Action.addTimer -> addTimer() - Action.setTimer -> setTimer(intent.getIntExtra("minute", 0)) + IntentAction.pause -> pauseReadAloud(true) + IntentAction.resume -> resumeReadAloud() + IntentAction.upTtsSpeechRate -> upSpeechRate(true) + IntentAction.prevParagraph -> prevP() + IntentAction.nextParagraph -> nextP() + IntentAction.addTimer -> addTimer() + IntentAction.setTimer -> setTimer(intent.getIntExtra("minute", 0)) else -> stopSelf() } } @@ -124,13 +124,13 @@ abstract class BaseReadAloudService : BaseService(), open fun play() { pause = false - postEvent(Bus.ALOUD_STATE, Status.PLAY) + postEvent(EventBus.ALOUD_STATE, Status.PLAY) upNotification() } @CallSuper open fun pauseReadAloud(pause: Boolean) { - postEvent(Bus.ALOUD_STATE, Status.PAUSE) + postEvent(EventBus.ALOUD_STATE, Status.PAUSE) BaseReadAloudService.pause = pause upNotification() upMediaSessionPlaybackState(PlaybackStateCompat.STATE_PAUSED) @@ -167,7 +167,7 @@ abstract class BaseReadAloudService : BaseService(), handler.removeCallbacks(dsRunnable) handler.postDelayed(dsRunnable, 60000) } - postEvent(Bus.TTS_DS, timeMinute) + postEvent(EventBus.TTS_DS, timeMinute) upNotification() } @@ -183,7 +183,7 @@ abstract class BaseReadAloudService : BaseService(), handler.postDelayed(dsRunnable, 60000) } } - postEvent(Bus.TTS_DS, timeMinute) + postEvent(EventBus.TTS_DS, timeMinute) upNotification() } @@ -298,24 +298,24 @@ abstract class BaseReadAloudService : BaseService(), builder.addAction( R.drawable.ic_play_24dp, getString(R.string.resume), - aloudServicePendingIntent(Action.resume) + aloudServicePendingIntent(IntentAction.resume) ) } else { builder.addAction( R.drawable.ic_pause_24dp, getString(R.string.pause), - aloudServicePendingIntent(Action.pause) + aloudServicePendingIntent(IntentAction.pause) ) } builder.addAction( R.drawable.ic_stop_black_24dp, getString(R.string.stop), - aloudServicePendingIntent(Action.stop) + aloudServicePendingIntent(IntentAction.stop) ) builder.addAction( R.drawable.ic_time_add_24dp, getString(R.string.set_timer), - aloudServicePendingIntent(Action.addTimer) + aloudServicePendingIntent(IntentAction.addTimer) ) builder.setStyle( androidx.media.app.NotificationCompat.MediaStyle() diff --git a/app/src/main/java/io/legado/app/service/CheckSourceService.kt b/app/src/main/java/io/legado/app/service/CheckSourceService.kt index ba36d1e8b..6507cb219 100644 --- a/app/src/main/java/io/legado/app/service/CheckSourceService.kt +++ b/app/src/main/java/io/legado/app/service/CheckSourceService.kt @@ -1,10 +1,11 @@ package io.legado.app.service +import android.content.Context import android.content.Intent import androidx.core.app.NotificationCompat import io.legado.app.R import io.legado.app.base.BaseService -import io.legado.app.constant.Action +import io.legado.app.constant.IntentAction import io.legado.app.constant.AppConst import io.legado.app.data.entities.BookSource import io.legado.app.help.AppConfig @@ -14,6 +15,24 @@ import kotlinx.coroutines.asCoroutineDispatcher import java.util.concurrent.Executors class CheckSourceService : BaseService() { + + companion object{ + fun start(context: Context, selectedIds: Array) { + Intent(context, CheckSourceService::class.java).let { + it.action = IntentAction.start + it.putExtra("selectIds", selectedIds) + context.startService(it) + } + } + + fun stop(context: Context) { + Intent(context, CheckSourceService::class.java).let { + it.action = IntentAction.stop + context.startService(it) + } + } + } + private var searchPool = Executors.newFixedThreadPool(AppConfig.threadCount).asCoroutineDispatcher() private var sourceList: List? = null @@ -25,7 +44,7 @@ class CheckSourceService : BaseService() { override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { when (intent?.action) { - Action.start -> { + IntentAction.start -> { } else -> stopSelf() } @@ -52,7 +71,7 @@ class CheckSourceService : BaseService() { .addAction( R.drawable.ic_stop_black_24dp, getString(R.string.cancel), - IntentHelp.servicePendingIntent(this, Action.stop) + IntentHelp.servicePendingIntent(this, IntentAction.stop) ) sourceList?.let { builder.setProgress(it.size, state, false) diff --git a/app/src/main/java/io/legado/app/service/DownloadService.kt b/app/src/main/java/io/legado/app/service/DownloadService.kt index 9c2e7a2f3..df49e24d9 100644 --- a/app/src/main/java/io/legado/app/service/DownloadService.kt +++ b/app/src/main/java/io/legado/app/service/DownloadService.kt @@ -6,9 +6,9 @@ import androidx.core.app.NotificationCompat import io.legado.app.App import io.legado.app.R import io.legado.app.base.BaseService -import io.legado.app.constant.Action +import io.legado.app.constant.IntentAction import io.legado.app.constant.AppConst -import io.legado.app.constant.Bus +import io.legado.app.constant.EventBus import io.legado.app.help.AppConfig import io.legado.app.help.BookHelp import io.legado.app.help.IntentHelp @@ -34,7 +34,7 @@ class DownloadService : BaseService() { builder.addAction( R.drawable.ic_stop_black_24dp, getString(R.string.cancel), - IntentHelp.servicePendingIntent(this, Action.stop) + IntentHelp.servicePendingIntent(this, IntentAction.stop) ) builder.setVisibility(NotificationCompat.VISIBILITY_PUBLIC) } @@ -48,12 +48,12 @@ class DownloadService : BaseService() { override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { intent?.action?.let { action -> when (action) { - Action.start -> download( + IntentAction.start -> download( intent.getStringExtra("bookUrl"), intent.getIntExtra("start", 0), intent.getIntExtra("end", 0) ) - Action.stop -> stopDownload() + IntentAction.stop -> stopDownload() } } return super.onStartCommand(intent, flags, startId) @@ -64,7 +64,7 @@ class DownloadService : BaseService() { searchPool.close() handler.removeCallbacks(runnable) super.onDestroy() - postEvent(Bus.UP_DOWNLOAD, false) + postEvent(EventBus.UP_DOWNLOAD, false) } private fun download(bookUrl: String?, start: Int, end: Int) { @@ -105,7 +105,7 @@ class DownloadService : BaseService() { private fun upDownload() { updateNotification(notificationContent) - postEvent(Bus.UP_DOWNLOAD, true) + postEvent(EventBus.UP_DOWNLOAD, true) handler.removeCallbacks(runnable) handler.postDelayed(runnable, 1000) } diff --git a/app/src/main/java/io/legado/app/service/HttpReadAloudService.kt b/app/src/main/java/io/legado/app/service/HttpReadAloudService.kt index f8048af54..1cf40fc8c 100644 --- a/app/src/main/java/io/legado/app/service/HttpReadAloudService.kt +++ b/app/src/main/java/io/legado/app/service/HttpReadAloudService.kt @@ -2,7 +2,7 @@ package io.legado.app.service import android.app.PendingIntent import android.media.MediaPlayer -import io.legado.app.constant.Bus +import io.legado.app.constant.EventBus import io.legado.app.constant.PreferKey import io.legado.app.help.IntentHelp import io.legado.app.help.http.HttpHelper @@ -98,7 +98,7 @@ class HttpReadAloudService : BaseReadAloudService(), mediaPlayer.reset() mediaPlayer.setDataSource(fd) mediaPlayer.prepareAsync() - postEvent(Bus.TTS_START, readAloudNumber + 1) + postEvent(EventBus.TTS_START, readAloudNumber + 1) } catch (e: Exception) { e.printStackTrace() } @@ -187,7 +187,7 @@ class HttpReadAloudService : BaseReadAloudService(), ReadBook.moveToNextPage() } } - postEvent(Bus.TTS_START, readAloudNumber + 1) + postEvent(EventBus.TTS_START, readAloudNumber + 1) } override fun onError(mp: MediaPlayer?, what: Int, extra: Int): Boolean { diff --git a/app/src/main/java/io/legado/app/service/TTSReadAloudService.kt b/app/src/main/java/io/legado/app/service/TTSReadAloudService.kt index 977e8b0ac..4c5357ce6 100644 --- a/app/src/main/java/io/legado/app/service/TTSReadAloudService.kt +++ b/app/src/main/java/io/legado/app/service/TTSReadAloudService.kt @@ -6,7 +6,7 @@ import android.speech.tts.TextToSpeech import android.speech.tts.UtteranceProgressListener import io.legado.app.R import io.legado.app.constant.AppConst -import io.legado.app.constant.Bus +import io.legado.app.constant.EventBus import io.legado.app.help.IntentHelp import io.legado.app.help.MediaHelp import io.legado.app.service.help.ReadBook @@ -152,7 +152,7 @@ class TTSReadAloudService : BaseReadAloudService(), TextToSpeech.OnInitListener ReadBook.moveToNextPage() } } - postEvent(Bus.TTS_START, readAloudNumber + 1) + postEvent(EventBus.TTS_START, readAloudNumber + 1) } override fun onDone(s: String) { @@ -169,7 +169,7 @@ class TTSReadAloudService : BaseReadAloudService(), TextToSpeech.OnInitListener if (readAloudNumber + start > it.getReadLength(pageIndex + 1)) { pageIndex++ ReadBook.moveToNextPage() - postEvent(Bus.TTS_START, readAloudNumber + start) + postEvent(EventBus.TTS_START, readAloudNumber + start) } } } diff --git a/app/src/main/java/io/legado/app/service/WebService.kt b/app/src/main/java/io/legado/app/service/WebService.kt index 25f2b6822..e9d223956 100644 --- a/app/src/main/java/io/legado/app/service/WebService.kt +++ b/app/src/main/java/io/legado/app/service/WebService.kt @@ -6,9 +6,9 @@ import androidx.core.app.NotificationCompat import io.legado.app.App import io.legado.app.R import io.legado.app.base.BaseService -import io.legado.app.constant.Action +import io.legado.app.constant.IntentAction import io.legado.app.constant.AppConst -import io.legado.app.constant.Bus +import io.legado.app.constant.EventBus import io.legado.app.help.IntentHelp import io.legado.app.utils.NetworkUtils import io.legado.app.utils.getPrefInt @@ -32,7 +32,7 @@ class WebService : BaseService() { fun stop(context: Context) { if (isRun) { val intent = Intent(context, WebService::class.java) - intent.action = Action.stop + intent.action = IntentAction.stop context.startService(intent) } } @@ -56,12 +56,12 @@ class WebService : BaseService() { if (webSocketServer?.isAlive == true) { webSocketServer?.stop() } - postEvent(Bus.WEB_SERVICE_STOP, true) + postEvent(EventBus.WEB_SERVICE_STOP, true) } override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { when (intent?.action) { - Action.stop -> stopSelf() + IntentAction.stop -> stopSelf() else -> upWebServer() } return super.onStartCommand(intent, flags, startId) @@ -115,7 +115,7 @@ class WebService : BaseService() { builder.addAction( R.drawable.ic_stop_black_24dp, getString(R.string.cancel), - IntentHelp.servicePendingIntent(this, Action.stop) + IntentHelp.servicePendingIntent(this, IntentAction.stop) ) builder.setVisibility(NotificationCompat.VISIBILITY_PUBLIC) val notification = builder.build() diff --git a/app/src/main/java/io/legado/app/service/help/AudioPlay.kt b/app/src/main/java/io/legado/app/service/help/AudioPlay.kt index add1a3fab..7c8d120b3 100644 --- a/app/src/main/java/io/legado/app/service/help/AudioPlay.kt +++ b/app/src/main/java/io/legado/app/service/help/AudioPlay.kt @@ -3,7 +3,7 @@ package io.legado.app.service.help import android.content.Context import android.content.Intent import androidx.lifecycle.MutableLiveData -import io.legado.app.constant.Action +import io.legado.app.constant.IntentAction import io.legado.app.constant.Status import io.legado.app.data.entities.Book import io.legado.app.model.WebBook @@ -27,14 +27,14 @@ object AudioPlay { fun play(context: Context) { val intent = Intent(context, AudioPlayService::class.java) - intent.action = Action.play + intent.action = IntentAction.play context.startService(intent) } fun pause(context: Context) { if (AudioPlayService.isRun) { val intent = Intent(context, AudioPlayService::class.java) - intent.action = Action.pause + intent.action = IntentAction.pause context.startService(intent) } } @@ -42,7 +42,7 @@ object AudioPlay { fun resume(context: Context) { if (AudioPlayService.isRun) { val intent = Intent(context, AudioPlayService::class.java) - intent.action = Action.resume + intent.action = IntentAction.resume context.startService(intent) } } @@ -50,7 +50,7 @@ object AudioPlay { fun stop(context: Context) { if (AudioPlayService.isRun) { val intent = Intent(context, AudioPlayService::class.java) - intent.action = Action.stop + intent.action = IntentAction.stop context.startService(intent) } } @@ -58,7 +58,7 @@ object AudioPlay { fun adjustSpeed(context: Context, adjust: Float) { if (AudioPlayService.isRun) { val intent = Intent(context, AudioPlayService::class.java) - intent.action = Action.adjustSpeed + intent.action = IntentAction.adjustSpeed intent.putExtra("adjust", adjust) context.startService(intent) } @@ -67,7 +67,7 @@ object AudioPlay { fun adjustProgress(context: Context, position: Int) { if (AudioPlayService.isRun) { val intent = Intent(context, AudioPlayService::class.java) - intent.action = Action.adjustProgress + intent.action = IntentAction.adjustProgress intent.putExtra("position", position) context.startService(intent) } @@ -76,7 +76,7 @@ object AudioPlay { fun prev(context: Context) { if (AudioPlayService.isRun) { val intent = Intent(context, AudioPlayService::class.java) - intent.action = Action.prev + intent.action = IntentAction.prev context.startService(intent) } } @@ -84,7 +84,7 @@ object AudioPlay { fun next(context: Context) { if (AudioPlayService.isRun) { val intent = Intent(context, AudioPlayService::class.java) - intent.action = Action.next + intent.action = IntentAction.next context.startService(intent) } } diff --git a/app/src/main/java/io/legado/app/service/help/Download.kt b/app/src/main/java/io/legado/app/service/help/Download.kt index 1c17a7ee1..86accbceb 100644 --- a/app/src/main/java/io/legado/app/service/help/Download.kt +++ b/app/src/main/java/io/legado/app/service/help/Download.kt @@ -2,14 +2,14 @@ package io.legado.app.service.help import android.content.Context import android.content.Intent -import io.legado.app.constant.Action +import io.legado.app.constant.IntentAction import io.legado.app.service.DownloadService object Download { fun start(context: Context, bookUrl: String, start: Int, end: Int) { Intent(context, DownloadService::class.java).let { - it.action = Action.start + it.action = IntentAction.start it.putExtra("bookUrl", bookUrl) it.putExtra("start", start) it.putExtra("end", end) diff --git a/app/src/main/java/io/legado/app/service/help/ReadAloud.kt b/app/src/main/java/io/legado/app/service/help/ReadAloud.kt index 49285eeff..b5c12a965 100644 --- a/app/src/main/java/io/legado/app/service/help/ReadAloud.kt +++ b/app/src/main/java/io/legado/app/service/help/ReadAloud.kt @@ -3,7 +3,7 @@ package io.legado.app.service.help import android.content.Context import android.content.Intent import io.legado.app.App -import io.legado.app.constant.Action +import io.legado.app.constant.IntentAction import io.legado.app.constant.PreferKey import io.legado.app.service.BaseReadAloudService import io.legado.app.service.HttpReadAloudService @@ -30,7 +30,7 @@ object ReadAloud { play: Boolean = true ) { val intent = Intent(context, aloudClass) - intent.action = Action.play + intent.action = IntentAction.play intent.putExtra("title", title) intent.putExtra("subtitle", subtitle) intent.putExtra("pageIndex", pageIndex) @@ -42,7 +42,7 @@ object ReadAloud { fun pause(context: Context) { if (BaseReadAloudService.isRun) { val intent = Intent(context, aloudClass) - intent.action = Action.pause + intent.action = IntentAction.pause context.startService(intent) } } @@ -50,7 +50,7 @@ object ReadAloud { fun resume(context: Context) { if (BaseReadAloudService.isRun) { val intent = Intent(context, aloudClass) - intent.action = Action.resume + intent.action = IntentAction.resume context.startService(intent) } } @@ -58,7 +58,7 @@ object ReadAloud { fun stop(context: Context) { if (BaseReadAloudService.isRun) { val intent = Intent(context, aloudClass) - intent.action = Action.stop + intent.action = IntentAction.stop context.startService(intent) } } @@ -66,7 +66,7 @@ object ReadAloud { fun prevParagraph(context: Context) { if (BaseReadAloudService.isRun) { val intent = Intent(context, aloudClass) - intent.action = Action.prevParagraph + intent.action = IntentAction.prevParagraph context.startService(intent) } } @@ -74,7 +74,7 @@ object ReadAloud { fun nextParagraph(context: Context) { if (BaseReadAloudService.isRun) { val intent = Intent(context, aloudClass) - intent.action = Action.nextParagraph + intent.action = IntentAction.nextParagraph context.startService(intent) } } @@ -82,7 +82,7 @@ object ReadAloud { fun upTtsSpeechRate(context: Context) { if (BaseReadAloudService.isRun) { val intent = Intent(context, aloudClass) - intent.action = Action.upTtsSpeechRate + intent.action = IntentAction.upTtsSpeechRate context.startService(intent) } } @@ -90,7 +90,7 @@ object ReadAloud { fun setTimer(context: Context, minute: Int) { if (BaseReadAloudService.isRun) { val intent = Intent(context, aloudClass) - intent.action = Action.setTimer + intent.action = IntentAction.setTimer intent.putExtra("minute", minute) context.startService(intent) } diff --git a/app/src/main/java/io/legado/app/ui/audio/AudioPlayActivity.kt b/app/src/main/java/io/legado/app/ui/audio/AudioPlayActivity.kt index a348b6e1e..dffd6a50f 100644 --- a/app/src/main/java/io/legado/app/ui/audio/AudioPlayActivity.kt +++ b/app/src/main/java/io/legado/app/ui/audio/AudioPlayActivity.kt @@ -14,7 +14,7 @@ import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions import com.bumptech.glide.request.RequestOptions import io.legado.app.R import io.legado.app.base.VMBaseActivity -import io.legado.app.constant.Bus +import io.legado.app.constant.EventBus import io.legado.app.constant.Status import io.legado.app.constant.Theme import io.legado.app.data.entities.Book @@ -193,12 +193,12 @@ class AudioPlayActivity : } override fun observeLiveBus() { - observeEvent(Bus.MEDIA_BUTTON) { + observeEvent(EventBus.MEDIA_BUTTON) { if (it) { playButton() } } - observeEventSticky(Bus.AUDIO_STATE) { + observeEventSticky(EventBus.AUDIO_STATE) { AudioPlay.status = it if (it == Status.PLAY) { fab_play_stop.setImageResource(R.drawable.ic_pause_24dp) @@ -206,19 +206,19 @@ class AudioPlayActivity : fab_play_stop.setImageResource(R.drawable.ic_play_24dp) } } - observeEventSticky(Bus.AUDIO_SUB_TITLE) { + observeEventSticky(EventBus.AUDIO_SUB_TITLE) { tv_sub_title.text = it } - observeEventSticky(Bus.AUDIO_SIZE) { + observeEventSticky(EventBus.AUDIO_SIZE) { player_progress.max = it tv_all_time.text = DateFormatUtils.format(it.toLong(), "mm:ss") } - observeEventSticky(Bus.AUDIO_PROGRESS) { + observeEventSticky(EventBus.AUDIO_PROGRESS) { AudioPlay.durPageIndex = it if (!adjustProgress) player_progress.progress = it tv_dur_time.text = DateFormatUtils.format(it.toLong(), "mm:ss") } - observeEventSticky(Bus.AUDIO_SPEED) { + observeEventSticky(EventBus.AUDIO_SPEED) { tv_speed.text = String.format("%.1fX", it) tv_speed.visible() } diff --git a/app/src/main/java/io/legado/app/ui/book/read/ReadBookActivity.kt b/app/src/main/java/io/legado/app/ui/book/read/ReadBookActivity.kt index 60057a622..e35a50a9e 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/ReadBookActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/ReadBookActivity.kt @@ -21,7 +21,7 @@ import com.jaredrummler.android.colorpicker.ColorPickerDialogListener import io.legado.app.App import io.legado.app.R import io.legado.app.base.VMBaseActivity -import io.legado.app.constant.Bus +import io.legado.app.constant.EventBus import io.legado.app.constant.PreferKey import io.legado.app.constant.Status import io.legado.app.data.entities.Book @@ -498,12 +498,12 @@ class ReadBookActivity : VMBaseActivity(R.layout.activity_boo when (dialogId) { TEXT_COLOR -> { setTextColor(color) - postEvent(Bus.UP_CONFIG, false) + postEvent(EventBus.UP_CONFIG, false) } BG_COLOR -> { setBg(0, "#${color.hexString}") ReadBookConfig.upBg() - postEvent(Bus.UP_CONFIG, false) + postEvent(EventBus.UP_CONFIG, false) } } } @@ -550,7 +550,7 @@ class ReadBookActivity : VMBaseActivity(R.layout.activity_boo override fun observeLiveBus() { super.observeLiveBus() - observeEvent(Bus.ALOUD_STATE) { + observeEvent(EventBus.ALOUD_STATE) { if (it == Status.STOP || it == Status.PAUSE) { ReadBook.curTextChapter?.let { textChapter -> val page = textChapter.page(ReadBook.durPageIndex) @@ -561,20 +561,20 @@ class ReadBookActivity : VMBaseActivity(R.layout.activity_boo } } } - observeEvent(Bus.TIME_CHANGED) { page_view.upTime() } - observeEvent(Bus.BATTERY_CHANGED) { page_view.upBattery(it) } - observeEvent(Bus.OPEN_CHAPTER) { + observeEvent(EventBus.TIME_CHANGED) { page_view.upTime() } + observeEvent(EventBus.BATTERY_CHANGED) { page_view.upBattery(it) } + observeEvent(EventBus.OPEN_CHAPTER) { viewModel.openChapter(it.index, ReadBook.durPageIndex) page_view.upContent() } - observeEvent(Bus.MEDIA_BUTTON) { + observeEvent(EventBus.MEDIA_BUTTON) { if (it) { onClickReadAloud() } else { ReadBook.readAloud(!BaseReadAloudService.pause) } } - observeEvent(Bus.UP_CONFIG) { + observeEvent(EventBus.UP_CONFIG) { upSystemUiVisibility() content_view.upStyle() page_view.upBg() @@ -585,7 +585,7 @@ class ReadBookActivity : VMBaseActivity(R.layout.activity_boo page_view.upContent() } } - observeEventSticky(Bus.TTS_START) { chapterStart -> + observeEventSticky(EventBus.TTS_START) { chapterStart -> launch(IO) { if (BaseReadAloudService.isPlay()) { ReadBook.curTextChapter?.let { @@ -598,7 +598,7 @@ class ReadBookActivity : VMBaseActivity(R.layout.activity_boo } } } - observeEvent(Bus.REPLACE) { + observeEvent(EventBus.REPLACE) { ReplaceEditDialog().show(supportFragmentManager, "replaceEditDialog") } observeEvent(PreferKey.keepLight) { diff --git a/app/src/main/java/io/legado/app/ui/book/read/config/BgTextConfigDialog.kt b/app/src/main/java/io/legado/app/ui/book/read/config/BgTextConfigDialog.kt index 5d61aefe1..289658f80 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/config/BgTextConfigDialog.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/config/BgTextConfigDialog.kt @@ -20,7 +20,7 @@ import com.jaredrummler.android.colorpicker.ColorPickerDialog import io.legado.app.R import io.legado.app.base.adapter.ItemViewHolder import io.legado.app.base.adapter.SimpleRecyclerAdapter -import io.legado.app.constant.Bus +import io.legado.app.constant.EventBus import io.legado.app.help.ImageLoader import io.legado.app.help.ReadBookConfig import io.legado.app.help.permission.Permissions @@ -154,7 +154,7 @@ class BgTextConfigDialog : DialogFragment() { this.onClick { ReadBookConfig.getConfig().setBg(1, item) ReadBookConfig.upBg() - postEvent(Bus.UP_CONFIG, false) + postEvent(EventBus.UP_CONFIG, false) } } } @@ -178,7 +178,7 @@ class BgTextConfigDialog : DialogFragment() { file.writeBytes(it) ReadBookConfig.getConfig().setBg(2, file.absolutePath) ReadBookConfig.upBg() - postEvent(Bus.UP_CONFIG, false) + postEvent(EventBus.UP_CONFIG, false) } } } else { @@ -192,7 +192,7 @@ class BgTextConfigDialog : DialogFragment() { FileUtils.getPath(requireContext(), uri)?.let { path -> ReadBookConfig.getConfig().setBg(2, path) ReadBookConfig.upBg() - postEvent(Bus.UP_CONFIG, false) + postEvent(EventBus.UP_CONFIG, false) } } .request() diff --git a/app/src/main/java/io/legado/app/ui/book/read/config/MoreConfigDialog.kt b/app/src/main/java/io/legado/app/ui/book/read/config/MoreConfigDialog.kt index e18f32c0b..ecb7df170 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/config/MoreConfigDialog.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/config/MoreConfigDialog.kt @@ -12,7 +12,7 @@ import androidx.fragment.app.DialogFragment import androidx.preference.Preference import androidx.preference.PreferenceFragmentCompat import io.legado.app.R -import io.legado.app.constant.Bus +import io.legado.app.constant.EventBus import io.legado.app.constant.PreferKey import io.legado.app.lib.theme.ATH import io.legado.app.ui.book.read.Help @@ -92,8 +92,8 @@ class MoreConfigDialog : DialogFragment() { key: String? ) { when (key) { - PreferKey.hideStatusBar -> postEvent(Bus.UP_CONFIG, true) - PreferKey.hideNavigationBar -> postEvent(Bus.UP_CONFIG, true) + PreferKey.hideStatusBar -> postEvent(EventBus.UP_CONFIG, true) + PreferKey.hideNavigationBar -> postEvent(EventBus.UP_CONFIG, true) PreferKey.keepLight -> postEvent(PreferKey.keepLight, true) } } diff --git a/app/src/main/java/io/legado/app/ui/book/read/config/PaddingConfigDialog.kt b/app/src/main/java/io/legado/app/ui/book/read/config/PaddingConfigDialog.kt index 19ce7e100..c1a9e5e8f 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/config/PaddingConfigDialog.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/config/PaddingConfigDialog.kt @@ -8,7 +8,7 @@ import android.view.ViewGroup import android.widget.SeekBar import androidx.fragment.app.DialogFragment import io.legado.app.R -import io.legado.app.constant.Bus +import io.legado.app.constant.EventBus import io.legado.app.help.ReadBookConfig import io.legado.app.ui.book.read.Help import io.legado.app.utils.postEvent @@ -61,35 +61,35 @@ class PaddingConfigDialog : DialogFragment() { private fun initView() = with(ReadBookConfig.getConfig()) { iv_padding_top_add.onClick { seek_padding_top.progressAdd(1) - postEvent(Bus.UP_CONFIG, true) + postEvent(EventBus.UP_CONFIG, true) } iv_padding_top_remove.onClick { seek_padding_top.progressAdd(-1) - postEvent(Bus.UP_CONFIG, true) + postEvent(EventBus.UP_CONFIG, true) } iv_padding_bottom_add.onClick { seek_padding_bottom.progressAdd(1) - postEvent(Bus.UP_CONFIG, true) + postEvent(EventBus.UP_CONFIG, true) } iv_padding_bottom_remove.onClick { seek_padding_bottom.progressAdd(-1) - postEvent(Bus.UP_CONFIG, true) + postEvent(EventBus.UP_CONFIG, true) } iv_padding_left_add.onClick { seek_padding_left.progressAdd(1) - postEvent(Bus.UP_CONFIG, true) + postEvent(EventBus.UP_CONFIG, true) } iv_padding_left_remove.onClick { seek_padding_left.progressAdd(-1) - postEvent(Bus.UP_CONFIG, true) + postEvent(EventBus.UP_CONFIG, true) } iv_padding_right_add.onClick { seek_padding_right.progressAdd(1) - postEvent(Bus.UP_CONFIG, true) + postEvent(EventBus.UP_CONFIG, true) } iv_padding_right_remove.onClick { seek_padding_right.progressAdd(-1) - postEvent(Bus.UP_CONFIG, true) + postEvent(EventBus.UP_CONFIG, true) } seek_padding_top.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener { @@ -101,7 +101,7 @@ class PaddingConfigDialog : DialogFragment() { override fun onStartTrackingTouch(seekBar: SeekBar?) = Unit override fun onStopTrackingTouch(seekBar: SeekBar?) { - postEvent(Bus.UP_CONFIG, true) + postEvent(EventBus.UP_CONFIG, true) } }) seek_padding_bottom.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener { @@ -113,7 +113,7 @@ class PaddingConfigDialog : DialogFragment() { override fun onStartTrackingTouch(seekBar: SeekBar?) = Unit override fun onStopTrackingTouch(seekBar: SeekBar?) { - postEvent(Bus.UP_CONFIG, true) + postEvent(EventBus.UP_CONFIG, true) } }) seek_padding_left.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener { @@ -125,7 +125,7 @@ class PaddingConfigDialog : DialogFragment() { override fun onStartTrackingTouch(seekBar: SeekBar?) = Unit override fun onStopTrackingTouch(seekBar: SeekBar?) { - postEvent(Bus.UP_CONFIG, true) + postEvent(EventBus.UP_CONFIG, true) } }) seek_padding_right.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener { @@ -137,7 +137,7 @@ class PaddingConfigDialog : DialogFragment() { override fun onStartTrackingTouch(seekBar: SeekBar?) = Unit override fun onStopTrackingTouch(seekBar: SeekBar?) { - postEvent(Bus.UP_CONFIG, true) + postEvent(EventBus.UP_CONFIG, true) } }) } diff --git a/app/src/main/java/io/legado/app/ui/book/read/config/ReadAloudConfigDialog.kt b/app/src/main/java/io/legado/app/ui/book/read/config/ReadAloudConfigDialog.kt index 14f5c0b9b..0cc2a1336 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/config/ReadAloudConfigDialog.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/config/ReadAloudConfigDialog.kt @@ -12,7 +12,7 @@ import androidx.preference.ListPreference import androidx.preference.Preference import androidx.preference.PreferenceFragmentCompat import io.legado.app.R -import io.legado.app.constant.Bus +import io.legado.app.constant.EventBus import io.legado.app.constant.PreferKey import io.legado.app.lib.theme.ATH import io.legado.app.service.BaseReadAloudService @@ -89,7 +89,7 @@ class ReadAloudConfigDialog : DialogFragment() { when (key) { PreferKey.readAloudByPage -> { if (BaseReadAloudService.isRun) { - postEvent(Bus.MEDIA_BUTTON, false) + postEvent(EventBus.MEDIA_BUTTON, false) } } PreferKey.readAloudOnLine -> { diff --git a/app/src/main/java/io/legado/app/ui/book/read/config/ReadAloudDialog.kt b/app/src/main/java/io/legado/app/ui/book/read/config/ReadAloudDialog.kt index f464d99b2..deeef204b 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/config/ReadAloudDialog.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/config/ReadAloudDialog.kt @@ -9,7 +9,7 @@ import android.view.ViewGroup import android.widget.SeekBar import androidx.fragment.app.DialogFragment import io.legado.app.R -import io.legado.app.constant.Bus +import io.legado.app.constant.EventBus import io.legado.app.service.BaseReadAloudService import io.legado.app.service.help.ReadAloud import io.legado.app.service.help.ReadBook @@ -57,8 +57,8 @@ class ReadAloudDialog : DialogFragment() { } private fun initData() { - observeEvent(Bus.ALOUD_STATE) { upPlayState() } - observeEvent(Bus.TTS_DS) { seek_timer.progress = it } + observeEvent(EventBus.ALOUD_STATE) { upPlayState() } + observeEvent(EventBus.TTS_DS) { seek_timer.progress = it } upPlayState() seek_timer.progress = BaseReadAloudService.timeMinute tv_timer.text = diff --git a/app/src/main/java/io/legado/app/ui/book/read/config/ReadStyleDialog.kt b/app/src/main/java/io/legado/app/ui/book/read/config/ReadStyleDialog.kt index 8a1327a85..10d3d3433 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/config/ReadStyleDialog.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/config/ReadStyleDialog.kt @@ -10,7 +10,7 @@ import android.widget.SeekBar import androidx.core.view.get import androidx.fragment.app.DialogFragment import io.legado.app.R -import io.legado.app.constant.Bus +import io.legado.app.constant.EventBus import io.legado.app.constant.PreferKey import io.legado.app.help.ImageLoader import io.legado.app.help.ReadBookConfig @@ -83,7 +83,7 @@ class ReadStyleDialog : DialogFragment(), FontSelectDialog.CallBack { textBold = !textBold tv_text_bold.isSelected = textBold } - postEvent(Bus.UP_CONFIG, false) + postEvent(EventBus.UP_CONFIG, false) } tv_text_font.onClick { FontSelectDialog().show(childFragmentManager, "fontSelectDialog") @@ -94,7 +94,7 @@ class ReadStyleDialog : DialogFragment(), FontSelectDialog.CallBack { items = resources.getStringArray(R.array.indent).toList() ) { _, index -> putPrefInt("textIndent", index) - postEvent(Bus.UP_CONFIG, true) + postEvent(EventBus.UP_CONFIG, true) } } tv_padding.onClick { @@ -112,16 +112,16 @@ class ReadStyleDialog : DialogFragment(), FontSelectDialog.CallBack { override fun onStartTrackingTouch(seekBar: SeekBar?) = Unit override fun onStopTrackingTouch(seekBar: SeekBar?) { - postEvent(Bus.UP_CONFIG, true) + postEvent(EventBus.UP_CONFIG, true) } }) iv_text_size_add.onClick { seek_text_size.progressAdd(1) - postEvent(Bus.UP_CONFIG, true) + postEvent(EventBus.UP_CONFIG, true) } iv_text_size_remove.onClick { seek_text_size.progressAdd(-1) - postEvent(Bus.UP_CONFIG, true) + postEvent(EventBus.UP_CONFIG, true) } seek_text_letter_spacing.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener { @@ -134,16 +134,16 @@ class ReadStyleDialog : DialogFragment(), FontSelectDialog.CallBack { override fun onStartTrackingTouch(seekBar: SeekBar?) = Unit override fun onStopTrackingTouch(seekBar: SeekBar?) { - postEvent(Bus.UP_CONFIG, true) + postEvent(EventBus.UP_CONFIG, true) } }) iv_text_letter_spacing_add.onClick { seek_text_letter_spacing.progressAdd(1) - postEvent(Bus.UP_CONFIG, true) + postEvent(EventBus.UP_CONFIG, true) } iv_text_letter_spacing_remove.onClick { seek_text_letter_spacing.progressAdd(-1) - postEvent(Bus.UP_CONFIG, true) + postEvent(EventBus.UP_CONFIG, true) } seek_line_size.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener { @@ -156,16 +156,16 @@ class ReadStyleDialog : DialogFragment(), FontSelectDialog.CallBack { override fun onStartTrackingTouch(seekBar: SeekBar?) = Unit override fun onStopTrackingTouch(seekBar: SeekBar?) { - postEvent(Bus.UP_CONFIG, true) + postEvent(EventBus.UP_CONFIG, true) } }) iv_line_size_add.onClick { seek_line_size.progressAdd(1) - postEvent(Bus.UP_CONFIG, true) + postEvent(EventBus.UP_CONFIG, true) } iv_line_size_remove.onClick { seek_line_size.progressAdd(-1) - postEvent(Bus.UP_CONFIG, true) + postEvent(EventBus.UP_CONFIG, true) } rg_page_anim.onCheckedChange { _, checkedId -> for (i in 0 until rg_page_anim.childCount) { @@ -197,7 +197,7 @@ class ReadStyleDialog : DialogFragment(), FontSelectDialog.CallBack { ReadBookConfig.upBg() upStyle() upBg() - postEvent(Bus.UP_CONFIG, true) + postEvent(EventBus.UP_CONFIG, true) } } @@ -266,6 +266,6 @@ class ReadStyleDialog : DialogFragment(), FontSelectDialog.CallBack { override fun selectFile(path: String) { requireContext().putPrefString(PreferKey.readBookFont, path) - postEvent(Bus.UP_CONFIG, true) + postEvent(EventBus.UP_CONFIG, true) } } \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/ui/book/read/page/ContentSelectActionCallback.kt b/app/src/main/java/io/legado/app/ui/book/read/page/ContentSelectActionCallback.kt index cfce5f27b..f274b2744 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/page/ContentSelectActionCallback.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/page/ContentSelectActionCallback.kt @@ -6,7 +6,7 @@ import android.view.MenuItem import android.widget.TextView import io.legado.app.R -import io.legado.app.constant.Bus +import io.legado.app.constant.EventBus import io.legado.app.utils.postEvent class ContentSelectActionCallback(private val textView: TextView) : ActionMode.Callback { @@ -15,7 +15,7 @@ class ContentSelectActionCallback(private val textView: TextView) : ActionMode.C when (item?.itemId) { R.id.menu_replace -> { val text = textView.text.substring(textView.selectionStart, textView.selectionEnd) - postEvent(Bus.REPLACE, text) + postEvent(EventBus.REPLACE, text) mode?.finish() return true } diff --git a/app/src/main/java/io/legado/app/ui/config/OtherConfigFragment.kt b/app/src/main/java/io/legado/app/ui/config/OtherConfigFragment.kt index ccfc88116..8f3a7e244 100644 --- a/app/src/main/java/io/legado/app/ui/config/OtherConfigFragment.kt +++ b/app/src/main/java/io/legado/app/ui/config/OtherConfigFragment.kt @@ -12,7 +12,7 @@ import androidx.preference.Preference import androidx.preference.PreferenceFragmentCompat import io.legado.app.App import io.legado.app.R -import io.legado.app.constant.Bus +import io.legado.app.constant.EventBus import io.legado.app.constant.PreferKey import io.legado.app.help.AppConfig import io.legado.app.help.BookHelp @@ -90,7 +90,7 @@ class OtherConfigFragment : PreferenceFragmentCompat(), PreferKey.processText -> sharedPreferences?.let { setProcessTextEnable(it.getBoolean("process_text", true)) } - PreferKey.showRss -> postEvent(Bus.SHOW_RSS, "unused") + PreferKey.showRss -> postEvent(EventBus.SHOW_RSS, "unused") } } diff --git a/app/src/main/java/io/legado/app/ui/config/ThemeConfigFragment.kt b/app/src/main/java/io/legado/app/ui/config/ThemeConfigFragment.kt index 2ee2f6621..856e6cbb3 100644 --- a/app/src/main/java/io/legado/app/ui/config/ThemeConfigFragment.kt +++ b/app/src/main/java/io/legado/app/ui/config/ThemeConfigFragment.kt @@ -9,7 +9,7 @@ import androidx.preference.Preference import androidx.preference.PreferenceFragmentCompat import io.legado.app.App import io.legado.app.R -import io.legado.app.constant.Bus +import io.legado.app.constant.EventBus import io.legado.app.help.AppConfig import io.legado.app.lib.dialogs.alert import io.legado.app.lib.dialogs.noButton @@ -180,7 +180,7 @@ class ThemeConfigFragment : PreferenceFragmentCompat(), SharedPreferences.OnShar } private fun recreateActivities() { - postEvent(Bus.RECREATE, "") + postEvent(EventBus.RECREATE, "") Handler().postDelayed({ activity?.recreate() }, 100L) } diff --git a/app/src/main/java/io/legado/app/ui/download/DownloadActivity.kt b/app/src/main/java/io/legado/app/ui/download/DownloadActivity.kt index a2ff5d99e..dfa5f5b3d 100644 --- a/app/src/main/java/io/legado/app/ui/download/DownloadActivity.kt +++ b/app/src/main/java/io/legado/app/ui/download/DownloadActivity.kt @@ -9,7 +9,7 @@ import androidx.recyclerview.widget.LinearLayoutManager import io.legado.app.App import io.legado.app.R import io.legado.app.base.BaseActivity -import io.legado.app.constant.Bus +import io.legado.app.constant.EventBus import io.legado.app.data.entities.Book import io.legado.app.service.help.Download import io.legado.app.utils.applyTint @@ -67,7 +67,7 @@ class DownloadActivity : BaseActivity(R.layout.activity_download) { } override fun observeLiveBus() { - observeEvent(Bus.UP_DOWNLOAD) { + observeEvent(EventBus.UP_DOWNLOAD) { if (it) { menu?.findItem(R.id.menu_download)?.setIcon(R.drawable.ic_stop_black_24dp) menu?.applyTint(this) diff --git a/app/src/main/java/io/legado/app/ui/main/MainActivity.kt b/app/src/main/java/io/legado/app/ui/main/MainActivity.kt index 5d9fee452..9fda82311 100644 --- a/app/src/main/java/io/legado/app/ui/main/MainActivity.kt +++ b/app/src/main/java/io/legado/app/ui/main/MainActivity.kt @@ -14,7 +14,7 @@ import io.legado.app.App import io.legado.app.BuildConfig import io.legado.app.R import io.legado.app.base.VMBaseActivity -import io.legado.app.constant.Bus +import io.legado.app.constant.EventBus import io.legado.app.constant.PreferKey import io.legado.app.help.AppConfig import io.legado.app.help.coroutine.Coroutine @@ -144,10 +144,10 @@ class MainActivity : VMBaseActivity(R.layout.activity_main), } override fun observeLiveBus() { - observeEvent(Bus.RECREATE) { + observeEvent(EventBus.RECREATE) { recreate() } - observeEvent(Bus.SHOW_RSS) { + observeEvent(EventBus.SHOW_RSS) { bottom_navigation_view.menu.findItem(R.id.menu_rss).isVisible = AppConfig.isShowRSS upFragmentList() view_pager_main.adapter?.notifyDataSetChanged() diff --git a/app/src/main/java/io/legado/app/ui/main/MainViewModel.kt b/app/src/main/java/io/legado/app/ui/main/MainViewModel.kt index 960f860c1..6af83db54 100644 --- a/app/src/main/java/io/legado/app/ui/main/MainViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/main/MainViewModel.kt @@ -3,7 +3,7 @@ package io.legado.app.ui.main import android.app.Application import io.legado.app.App import io.legado.app.base.BaseViewModel -import io.legado.app.constant.Bus +import io.legado.app.constant.EventBus import io.legado.app.data.entities.RssSource import io.legado.app.help.http.HttpHelper import io.legado.app.help.storage.Restore @@ -24,14 +24,14 @@ class MainViewModel(application: Application) : BaseViewModel(application) { App.db.bookSourceDao().getBookSource(book.origin)?.let { bookSource -> synchronized(this) { updateList.add(book.bookUrl) - postEvent(Bus.UP_BOOK, book.bookUrl) + postEvent(EventBus.UP_BOOK, book.bookUrl) } WebBook(bookSource).getChapterList(book) .timeout(300000) .onSuccess(IO) { synchronized(this) { updateList.remove(book.bookUrl) - postEvent(Bus.UP_BOOK, book.bookUrl) + postEvent(EventBus.UP_BOOK, book.bookUrl) } it?.let { App.db.bookDao().update(book) @@ -42,7 +42,7 @@ class MainViewModel(application: Application) : BaseViewModel(application) { .onError { synchronized(this) { updateList.remove(book.bookUrl) - postEvent(Bus.UP_BOOK, book.bookUrl) + postEvent(EventBus.UP_BOOK, book.bookUrl) } it.printStackTrace() } diff --git a/app/src/main/java/io/legado/app/ui/main/bookshelf/BookshelfFragment.kt b/app/src/main/java/io/legado/app/ui/main/bookshelf/BookshelfFragment.kt index 237e73567..a5fbb8bd5 100644 --- a/app/src/main/java/io/legado/app/ui/main/bookshelf/BookshelfFragment.kt +++ b/app/src/main/java/io/legado/app/ui/main/bookshelf/BookshelfFragment.kt @@ -14,7 +14,7 @@ import io.legado.app.App import io.legado.app.R import io.legado.app.base.VMBaseFragment import io.legado.app.constant.AppConst -import io.legado.app.constant.Bus +import io.legado.app.constant.EventBus import io.legado.app.constant.PreferKey import io.legado.app.data.entities.BookGroup import io.legado.app.lib.dialogs.* @@ -87,7 +87,7 @@ class BookshelfFragment : VMBaseFragment(R.layout.fragment_b TabLayoutMediator(tab_layout, view_pager_bookshelf) { tab, position -> tab.text = bookGroups[position].groupName }.attach() - observeEvent(Bus.UP_TABS) { + observeEvent(EventBus.UP_TABS) { tab_layout.getTabAt(it)?.select() } } diff --git a/app/src/main/java/io/legado/app/ui/main/bookshelf/books/BooksFragment.kt b/app/src/main/java/io/legado/app/ui/main/bookshelf/books/BooksFragment.kt index 2b92d361b..d7ffd7a34 100644 --- a/app/src/main/java/io/legado/app/ui/main/bookshelf/books/BooksFragment.kt +++ b/app/src/main/java/io/legado/app/ui/main/bookshelf/books/BooksFragment.kt @@ -11,7 +11,7 @@ import io.legado.app.App import io.legado.app.R import io.legado.app.base.BaseFragment import io.legado.app.constant.BookType -import io.legado.app.constant.Bus +import io.legado.app.constant.EventBus import io.legado.app.constant.PreferKey import io.legado.app.data.entities.Book import io.legado.app.help.IntentDataHelp @@ -56,7 +56,7 @@ class BooksFragment : BaseFragment(R.layout.fragment_books), } initRecyclerView() upRecyclerData() - observeEvent(Bus.UP_BOOK) { + observeEvent(EventBus.UP_BOOK) { booksAdapter.notification(it) } } diff --git a/app/src/main/java/io/legado/app/ui/main/my/MyFragment.kt b/app/src/main/java/io/legado/app/ui/main/my/MyFragment.kt index 2c515dbb7..035ca4d26 100644 --- a/app/src/main/java/io/legado/app/ui/main/my/MyFragment.kt +++ b/app/src/main/java/io/legado/app/ui/main/my/MyFragment.kt @@ -14,7 +14,7 @@ import androidx.preference.PreferenceFragmentCompat import io.legado.app.App import io.legado.app.R import io.legado.app.base.BaseFragment -import io.legado.app.constant.Bus +import io.legado.app.constant.EventBus import io.legado.app.constant.PreferKey import io.legado.app.help.BookHelp import io.legado.app.help.permission.Permissions @@ -182,7 +182,7 @@ class MyFragment : BaseFragment(R.layout.fragment_my_config) { } addPreferencesFromResource(R.xml.pref_main) val webServicePre = findPreference(PreferKey.webService) - observeEvent(Bus.WEB_SERVICE_STOP) { + observeEvent(EventBus.WEB_SERVICE_STOP) { webServicePre?.isChecked = false } } From 5999e210433ff9b88d6038371e986546024ed85e Mon Sep 17 00:00:00 2001 From: kunfei Date: Wed, 5 Feb 2020 18:41:54 +0800 Subject: [PATCH 118/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../legado/app/service/CheckSourceService.kt | 38 ++++++------------- .../io/legado/app/service/help/CheckSource.kt | 24 ++++++++++++ .../book/source/manage/BookSourceActivity.kt | 6 +-- 3 files changed, 38 insertions(+), 30 deletions(-) create mode 100644 app/src/main/java/io/legado/app/service/help/CheckSource.kt diff --git a/app/src/main/java/io/legado/app/service/CheckSourceService.kt b/app/src/main/java/io/legado/app/service/CheckSourceService.kt index 6507cb219..549d7fee2 100644 --- a/app/src/main/java/io/legado/app/service/CheckSourceService.kt +++ b/app/src/main/java/io/legado/app/service/CheckSourceService.kt @@ -1,13 +1,11 @@ package io.legado.app.service -import android.content.Context import android.content.Intent import androidx.core.app.NotificationCompat import io.legado.app.R import io.legado.app.base.BaseService -import io.legado.app.constant.IntentAction import io.legado.app.constant.AppConst -import io.legado.app.data.entities.BookSource +import io.legado.app.constant.IntentAction import io.legado.app.help.AppConfig import io.legado.app.help.IntentHelp import io.legado.app.ui.book.source.manage.BookSourceActivity @@ -15,27 +13,10 @@ import kotlinx.coroutines.asCoroutineDispatcher import java.util.concurrent.Executors class CheckSourceService : BaseService() { - - companion object{ - fun start(context: Context, selectedIds: Array) { - Intent(context, CheckSourceService::class.java).let { - it.action = IntentAction.start - it.putExtra("selectIds", selectedIds) - context.startService(it) - } - } - - fun stop(context: Context) { - Intent(context, CheckSourceService::class.java).let { - it.action = IntentAction.stop - context.startService(it) - } - } - } - private var searchPool = Executors.newFixedThreadPool(AppConfig.threadCount).asCoroutineDispatcher() - private var sourceList: List? = null + private val allIds = LinkedHashSet() + private val unCheckIds = LinkedHashSet() override fun onCreate() { super.onCreate() @@ -44,7 +25,8 @@ class CheckSourceService : BaseService() { override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { when (intent?.action) { - IntentAction.start -> { + IntentAction.start -> intent.getStringArrayListExtra("selectIds")?.let { + check(it) } else -> stopSelf() } @@ -56,6 +38,12 @@ class CheckSourceService : BaseService() { searchPool.close() } + private fun check(ids: List) { + allIds.addAll(ids) + unCheckIds.addAll(ids) + + } + /** * 更新通知 */ @@ -73,9 +61,7 @@ class CheckSourceService : BaseService() { getString(R.string.cancel), IntentHelp.servicePendingIntent(this, IntentAction.stop) ) - sourceList?.let { - builder.setProgress(it.size, state, false) - } + builder.setProgress(allIds.size, state, false) builder.setVisibility(NotificationCompat.VISIBILITY_PUBLIC) val notification = builder.build() startForeground(112202, notification) diff --git a/app/src/main/java/io/legado/app/service/help/CheckSource.kt b/app/src/main/java/io/legado/app/service/help/CheckSource.kt new file mode 100644 index 000000000..47aa593f9 --- /dev/null +++ b/app/src/main/java/io/legado/app/service/help/CheckSource.kt @@ -0,0 +1,24 @@ +package io.legado.app.service.help + +import android.content.Context +import android.content.Intent +import io.legado.app.constant.IntentAction +import io.legado.app.service.CheckSourceService + +object CheckSource { + + fun start(context: Context, selectedIds: ArrayList) { + Intent(context, CheckSourceService::class.java).let { + it.action = IntentAction.start + it.putExtra("selectIds", selectedIds) + context.startService(it) + } + } + + fun stop(context: Context) { + Intent(context, CheckSourceService::class.java).let { + it.action = IntentAction.stop + context.startService(it) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/ui/book/source/manage/BookSourceActivity.kt b/app/src/main/java/io/legado/app/ui/book/source/manage/BookSourceActivity.kt index 52b433a32..82d823a0a 100644 --- a/app/src/main/java/io/legado/app/ui/book/source/manage/BookSourceActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/source/manage/BookSourceActivity.kt @@ -30,7 +30,7 @@ import io.legado.app.lib.dialogs.okButton import io.legado.app.lib.theme.ATH import io.legado.app.lib.theme.primaryTextColor import io.legado.app.lib.theme.view.ATEAutoCompleteTextView -import io.legado.app.service.CheckSourceService +import io.legado.app.service.help.CheckSource import io.legado.app.ui.book.source.edit.BookSourceEditActivity import io.legado.app.ui.filechooser.FileChooserDialog import io.legado.app.ui.qrcode.QrCodeActivity @@ -40,7 +40,6 @@ import kotlinx.android.synthetic.main.dialog_edit_text.view.* import kotlinx.android.synthetic.main.view_search.* import org.jetbrains.anko.startActivity import org.jetbrains.anko.startActivityForResult -import org.jetbrains.anko.startService import org.jetbrains.anko.toast import java.io.FileNotFoundException @@ -94,8 +93,7 @@ class BookSourceActivity : VMBaseActivity(R.layout.activity R.id.menu_disable_explore -> viewModel.disableSelectExplore(adapter.getSelectionIds()) R.id.menu_del_selection -> viewModel.delSelection(adapter.getSelectionIds()) R.id.menu_export_selection -> viewModel.exportSelection(adapter.getSelectionIds()) - R.id.menu_check_source -> - startService(Pair("data", adapter.getSelectionIds())) + R.id.menu_check_source -> CheckSource.start(this, ArrayList(adapter.getSelectionIds())) R.id.menu_import_source_onLine -> showImportDialog() } if (item.groupId == R.id.source_group) { From a286831fd17736839d489769fe0049c5fb353113 Mon Sep 17 00:00:00 2001 From: kunfei Date: Wed, 5 Feb 2020 19:58:15 +0800 Subject: [PATCH 119/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/io/legado/app/base/BaseService.kt | 12 ++++++- .../io/legado/app/data/entities/BookSource.kt | 10 ++++++ .../legado/app/service/CheckSourceService.kt | 31 +++++++++++++++++++ .../io/legado/app/service/help/CheckSource.kt | 5 +++ app/src/main/res/values/strings.xml | 1 + 5 files changed, 58 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/io/legado/app/base/BaseService.kt b/app/src/main/java/io/legado/app/base/BaseService.kt index c67acb95c..163ac09ec 100644 --- a/app/src/main/java/io/legado/app/base/BaseService.kt +++ b/app/src/main/java/io/legado/app/base/BaseService.kt @@ -3,17 +3,27 @@ package io.legado.app.base import android.app.Service import android.content.Intent import android.os.IBinder +import io.legado.app.help.coroutine.Coroutine import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.MainScope import kotlinx.coroutines.cancel +import kotlin.coroutines.CoroutineContext abstract class BaseService : Service(), CoroutineScope by MainScope() { + fun execute( + scope: CoroutineScope = this, + context: CoroutineContext = Dispatchers.IO, + block: suspend CoroutineScope.() -> T + ): Coroutine { + return Coroutine.async(scope, context) { block() } + } + override fun onBind(intent: Intent?): IBinder? { return null } - override fun onDestroy() { super.onDestroy() cancel() diff --git a/app/src/main/java/io/legado/app/data/entities/BookSource.kt b/app/src/main/java/io/legado/app/data/entities/BookSource.kt index 39b569565..bab3a7b5e 100644 --- a/app/src/main/java/io/legado/app/data/entities/BookSource.kt +++ b/app/src/main/java/io/legado/app/data/entities/BookSource.kt @@ -126,6 +126,16 @@ data class BookSource( return contentRuleV!! } + fun addGroup(group: String) { + bookSourceGroup?.let { + if (!it.contains(group)) { + bookSourceGroup = "$it;$group" + } + } ?: let { + bookSourceGroup = group + } + } + fun getExploreKinds(): ArrayList? { val exploreKinds = arrayListOf() exploreUrl?.let { diff --git a/app/src/main/java/io/legado/app/service/CheckSourceService.kt b/app/src/main/java/io/legado/app/service/CheckSourceService.kt index 549d7fee2..bf4a268a8 100644 --- a/app/src/main/java/io/legado/app/service/CheckSourceService.kt +++ b/app/src/main/java/io/legado/app/service/CheckSourceService.kt @@ -2,19 +2,24 @@ package io.legado.app.service import android.content.Intent import androidx.core.app.NotificationCompat +import io.legado.app.App import io.legado.app.R import io.legado.app.base.BaseService import io.legado.app.constant.AppConst import io.legado.app.constant.IntentAction import io.legado.app.help.AppConfig import io.legado.app.help.IntentHelp +import io.legado.app.help.coroutine.Coroutine +import io.legado.app.model.WebBook import io.legado.app.ui.book.source.manage.BookSourceActivity +import kotlinx.coroutines.Dispatchers.IO import kotlinx.coroutines.asCoroutineDispatcher import java.util.concurrent.Executors class CheckSourceService : BaseService() { private var searchPool = Executors.newFixedThreadPool(AppConfig.threadCount).asCoroutineDispatcher() + private var task: Coroutine<*>? = null private val allIds = LinkedHashSet() private val unCheckIds = LinkedHashSet() @@ -35,13 +40,39 @@ class CheckSourceService : BaseService() { override fun onDestroy() { super.onDestroy() + task?.cancel() searchPool.close() } private fun check(ids: List) { + task?.cancel() + allIds.clear() + unCheckIds.clear() allIds.addAll(ids) unCheckIds.addAll(ids) + task = execute { + unCheckIds.forEach { sourceUrl -> + App.db.bookSourceDao().getBookSource(sourceUrl)?.let { source -> + val webBook = WebBook(source) + webBook.searchBook("我的", scope = this, context = searchPool) + .onError(IO) { + source.addGroup("失效") + App.db.bookSourceDao().update(source) + }.onFinally { + unCheckIds.remove(sourceUrl) + val checkedCount = allIds.size - unCheckIds.size + updateNotification( + checkedCount, + getString(R.string.progress_show, checkedCount, unCheckIds.size) + ) + } + } + } + } + task?.invokeOnCompletion { + stopSelf() + } } /** diff --git a/app/src/main/java/io/legado/app/service/help/CheckSource.kt b/app/src/main/java/io/legado/app/service/help/CheckSource.kt index 47aa593f9..11e140b10 100644 --- a/app/src/main/java/io/legado/app/service/help/CheckSource.kt +++ b/app/src/main/java/io/legado/app/service/help/CheckSource.kt @@ -2,12 +2,17 @@ package io.legado.app.service.help import android.content.Context import android.content.Intent +import io.legado.app.R import io.legado.app.constant.IntentAction import io.legado.app.service.CheckSourceService +import org.jetbrains.anko.toast object CheckSource { fun start(context: Context, selectedIds: ArrayList) { + if (selectedIds.isEmpty()) { + context.toast(R.string.non_select) + } Intent(context, CheckSourceService::class.java).let { it.action = IntentAction.start it.putExtra("selectIds", selectedIds) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 8b283bb42..ee33406df 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -252,6 +252,7 @@ 文字颜色和背景(长按自定义) 沉浸式状态栏 还剩%d章未下载 + 没有选择 长按输入颜色值 加载中… 追更区 From 3a2fe8f8e4a614f8c82ffa99202e0e51a5f872d4 Mon Sep 17 00:00:00 2001 From: kunfei Date: Wed, 5 Feb 2020 20:05:19 +0800 Subject: [PATCH 120/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/io/legado/app/service/CheckSourceService.kt | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/io/legado/app/service/CheckSourceService.kt b/app/src/main/java/io/legado/app/service/CheckSourceService.kt index bf4a268a8..19d19ca0f 100644 --- a/app/src/main/java/io/legado/app/service/CheckSourceService.kt +++ b/app/src/main/java/io/legado/app/service/CheckSourceService.kt @@ -20,7 +20,7 @@ class CheckSourceService : BaseService() { private var searchPool = Executors.newFixedThreadPool(AppConfig.threadCount).asCoroutineDispatcher() private var task: Coroutine<*>? = null - private val allIds = LinkedHashSet() + private var idsCount = 0 private val unCheckIds = LinkedHashSet() override fun onCreate() { @@ -46,9 +46,8 @@ class CheckSourceService : BaseService() { private fun check(ids: List) { task?.cancel() - allIds.clear() unCheckIds.clear() - allIds.addAll(ids) + idsCount = ids.size unCheckIds.addAll(ids) task = execute { unCheckIds.forEach { sourceUrl -> @@ -60,10 +59,10 @@ class CheckSourceService : BaseService() { App.db.bookSourceDao().update(source) }.onFinally { unCheckIds.remove(sourceUrl) - val checkedCount = allIds.size - unCheckIds.size + val checkedCount = idsCount - unCheckIds.size updateNotification( checkedCount, - getString(R.string.progress_show, checkedCount, unCheckIds.size) + getString(R.string.progress_show, checkedCount, idsCount) ) } } @@ -92,7 +91,7 @@ class CheckSourceService : BaseService() { getString(R.string.cancel), IntentHelp.servicePendingIntent(this, IntentAction.stop) ) - builder.setProgress(allIds.size, state, false) + builder.setProgress(idsCount, state, false) builder.setVisibility(NotificationCompat.VISIBILITY_PUBLIC) val notification = builder.build() startForeground(112202, notification) From 4a79d959b05917ce8e08e40f64366a06732dc38a Mon Sep 17 00:00:00 2001 From: kunfei Date: Wed, 5 Feb 2020 20:11:25 +0800 Subject: [PATCH 121/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/io/legado/app/service/help/CheckSource.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/java/io/legado/app/service/help/CheckSource.kt b/app/src/main/java/io/legado/app/service/help/CheckSource.kt index 11e140b10..057813337 100644 --- a/app/src/main/java/io/legado/app/service/help/CheckSource.kt +++ b/app/src/main/java/io/legado/app/service/help/CheckSource.kt @@ -12,6 +12,7 @@ object CheckSource { fun start(context: Context, selectedIds: ArrayList) { if (selectedIds.isEmpty()) { context.toast(R.string.non_select) + return } Intent(context, CheckSourceService::class.java).let { it.action = IntentAction.start From 83f3e0e0511b8914d08cfdb32f55222b0d08838d Mon Sep 17 00:00:00 2001 From: kunfei Date: Wed, 5 Feb 2020 20:30:02 +0800 Subject: [PATCH 122/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/io/legado/app/service/CheckSourceService.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/java/io/legado/app/service/CheckSourceService.kt b/app/src/main/java/io/legado/app/service/CheckSourceService.kt index 19d19ca0f..9d7d9dcc5 100644 --- a/app/src/main/java/io/legado/app/service/CheckSourceService.kt +++ b/app/src/main/java/io/legado/app/service/CheckSourceService.kt @@ -49,6 +49,7 @@ class CheckSourceService : BaseService() { unCheckIds.clear() idsCount = ids.size unCheckIds.addAll(ids) + updateNotification(0, getString(R.string.start)) task = execute { unCheckIds.forEach { sourceUrl -> App.db.bookSourceDao().getBookSource(sourceUrl)?.let { source -> From baa8b952006a8df6a773db661e6309b93daefed9 Mon Sep 17 00:00:00 2001 From: kunfei Date: Wed, 5 Feb 2020 20:30:55 +0800 Subject: [PATCH 123/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/io/legado/app/service/CheckSourceService.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/io/legado/app/service/CheckSourceService.kt b/app/src/main/java/io/legado/app/service/CheckSourceService.kt index 9d7d9dcc5..18f704a6e 100644 --- a/app/src/main/java/io/legado/app/service/CheckSourceService.kt +++ b/app/src/main/java/io/legado/app/service/CheckSourceService.kt @@ -49,7 +49,7 @@ class CheckSourceService : BaseService() { unCheckIds.clear() idsCount = ids.size unCheckIds.addAll(ids) - updateNotification(0, getString(R.string.start)) + updateNotification(0, getString(R.string.progress_show, 0, idsCount)) task = execute { unCheckIds.forEach { sourceUrl -> App.db.bookSourceDao().getBookSource(sourceUrl)?.let { source -> From db4f300064f287ad3e301d8b6b9fd5c1c251a81d Mon Sep 17 00:00:00 2001 From: kunfei Date: Wed, 5 Feb 2020 20:59:59 +0800 Subject: [PATCH 124/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/AndroidManifest.xml | 1 + app/src/main/java/io/legado/app/ui/README.md | 1 + .../ui/book/arrange/ArrangeBookActivity.kt | 23 +++++++++++++++++++ .../ui/book/arrange/ArrangeBookViewModel.kt | 9 ++++++++ .../main/res/layout/activity_arrange_book.xml | 7 ++++++ 5 files changed, 41 insertions(+) create mode 100644 app/src/main/java/io/legado/app/ui/book/arrange/ArrangeBookActivity.kt create mode 100644 app/src/main/java/io/legado/app/ui/book/arrange/ArrangeBookViewModel.kt create mode 100644 app/src/main/res/layout/activity_arrange_book.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 4be71d133..0f1381bf6 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -78,6 +78,7 @@ + diff --git a/app/src/main/java/io/legado/app/ui/README.md b/app/src/main/java/io/legado/app/ui/README.md index 9809241ec..a8bf2b216 100644 --- a/app/src/main/java/io/legado/app/ui/README.md +++ b/app/src/main/java/io/legado/app/ui/README.md @@ -2,6 +2,7 @@ * about 关于界面 * audio 音频播放界面 +* book\arrange 书架整理界面 * book\info 书籍信息查看 * book\read 书籍阅读界面 * book\search 搜索书籍界面 diff --git a/app/src/main/java/io/legado/app/ui/book/arrange/ArrangeBookActivity.kt b/app/src/main/java/io/legado/app/ui/book/arrange/ArrangeBookActivity.kt new file mode 100644 index 000000000..1e5cedde4 --- /dev/null +++ b/app/src/main/java/io/legado/app/ui/book/arrange/ArrangeBookActivity.kt @@ -0,0 +1,23 @@ +package io.legado.app.ui.book.arrange + +import android.os.Bundle +import androidx.lifecycle.LiveData +import io.legado.app.R +import io.legado.app.base.VMBaseActivity +import io.legado.app.data.entities.Book +import io.legado.app.utils.getViewModel + + +class ArrangeBookActivity : VMBaseActivity(R.layout.activity_arrange_book) { + override val viewModel: ArrangeBookViewModel + get() = getViewModel(ArrangeBookViewModel::class.java) + + private var booksLiveData: LiveData? = null + + override fun onActivityCreated(savedInstanceState: Bundle?) { + + + } + + +} \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/ui/book/arrange/ArrangeBookViewModel.kt b/app/src/main/java/io/legado/app/ui/book/arrange/ArrangeBookViewModel.kt new file mode 100644 index 000000000..a6fa9463f --- /dev/null +++ b/app/src/main/java/io/legado/app/ui/book/arrange/ArrangeBookViewModel.kt @@ -0,0 +1,9 @@ +package io.legado.app.ui.book.arrange + +import android.app.Application +import io.legado.app.base.BaseViewModel + + +class ArrangeBookViewModel(application: Application) : BaseViewModel(application) { + +} \ No newline at end of file diff --git a/app/src/main/res/layout/activity_arrange_book.xml b/app/src/main/res/layout/activity_arrange_book.xml new file mode 100644 index 000000000..d829e291c --- /dev/null +++ b/app/src/main/res/layout/activity_arrange_book.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file From 1aac80df4e107f15baa1067f97ebbd6e458b94f6 Mon Sep 17 00:00:00 2001 From: kunfei Date: Wed, 5 Feb 2020 21:03:12 +0800 Subject: [PATCH 125/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/ui/book/arrange/ArrangeBookAdapter.kt | 18 ++++++++++++++++++ app/src/main/res/layout/item_arrange_book.xml | 7 +++++++ 2 files changed, 25 insertions(+) create mode 100644 app/src/main/java/io/legado/app/ui/book/arrange/ArrangeBookAdapter.kt create mode 100644 app/src/main/res/layout/item_arrange_book.xml diff --git a/app/src/main/java/io/legado/app/ui/book/arrange/ArrangeBookAdapter.kt b/app/src/main/java/io/legado/app/ui/book/arrange/ArrangeBookAdapter.kt new file mode 100644 index 000000000..91fb157e1 --- /dev/null +++ b/app/src/main/java/io/legado/app/ui/book/arrange/ArrangeBookAdapter.kt @@ -0,0 +1,18 @@ +package io.legado.app.ui.book.arrange + +import android.content.Context +import io.legado.app.R +import io.legado.app.base.adapter.ItemViewHolder +import io.legado.app.base.adapter.SimpleRecyclerAdapter +import io.legado.app.data.entities.Book + + +class ArrangeBookAdapter(context: Context) : + SimpleRecyclerAdapter(context, R.layout.item_arrange_book) { + + + override fun convert(holder: ItemViewHolder, item: Book, payloads: MutableList) { + + } + +} \ No newline at end of file diff --git a/app/src/main/res/layout/item_arrange_book.xml b/app/src/main/res/layout/item_arrange_book.xml new file mode 100644 index 000000000..d829e291c --- /dev/null +++ b/app/src/main/res/layout/item_arrange_book.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file From b82e65b5618489e11838bf86f7be44102e1895d7 Mon Sep 17 00:00:00 2001 From: kunfei Date: Wed, 5 Feb 2020 21:46:56 +0800 Subject: [PATCH 126/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/book/arrange/ArrangeBookActivity.kt | 25 ++++++++++++++++--- .../ui/main/bookshelf/BookshelfFragment.kt | 4 +-- .../main/res/layout/activity_arrange_book.xml | 18 +++++++++++++ 3 files changed, 42 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/book/arrange/ArrangeBookActivity.kt b/app/src/main/java/io/legado/app/ui/book/arrange/ArrangeBookActivity.kt index 1e5cedde4..ce614f24d 100644 --- a/app/src/main/java/io/legado/app/ui/book/arrange/ArrangeBookActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/arrange/ArrangeBookActivity.kt @@ -2,22 +2,41 @@ package io.legado.app.ui.book.arrange import android.os.Bundle import androidx.lifecycle.LiveData +import androidx.lifecycle.Observer +import androidx.recyclerview.widget.LinearLayoutManager +import io.legado.app.App import io.legado.app.R import io.legado.app.base.VMBaseActivity import io.legado.app.data.entities.Book +import io.legado.app.lib.theme.ATH import io.legado.app.utils.getViewModel +import kotlinx.android.synthetic.main.activity_arrange_book.* class ArrangeBookActivity : VMBaseActivity(R.layout.activity_arrange_book) { override val viewModel: ArrangeBookViewModel get() = getViewModel(ArrangeBookViewModel::class.java) - - private var booksLiveData: LiveData? = null + private lateinit var adapter: ArrangeBookAdapter + private var booksLiveData: LiveData>? = null override fun onActivityCreated(savedInstanceState: Bundle?) { + initView() + initData() + } - + private fun initView() { + ATH.applyEdgeEffectColor(recycler_view) + recycler_view.layoutManager = LinearLayoutManager(this) + adapter = ArrangeBookAdapter(this) + recycler_view.adapter = adapter } + private fun initData() { + booksLiveData?.removeObservers(this) + booksLiveData = App.db.bookDao().observeAll() + booksLiveData?.observe(this, Observer { + + }) + } } \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/ui/main/bookshelf/BookshelfFragment.kt b/app/src/main/java/io/legado/app/ui/main/bookshelf/BookshelfFragment.kt index a5fbb8bd5..e3c68dcaa 100644 --- a/app/src/main/java/io/legado/app/ui/main/bookshelf/BookshelfFragment.kt +++ b/app/src/main/java/io/legado/app/ui/main/bookshelf/BookshelfFragment.kt @@ -21,6 +21,7 @@ import io.legado.app.lib.dialogs.* import io.legado.app.lib.theme.ATH import io.legado.app.lib.theme.accentColor import io.legado.app.lib.theme.view.ATEAutoCompleteTextView +import io.legado.app.ui.book.arrange.ArrangeBookActivity import io.legado.app.ui.book.search.SearchActivity import io.legado.app.ui.download.DownloadActivity import io.legado.app.ui.importbook.ImportBookActivity @@ -64,8 +65,7 @@ class BookshelfFragment : VMBaseFragment(R.layout.fragment_b .show(childFragmentManager, "groupManageDialog") R.id.menu_add_local -> startActivity() R.id.menu_add_url -> addBookByUrl() - R.id.menu_arrange_bookshelf -> { - } + R.id.menu_arrange_bookshelf -> startActivity() R.id.menu_download -> startActivity() } } diff --git a/app/src/main/res/layout/activity_arrange_book.xml b/app/src/main/res/layout/activity_arrange_book.xml index d829e291c..fb728237a 100644 --- a/app/src/main/res/layout/activity_arrange_book.xml +++ b/app/src/main/res/layout/activity_arrange_book.xml @@ -1,7 +1,25 @@ + + + + + + + + \ No newline at end of file From e3ff04ed62652740bee56d64f63ff1d62550c3e0 Mon Sep 17 00:00:00 2001 From: kunfei Date: Wed, 5 Feb 2020 22:09:18 +0800 Subject: [PATCH 127/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/res/menu/arrange_book.xml | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 app/src/main/res/menu/arrange_book.xml diff --git a/app/src/main/res/menu/arrange_book.xml b/app/src/main/res/menu/arrange_book.xml new file mode 100644 index 000000000..0b47d59ef --- /dev/null +++ b/app/src/main/res/menu/arrange_book.xml @@ -0,0 +1,9 @@ + + + + + + \ No newline at end of file From 940a012fb472e85ad6045a21a3cc54e01adf08ce Mon Sep 17 00:00:00 2001 From: kunfei Date: Wed, 5 Feb 2020 22:27:44 +0800 Subject: [PATCH 128/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/book/arrange/ArrangeBookActivity.kt | 14 +++++++ .../main/res/layout/activity_arrange_book.xml | 41 +++++++++++++++++-- app/src/main/res/values/strings.xml | 1 + 3 files changed, 53 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/book/arrange/ArrangeBookActivity.kt b/app/src/main/java/io/legado/app/ui/book/arrange/ArrangeBookActivity.kt index ce614f24d..17a555863 100644 --- a/app/src/main/java/io/legado/app/ui/book/arrange/ArrangeBookActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/arrange/ArrangeBookActivity.kt @@ -1,6 +1,8 @@ package io.legado.app.ui.book.arrange import android.os.Bundle +import android.view.Menu +import android.view.MenuItem import androidx.lifecycle.LiveData import androidx.lifecycle.Observer import androidx.recyclerview.widget.LinearLayoutManager @@ -24,6 +26,18 @@ class ArrangeBookActivity : VMBaseActivity(R.layout.activi initData() } + override fun onCompatCreateOptionsMenu(menu: Menu): Boolean { + menuInflater.inflate(R.menu.arrange_book, menu) + return super.onCompatCreateOptionsMenu(menu) + } + + override fun onCompatOptionsItemSelected(item: MenuItem): Boolean { + when (item.itemId) { + + } + return super.onCompatOptionsItemSelected(item) + } + private fun initView() { ATH.applyEdgeEffectColor(recycler_view) recycler_view.layoutManager = LinearLayoutManager(this) diff --git a/app/src/main/res/layout/activity_arrange_book.xml b/app/src/main/res/layout/activity_arrange_book.xml index fb728237a..40b9ce904 100644 --- a/app/src/main/res/layout/activity_arrange_book.xml +++ b/app/src/main/res/layout/activity_arrange_book.xml @@ -1,6 +1,7 @@ @@ -16,10 +17,44 @@ android:layout_height="0dp" android:layout_weight="1" /> - + + android:layout_height="50dp" + android:background="@color/background" + android:gravity="center_vertical" + android:padding="10dp" + android:elevation="2dp" + tools:ignore="RtlHardcoded,RtlSymmetry"> + - + + + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index ee33406df..909c9cae5 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -541,6 +541,7 @@ 分组管理 分组选择 编辑分组 + 移入分组 添加分组 新建替换 分组 From 15cc07e7bef19132585953ae49f6179c754e0d38 Mon Sep 17 00:00:00 2001 From: kunfei Date: Wed, 5 Feb 2020 22:32:54 +0800 Subject: [PATCH 129/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/io/legado/app/ui/config/BackupConfigFragment.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/java/io/legado/app/ui/config/BackupConfigFragment.kt b/app/src/main/java/io/legado/app/ui/config/BackupConfigFragment.kt index 2f153da3f..d10385945 100644 --- a/app/src/main/java/io/legado/app/ui/config/BackupConfigFragment.kt +++ b/app/src/main/java/io/legado/app/ui/config/BackupConfigFragment.kt @@ -129,6 +129,7 @@ class BackupConfigFragment : PreferenceFragmentCompat(), if (doc?.canWrite() == true) { launch { Backup.backup(requireContext(), uri) + toast(R.string.backup_success) } } else { selectBackupFolder() From 3951bf01d1732b5a7f5f5d3a5f3c71996d27fd02 Mon Sep 17 00:00:00 2001 From: kunfei Date: Wed, 5 Feb 2020 22:42:02 +0800 Subject: [PATCH 130/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/io/legado/app/constant/PreferKey.kt | 3 + .../io/legado/app/help/storage/WebDavHelp.kt | 7 ++- .../app/ui/config/BackupConfigFragment.kt | 55 ++++++++++--------- 3 files changed, 37 insertions(+), 28 deletions(-) diff --git a/app/src/main/java/io/legado/app/constant/PreferKey.kt b/app/src/main/java/io/legado/app/constant/PreferKey.kt index 1bfd5b634..f6a1b33ef 100644 --- a/app/src/main/java/io/legado/app/constant/PreferKey.kt +++ b/app/src/main/java/io/legado/app/constant/PreferKey.kt @@ -26,4 +26,7 @@ object PreferKey { const val threadCount = "threadCount" const val keepLight = "keep_light" const val webService = "webService" + const val webDavUrl = "web_dav_url" + const val webDavAccount = "web_dav_account" + const val webDavPassword = "web_dav_password" } \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/help/storage/WebDavHelp.kt b/app/src/main/java/io/legado/app/help/storage/WebDavHelp.kt index abd7a8a8a..7612a6913 100644 --- a/app/src/main/java/io/legado/app/help/storage/WebDavHelp.kt +++ b/app/src/main/java/io/legado/app/help/storage/WebDavHelp.kt @@ -2,6 +2,7 @@ package io.legado.app.help.storage import android.content.Context import io.legado.app.App +import io.legado.app.constant.PreferKey import io.legado.app.help.coroutine.Coroutine import io.legado.app.lib.webdav.WebDav import io.legado.app.lib.webdav.http.HttpAuth @@ -23,15 +24,15 @@ object WebDavHelp { } private fun getWebDavUrl(): String? { - var url = App.INSTANCE.getPrefString("web_dav_url") + var url = App.INSTANCE.getPrefString(PreferKey.webDavUrl) if (url.isNullOrBlank()) return null if (!url.endsWith("/")) url += "/" return url } private fun initWebDav(): Boolean { - val account = App.INSTANCE.getPrefString("web_dav_account") - val password = App.INSTANCE.getPrefString("web_dav_password") + val account = App.INSTANCE.getPrefString(PreferKey.webDavAccount) + val password = App.INSTANCE.getPrefString(PreferKey.webDavPassword) if (!account.isNullOrBlank() && !password.isNullOrBlank()) { HttpAuth.auth = HttpAuth.Auth(account, password) return true diff --git a/app/src/main/java/io/legado/app/ui/config/BackupConfigFragment.kt b/app/src/main/java/io/legado/app/ui/config/BackupConfigFragment.kt index d10385945..e27f82e11 100644 --- a/app/src/main/java/io/legado/app/ui/config/BackupConfigFragment.kt +++ b/app/src/main/java/io/legado/app/ui/config/BackupConfigFragment.kt @@ -51,19 +51,19 @@ class BackupConfigFragment : PreferenceFragmentCompat(), } } addPreferencesFromResource(R.xml.pref_config_backup) - findPreference("web_dav_url")?.let { + findPreference(PreferKey.webDavUrl)?.let { it.setOnBindEditTextListener { editText -> ATH.setTint(editText, requireContext().accentColor) } bindPreferenceSummaryToValue(it) } - findPreference("web_dav_account")?.let { + findPreference(PreferKey.webDavAccount)?.let { it.setOnBindEditTextListener { editText -> ATH.setTint(editText, requireContext().accentColor) } bindPreferenceSummaryToValue(it) } - findPreference("web_dav_password")?.let { + findPreference(PreferKey.webDavPassword)?.let { it.setOnBindEditTextListener { editText -> ATH.setTint(editText, requireContext().accentColor) editText.inputType = @@ -85,28 +85,33 @@ class BackupConfigFragment : PreferenceFragmentCompat(), } override fun onPreferenceChange(preference: Preference?, newValue: Any?): Boolean { - when { - preference?.key == "web_dav_password" -> if (newValue == null) { - preference.summary = getString(R.string.web_dav_pw_s) - } else { - preference.summary = "*".repeat(newValue.toString().length) - } - preference?.key == "web_dav_url" -> if (newValue == null) { - preference.summary = getString(R.string.web_dav_url_s) - } else { - preference.summary = newValue.toString() - } - preference?.key == "web_dav_account" -> if (newValue == null) { - preference.summary = getString(R.string.web_dav_account_s) - } else { - preference.summary = newValue.toString() - } - preference is ListPreference -> { - val index = preference.findIndexOfValue(newValue?.toString()) - // Set the summary to reflect the new value. - preference.setSummary(if (index >= 0) preference.entries[index] else null) - } - else -> preference?.summary = newValue?.toString() + when (preference?.key) { + PreferKey.webDavUrl -> + if (newValue == null) { + preference.summary = getString(R.string.web_dav_url_s) + } else { + preference.summary = newValue.toString() + } + PreferKey.webDavAccount -> + if (newValue == null) { + preference.summary = getString(R.string.web_dav_account_s) + } else { + preference.summary = newValue.toString() + } + PreferKey.webDavPassword -> + if (newValue == null) { + preference.summary = getString(R.string.web_dav_pw_s) + } else { + preference.summary = "*".repeat(newValue.toString().length) + } + else -> + if (preference is ListPreference) { + val index = preference.findIndexOfValue(newValue?.toString()) + // Set the summary to reflect the new value. + preference.setSummary(if (index >= 0) preference.entries[index] else null) + } else { + preference?.summary = newValue?.toString() + } } return false } From fd814edf0830193606e300140f1ead2055871a3f Mon Sep 17 00:00:00 2001 From: kunfei Date: Wed, 5 Feb 2020 22:47:14 +0800 Subject: [PATCH 131/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/io/legado/app/ui/config/BackupConfigFragment.kt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/src/main/java/io/legado/app/ui/config/BackupConfigFragment.kt b/app/src/main/java/io/legado/app/ui/config/BackupConfigFragment.kt index e27f82e11..38f5568fb 100644 --- a/app/src/main/java/io/legado/app/ui/config/BackupConfigFragment.kt +++ b/app/src/main/java/io/legado/app/ui/config/BackupConfigFragment.kt @@ -156,6 +156,7 @@ class BackupConfigFragment : PreferenceFragmentCompat(), .onGranted { launch { Backup.backup(requireContext(), null) + toast(R.string.backup_success) } } .request() @@ -316,6 +317,7 @@ class BackupConfigFragment : PreferenceFragmentCompat(), findPreference(PreferKey.backupPath)?.summary = uri.toString() launch { Backup.backup(requireContext(), uri) + toast(R.string.backup_success) } } } From 30be4ba3e036b6058557ba576dc3a1d904c9207b Mon Sep 17 00:00:00 2001 From: kunfei Date: Thu, 6 Feb 2020 10:07:22 +0800 Subject: [PATCH 132/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/io/legado/app/constant/PreferKey.kt | 1 + app/src/main/java/io/legado/app/help/AppConfig.kt | 6 ++++++ .../java/io/legado/app/service/HttpReadAloudService.kt | 4 ++-- .../java/io/legado/app/service/TTSReadAloudService.kt | 4 ++-- .../app/ui/book/read/config/ReadAloudConfigDialog.kt | 4 +++- .../io/legado/app/ui/book/read/config/ReadAloudDialog.kt | 9 ++++++--- 6 files changed, 20 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/io/legado/app/constant/PreferKey.kt b/app/src/main/java/io/legado/app/constant/PreferKey.kt index f6a1b33ef..ec5b3a4cd 100644 --- a/app/src/main/java/io/legado/app/constant/PreferKey.kt +++ b/app/src/main/java/io/legado/app/constant/PreferKey.kt @@ -10,6 +10,7 @@ object PreferKey { const val precisionSearch = "precisionSearch" const val readAloudOnLine = "readAloudOnLine" const val readAloudByPage = "readAloudByPage" + const val ttsSpeechRate = "ttsSpeechRate" const val ttsSpeechPer = "ttsSpeechPer" const val prevKey = "prevKeyCode" const val nextKey = "nextKeyCode" diff --git a/app/src/main/java/io/legado/app/help/AppConfig.kt b/app/src/main/java/io/legado/app/help/AppConfig.kt index 002fee5ff..84de0973c 100644 --- a/app/src/main/java/io/legado/app/help/AppConfig.kt +++ b/app/src/main/java/io/legado/app/help/AppConfig.kt @@ -50,6 +50,12 @@ object AppConfig { } } + var ttsSpeechRate: Int + get() = App.INSTANCE.getPrefInt(PreferKey.ttsSpeechRate, 5) + set(value) { + App.INSTANCE.putPrefInt(PreferKey.ttsSpeechRate, value) + } + val isEInkMode: Boolean get() = App.INSTANCE.getPrefBoolean("isEInkMode") diff --git a/app/src/main/java/io/legado/app/service/HttpReadAloudService.kt b/app/src/main/java/io/legado/app/service/HttpReadAloudService.kt index 1cf40fc8c..00190d93b 100644 --- a/app/src/main/java/io/legado/app/service/HttpReadAloudService.kt +++ b/app/src/main/java/io/legado/app/service/HttpReadAloudService.kt @@ -4,12 +4,12 @@ import android.app.PendingIntent import android.media.MediaPlayer import io.legado.app.constant.EventBus import io.legado.app.constant.PreferKey +import io.legado.app.help.AppConfig import io.legado.app.help.IntentHelp import io.legado.app.help.http.HttpHelper import io.legado.app.help.http.api.HttpPostApi import io.legado.app.service.help.ReadBook import io.legado.app.utils.FileUtils -import io.legado.app.utils.getPrefInt import io.legado.app.utils.getPrefString import io.legado.app.utils.postEvent import kotlinx.coroutines.Dispatchers.IO @@ -112,7 +112,7 @@ class HttpReadAloudService : BaseReadAloudService(), private fun getAudioBody(content: String): Map { return mapOf( Pair("tex", encodeTwo(content)), - Pair("spd", ((getPrefInt("ttsSpeechRate", 25) + 5) / 5).toString()), + Pair("spd", ((AppConfig.ttsSpeechRate + 5) / 5).toString()), Pair("per", getPrefString(PreferKey.ttsSpeechPer) ?: "0"), Pair("cuid", "baidu_speech_demo"), Pair("idx", "1"), diff --git a/app/src/main/java/io/legado/app/service/TTSReadAloudService.kt b/app/src/main/java/io/legado/app/service/TTSReadAloudService.kt index 4c5357ce6..1b1f40bcc 100644 --- a/app/src/main/java/io/legado/app/service/TTSReadAloudService.kt +++ b/app/src/main/java/io/legado/app/service/TTSReadAloudService.kt @@ -7,11 +7,11 @@ import android.speech.tts.UtteranceProgressListener import io.legado.app.R import io.legado.app.constant.AppConst import io.legado.app.constant.EventBus +import io.legado.app.help.AppConfig import io.legado.app.help.IntentHelp import io.legado.app.help.MediaHelp import io.legado.app.service.help.ReadBook import io.legado.app.utils.getPrefBoolean -import io.legado.app.utils.getPrefInt import io.legado.app.utils.postEvent import kotlinx.coroutines.launch import org.jetbrains.anko.toast @@ -96,7 +96,7 @@ class TTSReadAloudService : BaseReadAloudService(), TextToSpeech.OnInitListener textToSpeech = TextToSpeech(this, this) } } else { - textToSpeech?.setSpeechRate((this.getPrefInt("ttsSpeechRate", 5) + 5) / 10f) + textToSpeech?.setSpeechRate((AppConfig.ttsSpeechRate + 5) / 10f) } } diff --git a/app/src/main/java/io/legado/app/ui/book/read/config/ReadAloudConfigDialog.kt b/app/src/main/java/io/legado/app/ui/book/read/config/ReadAloudConfigDialog.kt index 0cc2a1336..7da1ac2e0 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/config/ReadAloudConfigDialog.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/config/ReadAloudConfigDialog.kt @@ -96,7 +96,9 @@ class ReadAloudConfigDialog : DialogFragment() { ReadAloud.stop(requireContext()) ReadAloud.aloudClass = ReadAloud.getReadAloudClass() } - PreferKey.ttsSpeechPer -> ReadAloud.upTtsSpeechRate(requireContext()) + PreferKey.ttsSpeechPer -> { + ReadAloud.upTtsSpeechRate(requireContext()) + } } } diff --git a/app/src/main/java/io/legado/app/ui/book/read/config/ReadAloudDialog.kt b/app/src/main/java/io/legado/app/ui/book/read/config/ReadAloudDialog.kt index deeef204b..6040c0880 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/config/ReadAloudDialog.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/config/ReadAloudDialog.kt @@ -10,11 +10,14 @@ import android.widget.SeekBar import androidx.fragment.app.DialogFragment import io.legado.app.R import io.legado.app.constant.EventBus +import io.legado.app.help.AppConfig import io.legado.app.service.BaseReadAloudService import io.legado.app.service.help.ReadAloud import io.legado.app.service.help.ReadBook import io.legado.app.ui.book.read.Help -import io.legado.app.utils.* +import io.legado.app.utils.getPrefBoolean +import io.legado.app.utils.observeEvent +import io.legado.app.utils.putPrefBoolean import kotlinx.android.synthetic.main.dialog_read_aloud.* import org.jetbrains.anko.sdk27.listeners.onClick import org.jetbrains.anko.sdk27.listeners.onLongClick @@ -65,7 +68,7 @@ class ReadAloudDialog : DialogFragment() { requireContext().getString(R.string.timer_m, BaseReadAloudService.timeMinute) cb_tts_follow_sys.isChecked = requireContext().getPrefBoolean("ttsFollowSys", true) seek_tts_SpeechRate.isEnabled = !cb_tts_follow_sys.isChecked - seek_tts_SpeechRate.progress = requireContext().getPrefInt("ttsSpeechRate", 5) + seek_tts_SpeechRate.progress = AppConfig.ttsSpeechRate } private fun initOnChange() { @@ -83,7 +86,7 @@ class ReadAloudDialog : DialogFragment() { override fun onStartTrackingTouch(seekBar: SeekBar?) = Unit override fun onStopTrackingTouch(seekBar: SeekBar?) { - requireContext().putPrefInt("ttsSpeechRate", seek_tts_SpeechRate.progress) + AppConfig.ttsSpeechRate = seek_tts_SpeechRate.progress upTtsSpeechRate() } }) From 84a042c54a667d9cc1bffc612e8aad27fae373d0 Mon Sep 17 00:00:00 2001 From: kunfei Date: Thu, 6 Feb 2020 10:20:40 +0800 Subject: [PATCH 133/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/io/legado/app/service/HttpReadAloudService.kt | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/app/src/main/java/io/legado/app/service/HttpReadAloudService.kt b/app/src/main/java/io/legado/app/service/HttpReadAloudService.kt index 00190d93b..1e91c3760 100644 --- a/app/src/main/java/io/legado/app/service/HttpReadAloudService.kt +++ b/app/src/main/java/io/legado/app/service/HttpReadAloudService.kt @@ -112,7 +112,7 @@ class HttpReadAloudService : BaseReadAloudService(), private fun getAudioBody(content: String): Map { return mapOf( Pair("tex", encodeTwo(content)), - Pair("spd", ((AppConfig.ttsSpeechRate + 5) / 5).toString()), + Pair("spd", ((AppConfig.ttsSpeechRate + 5) / 10 + 4).toString()), Pair("per", getPrefString(PreferKey.ttsSpeechPer) ?: "0"), Pair("cuid", "baidu_speech_demo"), Pair("idx", "1"), @@ -151,9 +151,6 @@ class HttpReadAloudService : BaseReadAloudService(), override fun upSpeechRate(reset: Boolean) { job?.cancel() mediaPlayer.reset() - for (i in 0 until nowSpeak) { - contentList.removeAt(0) - } nowSpeak = 0 playingIndex = -1 play() From d9d51ffd97e9eaad558b1ca47c05f246776df942 Mon Sep 17 00:00:00 2001 From: kunfei Date: Thu, 6 Feb 2020 10:25:38 +0800 Subject: [PATCH 134/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/io/legado/app/service/HttpReadAloudService.kt | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/app/src/main/java/io/legado/app/service/HttpReadAloudService.kt b/app/src/main/java/io/legado/app/service/HttpReadAloudService.kt index 1e91c3760..dcb6b16e9 100644 --- a/app/src/main/java/io/legado/app/service/HttpReadAloudService.kt +++ b/app/src/main/java/io/legado/app/service/HttpReadAloudService.kt @@ -148,14 +148,21 @@ class HttpReadAloudService : BaseReadAloudService(), } } + /** + * 更新朗读速度 + */ override fun upSpeechRate(reset: Boolean) { job?.cancel() mediaPlayer.reset() nowSpeak = 0 playingIndex = -1 + readAloudNumber = 0 play() } + /** + * 上一段 + */ override fun prevP() { if (nowSpeak > 0) { mediaPlayer.stop() @@ -165,6 +172,9 @@ class HttpReadAloudService : BaseReadAloudService(), } } + /** + * 下一段 + */ override fun nextP() { if (nowSpeak < contentList.size - 1) { mediaPlayer.stop() From 3d187dfe3ca226582ddbbd0ee48200d6c456f326 Mon Sep 17 00:00:00 2001 From: kunfei Date: Thu, 6 Feb 2020 10:35:43 +0800 Subject: [PATCH 135/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/io/legado/app/service/HttpReadAloudService.kt | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/app/src/main/java/io/legado/app/service/HttpReadAloudService.kt b/app/src/main/java/io/legado/app/service/HttpReadAloudService.kt index dcb6b16e9..64b296d62 100644 --- a/app/src/main/java/io/legado/app/service/HttpReadAloudService.kt +++ b/app/src/main/java/io/legado/app/service/HttpReadAloudService.kt @@ -154,9 +154,7 @@ class HttpReadAloudService : BaseReadAloudService(), override fun upSpeechRate(reset: Boolean) { job?.cancel() mediaPlayer.reset() - nowSpeak = 0 - playingIndex = -1 - readAloudNumber = 0 + downloadAudio() play() } From e993d710f6eba7761b36570bb858bb2e4e04a7c8 Mon Sep 17 00:00:00 2001 From: kunfei Date: Thu, 6 Feb 2020 11:12:09 +0800 Subject: [PATCH 136/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/io/legado/app/service/HttpReadAloudService.kt | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/io/legado/app/service/HttpReadAloudService.kt b/app/src/main/java/io/legado/app/service/HttpReadAloudService.kt index 64b296d62..c65350739 100644 --- a/app/src/main/java/io/legado/app/service/HttpReadAloudService.kt +++ b/app/src/main/java/io/legado/app/service/HttpReadAloudService.kt @@ -10,6 +10,7 @@ import io.legado.app.help.http.HttpHelper import io.legado.app.help.http.api.HttpPostApi import io.legado.app.service.help.ReadBook import io.legado.app.utils.FileUtils +import io.legado.app.utils.LogUtils import io.legado.app.utils.getPrefString import io.legado.app.utils.postEvent import kotlinx.coroutines.Dispatchers.IO @@ -153,9 +154,10 @@ class HttpReadAloudService : BaseReadAloudService(), */ override fun upSpeechRate(reset: Boolean) { job?.cancel() - mediaPlayer.reset() + if (mediaPlayer.isPlaying) { + mediaPlayer.stop() + } downloadAudio() - play() } /** @@ -196,6 +198,10 @@ class HttpReadAloudService : BaseReadAloudService(), } override fun onError(mp: MediaPlayer?, what: Int, extra: Int): Boolean { + LogUtils.d("mp", "what:$what extra:$extra") + if (what == -38 && extra == 0) { + return true + } handler.postDelayed({ readAloudNumber += contentList[nowSpeak].length + 1 if (nowSpeak < contentList.lastIndex) { From b2339ed0432e0bb459fac17b54839cbaef41df18 Mon Sep 17 00:00:00 2001 From: kunfei Date: Thu, 6 Feb 2020 11:26:23 +0800 Subject: [PATCH 137/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/io/legado/app/service/HttpReadAloudService.kt | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/io/legado/app/service/HttpReadAloudService.kt b/app/src/main/java/io/legado/app/service/HttpReadAloudService.kt index c65350739..014b1b778 100644 --- a/app/src/main/java/io/legado/app/service/HttpReadAloudService.kt +++ b/app/src/main/java/io/legado/app/service/HttpReadAloudService.kt @@ -94,11 +94,11 @@ class HttpReadAloudService : BaseReadAloudService(), @Synchronized private fun playAudio(fd: FileDescriptor) { if (playingIndex != nowSpeak && requestFocus()) { - playingIndex = nowSpeak try { mediaPlayer.reset() mediaPlayer.setDataSource(fd) mediaPlayer.prepareAsync() + playingIndex = nowSpeak postEvent(EventBus.TTS_START, readAloudNumber + 1) } catch (e: Exception) { e.printStackTrace() @@ -154,9 +154,8 @@ class HttpReadAloudService : BaseReadAloudService(), */ override fun upSpeechRate(reset: Boolean) { job?.cancel() - if (mediaPlayer.isPlaying) { - mediaPlayer.stop() - } + mediaPlayer.stop() + playingIndex = -1 downloadAudio() } From 3ac6d9807be454203e88b22cd8122654d3aa0ff4 Mon Sep 17 00:00:00 2001 From: kunfei Date: Thu, 6 Feb 2020 12:09:09 +0800 Subject: [PATCH 138/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/io/legado/app/help/AppConfig.kt | 3 ++ .../app/service/HttpReadAloudService.kt | 4 +- .../book/read/config/ReadAloudConfigDialog.kt | 45 +++++++++---------- app/src/main/res/values/strings.xml | 1 + app/src/main/res/xml/pref_config_aloud.xml | 2 +- 5 files changed, 26 insertions(+), 29 deletions(-) diff --git a/app/src/main/java/io/legado/app/help/AppConfig.kt b/app/src/main/java/io/legado/app/help/AppConfig.kt index 84de0973c..e1f80dfb5 100644 --- a/app/src/main/java/io/legado/app/help/AppConfig.kt +++ b/app/src/main/java/io/legado/app/help/AppConfig.kt @@ -56,6 +56,9 @@ object AppConfig { App.INSTANCE.putPrefInt(PreferKey.ttsSpeechRate, value) } + val ttsSpeechPer: String + get() = App.INSTANCE.getPrefString(PreferKey.ttsSpeechPer) ?: "0" + val isEInkMode: Boolean get() = App.INSTANCE.getPrefBoolean("isEInkMode") diff --git a/app/src/main/java/io/legado/app/service/HttpReadAloudService.kt b/app/src/main/java/io/legado/app/service/HttpReadAloudService.kt index 014b1b778..798307652 100644 --- a/app/src/main/java/io/legado/app/service/HttpReadAloudService.kt +++ b/app/src/main/java/io/legado/app/service/HttpReadAloudService.kt @@ -3,7 +3,6 @@ package io.legado.app.service import android.app.PendingIntent import android.media.MediaPlayer import io.legado.app.constant.EventBus -import io.legado.app.constant.PreferKey import io.legado.app.help.AppConfig import io.legado.app.help.IntentHelp import io.legado.app.help.http.HttpHelper @@ -11,7 +10,6 @@ import io.legado.app.help.http.api.HttpPostApi import io.legado.app.service.help.ReadBook import io.legado.app.utils.FileUtils import io.legado.app.utils.LogUtils -import io.legado.app.utils.getPrefString import io.legado.app.utils.postEvent import kotlinx.coroutines.Dispatchers.IO import kotlinx.coroutines.Job @@ -114,7 +112,7 @@ class HttpReadAloudService : BaseReadAloudService(), return mapOf( Pair("tex", encodeTwo(content)), Pair("spd", ((AppConfig.ttsSpeechRate + 5) / 10 + 4).toString()), - Pair("per", getPrefString(PreferKey.ttsSpeechPer) ?: "0"), + Pair("per", AppConfig.ttsSpeechPer), Pair("cuid", "baidu_speech_demo"), Pair("idx", "1"), Pair("cod", "2"), diff --git a/app/src/main/java/io/legado/app/ui/book/read/config/ReadAloudConfigDialog.kt b/app/src/main/java/io/legado/app/ui/book/read/config/ReadAloudConfigDialog.kt index 7da1ac2e0..294a1c127 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/config/ReadAloudConfigDialog.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/config/ReadAloudConfigDialog.kt @@ -14,11 +14,11 @@ import androidx.preference.PreferenceFragmentCompat import io.legado.app.R import io.legado.app.constant.EventBus import io.legado.app.constant.PreferKey +import io.legado.app.help.AppConfig import io.legado.app.lib.theme.ATH import io.legado.app.service.BaseReadAloudService import io.legado.app.service.help.ReadAloud import io.legado.app.ui.book.read.Help -import io.legado.app.utils.getPrefString import io.legado.app.utils.postEvent class ReadAloudConfigDialog : DialogFragment() { @@ -59,17 +59,19 @@ class ReadAloudConfigDialog : DialogFragment() { } class ReadAloudPreferenceFragment : PreferenceFragmentCompat(), - SharedPreferences.OnSharedPreferenceChangeListener, - Preference.OnPreferenceChangeListener { + SharedPreferences.OnSharedPreferenceChangeListener { override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { addPreferencesFromResource(R.xml.pref_config_aloud) + upPreferenceSummary( + findPreference(PreferKey.ttsSpeechPer), + AppConfig.ttsSpeechPer + ) } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) ATH.applyEdgeEffectColor(listView) - bindPreferenceSummaryToValue(findPreference(PreferKey.ttsSpeechPer)) } override fun onResume() { @@ -97,32 +99,25 @@ class ReadAloudConfigDialog : DialogFragment() { ReadAloud.aloudClass = ReadAloud.getReadAloudClass() } PreferKey.ttsSpeechPer -> { + upPreferenceSummary( + findPreference(PreferKey.ttsSpeechPer), + AppConfig.ttsSpeechPer + ) ReadAloud.upTtsSpeechRate(requireContext()) } } } - override fun onPreferenceChange(preference: Preference?, newValue: Any?): Boolean { - val stringValue = newValue.toString() - - if (preference is ListPreference) { - val index = preference.findIndexOfValue(stringValue) - // Set the summary to reflect the new value. - preference.setSummary(if (index >= 0) preference.entries[index] else null) - } else { - // For all other preferences, set the summary to the value's - preference?.summary = stringValue - } - return false - } - - private fun bindPreferenceSummaryToValue(preference: Preference?) { - preference?.apply { - onPreferenceChangeListener = this@ReadAloudPreferenceFragment - onPreferenceChange( - this, - context.getPrefString(key) - ) + private fun upPreferenceSummary(preference: Preference?, value: String) { + when (preference) { + is ListPreference -> { + val index = preference.findIndexOfValue(value) + // Set the summary to reflect the new value. + preference.summary = if (index >= 0) preference.entries[index] else null + } + else -> { + preference?.summary = value + } } } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 909c9cae5..f08aa7db8 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -590,5 +590,6 @@ 自动切换夜间模式 夜间模式跟随系统 上级 + 在线朗读音色 diff --git a/app/src/main/res/xml/pref_config_aloud.xml b/app/src/main/res/xml/pref_config_aloud.xml index d142c526c..d78e3c687 100644 --- a/app/src/main/res/xml/pref_config_aloud.xml +++ b/app/src/main/res/xml/pref_config_aloud.xml @@ -16,7 +16,7 @@ Date: Thu, 6 Feb 2020 12:20:10 +0800 Subject: [PATCH 139/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/io/legado/app/help/BookHelp.kt | 2 +- .../app/ui/config/OtherConfigFragment.kt | 47 +++++-------------- 2 files changed, 13 insertions(+), 36 deletions(-) diff --git a/app/src/main/java/io/legado/app/help/BookHelp.kt b/app/src/main/java/io/legado/app/help/BookHelp.kt index fa6b63c39..de8c0a5a7 100644 --- a/app/src/main/java/io/legado/app/help/BookHelp.kt +++ b/app/src/main/java/io/legado/app/help/BookHelp.kt @@ -15,7 +15,7 @@ import kotlin.math.min object BookHelp { private const val cacheFolderName = "book_cache" - private var downloadPath: String = + var downloadPath: String = App.INSTANCE.getPrefString(PreferKey.downloadPath) ?: App.INSTANCE.getExternalFilesDir(null)?.absolutePath ?: App.INSTANCE.cacheDir.absolutePath diff --git a/app/src/main/java/io/legado/app/ui/config/OtherConfigFragment.kt b/app/src/main/java/io/legado/app/ui/config/OtherConfigFragment.kt index 8f3a7e244..6a77a8c99 100644 --- a/app/src/main/java/io/legado/app/ui/config/OtherConfigFragment.kt +++ b/app/src/main/java/io/legado/app/ui/config/OtherConfigFragment.kt @@ -27,7 +27,6 @@ import io.legado.app.utils.* class OtherConfigFragment : PreferenceFragmentCompat(), FileChooserDialog.CallBack, - Preference.OnPreferenceChangeListener, SharedPreferences.OnSharedPreferenceChangeListener { private val requestCodeDownloadPath = 25324 @@ -40,8 +39,8 @@ class OtherConfigFragment : PreferenceFragmentCompat(), override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { putPrefBoolean("process_text", isProcessTextEnabled()) addPreferencesFromResource(R.xml.pref_config_other) - bindPreferenceSummaryToValue(findPreference(PreferKey.downloadPath)) - bindPreferenceSummaryToValue(findPreference(PreferKey.threadCount)) + upPreferenceSummary(findPreference(PreferKey.downloadPath), BookHelp.downloadPath) + upPreferenceSummary(findPreference(PreferKey.threadCount), AppConfig.threadCount.toString()) } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { @@ -84,7 +83,7 @@ class OtherConfigFragment : PreferenceFragmentCompat(), when (key) { PreferKey.downloadPath -> { BookHelp.upDownloadPath() - findPreference(key)?.summary = getPreferenceString(key).toString() + findPreference(key)?.summary = BookHelp.downloadPath } PreferKey.recordLog -> LogUtils.upLevel() PreferKey.processText -> sharedPreferences?.let { @@ -94,38 +93,16 @@ class OtherConfigFragment : PreferenceFragmentCompat(), } } - override fun onPreferenceChange(preference: Preference?, newValue: Any?): Boolean { - val stringValue = newValue.toString() - when { - preference is ListPreference -> { - val index = preference.findIndexOfValue(stringValue) + private fun upPreferenceSummary(preference: Preference?, value: String) { + when (preference) { + is ListPreference -> { + val index = preference.findIndexOfValue(value) // Set the summary to reflect the new value. - preference.setSummary(if (index >= 0) preference.entries[index] else null) + preference.summary = if (index >= 0) preference.entries[index] else null + } + else -> { + preference?.summary = value } - preference?.key == PreferKey.threadCount -> preference.summary = - getString(R.string.threads_num, stringValue) - else -> preference?.summary = stringValue - } - return false - } - - private fun bindPreferenceSummaryToValue(preference: Preference?) { - preference?.let { - preference.onPreferenceChangeListener = this - onPreferenceChange( - preference, - getPreferenceString(preference.key) - ) - } - } - - private fun getPreferenceString(key: String): Any { - return when (key) { - PreferKey.downloadPath -> getPrefString(PreferKey.downloadPath) - ?: App.INSTANCE.getExternalFilesDir(null)?.absolutePath - ?: App.INSTANCE.cacheDir.absolutePath - PreferKey.threadCount -> AppConfig.threadCount - else -> getPrefString(key) ?: "" } } @@ -166,7 +143,7 @@ class OtherConfigFragment : PreferenceFragmentCompat(), childFragmentManager, requestCodeDownloadPath, mode = FileChooserDialog.DIRECTORY, - initPath = getPreferenceString(PreferKey.downloadPath).toString() + initPath = BookHelp.downloadPath ) } .request() From 25d67acb36382e20f7126f651cee811a207d0453 Mon Sep 17 00:00:00 2001 From: kunfei Date: Thu, 6 Feb 2020 12:22:52 +0800 Subject: [PATCH 140/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/io/legado/app/ui/config/ThemeConfigFragment.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/io/legado/app/ui/config/ThemeConfigFragment.kt b/app/src/main/java/io/legado/app/ui/config/ThemeConfigFragment.kt index 856e6cbb3..c90db122d 100644 --- a/app/src/main/java/io/legado/app/ui/config/ThemeConfigFragment.kt +++ b/app/src/main/java/io/legado/app/ui/config/ThemeConfigFragment.kt @@ -104,7 +104,7 @@ class ThemeConfigFragment : PreferenceFragmentCompat(), SharedPreferences.OnShar .setTitle("切换默认主题") .setItems(items){ _,which -> - preference.summary = "${items[which]}" + preference.summary = items[which] putPrefInt("default_theme", which) when (which) { 0 -> { From 8816450b12e2c111270e970c90d05fe9e7941f91 Mon Sep 17 00:00:00 2001 From: kunfei Date: Thu, 6 Feb 2020 15:46:31 +0800 Subject: [PATCH 141/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/book/arrange/ArrangeBookActivity.kt | 2 +- .../app/ui/book/arrange/ArrangeBookAdapter.kt | 6 +- app/src/main/res/layout/item_arrange_book.xml | 58 ++++++++++++++++++- 3 files changed, 61 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/book/arrange/ArrangeBookActivity.kt b/app/src/main/java/io/legado/app/ui/book/arrange/ArrangeBookActivity.kt index 17a555863..7e349dcb6 100644 --- a/app/src/main/java/io/legado/app/ui/book/arrange/ArrangeBookActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/arrange/ArrangeBookActivity.kt @@ -49,7 +49,7 @@ class ArrangeBookActivity : VMBaseActivity(R.layout.activi booksLiveData?.removeObservers(this) booksLiveData = App.db.bookDao().observeAll() booksLiveData?.observe(this, Observer { - + adapter.setItems(it) }) } diff --git a/app/src/main/java/io/legado/app/ui/book/arrange/ArrangeBookAdapter.kt b/app/src/main/java/io/legado/app/ui/book/arrange/ArrangeBookAdapter.kt index 91fb157e1..3594119a6 100644 --- a/app/src/main/java/io/legado/app/ui/book/arrange/ArrangeBookAdapter.kt +++ b/app/src/main/java/io/legado/app/ui/book/arrange/ArrangeBookAdapter.kt @@ -5,6 +5,7 @@ import io.legado.app.R import io.legado.app.base.adapter.ItemViewHolder import io.legado.app.base.adapter.SimpleRecyclerAdapter import io.legado.app.data.entities.Book +import kotlinx.android.synthetic.main.item_arrange_book.view.* class ArrangeBookAdapter(context: Context) : @@ -12,7 +13,10 @@ class ArrangeBookAdapter(context: Context) : override fun convert(holder: ItemViewHolder, item: Book, payloads: MutableList) { - + with(holder.itemView) { + tv_name.text = item.name + tv_author.text = item.author + } } } \ No newline at end of file diff --git a/app/src/main/res/layout/item_arrange_book.xml b/app/src/main/res/layout/item_arrange_book.xml index d829e291c..dec2b66bf 100644 --- a/app/src/main/res/layout/item_arrange_book.xml +++ b/app/src/main/res/layout/item_arrange_book.xml @@ -1,7 +1,59 @@ - + android:layout_height="wrap_content"> - \ No newline at end of file + + + + + + + + + + + \ No newline at end of file From 5fdd51427a29088bdb9ae234f2f66c15f44f9501 Mon Sep 17 00:00:00 2001 From: kunfei Date: Thu, 6 Feb 2020 15:59:32 +0800 Subject: [PATCH 142/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/io/legado/app/ui/book/arrange/ArrangeBookAdapter.kt | 2 +- app/src/main/res/layout/item_arrange_book.xml | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/io/legado/app/ui/book/arrange/ArrangeBookAdapter.kt b/app/src/main/java/io/legado/app/ui/book/arrange/ArrangeBookAdapter.kt index 3594119a6..680ced2e3 100644 --- a/app/src/main/java/io/legado/app/ui/book/arrange/ArrangeBookAdapter.kt +++ b/app/src/main/java/io/legado/app/ui/book/arrange/ArrangeBookAdapter.kt @@ -15,7 +15,7 @@ class ArrangeBookAdapter(context: Context) : override fun convert(holder: ItemViewHolder, item: Book, payloads: MutableList) { with(holder.itemView) { tv_name.text = item.name - tv_author.text = item.author + tv_author.text = context.getString(R.string.author_show, item.author) } } diff --git a/app/src/main/res/layout/item_arrange_book.xml b/app/src/main/res/layout/item_arrange_book.xml index dec2b66bf..ea62f6d4f 100644 --- a/app/src/main/res/layout/item_arrange_book.xml +++ b/app/src/main/res/layout/item_arrange_book.xml @@ -21,6 +21,8 @@ android:layout_width="0dp" android:layout_height="wrap_content" android:padding="3dp" + android:textSize="16sp" + android:text="@string/book_name" app:layout_constraintTop_toTopOf="parent" app:layout_constraintBottom_toTopOf="@id/tv_author" app:layout_constraintLeft_toRightOf="@id/checkbox" @@ -31,6 +33,7 @@ android:layout_width="0dp" android:layout_height="wrap_content" android:padding="3dp" + android:text="@string/author" app:layout_constraintLeft_toRightOf="@+id/checkbox" app:layout_constraintTop_toBottomOf="@id/tv_name" app:layout_constraintBottom_toBottomOf="parent" From 988388f53052ae3ab612c140884ad5c458b41a5b Mon Sep 17 00:00:00 2001 From: kunfei Date: Thu, 6 Feb 2020 16:58:28 +0800 Subject: [PATCH 143/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/res/layout/activity_arrange_book.xml | 11 ++++++++++- app/src/main/res/values/strings.xml | 1 + 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/layout/activity_arrange_book.xml b/app/src/main/res/layout/activity_arrange_book.xml index 40b9ce904..993b58b77 100644 --- a/app/src/main/res/layout/activity_arrange_book.xml +++ b/app/src/main/res/layout/activity_arrange_book.xml @@ -30,12 +30,21 @@ + + 夜间模式跟随系统 上级 在线朗读音色 + (%d/%d) From fec631fecf01d8412341a775ba50f2b826837458 Mon Sep 17 00:00:00 2001 From: kunfei Date: Thu, 6 Feb 2020 17:08:38 +0800 Subject: [PATCH 144/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/ui/book/arrange/ArrangeBookActivity.kt | 8 ++++++-- .../app/ui/book/arrange/ArrangeBookAdapter.kt | 16 +++++++++++++++- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/book/arrange/ArrangeBookActivity.kt b/app/src/main/java/io/legado/app/ui/book/arrange/ArrangeBookActivity.kt index 7e349dcb6..5c9f9dfa4 100644 --- a/app/src/main/java/io/legado/app/ui/book/arrange/ArrangeBookActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/arrange/ArrangeBookActivity.kt @@ -10,14 +10,17 @@ import io.legado.app.App import io.legado.app.R import io.legado.app.base.VMBaseActivity import io.legado.app.data.entities.Book +import io.legado.app.data.entities.BookGroup import io.legado.app.lib.theme.ATH import io.legado.app.utils.getViewModel import kotlinx.android.synthetic.main.activity_arrange_book.* -class ArrangeBookActivity : VMBaseActivity(R.layout.activity_arrange_book) { +class ArrangeBookActivity : VMBaseActivity(R.layout.activity_arrange_book), + ArrangeBookAdapter.CallBack { override val viewModel: ArrangeBookViewModel get() = getViewModel(ArrangeBookViewModel::class.java) + override val groupList: List = arrayListOf() private lateinit var adapter: ArrangeBookAdapter private var booksLiveData: LiveData>? = null @@ -41,7 +44,7 @@ class ArrangeBookActivity : VMBaseActivity(R.layout.activi private fun initView() { ATH.applyEdgeEffectColor(recycler_view) recycler_view.layoutManager = LinearLayoutManager(this) - adapter = ArrangeBookAdapter(this) + adapter = ArrangeBookAdapter(this, this) recycler_view.adapter = adapter } @@ -53,4 +56,5 @@ class ArrangeBookActivity : VMBaseActivity(R.layout.activi }) } + } \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/ui/book/arrange/ArrangeBookAdapter.kt b/app/src/main/java/io/legado/app/ui/book/arrange/ArrangeBookAdapter.kt index 680ced2e3..718572606 100644 --- a/app/src/main/java/io/legado/app/ui/book/arrange/ArrangeBookAdapter.kt +++ b/app/src/main/java/io/legado/app/ui/book/arrange/ArrangeBookAdapter.kt @@ -5,10 +5,11 @@ import io.legado.app.R import io.legado.app.base.adapter.ItemViewHolder import io.legado.app.base.adapter.SimpleRecyclerAdapter import io.legado.app.data.entities.Book +import io.legado.app.data.entities.BookGroup import kotlinx.android.synthetic.main.item_arrange_book.view.* -class ArrangeBookAdapter(context: Context) : +class ArrangeBookAdapter(context: Context, val callBack: CallBack) : SimpleRecyclerAdapter(context, R.layout.item_arrange_book) { @@ -16,7 +17,20 @@ class ArrangeBookAdapter(context: Context) : with(holder.itemView) { tv_name.text = item.name tv_author.text = context.getString(R.string.author_show, item.author) + tv_group.text = getGroupName(item.group) } } + private fun getGroupName(groupId: Int): String { + callBack.groupList.forEach { + if (it.groupId == groupId) { + return it.groupName + } + } + return context.getString(R.string.group) + } + + interface CallBack { + val groupList: List + } } \ No newline at end of file From 705c38cd09d0e092455812741b98d5046cf2835a Mon Sep 17 00:00:00 2001 From: kunfei Date: Thu, 6 Feb 2020 17:46:40 +0800 Subject: [PATCH 145/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/model/webBook/BookChapterList.kt | 27 +++++++++---------- .../ui/book/arrange/ArrangeBookActivity.kt | 10 ++++++- 2 files changed, 21 insertions(+), 16 deletions(-) diff --git a/app/src/main/java/io/legado/app/model/webBook/BookChapterList.kt b/app/src/main/java/io/legado/app/model/webBook/BookChapterList.kt index 8c92ae7ed..705321694 100644 --- a/app/src/main/java/io/legado/app/model/webBook/BookChapterList.kt +++ b/app/src/main/java/io/legado/app/model/webBook/BookChapterList.kt @@ -51,17 +51,17 @@ object BookChapterList { ruleUrl = nextUrl, book = book, headerMapF = bookSource.getHeaderMap() ).getResponseAwait() .body?.let { nextBody -> - chapterData = analyzeChapterList( - nextBody, nextUrl, tocRule, listRule, - book, bookSource, log = false - ) - nextUrl = if (chapterData.nextUrl.isNotEmpty()) - chapterData.nextUrl[0] - else "" - chapterData.chapterList?.let { - chapterList.addAll(it) - } + chapterData = analyzeChapterList( + nextBody, nextUrl, tocRule, listRule, + book, bookSource, log = false + ) + nextUrl = if (chapterData.nextUrl.isNotEmpty()) + chapterData.nextUrl[0] + else "" + chapterData.chapterList?.let { + chapterList.addAll(it) } + } } Debug.log(bookSource.bookSourceUrl, "◇目录总页数:${nextUrlList.size}") } else if (chapterData.nextUrl.size > 1) { @@ -100,11 +100,8 @@ object BookChapterList { item.index = index } book.latestChapterTitle = chapterList.last().title - if (book.durChapterIndex < chapterList.size) { - book.durChapterTitle = chapterList[book.durChapterIndex].title - } else { - book.durChapterTitle = book.latestChapterTitle - } + book.durChapterTitle = + chapterList.getOrNull(book.durChapterIndex)?.title ?: book.latestChapterTitle if (book.totalChapterNum < chapterList.size) { book.lastCheckCount = chapterList.size - book.totalChapterNum } diff --git a/app/src/main/java/io/legado/app/ui/book/arrange/ArrangeBookActivity.kt b/app/src/main/java/io/legado/app/ui/book/arrange/ArrangeBookActivity.kt index 5c9f9dfa4..9354cce4c 100644 --- a/app/src/main/java/io/legado/app/ui/book/arrange/ArrangeBookActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/arrange/ArrangeBookActivity.kt @@ -20,8 +20,9 @@ class ArrangeBookActivity : VMBaseActivity(R.layout.activi ArrangeBookAdapter.CallBack { override val viewModel: ArrangeBookViewModel get() = getViewModel(ArrangeBookViewModel::class.java) - override val groupList: List = arrayListOf() + override val groupList: ArrayList = arrayListOf() private lateinit var adapter: ArrangeBookAdapter + private var groupLiveData: LiveData>? = null private var booksLiveData: LiveData>? = null override fun onActivityCreated(savedInstanceState: Bundle?) { @@ -49,6 +50,13 @@ class ArrangeBookActivity : VMBaseActivity(R.layout.activi } private fun initData() { + groupLiveData?.removeObservers(this) + groupLiveData = App.db.bookGroupDao().liveDataAll() + groupLiveData?.observe(this, Observer { + groupList.clear() + groupList.addAll(it) + adapter.notifyDataSetChanged() + }) booksLiveData?.removeObservers(this) booksLiveData = App.db.bookDao().observeAll() booksLiveData?.observe(this, Observer { From 92dadc5842f90ff06d4897bdfce85d7716908e00 Mon Sep 17 00:00:00 2001 From: kunfei Date: Thu, 6 Feb 2020 18:03:23 +0800 Subject: [PATCH 146/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/book/arrange/ArrangeBookActivity.kt | 15 +++++++++++++++ .../app/ui/book/arrange/ArrangeBookAdapter.kt | 19 +++++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/app/src/main/java/io/legado/app/ui/book/arrange/ArrangeBookActivity.kt b/app/src/main/java/io/legado/app/ui/book/arrange/ArrangeBookActivity.kt index 9354cce4c..421bce7fd 100644 --- a/app/src/main/java/io/legado/app/ui/book/arrange/ArrangeBookActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/arrange/ArrangeBookActivity.kt @@ -64,5 +64,20 @@ class ArrangeBookActivity : VMBaseActivity(R.layout.activi }) } + override fun upSelectCount() { + if (adapter.selectedBooks.size == 0) { + cb_selected_all.isChecked = false + } else { + cb_selected_all.isChecked = adapter.selectedBooks.size >= adapter.getItems().size + } + //重置全选的文字 + if (cb_selected_all.isChecked) { + cb_selected_all.setText(R.string.cancel) + } else { + cb_selected_all.setText(R.string.select_all) + } + tv_select_count.text = + getString(R.string.select_count, adapter.selectedBooks.size, adapter.getItems().size) + } } \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/ui/book/arrange/ArrangeBookAdapter.kt b/app/src/main/java/io/legado/app/ui/book/arrange/ArrangeBookAdapter.kt index 718572606..eefadb9b3 100644 --- a/app/src/main/java/io/legado/app/ui/book/arrange/ArrangeBookAdapter.kt +++ b/app/src/main/java/io/legado/app/ui/book/arrange/ArrangeBookAdapter.kt @@ -7,17 +7,35 @@ import io.legado.app.base.adapter.SimpleRecyclerAdapter import io.legado.app.data.entities.Book import io.legado.app.data.entities.BookGroup import kotlinx.android.synthetic.main.item_arrange_book.view.* +import org.jetbrains.anko.sdk27.listeners.onClick class ArrangeBookAdapter(context: Context, val callBack: CallBack) : SimpleRecyclerAdapter(context, R.layout.item_arrange_book) { + val selectedBooks: ArrayList = arrayListOf() override fun convert(holder: ItemViewHolder, item: Book, payloads: MutableList) { with(holder.itemView) { tv_name.text = item.name tv_author.text = context.getString(R.string.author_show, item.author) tv_group.text = getGroupName(item.group) + checkbox.isChecked = selectedBooks.contains(item.bookUrl) + checkbox.onClick { + if (checkbox.isChecked) { + selectedBooks.add(item.bookUrl) + } else { + selectedBooks.remove(item.bookUrl) + } + } + onClick { + checkbox.isChecked = !checkbox.isChecked + if (checkbox.isChecked) { + selectedBooks.add(item.bookUrl) + } else { + selectedBooks.remove(item.bookUrl) + } + } } } @@ -32,5 +50,6 @@ class ArrangeBookAdapter(context: Context, val callBack: CallBack) : interface CallBack { val groupList: List + fun upSelectCount() } } \ No newline at end of file From e3389ff8afd6fd1f542469abeaceb7dd24f12ea7 Mon Sep 17 00:00:00 2001 From: kunfei Date: Thu, 6 Feb 2020 18:12:58 +0800 Subject: [PATCH 147/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/io/legado/app/ui/book/arrange/ArrangeBookActivity.kt | 1 + .../java/io/legado/app/ui/book/arrange/ArrangeBookAdapter.kt | 2 ++ 2 files changed, 3 insertions(+) diff --git a/app/src/main/java/io/legado/app/ui/book/arrange/ArrangeBookActivity.kt b/app/src/main/java/io/legado/app/ui/book/arrange/ArrangeBookActivity.kt index 421bce7fd..056b55999 100644 --- a/app/src/main/java/io/legado/app/ui/book/arrange/ArrangeBookActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/arrange/ArrangeBookActivity.kt @@ -61,6 +61,7 @@ class ArrangeBookActivity : VMBaseActivity(R.layout.activi booksLiveData = App.db.bookDao().observeAll() booksLiveData?.observe(this, Observer { adapter.setItems(it) + upSelectCount() }) } diff --git a/app/src/main/java/io/legado/app/ui/book/arrange/ArrangeBookAdapter.kt b/app/src/main/java/io/legado/app/ui/book/arrange/ArrangeBookAdapter.kt index eefadb9b3..c24011ee4 100644 --- a/app/src/main/java/io/legado/app/ui/book/arrange/ArrangeBookAdapter.kt +++ b/app/src/main/java/io/legado/app/ui/book/arrange/ArrangeBookAdapter.kt @@ -27,6 +27,7 @@ class ArrangeBookAdapter(context: Context, val callBack: CallBack) : } else { selectedBooks.remove(item.bookUrl) } + callBack.upSelectCount() } onClick { checkbox.isChecked = !checkbox.isChecked @@ -35,6 +36,7 @@ class ArrangeBookAdapter(context: Context, val callBack: CallBack) : } else { selectedBooks.remove(item.bookUrl) } + callBack.upSelectCount() } } } From 15585965f4e7cf40ca0be00836459820e0c763fe Mon Sep 17 00:00:00 2001 From: kunfei Date: Thu, 6 Feb 2020 18:20:54 +0800 Subject: [PATCH 148/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/ui/book/arrange/ArrangeBookActivity.kt | 4 ++++ .../app/ui/book/arrange/ArrangeBookAdapter.kt | 16 +++++++++++++++- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/io/legado/app/ui/book/arrange/ArrangeBookActivity.kt b/app/src/main/java/io/legado/app/ui/book/arrange/ArrangeBookActivity.kt index 056b55999..740afc1cc 100644 --- a/app/src/main/java/io/legado/app/ui/book/arrange/ArrangeBookActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/arrange/ArrangeBookActivity.kt @@ -14,6 +14,7 @@ import io.legado.app.data.entities.BookGroup import io.legado.app.lib.theme.ATH import io.legado.app.utils.getViewModel import kotlinx.android.synthetic.main.activity_arrange_book.* +import org.jetbrains.anko.sdk27.listeners.onClick class ArrangeBookActivity : VMBaseActivity(R.layout.activity_arrange_book), @@ -47,6 +48,9 @@ class ArrangeBookActivity : VMBaseActivity(R.layout.activi recycler_view.layoutManager = LinearLayoutManager(this) adapter = ArrangeBookAdapter(this, this) recycler_view.adapter = adapter + cb_selected_all.onClick { + adapter.selectAll(cb_selected_all.isChecked) + } } private fun initData() { diff --git a/app/src/main/java/io/legado/app/ui/book/arrange/ArrangeBookAdapter.kt b/app/src/main/java/io/legado/app/ui/book/arrange/ArrangeBookAdapter.kt index c24011ee4..75bc12c85 100644 --- a/app/src/main/java/io/legado/app/ui/book/arrange/ArrangeBookAdapter.kt +++ b/app/src/main/java/io/legado/app/ui/book/arrange/ArrangeBookAdapter.kt @@ -13,7 +13,21 @@ import org.jetbrains.anko.sdk27.listeners.onClick class ArrangeBookAdapter(context: Context, val callBack: CallBack) : SimpleRecyclerAdapter(context, R.layout.item_arrange_book) { - val selectedBooks: ArrayList = arrayListOf() + val selectedBooks: HashSet = hashSetOf() + + fun selectAll(selectAll: Boolean) { + if (selectAll) { + selectedBooks.clear() + notifyDataSetChanged() + callBack.upSelectCount() + } else { + getItems().forEach { + selectedBooks.add(it.bookUrl) + } + notifyDataSetChanged() + callBack.upSelectCount() + } + } override fun convert(holder: ItemViewHolder, item: Book, payloads: MutableList) { with(holder.itemView) { From b4df33d92ae98fa70cba0cc7493c87f8728f2385 Mon Sep 17 00:00:00 2001 From: kunfei Date: Thu, 6 Feb 2020 18:38:35 +0800 Subject: [PATCH 149/159] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index d65e3dbdc..1a035aaf5 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,3 @@ # legado ## 阅读3.0 +书源规则 https://celeter.github.io/?tdsourcetag=s_pctim_aiomsg From 0cce324ce375b5344d75f67171672ddc5f8e3eeb Mon Sep 17 00:00:00 2001 From: kunfei Date: Thu, 6 Feb 2020 18:40:32 +0800 Subject: [PATCH 150/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/ui/book/arrange/ArrangeBookActivity.kt | 8 ++------ .../app/ui/book/arrange/ArrangeBookAdapter.kt | 16 ++++++++++++---- 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/book/arrange/ArrangeBookActivity.kt b/app/src/main/java/io/legado/app/ui/book/arrange/ArrangeBookActivity.kt index 740afc1cc..936c7b70b 100644 --- a/app/src/main/java/io/legado/app/ui/book/arrange/ArrangeBookActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/arrange/ArrangeBookActivity.kt @@ -49,7 +49,7 @@ class ArrangeBookActivity : VMBaseActivity(R.layout.activi adapter = ArrangeBookAdapter(this, this) recycler_view.adapter = adapter cb_selected_all.onClick { - adapter.selectAll(cb_selected_all.isChecked) + adapter.selectAll(!adapter.isSelectAll()) } } @@ -70,11 +70,7 @@ class ArrangeBookActivity : VMBaseActivity(R.layout.activi } override fun upSelectCount() { - if (adapter.selectedBooks.size == 0) { - cb_selected_all.isChecked = false - } else { - cb_selected_all.isChecked = adapter.selectedBooks.size >= adapter.getItems().size - } + cb_selected_all.isChecked = adapter.isSelectAll() //重置全选的文字 if (cb_selected_all.isChecked) { cb_selected_all.setText(R.string.cancel) diff --git a/app/src/main/java/io/legado/app/ui/book/arrange/ArrangeBookAdapter.kt b/app/src/main/java/io/legado/app/ui/book/arrange/ArrangeBookAdapter.kt index 75bc12c85..890f29bad 100644 --- a/app/src/main/java/io/legado/app/ui/book/arrange/ArrangeBookAdapter.kt +++ b/app/src/main/java/io/legado/app/ui/book/arrange/ArrangeBookAdapter.kt @@ -15,17 +15,25 @@ class ArrangeBookAdapter(context: Context, val callBack: CallBack) : val selectedBooks: HashSet = hashSetOf() + fun isSelectAll(): Boolean { + return if (selectedBooks.isEmpty()) { + false + } else { + selectedBooks.size >= itemCount + } + } + fun selectAll(selectAll: Boolean) { if (selectAll) { - selectedBooks.clear() - notifyDataSetChanged() - callBack.upSelectCount() - } else { getItems().forEach { selectedBooks.add(it.bookUrl) } notifyDataSetChanged() callBack.upSelectCount() + } else { + selectedBooks.clear() + notifyDataSetChanged() + callBack.upSelectCount() } } From 6dcadcd5d71ae2ec58067041fed920fcd719f570 Mon Sep 17 00:00:00 2001 From: kunfei Date: Thu, 6 Feb 2020 19:17:26 +0800 Subject: [PATCH 151/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/book/arrange/ArrangeBookActivity.kt | 22 +++++++++++++++++++ .../app/ui/book/arrange/ArrangeBookAdapter.kt | 4 ++++ .../ui/book/arrange/ArrangeBookViewModel.kt | 5 +++++ app/src/main/res/values/strings.xml | 2 ++ 4 files changed, 33 insertions(+) diff --git a/app/src/main/java/io/legado/app/ui/book/arrange/ArrangeBookActivity.kt b/app/src/main/java/io/legado/app/ui/book/arrange/ArrangeBookActivity.kt index 936c7b70b..2f3658f89 100644 --- a/app/src/main/java/io/legado/app/ui/book/arrange/ArrangeBookActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/arrange/ArrangeBookActivity.kt @@ -11,10 +11,14 @@ import io.legado.app.R import io.legado.app.base.VMBaseActivity import io.legado.app.data.entities.Book import io.legado.app.data.entities.BookGroup +import io.legado.app.lib.dialogs.alert +import io.legado.app.lib.dialogs.okButton import io.legado.app.lib.theme.ATH +import io.legado.app.utils.applyTint import io.legado.app.utils.getViewModel import kotlinx.android.synthetic.main.activity_arrange_book.* import org.jetbrains.anko.sdk27.listeners.onClick +import org.jetbrains.anko.toast class ArrangeBookActivity : VMBaseActivity(R.layout.activity_arrange_book), @@ -51,6 +55,17 @@ class ArrangeBookActivity : VMBaseActivity(R.layout.activi cb_selected_all.onClick { adapter.selectAll(!adapter.isSelectAll()) } + btn_delete.onClick { + if (adapter.selectedBooks.isEmpty()) { + toast(R.string.non_select) + return@onClick + } + alert(titleResource = R.string.sure, messageResource = R.string.sure_del) { + okButton { + viewModel.deleteBook(*adapter.selectedBooks.toTypedArray()) + } + }.show().applyTint() + } } private fun initData() { @@ -81,4 +96,11 @@ class ArrangeBookActivity : VMBaseActivity(R.layout.activi getString(R.string.select_count, adapter.selectedBooks.size, adapter.getItems().size) } + override fun deleteBook(bookUrl: String) { + alert(titleResource = R.string.sure, messageResource = R.string.sure_del) { + okButton { + viewModel.deleteBook(bookUrl) + } + }.show().applyTint() + } } \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/ui/book/arrange/ArrangeBookAdapter.kt b/app/src/main/java/io/legado/app/ui/book/arrange/ArrangeBookAdapter.kt index 890f29bad..0a4fb5a52 100644 --- a/app/src/main/java/io/legado/app/ui/book/arrange/ArrangeBookAdapter.kt +++ b/app/src/main/java/io/legado/app/ui/book/arrange/ArrangeBookAdapter.kt @@ -60,6 +60,9 @@ class ArrangeBookAdapter(context: Context, val callBack: CallBack) : } callBack.upSelectCount() } + tv_delete.onClick { + callBack.deleteBook(item.bookUrl) + } } } @@ -75,5 +78,6 @@ class ArrangeBookAdapter(context: Context, val callBack: CallBack) : interface CallBack { val groupList: List fun upSelectCount() + fun deleteBook(bookUrl: String) } } \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/ui/book/arrange/ArrangeBookViewModel.kt b/app/src/main/java/io/legado/app/ui/book/arrange/ArrangeBookViewModel.kt index a6fa9463f..76e890886 100644 --- a/app/src/main/java/io/legado/app/ui/book/arrange/ArrangeBookViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/book/arrange/ArrangeBookViewModel.kt @@ -6,4 +6,9 @@ import io.legado.app.base.BaseViewModel class ArrangeBookViewModel(application: Application) : BaseViewModel(application) { + + fun deleteBook(vararg bookUrl: String) { + + } + } \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 7b6ebfbc4..fc4d73a1a 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -457,6 +457,8 @@ 网络连接不可用 + 确认 + 是否确认删除? 是否删除全部书籍? 是否同时删除已下载的书籍目录? 扫描二维码需相机权限 From e35bafb0f72cfc0ad447c50668ab9476c292576c Mon Sep 17 00:00:00 2001 From: kunfei Date: Thu, 6 Feb 2020 19:21:15 +0800 Subject: [PATCH 152/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../io/legado/app/ui/book/arrange/ArrangeBookActivity.kt | 7 +++++++ app/src/main/res/layout/activity_arrange_book.xml | 4 ++-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/book/arrange/ArrangeBookActivity.kt b/app/src/main/java/io/legado/app/ui/book/arrange/ArrangeBookActivity.kt index 2f3658f89..e985f8c8b 100644 --- a/app/src/main/java/io/legado/app/ui/book/arrange/ArrangeBookActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/arrange/ArrangeBookActivity.kt @@ -66,6 +66,13 @@ class ArrangeBookActivity : VMBaseActivity(R.layout.activi } }.show().applyTint() } + btn_to_group.onClick { + if (adapter.selectedBooks.isEmpty()) { + toast(R.string.non_select) + return@onClick + } + + } } private fun initData() { diff --git a/app/src/main/res/layout/activity_arrange_book.xml b/app/src/main/res/layout/activity_arrange_book.xml index 993b58b77..795e1bfa4 100644 --- a/app/src/main/res/layout/activity_arrange_book.xml +++ b/app/src/main/res/layout/activity_arrange_book.xml @@ -46,7 +46,7 @@ tools:ignore="RelativeOverlap" /> \ No newline at end of file From 541c2cecf59fb5775227ffa4993ab9cffaa05c18 Mon Sep 17 00:00:00 2001 From: kunfei Date: Thu, 6 Feb 2020 19:32:50 +0800 Subject: [PATCH 153/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bookshelf => book/group}/GroupManageDialog.kt | 10 ++++++++-- .../app/ui/book/{info => group}/GroupSelectDialog.kt | 7 +++++-- .../io/legado/app/ui/book/info/BookInfoActivity.kt | 1 + .../legado/app/ui/main/bookshelf/BookshelfFragment.kt | 1 + 4 files changed, 15 insertions(+), 4 deletions(-) rename app/src/main/java/io/legado/app/ui/{main/bookshelf => book/group}/GroupManageDialog.kt (96%) rename app/src/main/java/io/legado/app/ui/book/{info => group}/GroupSelectDialog.kt (98%) diff --git a/app/src/main/java/io/legado/app/ui/main/bookshelf/GroupManageDialog.kt b/app/src/main/java/io/legado/app/ui/book/group/GroupManageDialog.kt similarity index 96% rename from app/src/main/java/io/legado/app/ui/main/bookshelf/GroupManageDialog.kt rename to app/src/main/java/io/legado/app/ui/book/group/GroupManageDialog.kt index 1022f4ed9..af3723e11 100644 --- a/app/src/main/java/io/legado/app/ui/main/bookshelf/GroupManageDialog.kt +++ b/app/src/main/java/io/legado/app/ui/book/group/GroupManageDialog.kt @@ -1,4 +1,4 @@ -package io.legado.app.ui.main.bookshelf +package io.legado.app.ui.book.group import android.annotation.SuppressLint import android.content.Context @@ -25,6 +25,7 @@ import io.legado.app.lib.dialogs.alert import io.legado.app.lib.dialogs.customView import io.legado.app.lib.dialogs.noButton import io.legado.app.lib.dialogs.yesButton +import io.legado.app.ui.main.bookshelf.BookshelfViewModel import io.legado.app.utils.applyTint import io.legado.app.utils.getViewModel import io.legado.app.utils.requestInputMethod @@ -77,7 +78,12 @@ class GroupManageDialog : DialogFragment(), Toolbar.OnMenuItemClickListener { recycler_view.adapter = adapter App.db.bookGroupDao().liveDataAll().observe(viewLifecycleOwner, Observer { val diffResult = - DiffUtil.calculateDiff(GroupDiffCallBack(adapter.getItems(), it)) + DiffUtil.calculateDiff( + GroupDiffCallBack( + adapter.getItems(), + it + ) + ) adapter.setItems(it, false) diffResult.dispatchUpdatesTo(adapter) }) diff --git a/app/src/main/java/io/legado/app/ui/book/info/GroupSelectDialog.kt b/app/src/main/java/io/legado/app/ui/book/group/GroupSelectDialog.kt similarity index 98% rename from app/src/main/java/io/legado/app/ui/book/info/GroupSelectDialog.kt rename to app/src/main/java/io/legado/app/ui/book/group/GroupSelectDialog.kt index 517f9dc9d..6dbdbd17b 100644 --- a/app/src/main/java/io/legado/app/ui/book/info/GroupSelectDialog.kt +++ b/app/src/main/java/io/legado/app/ui/book/group/GroupSelectDialog.kt @@ -1,4 +1,4 @@ -package io.legado.app.ui.book.info +package io.legado.app.ui.book.group import android.annotation.SuppressLint import android.content.Context @@ -44,7 +44,10 @@ class GroupSelectDialog : DialogFragment(), Toolbar.OnMenuItemClickListener { fun show(manager: FragmentManager) { val fragment = GroupSelectDialog() - fragment.show(manager, tag) + fragment.show( + manager, + tag + ) } } diff --git a/app/src/main/java/io/legado/app/ui/book/info/BookInfoActivity.kt b/app/src/main/java/io/legado/app/ui/book/info/BookInfoActivity.kt index 6b0e5433f..cf86b2f04 100644 --- a/app/src/main/java/io/legado/app/ui/book/info/BookInfoActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/info/BookInfoActivity.kt @@ -21,6 +21,7 @@ import io.legado.app.help.BlurTransformation import io.legado.app.help.ImageLoader import io.legado.app.help.IntentDataHelp import io.legado.app.ui.audio.AudioPlayActivity +import io.legado.app.ui.book.group.GroupSelectDialog import io.legado.app.ui.book.info.edit.BookInfoEditActivity import io.legado.app.ui.book.read.ReadBookActivity import io.legado.app.ui.book.source.edit.BookSourceEditActivity diff --git a/app/src/main/java/io/legado/app/ui/main/bookshelf/BookshelfFragment.kt b/app/src/main/java/io/legado/app/ui/main/bookshelf/BookshelfFragment.kt index e3c68dcaa..c51bd46e2 100644 --- a/app/src/main/java/io/legado/app/ui/main/bookshelf/BookshelfFragment.kt +++ b/app/src/main/java/io/legado/app/ui/main/bookshelf/BookshelfFragment.kt @@ -22,6 +22,7 @@ import io.legado.app.lib.theme.ATH import io.legado.app.lib.theme.accentColor import io.legado.app.lib.theme.view.ATEAutoCompleteTextView import io.legado.app.ui.book.arrange.ArrangeBookActivity +import io.legado.app.ui.book.group.GroupManageDialog import io.legado.app.ui.book.search.SearchActivity import io.legado.app.ui.download.DownloadActivity import io.legado.app.ui.importbook.ImportBookActivity From 9c7e5d9a279c9530227944aeaedfeb4b05d7c009 Mon Sep 17 00:00:00 2001 From: kunfei Date: Thu, 6 Feb 2020 19:39:34 +0800 Subject: [PATCH 154/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/io/legado/app/data/entities/Book.kt | 10 +++++----- .../legado/app/ui/book/arrange/ArrangeBookActivity.kt | 6 +++++- .../legado/app/ui/book/arrange/ArrangeBookAdapter.kt | 4 ++++ 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/io/legado/app/data/entities/Book.kt b/app/src/main/java/io/legado/app/data/entities/Book.kt index 0c43860f0..204d2de7a 100644 --- a/app/src/main/java/io/legado/app/data/entities/Book.kt +++ b/app/src/main/java/io/legado/app/data/entities/Book.kt @@ -21,14 +21,14 @@ data class Book( var tocUrl: String = "", // 目录页Url (toc=table of Contents) var origin: String = BookType.local, // 书源URL(默认BookType.local) var originName: String = "", //书源名称 or 本地书籍文件名 - var name: String = "", // 书籍名称(书源获取) - var author: String = "", // 作者名称(书源获取) - override var kind: String? = null, // 分类信息(书源获取) + var name: String = "", // 书籍名称(书源获取) + var author: String = "", // 作者名称(书源获取) + override var kind: String? = null, // 分类信息(书源获取) var customTag: String? = null, // 分类信息(用户修改) var coverUrl: String? = null, // 封面Url(书源获取) var customCoverUrl: String? = null, // 封面Url(用户修改) - var intro: String? = null, // 简介内容(书源获取) - var customIntro: String? = null, // 简介内容(用户修改) + var intro: String? = null, // 简介内容(书源获取) + var customIntro: String? = null, // 简介内容(用户修改) var charset: String? = null, // 自定义字符集名称(仅适用于本地书籍) var type: Int = 0, // @BookType var group: Int = 0, // 自定义分组索引号 diff --git a/app/src/main/java/io/legado/app/ui/book/arrange/ArrangeBookActivity.kt b/app/src/main/java/io/legado/app/ui/book/arrange/ArrangeBookActivity.kt index e985f8c8b..3baabc568 100644 --- a/app/src/main/java/io/legado/app/ui/book/arrange/ArrangeBookActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/arrange/ArrangeBookActivity.kt @@ -71,7 +71,7 @@ class ArrangeBookActivity : VMBaseActivity(R.layout.activi toast(R.string.non_select) return@onClick } - + selectGroup() } } @@ -91,6 +91,10 @@ class ArrangeBookActivity : VMBaseActivity(R.layout.activi }) } + override fun selectGroup() { + + } + override fun upSelectCount() { cb_selected_all.isChecked = adapter.isSelectAll() //重置全选的文字 diff --git a/app/src/main/java/io/legado/app/ui/book/arrange/ArrangeBookAdapter.kt b/app/src/main/java/io/legado/app/ui/book/arrange/ArrangeBookAdapter.kt index 0a4fb5a52..44fdecda7 100644 --- a/app/src/main/java/io/legado/app/ui/book/arrange/ArrangeBookAdapter.kt +++ b/app/src/main/java/io/legado/app/ui/book/arrange/ArrangeBookAdapter.kt @@ -63,6 +63,9 @@ class ArrangeBookAdapter(context: Context, val callBack: CallBack) : tv_delete.onClick { callBack.deleteBook(item.bookUrl) } + tv_group.onClick { + callBack.selectGroup() + } } } @@ -79,5 +82,6 @@ class ArrangeBookAdapter(context: Context, val callBack: CallBack) : val groupList: List fun upSelectCount() fun deleteBook(bookUrl: String) + fun selectGroup() } } \ No newline at end of file From 07ca45d5aeeede74ec33f56095238c5b472562c3 Mon Sep 17 00:00:00 2001 From: kunfei Date: Thu, 6 Feb 2020 20:29:45 +0800 Subject: [PATCH 155/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../io/legado/app/data/dao/BookSourceDao.kt | 17 +------ .../io/legado/app/data/entities/BookSource.kt | 12 +++++ .../io/legado/app/service/help/CheckSource.kt | 9 +++- .../book/source/manage/BookSourceActivity.kt | 20 ++++---- .../book/source/manage/BookSourceAdapter.kt | 26 +++++----- .../book/source/manage/BookSourceViewModel.kt | 48 +++++++++---------- 6 files changed, 65 insertions(+), 67 deletions(-) diff --git a/app/src/main/java/io/legado/app/data/dao/BookSourceDao.kt b/app/src/main/java/io/legado/app/data/dao/BookSourceDao.kt index 159622898..ce8dfe950 100644 --- a/app/src/main/java/io/legado/app/data/dao/BookSourceDao.kt +++ b/app/src/main/java/io/legado/app/data/dao/BookSourceDao.kt @@ -29,21 +29,6 @@ interface BookSourceDao { @Query("select distinct enabled from book_sources where bookSourceName like :searchKey or bookSourceGroup like :searchKey or bookSourceUrl like :searchKey") fun searchIsEnable(searchKey: String = ""): List - @Query("update book_sources set enabled = 1 where bookSourceUrl = :sourceUrl") - fun enableSection(sourceUrl: String) - - @Query("update book_sources set enabled = 0 where bookSourceUrl = :sourceUrl") - fun disableSection(sourceUrl: String) - - @Query("update book_sources set enabledExplore = 1 where bookSourceUrl = :sourceUrl") - fun enableSectionExplore(sourceUrl: String) - - @Query("update book_sources set enabledExplore = 0 where bookSourceUrl = :sourceUrl") - fun disableSectionExplore(sourceUrl: String) - - @Query("delete from book_sources where bookSourceUrl = :sourceUrl") - fun delSection(sourceUrl: String) - @Query("select * from book_sources where enabledExplore = 1 order by customOrder asc") fun observeFind(): DataSource.Factory @@ -78,7 +63,7 @@ interface BookSourceDao { fun update(vararg bookSource: BookSource) @Delete - fun delete(bookSource: BookSource) + fun delete(vararg bookSource: BookSource) @Query("delete from book_sources where bookSourceUrl = :key") fun delete(key: String) diff --git a/app/src/main/java/io/legado/app/data/entities/BookSource.kt b/app/src/main/java/io/legado/app/data/entities/BookSource.kt index bab3a7b5e..78852a4ec 100644 --- a/app/src/main/java/io/legado/app/data/entities/BookSource.kt +++ b/app/src/main/java/io/legado/app/data/entities/BookSource.kt @@ -47,6 +47,18 @@ data class BookSource( var ruleToc: String? = null, // 目录页规则 var ruleContent: String? = null // 正文页规则 ) : Parcelable, JsExtensions { + + override fun hashCode(): Int { + return bookSourceUrl.hashCode() + } + + override fun equals(other: Any?): Boolean { + if (other is BookSource) { + return other.bookSourceUrl == bookSourceUrl + } + return false + } + @Ignore @IgnoredOnParcel private var searchRuleV: SearchRule? = null diff --git a/app/src/main/java/io/legado/app/service/help/CheckSource.kt b/app/src/main/java/io/legado/app/service/help/CheckSource.kt index 057813337..1f13723a2 100644 --- a/app/src/main/java/io/legado/app/service/help/CheckSource.kt +++ b/app/src/main/java/io/legado/app/service/help/CheckSource.kt @@ -4,16 +4,21 @@ import android.content.Context import android.content.Intent import io.legado.app.R import io.legado.app.constant.IntentAction +import io.legado.app.data.entities.BookSource import io.legado.app.service.CheckSourceService import org.jetbrains.anko.toast object CheckSource { - fun start(context: Context, selectedIds: ArrayList) { - if (selectedIds.isEmpty()) { + fun start(context: Context, sources: LinkedHashSet) { + if (sources.isEmpty()) { context.toast(R.string.non_select) return } + val selectedIds: ArrayList = arrayListOf() + sources.map { + selectedIds.add(it.bookSourceUrl) + } Intent(context, CheckSourceService::class.java).let { it.action = IntentAction.start it.putExtra("selectIds", selectedIds) diff --git a/app/src/main/java/io/legado/app/ui/book/source/manage/BookSourceActivity.kt b/app/src/main/java/io/legado/app/ui/book/source/manage/BookSourceActivity.kt index 82d823a0a..4f9fea1df 100644 --- a/app/src/main/java/io/legado/app/ui/book/source/manage/BookSourceActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/source/manage/BookSourceActivity.kt @@ -80,20 +80,18 @@ class BookSourceActivity : VMBaseActivity(R.layout.activity when (item.itemId) { R.id.menu_add_book_source -> startActivity() R.id.menu_import_source_qr -> startActivityForResult(qrRequestCode) - R.id.menu_group_manage -> GroupManageDialog().show( - supportFragmentManager, - "groupManage" - ) + R.id.menu_group_manage -> + GroupManageDialog().show(supportFragmentManager, "groupManage") R.id.menu_import_source_local -> selectFileSys() R.id.menu_select_all -> adapter.selectAll() R.id.menu_revert_selection -> adapter.revertSelection() - R.id.menu_enable_selection -> viewModel.enableSelection(adapter.getSelectionIds()) - R.id.menu_disable_selection -> viewModel.disableSelection(adapter.getSelectionIds()) - R.id.menu_enable_explore -> viewModel.enableSelectExplore(adapter.getSelectionIds()) - R.id.menu_disable_explore -> viewModel.disableSelectExplore(adapter.getSelectionIds()) - R.id.menu_del_selection -> viewModel.delSelection(adapter.getSelectionIds()) - R.id.menu_export_selection -> viewModel.exportSelection(adapter.getSelectionIds()) - R.id.menu_check_source -> CheckSource.start(this, ArrayList(adapter.getSelectionIds())) + R.id.menu_enable_selection -> viewModel.enableSelection(adapter.getSelection()) + R.id.menu_disable_selection -> viewModel.disableSelection(adapter.getSelection()) + R.id.menu_enable_explore -> viewModel.enableSelectExplore(adapter.getSelection()) + R.id.menu_disable_explore -> viewModel.disableSelectExplore(adapter.getSelection()) + R.id.menu_del_selection -> viewModel.delSelection(adapter.getSelection()) + R.id.menu_export_selection -> viewModel.exportSelection(adapter.getSelection()) + R.id.menu_check_source -> CheckSource.start(this, adapter.getSelection()) R.id.menu_import_source_onLine -> showImportDialog() } if (item.groupId == R.id.source_group) { diff --git a/app/src/main/java/io/legado/app/ui/book/source/manage/BookSourceAdapter.kt b/app/src/main/java/io/legado/app/ui/book/source/manage/BookSourceAdapter.kt index c7c432e16..e29a39d2b 100644 --- a/app/src/main/java/io/legado/app/ui/book/source/manage/BookSourceAdapter.kt +++ b/app/src/main/java/io/legado/app/ui/book/source/manage/BookSourceAdapter.kt @@ -16,31 +16,31 @@ class BookSourceAdapter(context: Context, val callBack: CallBack) : SimpleRecyclerAdapter(context, R.layout.item_book_source), OnItemTouchCallbackListener { - private val selectedIds = linkedSetOf() + private val selected = linkedSetOf() fun selectAll() { getItems().forEach { - selectedIds.add(it.bookSourceUrl) + selected.add(it) } notifyItemRangeChanged(0, itemCount, 1) } fun revertSelection() { getItems().forEach { - if (selectedIds.contains(it.bookSourceUrl)) { - selectedIds.remove(it.bookSourceUrl) + if (selected.contains(it)) { + selected.remove(it) } else { - selectedIds.add(it.bookSourceUrl) + selected.add(it) } } notifyItemRangeChanged(0, itemCount, 1) } - fun getSelectionIds(): LinkedHashSet { - val selection = linkedSetOf() + fun getSelection(): LinkedHashSet { + val selection = linkedSetOf() getItems().map { - if (selectedIds.contains(it.bookSourceUrl)) { - selection.add(it.bookSourceUrl) + if (selected.contains(it)) { + selection.add(it) } } return selection @@ -81,12 +81,12 @@ class BookSourceAdapter(context: Context, val callBack: CallBack) : item.enabled = swt_enabled.isChecked callBack.update(item) } - cb_book_source.isChecked = selectedIds.contains(item.bookSourceUrl) + cb_book_source.isChecked = selected.contains(item) cb_book_source.setOnClickListener { if (cb_book_source.isChecked) { - selectedIds.add(item.bookSourceUrl) + selected.add(item) } else { - selectedIds.remove(item.bookSourceUrl) + selected.remove(item) } } iv_edit.onClick { callBack.edit(item) } @@ -105,7 +105,7 @@ class BookSourceAdapter(context: Context, val callBack: CallBack) : } } else { when (payloads[0]) { - 1 -> cb_book_source.isChecked = selectedIds.contains(item.bookSourceUrl) + 1 -> cb_book_source.isChecked = selected.contains(item) 2 -> swt_enabled.isChecked = item.enabled } } diff --git a/app/src/main/java/io/legado/app/ui/book/source/manage/BookSourceViewModel.kt b/app/src/main/java/io/legado/app/ui/book/source/manage/BookSourceViewModel.kt index 554ae4165..9bbaccfb9 100644 --- a/app/src/main/java/io/legado/app/ui/book/source/manage/BookSourceViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/book/source/manage/BookSourceViewModel.kt @@ -43,56 +43,54 @@ class BookSourceViewModel(application: Application) : BaseViewModel(application) } } - fun enableSelection(ids: LinkedHashSet) { + fun enableSelection(sources: LinkedHashSet) { execute { - ids.forEach { - App.db.bookSourceDao().enableSection(it) + sources.forEach { + it.enabled = true } + App.db.bookSourceDao().update(*sources.toTypedArray()) } } - fun disableSelection(ids: LinkedHashSet) { + fun disableSelection(sources: LinkedHashSet) { execute { - ids.forEach { - App.db.bookSourceDao().disableSection(it) + sources.forEach { + it.enabled = false } + App.db.bookSourceDao().update(*sources.toTypedArray()) } } - fun enableSelectExplore(ids: LinkedHashSet) { + fun enableSelectExplore(sources: LinkedHashSet) { execute { - ids.forEach { - App.db.bookSourceDao().enableSectionExplore(it) + sources.forEach { + it.enabledExplore = true } + App.db.bookSourceDao().update(*sources.toTypedArray()) } } - fun disableSelectExplore(ids: LinkedHashSet) { + fun disableSelectExplore(sources: LinkedHashSet) { execute { - ids.forEach { - App.db.bookSourceDao().disableSectionExplore(it) + sources.forEach { + it.enabledExplore = false } + App.db.bookSourceDao().update(*sources.toTypedArray()) } } - fun delSelection(ids: LinkedHashSet) { + fun delSelection(sources: LinkedHashSet) { execute { - ids.forEach { - App.db.bookSourceDao().delSection(it) - } + App.db.bookSourceDao().delete(*sources.toTypedArray()) } } - fun exportSelection(ids: LinkedHashSet) { + fun exportSelection(sources: LinkedHashSet) { execute { - ids.map { - App.db.bookSourceDao().getBookSource(it) - }.let { - val json = GSON.toJson(it) - val file = - FileUtils.createFileIfNotExist(Backup.exportPath + File.separator + "exportBookSource.json") - file.writeText(json) - } + val json = GSON.toJson(sources) + val file = + FileUtils.createFileIfNotExist(Backup.exportPath + File.separator + "exportBookSource.json") + file.writeText(json) }.onSuccess { context.toast("成功导出至\n${Backup.exportPath}") }.onError { From 7712df964ef3b05bf8eb3c03892171702e5c4e78 Mon Sep 17 00:00:00 2001 From: kunfei Date: Thu, 6 Feb 2020 20:31:59 +0800 Subject: [PATCH 156/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/ui/book/source/manage/BookSourceAdapter.kt | 1 - .../legado/app/ui/book/source/manage/DiffCallBack.kt | 10 ---------- 2 files changed, 11 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/book/source/manage/BookSourceAdapter.kt b/app/src/main/java/io/legado/app/ui/book/source/manage/BookSourceAdapter.kt index e29a39d2b..8f5c3c9bc 100644 --- a/app/src/main/java/io/legado/app/ui/book/source/manage/BookSourceAdapter.kt +++ b/app/src/main/java/io/legado/app/ui/book/source/manage/BookSourceAdapter.kt @@ -106,7 +106,6 @@ class BookSourceAdapter(context: Context, val callBack: CallBack) : } else { when (payloads[0]) { 1 -> cb_book_source.isChecked = selected.contains(item) - 2 -> swt_enabled.isChecked = item.enabled } } } diff --git a/app/src/main/java/io/legado/app/ui/book/source/manage/DiffCallBack.kt b/app/src/main/java/io/legado/app/ui/book/source/manage/DiffCallBack.kt index 0e8d9bead..6eb02037a 100644 --- a/app/src/main/java/io/legado/app/ui/book/source/manage/DiffCallBack.kt +++ b/app/src/main/java/io/legado/app/ui/book/source/manage/DiffCallBack.kt @@ -30,14 +30,4 @@ class DiffCallBack( && oldItem.enabled == newItem.enabled } - override fun getChangePayload(oldItemPosition: Int, newItemPosition: Int): Any? { - val oldItem = oldItems[oldItemPosition] - val newItem = newItems[newItemPosition] - return when { - oldItem.bookSourceName == newItem.bookSourceName - && oldItem.bookSourceGroup == newItem.bookSourceGroup - && oldItem.enabled != newItem.enabled -> 2 - else -> null - } - } } \ No newline at end of file From 5e6ddf402b1a3abcdef21433a36a5c8316e47f66 Mon Sep 17 00:00:00 2001 From: kunfei Date: Thu, 6 Feb 2020 20:40:31 +0800 Subject: [PATCH 157/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/io/legado/app/data/dao/BookDao.kt | 5 ++++- .../legado/app/ui/audio/AudioPlayViewModel.kt | 4 ++-- .../app/ui/book/arrange/ArrangeBookActivity.kt | 4 ++-- .../app/ui/book/arrange/ArrangeBookAdapter.kt | 18 +++++++++--------- .../ui/book/arrange/ArrangeBookViewModel.kt | 8 ++++++-- .../app/ui/book/info/BookInfoViewModel.kt | 4 ++-- .../app/ui/book/read/ReadBookViewModel.kt | 4 ++-- 7 files changed, 27 insertions(+), 20 deletions(-) diff --git a/app/src/main/java/io/legado/app/data/dao/BookDao.kt b/app/src/main/java/io/legado/app/data/dao/BookDao.kt index cbd0f61ce..30d275df7 100644 --- a/app/src/main/java/io/legado/app/data/dao/BookDao.kt +++ b/app/src/main/java/io/legado/app/data/dao/BookDao.kt @@ -60,7 +60,10 @@ interface BookDao { fun insert(vararg book: Book) @Update - fun update(vararg books: Book) + fun update(vararg book: Book) + + @Delete + fun delete(vararg book: Book) @Query("delete from books where bookUrl = :bookUrl") fun delete(bookUrl: String) diff --git a/app/src/main/java/io/legado/app/ui/audio/AudioPlayViewModel.kt b/app/src/main/java/io/legado/app/ui/audio/AudioPlayViewModel.kt index 5adc2c7be..b5dd5bfba 100644 --- a/app/src/main/java/io/legado/app/ui/audio/AudioPlayViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/audio/AudioPlayViewModel.kt @@ -91,7 +91,7 @@ class AudioPlayViewModel(application: Application) : BaseViewModel(application) fun changeTo(book1: Book) { execute { AudioPlay.book?.let { - App.db.bookDao().delete(it.bookUrl) + App.db.bookDao().delete(it) } withContext(Dispatchers.Main) { @@ -142,7 +142,7 @@ class AudioPlayViewModel(application: Application) : BaseViewModel(application) fun removeFromBookshelf(success: (() -> Unit)?) { execute { AudioPlay.book?.let { - App.db.bookDao().delete(it.bookUrl) + App.db.bookDao().delete(it) } }.onSuccess { success?.invoke() diff --git a/app/src/main/java/io/legado/app/ui/book/arrange/ArrangeBookActivity.kt b/app/src/main/java/io/legado/app/ui/book/arrange/ArrangeBookActivity.kt index 3baabc568..b6204e90b 100644 --- a/app/src/main/java/io/legado/app/ui/book/arrange/ArrangeBookActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/arrange/ArrangeBookActivity.kt @@ -107,10 +107,10 @@ class ArrangeBookActivity : VMBaseActivity(R.layout.activi getString(R.string.select_count, adapter.selectedBooks.size, adapter.getItems().size) } - override fun deleteBook(bookUrl: String) { + override fun deleteBook(book: Book) { alert(titleResource = R.string.sure, messageResource = R.string.sure_del) { okButton { - viewModel.deleteBook(bookUrl) + viewModel.deleteBook(book) } }.show().applyTint() } diff --git a/app/src/main/java/io/legado/app/ui/book/arrange/ArrangeBookAdapter.kt b/app/src/main/java/io/legado/app/ui/book/arrange/ArrangeBookAdapter.kt index 44fdecda7..dab74dc4b 100644 --- a/app/src/main/java/io/legado/app/ui/book/arrange/ArrangeBookAdapter.kt +++ b/app/src/main/java/io/legado/app/ui/book/arrange/ArrangeBookAdapter.kt @@ -13,7 +13,7 @@ import org.jetbrains.anko.sdk27.listeners.onClick class ArrangeBookAdapter(context: Context, val callBack: CallBack) : SimpleRecyclerAdapter(context, R.layout.item_arrange_book) { - val selectedBooks: HashSet = hashSetOf() + val selectedBooks: HashSet = hashSetOf() fun isSelectAll(): Boolean { return if (selectedBooks.isEmpty()) { @@ -26,7 +26,7 @@ class ArrangeBookAdapter(context: Context, val callBack: CallBack) : fun selectAll(selectAll: Boolean) { if (selectAll) { getItems().forEach { - selectedBooks.add(it.bookUrl) + selectedBooks.add(it) } notifyDataSetChanged() callBack.upSelectCount() @@ -42,26 +42,26 @@ class ArrangeBookAdapter(context: Context, val callBack: CallBack) : tv_name.text = item.name tv_author.text = context.getString(R.string.author_show, item.author) tv_group.text = getGroupName(item.group) - checkbox.isChecked = selectedBooks.contains(item.bookUrl) + checkbox.isChecked = selectedBooks.contains(item) checkbox.onClick { if (checkbox.isChecked) { - selectedBooks.add(item.bookUrl) + selectedBooks.add(item) } else { - selectedBooks.remove(item.bookUrl) + selectedBooks.remove(item) } callBack.upSelectCount() } onClick { checkbox.isChecked = !checkbox.isChecked if (checkbox.isChecked) { - selectedBooks.add(item.bookUrl) + selectedBooks.add(item) } else { - selectedBooks.remove(item.bookUrl) + selectedBooks.remove(item) } callBack.upSelectCount() } tv_delete.onClick { - callBack.deleteBook(item.bookUrl) + callBack.deleteBook(item) } tv_group.onClick { callBack.selectGroup() @@ -81,7 +81,7 @@ class ArrangeBookAdapter(context: Context, val callBack: CallBack) : interface CallBack { val groupList: List fun upSelectCount() - fun deleteBook(bookUrl: String) + fun deleteBook(book: Book) fun selectGroup() } } \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/ui/book/arrange/ArrangeBookViewModel.kt b/app/src/main/java/io/legado/app/ui/book/arrange/ArrangeBookViewModel.kt index 76e890886..c7e571447 100644 --- a/app/src/main/java/io/legado/app/ui/book/arrange/ArrangeBookViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/book/arrange/ArrangeBookViewModel.kt @@ -1,14 +1,18 @@ package io.legado.app.ui.book.arrange import android.app.Application +import io.legado.app.App import io.legado.app.base.BaseViewModel +import io.legado.app.data.entities.Book class ArrangeBookViewModel(application: Application) : BaseViewModel(application) { - fun deleteBook(vararg bookUrl: String) { - + fun deleteBook(vararg book: Book) { + execute { + App.db.bookDao().delete() + } } } \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/ui/book/info/BookInfoViewModel.kt b/app/src/main/java/io/legado/app/ui/book/info/BookInfoViewModel.kt index 0a54aaeac..d7ff22277 100644 --- a/app/src/main/java/io/legado/app/ui/book/info/BookInfoViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/book/info/BookInfoViewModel.kt @@ -137,7 +137,7 @@ class BookInfoViewModel(application: Application) : BaseViewModel(application) { execute { if (inBookshelf) { bookData.value?.let { - App.db.bookDao().delete(it.bookUrl) + App.db.bookDao().delete(it) } App.db.bookDao().insert(book) } @@ -202,7 +202,7 @@ class BookInfoViewModel(application: Application) : BaseViewModel(application) { fun delBook(success: (() -> Unit)?) { execute { bookData.value?.let { - App.db.bookDao().delete(it.bookUrl) + App.db.bookDao().delete(it) } inBookshelf = false }.onSuccess { diff --git a/app/src/main/java/io/legado/app/ui/book/read/ReadBookViewModel.kt b/app/src/main/java/io/legado/app/ui/book/read/ReadBookViewModel.kt index bb4ef95f0..ed5d9d04d 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/ReadBookViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/ReadBookViewModel.kt @@ -128,7 +128,7 @@ class ReadBookViewModel(application: Application) : BaseViewModel(application) { fun changeTo(book1: Book) { execute { ReadBook.book?.let { - App.db.bookDao().delete(it.bookUrl) + App.db.bookDao().delete(it) } ReadBook.prevTextChapter = null ReadBook.curTextChapter = null @@ -185,7 +185,7 @@ class ReadBookViewModel(application: Application) : BaseViewModel(application) { fun removeFromBookshelf(success: (() -> Unit)?) { execute { ReadBook.book?.let { - App.db.bookDao().delete(it.bookUrl) + App.db.bookDao().delete(it) } }.onSuccess { success?.invoke() From eb54b86187eaeb2ca26e5be061263fc164cecccb Mon Sep 17 00:00:00 2001 From: kunfei Date: Thu, 6 Feb 2020 20:41:23 +0800 Subject: [PATCH 158/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/io/legado/app/data/dao/BookDao.kt | 3 --- 1 file changed, 3 deletions(-) diff --git a/app/src/main/java/io/legado/app/data/dao/BookDao.kt b/app/src/main/java/io/legado/app/data/dao/BookDao.kt index 30d275df7..399f79c45 100644 --- a/app/src/main/java/io/legado/app/data/dao/BookDao.kt +++ b/app/src/main/java/io/legado/app/data/dao/BookDao.kt @@ -65,9 +65,6 @@ interface BookDao { @Delete fun delete(vararg book: Book) - @Query("delete from books where bookUrl = :bookUrl") - fun delete(bookUrl: String) - @Query("update books set durChapterPos = :pos where bookUrl = :bookUrl") fun upProgress(bookUrl: String, pos: Int) } \ No newline at end of file From e62f842635917835170180456df41e5b36a2a612 Mon Sep 17 00:00:00 2001 From: kunfei Date: Thu, 6 Feb 2020 21:34:20 +0800 Subject: [PATCH 159/159] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../book/source/manage/BookSourceAdapter.kt | 22 ++++++++++---- .../app/ui/book/source/manage/DiffCallBack.kt | 29 +++++++++++++++++-- 2 files changed, 43 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/book/source/manage/BookSourceAdapter.kt b/app/src/main/java/io/legado/app/ui/book/source/manage/BookSourceAdapter.kt index 8f5c3c9bc..c5660e07d 100644 --- a/app/src/main/java/io/legado/app/ui/book/source/manage/BookSourceAdapter.kt +++ b/app/src/main/java/io/legado/app/ui/book/source/manage/BookSourceAdapter.kt @@ -1,8 +1,10 @@ package io.legado.app.ui.book.source.manage import android.content.Context +import android.os.Bundle import android.view.Menu import android.widget.PopupMenu +import androidx.core.os.bundleOf import io.legado.app.R import io.legado.app.base.adapter.ItemViewHolder import io.legado.app.base.adapter.SimpleRecyclerAdapter @@ -22,7 +24,7 @@ class BookSourceAdapter(context: Context, val callBack: CallBack) : getItems().forEach { selected.add(it) } - notifyItemRangeChanged(0, itemCount, 1) + notifyItemRangeChanged(0, itemCount, bundleOf(Pair("selected", null))) } fun revertSelection() { @@ -33,7 +35,7 @@ class BookSourceAdapter(context: Context, val callBack: CallBack) : selected.add(it) } } - notifyItemRangeChanged(0, itemCount, 1) + notifyItemRangeChanged(0, itemCount, bundleOf(Pair("selected", null))) } fun getSelection(): LinkedHashSet { @@ -68,7 +70,8 @@ class BookSourceAdapter(context: Context, val callBack: CallBack) : override fun convert(holder: ItemViewHolder, item: BookSource, payloads: MutableList) { with(holder.itemView) { - if (payloads.isEmpty()) { + val payload = payloads.getOrNull(0) as? Bundle + if (payload == null) { this.setBackgroundColor(context.backgroundColor) if (item.bookSourceGroup.isNullOrEmpty()) { cb_book_source.text = item.bookSourceName @@ -104,8 +107,17 @@ class BookSourceAdapter(context: Context, val callBack: CallBack) : popupMenu.show() } } else { - when (payloads[0]) { - 1 -> cb_book_source.isChecked = selected.contains(item) + payload.keySet().map { + when (it) { + "select" -> cb_book_source.isChecked = selected.contains(item) + "name", "group" -> if (item.bookSourceGroup.isNullOrEmpty()) { + cb_book_source.text = item.bookSourceName + } else { + cb_book_source.text = + String.format("%s (%s)", item.bookSourceName, item.bookSourceGroup) + } + "enabled" -> swt_enabled.isChecked = payload.getBoolean(it) + } } } } diff --git a/app/src/main/java/io/legado/app/ui/book/source/manage/DiffCallBack.kt b/app/src/main/java/io/legado/app/ui/book/source/manage/DiffCallBack.kt index 6eb02037a..da0d1292e 100644 --- a/app/src/main/java/io/legado/app/ui/book/source/manage/DiffCallBack.kt +++ b/app/src/main/java/io/legado/app/ui/book/source/manage/DiffCallBack.kt @@ -1,5 +1,6 @@ package io.legado.app.ui.book.source.manage +import android.os.Bundle import androidx.recyclerview.widget.DiffUtil import io.legado.app.data.entities.BookSource @@ -25,9 +26,31 @@ class DiffCallBack( override fun areContentsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean { val oldItem = oldItems[oldItemPosition] val newItem = newItems[newItemPosition] - return oldItem.bookSourceName == newItem.bookSourceName - && oldItem.bookSourceGroup == newItem.bookSourceGroup - && oldItem.enabled == newItem.enabled + if (oldItem.bookSourceName != newItem.bookSourceName) + return false + if (oldItem.bookSourceGroup != newItem.bookSourceGroup) + return false + if (oldItem.enabled != newItem.enabled) + return false + return true } + override fun getChangePayload(oldItemPosition: Int, newItemPosition: Int): Any? { + val oldItem = oldItems[oldItemPosition] + val newItem = newItems[newItemPosition] + val payload = Bundle() + if (oldItem.bookSourceName != newItem.bookSourceName) { + payload.putString("name", newItem.bookSourceName) + } + if (oldItem.bookSourceGroup != newItem.bookSourceGroup) { + payload.putString("group", newItem.bookSourceGroup) + } + if (oldItem.enabled != newItem.enabled) { + payload.putBoolean("enabled", newItem.enabled) + } + if (payload.isEmpty) { + return null + } + return payload + } } \ No newline at end of file