From 98fa25fb60bfe21341a40963bf6a36a2e5dc3fb5 Mon Sep 17 00:00:00 2001 From: gedoor Date: Tue, 5 Jan 2021 09:39:58 +0800 Subject: [PATCH 01/72] =?UTF-8?q?=E4=BF=AE=E5=A4=8Dbug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../io/legado/app/model/webBook/BookChapterList.kt | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 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 1bba73ec1..445acd2d7 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 @@ -93,9 +93,12 @@ object BookChapterList { for (item in chapterDataList) { downloadToc( scope, item, book, bookSource, - tocRule, listRule, chapterList, chapterDataList + tocRule, listRule, chapterList, chapterDataList, + { + block.resume(finish(book, chapterList, reverse)) + } ) { - block.resume(finish(book, chapterList, reverse)) + throw it } } } @@ -114,7 +117,8 @@ object BookChapterList { listRule: String, chapterList: ArrayList, chapterDataList: ArrayList>, - onFinish: () -> Unit + onFinish: () -> Unit, + onError: (error: Throwable) -> Unit ) { Coroutine.async(scope = scope) { val nextBody = AnalyzeUrl( @@ -142,7 +146,7 @@ object BookChapterList { } } }.onError { - throw it + onError.invoke(it) } } From 02d75422e1b24ad379b6116cae2acc4acff6d55b Mon Sep 17 00:00:00 2001 From: gedoor Date: Tue, 5 Jan 2021 09:55:07 +0800 Subject: [PATCH 02/72] =?UTF-8?q?=E4=BF=AE=E5=A4=8Dbug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/assets/updateLog.md | 4 ++-- .../main/java/io/legado/app/model/webBook/BookChapterList.kt | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/assets/updateLog.md b/app/src/main/assets/updateLog.md index f3d953e59..538dc746e 100644 --- a/app/src/main/assets/updateLog.md +++ b/app/src/main/assets/updateLog.md @@ -3,8 +3,8 @@ * 关注合作公众号 **[小说拾遗]** 获取好看的小说。 * 旧版数据导入教程:先在旧版阅读(2.x)中进行备份,然后在新版阅读(3.x)【我的】->【备份与恢复】,选择【导入旧版本数据】。 -**2021/01/04** -* 修复bug +**2021/01/05** +* 修复崩溃bug **2021/01/03** * 导出书单只保留书名与作者,导入时自动查找可用源 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 445acd2d7..271254e04 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 @@ -98,7 +98,7 @@ object BookChapterList { block.resume(finish(book, chapterList, reverse)) } ) { - throw it + block.resumeWithException(it) } } } From 3f767d3a28cac4482d339758b36d16670e421a57 Mon Sep 17 00:00:00 2001 From: gedoor Date: Tue, 5 Jan 2021 10:02:20 +0800 Subject: [PATCH 03/72] =?UTF-8?q?=E4=BF=AE=E5=A4=8Dbug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/io/legado/app/model/webBook/BookChapterList.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 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 271254e04..1bdf1ca05 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 @@ -98,13 +98,13 @@ object BookChapterList { block.resume(finish(book, chapterList, reverse)) } ) { - block.resumeWithException(it) + block.cancel(it) } } } } }.onFailure { - block.resumeWithException(it) + block.cancel(it) } } From 692ad361a85adb51c1ce542af757dbae0d006ceb Mon Sep 17 00:00:00 2001 From: gedoor Date: Tue, 5 Jan 2021 15:34:46 +0800 Subject: [PATCH 04/72] =?UTF-8?q?=E4=BF=AE=E5=A4=8Dbug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/ui/replace/ReplaceRuleActivity.kt | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/replace/ReplaceRuleActivity.kt b/app/src/main/java/io/legado/app/ui/replace/ReplaceRuleActivity.kt index 548d9a481..af44e0c32 100644 --- a/app/src/main/java/io/legado/app/ui/replace/ReplaceRuleActivity.kt +++ b/app/src/main/java/io/legado/app/ui/replace/ReplaceRuleActivity.kt @@ -154,14 +154,15 @@ class ReplaceRuleActivity : VMBaseActivity { App.db.replaceRuleDao.liveDataSearch("%$searchKey%") } + }.apply { + observe(this@ReplaceRuleActivity, { + if (dataInit) { + setResult(Activity.RESULT_OK) + } + adapter.setItems(it, adapter.diffItemCallBack) + dataInit = true + }) } - replaceRuleLiveData?.observe(this, { - if (dataInit) { - setResult(Activity.RESULT_OK) - } - adapter.setItems(it, adapter.diffItemCallBack) - dataInit = true - }) } private fun observeGroupData() { @@ -239,7 +240,7 @@ class ReplaceRuleActivity : VMBaseActivity Date: Tue, 5 Jan 2021 15:49:57 +0800 Subject: [PATCH 05/72] =?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 | 4 +-- .../io/legado/app/data/dao/RssSourceDao.kt | 8 ++++- .../io/legado/app/ui/main/rss/RssFragment.kt | 13 ++++++-- .../ui/rss/source/manage/RssSourceActivity.kt | 30 +++++++++---------- 4 files changed, 34 insertions(+), 21 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 3655e0117..c2f82bf13 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 @@ -12,10 +12,10 @@ interface BookSourceDao { fun liveDataAll(): LiveData> @Query("select * from book_sources where bookSourceName like :searchKey or bookSourceGroup like :searchKey or bookSourceUrl like :searchKey or bookSourceComment like :searchKey order by customOrder asc") - fun liveDataSearch(searchKey: String = ""): LiveData> + fun liveDataSearch(searchKey: String): LiveData> @Query("select * from book_sources where bookSourceGroup like :searchKey order by customOrder asc") - fun liveDataGroupSearch(searchKey: String = ""): LiveData> + fun liveDataGroupSearch(searchKey: String): LiveData> @Query("select * from book_sources where enabled = 1 order by customOrder asc") fun liveDataEnabled(): LiveData> diff --git a/app/src/main/java/io/legado/app/data/dao/RssSourceDao.kt b/app/src/main/java/io/legado/app/data/dao/RssSourceDao.kt index ad2b25706..001877246 100644 --- a/app/src/main/java/io/legado/app/data/dao/RssSourceDao.kt +++ b/app/src/main/java/io/legado/app/data/dao/RssSourceDao.kt @@ -28,9 +28,15 @@ interface RssSourceDao { @Query("SELECT * FROM rssSources where sourceGroup like :key order by customOrder") fun liveGroupSearch(key: String): LiveData> - @Query("SELECT * FROM rssSources where enabled = 1 and (sourceName like '%'||:searchKey||'%' or sourceGroup like '%'||:searchKey||'%' or sourceUrl like '%'||:searchKey||'%') order by customOrder") + @Query("SELECT * FROM rssSources where enabled = 1 order by customOrder") + fun liveEnabled(): LiveData> + + @Query("SELECT * FROM rssSources where enabled = 1 and (sourceName like :searchKey or sourceGroup like :searchKey or sourceUrl like :searchKey) order by customOrder") fun liveEnabled(searchKey: String): LiveData> + @Query("SELECT * FROM rssSources where enabled = 1 and sourceGroup like :searchKey order by customOrder") + fun liveEnabledByGroup(searchKey: String): LiveData> + @Query("select sourceGroup from rssSources where trim(sourceGroup) <> ''") fun liveGroup(): LiveData> 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 60db06649..8cc1a1f00 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 @@ -92,7 +92,7 @@ class RssFragment : VMBaseFragment(R.layout.fragment_rss), } override fun onQueryTextChange(newText: String?): Boolean { - initData(newText ?: "") + initData(newText) return false } }) @@ -113,9 +113,16 @@ class RssFragment : VMBaseFragment(R.layout.fragment_rss), } } - private fun initData(searchKey: String = "") { + private fun initData(searchKey: String? = null) { liveRssData?.removeObservers(this) - liveRssData = App.db.rssSourceDao.liveEnabled(searchKey).apply { + liveRssData = when { + searchKey.isNullOrEmpty() -> App.db.rssSourceDao.liveEnabled() + searchKey.startsWith("group:") -> { + val key = searchKey.substringAfter("group:") + App.db.rssSourceDao.liveEnabledByGroup("%$key%") + } + else -> App.db.rssSourceDao.liveEnabled("%$searchKey%") + }.apply { observe(viewLifecycleOwner, { adapter.setItems(it) }) diff --git a/app/src/main/java/io/legado/app/ui/rss/source/manage/RssSourceActivity.kt b/app/src/main/java/io/legado/app/ui/rss/source/manage/RssSourceActivity.kt index 0f7d10e8d..4a5ac68cd 100644 --- a/app/src/main/java/io/legado/app/ui/rss/source/manage/RssSourceActivity.kt +++ b/app/src/main/java/io/legado/app/ui/rss/source/manage/RssSourceActivity.kt @@ -199,22 +199,22 @@ class RssSourceActivity : VMBaseActivity { - App.db.rssSourceDao.liveAll() - } - searchKey.startsWith("group:") -> { - val key = searchKey.substringAfter("group:") - App.db.rssSourceDao.liveGroupSearch("%$key%") - } - else -> { - App.db.rssSourceDao.liveSearch("%$searchKey%") - } + sourceLiveData = when { + searchKey.isNullOrBlank() -> { + App.db.rssSourceDao.liveAll() } - sourceLiveData?.observe(this, { - adapter.setItems(it, adapter.diffItemCallback) - }) + searchKey.startsWith("group:") -> { + val key = searchKey.substringAfter("group:") + App.db.rssSourceDao.liveGroupSearch("%$key%") + } + else -> { + App.db.rssSourceDao.liveSearch("%$searchKey%") + } + }.apply { + observe(this@RssSourceActivity, { + adapter.setItems(it, adapter.diffItemCallback) + }) + } } private fun showHelp() { From f3665de813d66653157b92f724b00891df800b5a Mon Sep 17 00:00:00 2001 From: gedoor Date: Tue, 5 Jan 2021 20:18:46 +0800 Subject: [PATCH 06/72] =?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 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 8cc1a1f00..bdc8c34b9 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 @@ -105,7 +105,7 @@ class RssFragment : VMBaseFragment(R.layout.fragment_rss), adapter.addHeaderView { ItemRssBinding.inflate(layoutInflater, it, false).apply { tvName.setText(R.string.rule_subscription) - ivIcon.setImageResource(R.mipmap.ic_launcher) + ivIcon.setImageResource(R.drawable.image_rss_article) root.onClick { startActivity() } From 9d5467f5a05f9156b0490f4b41399fadb9e2f06c Mon Sep 17 00:00:00 2001 From: gedoor Date: Tue, 5 Jan 2021 20:34:04 +0800 Subject: [PATCH 07/72] =?UTF-8?q?=E4=BF=AE=E5=A4=8Dbug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../io/legado/app/ui/main/rss/RssFragment.kt | 2 +- app/src/main/res/drawable/image_legado.png | Bin 0 -> 17309 bytes 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 app/src/main/res/drawable/image_legado.png 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 bdc8c34b9..daf1dde0d 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 @@ -105,7 +105,7 @@ class RssFragment : VMBaseFragment(R.layout.fragment_rss), adapter.addHeaderView { ItemRssBinding.inflate(layoutInflater, it, false).apply { tvName.setText(R.string.rule_subscription) - ivIcon.setImageResource(R.drawable.image_rss_article) + ivIcon.setImageResource(R.drawable.image_legado) root.onClick { startActivity() } diff --git a/app/src/main/res/drawable/image_legado.png b/app/src/main/res/drawable/image_legado.png new file mode 100644 index 0000000000000000000000000000000000000000..6d101d80649eef54b39441843d6adbf9cf277178 GIT binary patch literal 17309 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 Date: Tue, 5 Jan 2021 20:45:17 +0800 Subject: [PATCH 08/72] =?UTF-8?q?fix:=20=E6=9C=97=E8=AF=BB=E6=97=B6?= =?UTF-8?q?=E7=BF=BB=E9=A1=B5=E9=98=B2=E6=AD=A2=E9=87=8D=E5=A4=8D=E5=8F=91?= =?UTF-8?q?=E9=80=81=E8=AF=B7=E6=B1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/service/HttpReadAloudService.kt | 127 ++++++++++++++---- 1 file changed, 101 insertions(+), 26 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 2851173ed..e1bb89e61 100644 --- a/app/src/main/java/io/legado/app/service/HttpReadAloudService.kt +++ b/app/src/main/java/io/legado/app/service/HttpReadAloudService.kt @@ -12,11 +12,18 @@ import io.legado.app.service.help.ReadAloud import io.legado.app.service.help.ReadBook import io.legado.app.utils.FileUtils import io.legado.app.utils.LogUtils +import io.legado.app.utils.MD5Utils import io.legado.app.utils.postEvent +import kotlinx.coroutines.delay import kotlinx.coroutines.isActive +import kotlinx.coroutines.launch +import org.jetbrains.anko.collections.forEachWithIndex import java.io.File import java.io.FileDescriptor import java.io.FileInputStream +import java.net.ConnectException +import java.net.SocketTimeoutException +import java.util.* class HttpReadAloudService : BaseReadAloudService(), MediaPlayer.OnPreparedListener, @@ -55,12 +62,17 @@ class HttpReadAloudService : BaseReadAloudService(), override fun play() { if (contentList.isEmpty()) return - if (nowSpeak == 0) { - downloadAudio() - } else { - val file = getSpeakFile(nowSpeak) - if (file.exists()) { - playAudio(FileInputStream(file).fd) + ReadAloud.httpTTS?.let { + val fileName = md5SpeakFileName(it.url, AppConfig.ttsSpeechRate.toString(), contentList[nowSpeak]) + if (nowSpeak == 0) { + downloadAudio() + } else { + val file = getSpeakFileAsMd5(fileName) + if (file.exists()) { + playAudio(FileInputStream(file).fd) + } else { + downloadAudio() + } } } } @@ -68,28 +80,54 @@ class HttpReadAloudService : BaseReadAloudService(), private fun downloadAudio() { task?.cancel() task = execute { - FileUtils.deleteFile(ttsFolder) - for (index in 0 until contentList.size) { - if (isActive) { - ReadAloud.httpTTS?.let { - AnalyzeUrl( - it.url, - speakText = contentList[index], - speakSpeed = AppConfig.ttsSpeechRate - ).getByteArray().let { bytes -> - if (isActive) { - val file = getSpeakFile(index) - file.writeBytes(bytes) - if (index == nowSpeak) { - @Suppress("BlockingMethodInNonBlockingContext") - val fis = FileInputStream(file) - playAudio(fis.fd) + removeCacheFile() + ReadAloud.httpTTS?.let { + contentList.forEachWithIndex { index, item -> + if (isActive) { + val fileName = + md5SpeakFileName(it.url, AppConfig.ttsSpeechRate.toString(), item) + + if (hasSpeakFile(fileName)) { //已经下载好的语音缓存 + if (index == nowSpeak) { + val file = getSpeakFileAsMd5(fileName) + + @Suppress("BlockingMethodInNonBlockingContext") + val fis = FileInputStream(file) + playAudio(fis.fd) + } + } else if (hasSpeakCacheFile(fileName)) { //缓存文件还在,可能还没下载完 + return@let + } else { //没有下载并且没有缓存文件 + try { + createSpeakCacheFile(fileName) + AnalyzeUrl( + it.url, + speakText = item, + speakSpeed = AppConfig.ttsSpeechRate + ).getByteArray().let { bytes -> + if (isActive) { + val file = getSpeakFileAsMd5(fileName) + //val file = getSpeakFile(index) + file.writeBytes(bytes) + + if (index == nowSpeak) { + @Suppress("BlockingMethodInNonBlockingContext") + val fis = FileInputStream(file) + playAudio(fis.fd) + } + } } + } catch (e: SocketTimeoutException) { + removeSpeakCacheFile(fileName) + // delay(2000) + // downloadAudio() + } catch (e: ConnectException) { + removeSpeakCacheFile(fileName) + } catch (e: Exception) { + removeSpeakCacheFile(fileName) } } } - } else { - break } } } @@ -110,10 +148,47 @@ class HttpReadAloudService : BaseReadAloudService(), } } - private fun getSpeakFile(index: Int = nowSpeak): File { - return FileUtils.createFileIfNotExist("${ttsFolder}${File.separator}${index}.mp3") + private fun speakFilePath() = ttsFolder + File.separator + private fun md5SpeakFileName(url: String, ttsConfig: String, content: String): String { + return MD5Utils.md5Encode16(textChapter!!.title) + "_" + MD5Utils.md5Encode16("$url-|-$ttsConfig-|-$content") + } + + private fun hasSpeakFile(name: String) = + FileUtils.exist("${speakFilePath()}$name.mp3") + + private fun hasSpeakCacheFile(name: String) = + FileUtils.exist("${speakFilePath()}$name.mp3.cache") + + private fun createSpeakCacheFile(name: String): File = + FileUtils.createFileWithReplace("${speakFilePath()}$name.mp3.cache") + + private fun removeSpeakCacheFile(name: String) { + FileUtils.delete("${speakFilePath()}$name.mp3.cache") + } + + private fun getSpeakFileAsMd5(name: String): File = + FileUtils.createFileIfNotExist("${speakFilePath()}$name.mp3") + + private fun removeCacheFile() { + FileUtils.listDirsAndFiles(speakFilePath())?.forEach { + if (it == null) { + return@forEach + } + if (Regex(""".+\.mp3$""").matches(it.name)) { //mp3缓存文件 + val reg = + """^${MD5Utils.md5Encode16(textChapter!!.title)}_[a-z0-9]{16}\.mp3$""".toRegex() + if (!reg.matches(it.name)) { + FileUtils.deleteFile(it.absolutePath) + } + } else { + if (Date().time - it.lastModified() > 30000) { + FileUtils.deleteFile(it.absolutePath) + } + } + } } + override fun pauseReadAloud(pause: Boolean) { super.pauseReadAloud(pause) mediaPlayer.pause() From 8b88b91bb34dbd441d590f90ca347ecb8a7a9d46 Mon Sep 17 00:00:00 2001 From: gedoor Date: Tue, 5 Jan 2021 20:52:25 +0800 Subject: [PATCH 09/72] =?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_bookshelf_list.xml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/app/src/main/res/layout/item_bookshelf_list.xml b/app/src/main/res/layout/item_bookshelf_list.xml index f6e0a694d..5a9fefbd2 100644 --- a/app/src/main/res/layout/item_bookshelf_list.xml +++ b/app/src/main/res/layout/item_bookshelf_list.xml @@ -11,8 +11,8 @@ @@ -126,7 +126,7 @@ android:textSize="13sp" app:layout_constraintBottom_toTopOf="@id/tv_last" app:layout_constraintLeft_toRightOf="@+id/iv_read" - app:layout_constraintRight_toLeftOf="@id/fl_has_new" + app:layout_constraintRight_toRightOf="@+id/fl_has_new" app:layout_constraintTop_toBottomOf="@+id/tv_author" /> Date: Tue, 5 Jan 2021 22:32:34 +0800 Subject: [PATCH 10/72] =?UTF-8?q?fix:=20=E6=88=90=E5=8A=9F=E5=90=8E?= =?UTF-8?q?=E6=9C=AA=E5=88=A0=E9=99=A4=E7=BC=93=E5=AD=98=E6=96=87=E4=BB=B6?= 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 e1bb89e61..187a37623 100644 --- a/app/src/main/java/io/legado/app/service/HttpReadAloudService.kt +++ b/app/src/main/java/io/legado/app/service/HttpReadAloudService.kt @@ -109,7 +109,7 @@ class HttpReadAloudService : BaseReadAloudService(), val file = getSpeakFileAsMd5(fileName) //val file = getSpeakFile(index) file.writeBytes(bytes) - + removeSpeakCacheFile(fileName) if (index == nowSpeak) { @Suppress("BlockingMethodInNonBlockingContext") val fis = FileInputStream(file) From 52966de8d3739101291f2dba02ff463897608c49 Mon Sep 17 00:00:00 2001 From: gedoor Date: Tue, 5 Jan 2021 22:40:39 +0800 Subject: [PATCH 11/72] =?UTF-8?q?=E6=8C=89=E5=90=AF=E7=94=A8=E7=A6=81?= =?UTF-8?q?=E7=94=A8=E6=8E=92=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../book/source/manage/BookSourceActivity.kt | 64 ++++++++++++------- app/src/main/res/menu/book_source.xml | 6 ++ app/src/main/res/values-zh-rHK/strings.xml | 1 + app/src/main/res/values-zh-rTW/strings.xml | 1 + app/src/main/res/values-zh/strings.xml | 1 + app/src/main/res/values/strings.xml | 1 + 6 files changed, 52 insertions(+), 22 deletions(-) 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 0aeceded0..b23e1a641 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 @@ -130,6 +130,11 @@ class BookSourceActivity : VMBaseActivity { + item.isChecked = true + sortCheck(Sort.Enable) + initLiveDataBookSource(searchView.query?.toString()) + } R.id.menu_enabled_group -> { searchView.setQuery(getString(R.string.enabled), true) } @@ -187,29 +192,44 @@ class BookSourceActivity : VMBaseActivity { App.db.bookSourceDao.liveDataSearch("%$searchKey%") } - } - bookSourceLiveDate?.observe(this, { data -> - val sourceList = - if (sortAscending) when (sort) { - Sort.Weight -> data.sortedBy { it.weight } - Sort.Name -> data.sortedWith { o1, o2 -> - o1.bookSourceName.cnCompare(o2.bookSourceName) + }.apply { + observe(this@BookSourceActivity, { data -> + val sourceList = + if (sortAscending) when (sort) { + Sort.Weight -> data.sortedBy { it.weight } + Sort.Name -> data.sortedWith { o1, o2 -> + o1.bookSourceName.cnCompare(o2.bookSourceName) + } + Sort.Url -> data.sortedBy { it.bookSourceUrl } + Sort.Update -> data.sortedByDescending { it.lastUpdateTime } + Sort.Enable -> data.sortedWith { o1, o2 -> + var sort = -o1.enabled.compareTo(o2.enabled) + if (sort == 0) { + sort = o1.bookSourceName.cnCompare(o2.bookSourceName) + } + sort + } + else -> data } - Sort.Url -> data.sortedBy { it.bookSourceUrl } - Sort.Update -> data.sortedByDescending { it.lastUpdateTime } - else -> data - } - else when (sort) { - Sort.Weight -> data.sortedByDescending { it.weight } - Sort.Name -> data.sortedWith { o1, o2 -> - o2.bookSourceName.cnCompare(o1.bookSourceName) + else when (sort) { + Sort.Weight -> data.sortedByDescending { it.weight } + Sort.Name -> data.sortedWith { o1, o2 -> + o2.bookSourceName.cnCompare(o1.bookSourceName) + } + Sort.Url -> data.sortedByDescending { it.bookSourceUrl } + Sort.Update -> data.sortedBy { it.lastUpdateTime } + Sort.Enable -> data.sortedWith { o1, o2 -> + var sort = o1.enabled.compareTo(o2.enabled) + if (sort == 0) { + sort = o1.bookSourceName.cnCompare(o2.bookSourceName) + } + sort + } + else -> data.reversed() } - Sort.Url -> data.sortedByDescending { it.bookSourceUrl } - Sort.Update -> data.sortedBy { it.lastUpdateTime } - else -> data.reversed() - } - adapter.setItems(sourceList, adapter.diffItemCallback) - }) + adapter.setItems(sourceList, adapter.diffItemCallback) + }) + } } private fun showHelp() { @@ -483,6 +503,6 @@ class BookSourceActivity : VMBaseActivity + + + diff --git a/app/src/main/res/values-zh-rHK/strings.xml b/app/src/main/res/values-zh-rHK/strings.xml index 63f2ec2e1..3192e781d 100644 --- a/app/src/main/res/values-zh-rHK/strings.xml +++ b/app/src/main/res/values-zh-rHK/strings.xml @@ -799,5 +799,6 @@ 导入书单 预下载 预先下载10章正文 + 启用排序 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index af90b7f86..1b64a2d78 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -800,5 +800,6 @@ 导入书单 预下载 预先下载10章正文 + 启用排序 diff --git a/app/src/main/res/values-zh/strings.xml b/app/src/main/res/values-zh/strings.xml index 48eb53cb6..ad6bfbce7 100644 --- a/app/src/main/res/values-zh/strings.xml +++ b/app/src/main/res/values-zh/strings.xml @@ -803,5 +803,6 @@ 导入书单 预下载 预先下载10章正文 + 启用排序 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index d2c078fec..c38246704 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -806,5 +806,6 @@ 导入书单 预下载 预先下载10章正文 + 启用排序 From c62f798d5588292f9747d66a7f2dbbd88f445f8b Mon Sep 17 00:00:00 2001 From: gedoor Date: Wed, 6 Jan 2021 10:35:24 +0800 Subject: [PATCH 12/72] =?UTF-8?q?=E4=BF=AE=E5=A4=8Dbug?= 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, 2 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 187a37623..ac1a5c4a6 100644 --- a/app/src/main/java/io/legado/app/service/HttpReadAloudService.kt +++ b/app/src/main/java/io/legado/app/service/HttpReadAloudService.kt @@ -14,9 +14,7 @@ import io.legado.app.utils.FileUtils import io.legado.app.utils.LogUtils import io.legado.app.utils.MD5Utils import io.legado.app.utils.postEvent -import kotlinx.coroutines.delay import kotlinx.coroutines.isActive -import kotlinx.coroutines.launch import org.jetbrains.anko.collections.forEachWithIndex import java.io.File import java.io.FileDescriptor @@ -115,6 +113,8 @@ class HttpReadAloudService : BaseReadAloudService(), val fis = FileInputStream(file) playAudio(fis.fd) } + } else { + removeSpeakCacheFile(fileName) } } } catch (e: SocketTimeoutException) { From 82340213106fc434c22179dade5c3134b0c50cec Mon Sep 17 00:00:00 2001 From: gedoor Date: Wed, 6 Jan 2021 10:46:23 +0800 Subject: [PATCH 13/72] =?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/service/HttpReadAloudService.kt | 22 +++++++++---------- 1 file changed, 10 insertions(+), 12 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 ac1a5c4a6..a91771e66 100644 --- a/app/src/main/java/io/legado/app/service/HttpReadAloudService.kt +++ b/app/src/main/java/io/legado/app/service/HttpReadAloudService.kt @@ -14,6 +14,7 @@ import io.legado.app.utils.FileUtils import io.legado.app.utils.LogUtils import io.legado.app.utils.MD5Utils import io.legado.app.utils.postEvent +import kotlinx.coroutines.ensureActive import kotlinx.coroutines.isActive import org.jetbrains.anko.collections.forEachWithIndex import java.io.File @@ -103,18 +104,15 @@ class HttpReadAloudService : BaseReadAloudService(), speakText = item, speakSpeed = AppConfig.ttsSpeechRate ).getByteArray().let { bytes -> - if (isActive) { - val file = getSpeakFileAsMd5(fileName) - //val file = getSpeakFile(index) - file.writeBytes(bytes) - removeSpeakCacheFile(fileName) - if (index == nowSpeak) { - @Suppress("BlockingMethodInNonBlockingContext") - val fis = FileInputStream(file) - playAudio(fis.fd) - } - } else { - removeSpeakCacheFile(fileName) + ensureActive() + val file = getSpeakFileAsMd5(fileName) + //val file = getSpeakFile(index) + file.writeBytes(bytes) + removeSpeakCacheFile(fileName) + if (index == nowSpeak) { + @Suppress("BlockingMethodInNonBlockingContext") + val fis = FileInputStream(file) + playAudio(fis.fd) } } } catch (e: SocketTimeoutException) { From fd92efdb1bb6571ed9d5ac827e50fba5f92a58e5 Mon Sep 17 00:00:00 2001 From: gedoor Date: Wed, 6 Jan 2021 12:18:35 +0800 Subject: [PATCH 14/72] =?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/SearchBookDao.kt | 4 ++++ .../legado/app/ui/book/changesource/ChangeSourceDialog.kt | 8 ++++---- .../app/ui/book/changesource/ChangeSourceViewModel.kt | 1 + 3 files changed, 9 insertions(+), 4 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 74d33dfeb..234e24e0d 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 @@ -63,6 +63,10 @@ interface SearchBookDao { @Insert(onConflict = OnConflictStrategy.REPLACE) fun insert(vararg searchBook: SearchBook): List + @Query("delete from searchBooks where name = :name and author = :author") + fun clear(name: String, author: String) + @Query("delete from searchBooks where time < :time") fun clearExpired(time: Long) + } \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/ui/book/changesource/ChangeSourceDialog.kt b/app/src/main/java/io/legado/app/ui/book/changesource/ChangeSourceDialog.kt index 1c5071173..fe26451fb 100644 --- a/app/src/main/java/io/legado/app/ui/book/changesource/ChangeSourceDialog.kt +++ b/app/src/main/java/io/legado/app/ui/book/changesource/ChangeSourceDialog.kt @@ -84,10 +84,10 @@ class ChangeSourceDialog : BaseDialogFragment(), binding.toolBar.inflateMenu(R.menu.change_source) binding.toolBar.menu.applyTint(requireContext()) binding.toolBar.setOnMenuItemClickListener(this) - binding.toolBar.menu.findItem(R.id.menu_load_info)?.isChecked = - AppConfig.changeSourceLoadInfo - binding.toolBar.menu.findItem(R.id.menu_load_toc)?.isChecked = AppConfig.changeSourceLoadToc - + binding.toolBar.menu.findItem(R.id.menu_load_info) + ?.isChecked = AppConfig.changeSourceLoadInfo + binding.toolBar.menu.findItem(R.id.menu_load_toc) + ?.isChecked = AppConfig.changeSourceLoadToc } private fun initRecyclerView() { diff --git a/app/src/main/java/io/legado/app/ui/book/changesource/ChangeSourceViewModel.kt b/app/src/main/java/io/legado/app/ui/book/changesource/ChangeSourceViewModel.kt index 279cf7d79..143d706ba 100644 --- a/app/src/main/java/io/legado/app/ui/book/changesource/ChangeSourceViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/book/changesource/ChangeSourceViewModel.kt @@ -99,6 +99,7 @@ class ChangeSourceViewModel(application: Application) : BaseViewModel(applicatio private fun startSearch() { execute { + App.db.searchBookDao.clear(name, author) bookSourceList.clear() if (searchGroup.isBlank()) { bookSourceList.addAll(App.db.bookSourceDao.allEnabled) From 89e56b8aa68aa28ed0861a05171296c548dccec3 Mon Sep 17 00:00:00 2001 From: gedoor Date: Sun, 10 Jan 2021 14:28:52 +0800 Subject: [PATCH 15/72] =?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 ++++ app/src/main/res/layout/dialog_bookmark.xml | 2 ++ 2 files changed, 6 insertions(+) diff --git a/app/src/main/assets/updateLog.md b/app/src/main/assets/updateLog.md index 538dc746e..488f697bf 100644 --- a/app/src/main/assets/updateLog.md +++ b/app/src/main/assets/updateLog.md @@ -3,6 +3,10 @@ * 关注合作公众号 **[小说拾遗]** 获取好看的小说。 * 旧版数据导入教程:先在旧版阅读(2.x)中进行备份,然后在新版阅读(3.x)【我的】->【备份与恢复】,选择【导入旧版本数据】。 +**2021/01/10** +* 修复bug +* + **2021/01/05** * 修复崩溃bug diff --git a/app/src/main/res/layout/dialog_bookmark.xml b/app/src/main/res/layout/dialog_bookmark.xml index 83bc712bb..168324bfd 100644 --- a/app/src/main/res/layout/dialog_bookmark.xml +++ b/app/src/main/res/layout/dialog_bookmark.xml @@ -22,6 +22,7 @@ android:id="@+id/edit_book_text" android:layout_width="match_parent" android:layout_height="wrap_content" + android:maxLines="6" android:hint="@string/content" /> @@ -37,6 +38,7 @@ android:id="@+id/edit_view" android:layout_width="match_parent" android:layout_height="wrap_content" + android:maxLines="6" android:hint="@string/note_content" /> From c13bfae5efc87302a8893927ab9bf6f9a878a983 Mon Sep 17 00:00:00 2001 From: gedoor Date: Sun, 10 Jan 2021 16:30:54 +0800 Subject: [PATCH 16/72] =?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 +- .../main/java/io/legado/app/ui/book/read/ReadMenu.kt | 11 ++++++----- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/app/src/main/assets/updateLog.md b/app/src/main/assets/updateLog.md index 488f697bf..d0a20cdc0 100644 --- a/app/src/main/assets/updateLog.md +++ b/app/src/main/assets/updateLog.md @@ -5,7 +5,7 @@ **2021/01/10** * 修复bug -* +* 朗读时翻页防止重复发送请求 by [litcc](https://github.com/litcc) **2021/01/05** * 修复崩溃bug diff --git a/app/src/main/java/io/legado/app/ui/book/read/ReadMenu.kt b/app/src/main/java/io/legado/app/ui/book/read/ReadMenu.kt index a73f3d4a2..42a40faab 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/ReadMenu.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/ReadMenu.kt @@ -37,6 +37,7 @@ class ReadMenu @JvmOverloads constructor( private lateinit var menuTopOut: Animation private lateinit var menuBottomIn: Animation private lateinit var menuBottomOut: Animation + private val accentColor: Int = context.accentColor private val bgColor: Int = context.bottomBackground private val textColor: Int = context.getPrimaryTextColor(ColorUtils.isColorLight(bgColor)) private val bottomBackgroundList: ColorStateList = Selector.colorBuild() @@ -65,13 +66,13 @@ class ReadMenu @JvmOverloads constructor( llBrightness.background = brightnessBackground llBottomBg.setBackgroundColor(bgColor) fabSearch.backgroundTintList = bottomBackgroundList - fabSearch.setColorFilter(textColor) + fabSearch.setColorFilter(accentColor) fabAutoPage.backgroundTintList = bottomBackgroundList - fabAutoPage.setColorFilter(textColor) + fabAutoPage.setColorFilter(accentColor) fabReplaceRule.backgroundTintList = bottomBackgroundList - fabReplaceRule.setColorFilter(textColor) + fabReplaceRule.setColorFilter(accentColor) fabNightTheme.backgroundTintList = bottomBackgroundList - fabNightTheme.setColorFilter(textColor) + fabNightTheme.setColorFilter(accentColor) tvPre.setTextColor(textColor) tvNext.setTextColor(textColor) ivCatalog.setColorFilter(textColor) @@ -308,7 +309,7 @@ class ReadMenu @JvmOverloads constructor( fabAutoPage.setImageResource(R.drawable.ic_auto_page) fabAutoPage.contentDescription = context.getString(R.string.auto_next_page) } - fabAutoPage.setColorFilter(textColor) + fabAutoPage.setColorFilter(accentColor) } interface CallBack { From ba40d55de1222611a7da4823f4e164580d02acec Mon Sep 17 00:00:00 2001 From: gedoor Date: Sun, 10 Jan 2021 16:58:59 +0800 Subject: [PATCH 17/72] =?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/ReadMenu.kt | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/book/read/ReadMenu.kt b/app/src/main/java/io/legado/app/ui/book/read/ReadMenu.kt index 42a40faab..a73f3d4a2 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/ReadMenu.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/ReadMenu.kt @@ -37,7 +37,6 @@ class ReadMenu @JvmOverloads constructor( private lateinit var menuTopOut: Animation private lateinit var menuBottomIn: Animation private lateinit var menuBottomOut: Animation - private val accentColor: Int = context.accentColor private val bgColor: Int = context.bottomBackground private val textColor: Int = context.getPrimaryTextColor(ColorUtils.isColorLight(bgColor)) private val bottomBackgroundList: ColorStateList = Selector.colorBuild() @@ -66,13 +65,13 @@ class ReadMenu @JvmOverloads constructor( llBrightness.background = brightnessBackground llBottomBg.setBackgroundColor(bgColor) fabSearch.backgroundTintList = bottomBackgroundList - fabSearch.setColorFilter(accentColor) + fabSearch.setColorFilter(textColor) fabAutoPage.backgroundTintList = bottomBackgroundList - fabAutoPage.setColorFilter(accentColor) + fabAutoPage.setColorFilter(textColor) fabReplaceRule.backgroundTintList = bottomBackgroundList - fabReplaceRule.setColorFilter(accentColor) + fabReplaceRule.setColorFilter(textColor) fabNightTheme.backgroundTintList = bottomBackgroundList - fabNightTheme.setColorFilter(accentColor) + fabNightTheme.setColorFilter(textColor) tvPre.setTextColor(textColor) tvNext.setTextColor(textColor) ivCatalog.setColorFilter(textColor) @@ -309,7 +308,7 @@ class ReadMenu @JvmOverloads constructor( fabAutoPage.setImageResource(R.drawable.ic_auto_page) fabAutoPage.contentDescription = context.getString(R.string.auto_next_page) } - fabAutoPage.setColorFilter(accentColor) + fabAutoPage.setColorFilter(textColor) } interface CallBack { From f852c094ab4b1e17fb884e29eb9715ff12245554 Mon Sep 17 00:00:00 2001 From: gedoor Date: Sun, 10 Jan 2021 17:19:57 +0800 Subject: [PATCH 18/72] =?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 | 17 ++-- .../io/legado/app/ui/book/read/ReadMenu.kt | 5 ++ app/src/main/res/layout/view_read_menu.xml | 88 ++++++++++++------- app/src/main/res/menu/book_read.xml | 8 -- 4 files changed, 68 insertions(+), 50 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 02040e26d..a8b7835ab 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 @@ -171,8 +171,6 @@ class ReadBookActivity : ReadBookBaseActivity(), R.id.menu_group_on_line_ns -> item.isVisible = onLine R.id.menu_group_local -> item.isVisible = !onLine R.id.menu_group_text -> item.isVisible = book.isLocalTxt() - R.id.menu_group_login -> - item.isVisible = !ReadBook.webBook?.bookSource?.loginUrl.isNullOrEmpty() else -> when (item.itemId) { R.id.menu_enable_replace -> item.isChecked = book.getUseReplaceRule() R.id.menu_re_segment -> item.isChecked = book.getReSegment() @@ -245,12 +243,6 @@ class ReadBookActivity : ReadBookBaseActivity(), supportFragmentManager, ReadBook.book?.tocUrl ) - R.id.menu_login -> ReadBook.webBook?.bookSource?.let { - startActivity( - Pair("sourceUrl", it.bookSourceUrl), - Pair("loginUrl", it.loginUrl) - ) - } R.id.menu_set_charset -> showCharsetConfig() R.id.menu_get_progress -> ReadBook.book?.let { viewModel.syncBookProgress(it) { progress -> @@ -715,6 +707,15 @@ class ReadBookActivity : ReadBookBaseActivity(), upNavigationBarColor() } + override fun showLogin() { + ReadBook.webBook?.bookSource?.let { + startActivity( + Pair("sourceUrl", it.bookSourceUrl), + Pair("loginUrl", it.loginUrl) + ) + } + } + /** * 朗读按钮 */ diff --git a/app/src/main/java/io/legado/app/ui/book/read/ReadMenu.kt b/app/src/main/java/io/legado/app/ui/book/read/ReadMenu.kt index a73f3d4a2..8dff5e647 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/ReadMenu.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/ReadMenu.kt @@ -140,6 +140,9 @@ class ReadMenu @JvmOverloads constructor( tvChapterUrl.onClick { context.openUrl(binding.tvChapterUrl.text.toString()) } + tvLogin.onClick { + callBack.showLogin() + } ivBrightnessAuto.onClick { context.putPrefBoolean("brightnessAuto", !brightnessAuto()) upBrightnessState() @@ -277,6 +280,7 @@ class ReadMenu @JvmOverloads constructor( } fun upBookView() { + binding.tvLogin.visible(!ReadBook.webBook?.bookSource?.loginUrl.isNullOrEmpty()) ReadBook.curTextChapter?.let { binding.tvChapterName.text = it.title binding.tvChapterName.visible() @@ -323,6 +327,7 @@ class ReadMenu @JvmOverloads constructor( fun upSystemUiVisibility() fun onClickReadAloud() fun showReadMenuHelp() + fun showLogin() } } diff --git a/app/src/main/res/layout/view_read_menu.xml b/app/src/main/res/layout/view_read_menu.xml index e7882c8bc..9653e8def 100644 --- a/app/src/main/res/layout/view_read_menu.xml +++ b/app/src/main/res/layout/view_read_menu.xml @@ -21,25 +21,45 @@ android:theme="?attr/actionBarStyle" app:layout_constraintTop_toTopOf="parent"> - - - + android:layout_height="wrap_content"> + + + + + + + + @@ -48,19 +68,19 @@ android:layout_width="wrap_content" android:layout_height="0dp" android:layout_margin="8dp" - android:orientation="vertical" android:gravity="center_horizontal" - app:layout_constraintTop_toBottomOf="@+id/title_bar" + android:orientation="vertical" + app:layout_constraintBottom_toTopOf="@+id/bottom_menu" app:layout_constraintLeft_toLeftOf="parent" - app:layout_constraintBottom_toTopOf="@+id/bottom_menu"> + app:layout_constraintTop_toBottomOf="@+id/title_bar"> + android:contentDescription="@string/brightness_auto" + android:src="@drawable/ic_brightness_auto" /> @@ -187,8 +207,8 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@color/background_menu" - android:orientation="vertical" - android:importantForAccessibility="no"> + android:importantForAccessibility="no" + android:orientation="vertical"> + android:importantForAccessibility="no" + android:orientation="horizontal"> + android:importantForAccessibility="no" + android:orientation="horizontal"> @@ -322,8 +342,8 @@ android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:layout_marginTop="3dp" - android:singleLine="true" android:ellipsize="middle" + android:singleLine="true" android:text="@string/read_aloud" android:textColor="@color/primaryText" android:textSize="12sp" /> @@ -363,8 +383,8 @@ android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:layout_marginTop="3dp" - android:singleLine="true" android:ellipsize="middle" + android:singleLine="true" android:text="@string/interface_setting" android:textColor="@color/primaryText" android:textSize="12sp" /> @@ -404,8 +424,8 @@ android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:layout_marginTop="3dp" - android:singleLine="true" android:ellipsize="middle" + android:singleLine="true" android:text="@string/setting" android:textColor="@color/primaryText" android:textSize="12sp" /> diff --git a/app/src/main/res/menu/book_read.xml b/app/src/main/res/menu/book_read.xml index f35b5b901..b34861c5a 100644 --- a/app/src/main/res/menu/book_read.xml +++ b/app/src/main/res/menu/book_read.xml @@ -49,14 +49,6 @@ android:title="@string/bookmark_add" app:showAsAction="never" /> - - - - Date: Sun, 10 Jan 2021 17:39:32 +0800 Subject: [PATCH 19/72] =?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/ReadBookActivity.kt | 4 +++- .../java/io/legado/app/ui/book/read/ReadBookViewModel.kt | 4 +++- app/src/main/res/layout/view_read_menu.xml | 6 +++++- 3 files changed, 11 insertions(+), 3 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 a8b7835ab..941d11033 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 @@ -776,7 +776,9 @@ class ReadBookActivity : ReadBookBaseActivity(), super.onActivityResult(requestCode, resultCode, data) if (resultCode == Activity.RESULT_OK) { when (requestCode) { - requestCodeEditSource -> viewModel.upBookSource() + requestCodeEditSource -> viewModel.upBookSource() { + upView() + } requestCodeChapterList -> data?.getIntExtra("index", ReadBook.durChapterIndex)?.let { index -> if (index != ReadBook.durChapterIndex) { 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 de9c080d7..7e718ff36 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 @@ -271,13 +271,15 @@ class ReadBookViewModel(application: Application) : BaseViewModel(application) { } } - fun upBookSource() { + fun upBookSource(success: (() -> Unit)?) { execute { ReadBook.book?.let { book -> App.db.bookSourceDao.getBookSource(book.origin)?.let { ReadBook.webBook = WebBook(it) } } + }.onSuccess { + success?.invoke() } } diff --git a/app/src/main/res/layout/view_read_menu.xml b/app/src/main/res/layout/view_read_menu.xml index 9653e8def..1a62637cf 100644 --- a/app/src/main/res/layout/view_read_menu.xml +++ b/app/src/main/res/layout/view_read_menu.xml @@ -51,10 +51,14 @@ app:layout_constraintRight_toLeftOf="@+id/tv_login" app:layout_constraintTop_toBottomOf="@+id/tv_chapter_name" /> - From fa88777ea8a26f8fc86ae0cd6eab1ddb29e5412f Mon Sep 17 00:00:00 2001 From: gedoor Date: Mon, 11 Jan 2021 11:46:50 +0800 Subject: [PATCH 20/72] =?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/book/read/ReadMenu.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/io/legado/app/ui/book/read/ReadMenu.kt b/app/src/main/java/io/legado/app/ui/book/read/ReadMenu.kt index 8dff5e647..63fa5c0f1 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/ReadMenu.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/ReadMenu.kt @@ -9,6 +9,7 @@ import android.view.WindowManager import android.view.animation.Animation import android.widget.FrameLayout import android.widget.SeekBar +import androidx.core.view.isGone import androidx.core.view.isVisible import io.legado.app.App import io.legado.app.R @@ -280,7 +281,7 @@ class ReadMenu @JvmOverloads constructor( } fun upBookView() { - binding.tvLogin.visible(!ReadBook.webBook?.bookSource?.loginUrl.isNullOrEmpty()) + binding.tvLogin.isGone = ReadBook.webBook?.bookSource?.loginUrl.isNullOrEmpty() ReadBook.curTextChapter?.let { binding.tvChapterName.text = it.title binding.tvChapterName.visible() From c3ddd72e06cdc29b850d62b7870ee4d52b3b22ac Mon Sep 17 00:00:00 2001 From: gedoor Date: Tue, 12 Jan 2021 14:09:45 +0800 Subject: [PATCH 21/72] =?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/web/SourceDebugWebSocket.kt | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/io/legado/app/web/SourceDebugWebSocket.kt b/app/src/main/java/io/legado/app/web/SourceDebugWebSocket.kt index 8b18d1179..38d46fa6d 100644 --- a/app/src/main/java/io/legado/app/web/SourceDebugWebSocket.kt +++ b/app/src/main/java/io/legado/app/web/SourceDebugWebSocket.kt @@ -48,10 +48,8 @@ class SourceDebugWebSocket(handshakeRequest: NanoHTTPD.IHTTPSession) : val tag = debugBean["tag"] val key = debugBean["key"] if (tag.isNullOrBlank() || key.isNullOrBlank()) { - kotlin.runCatching { - send(App.INSTANCE.getString(R.string.cannot_empty)) - close(NanoWSD.WebSocketFrame.CloseCode.NormalClosure, "调试结束", false) - } + send(App.INSTANCE.getString(R.string.cannot_empty)) + close(NanoWSD.WebSocketFrame.CloseCode.NormalClosure, "调试结束", false) return } App.db.bookSourceDao.getBookSource(tag)?.let { @@ -75,6 +73,7 @@ class SourceDebugWebSocket(handshakeRequest: NanoHTTPD.IHTTPSession) : send(msg) if (state == -1 || state == 1000) { Debug.cancelDebug(true) + close(NanoWSD.WebSocketFrame.CloseCode.NormalClosure, "调试结束", false) } } } From 5ed541836a6e2b9103f601f58a57155745c7426e Mon Sep 17 00:00:00 2001 From: gedoor Date: Tue, 12 Jan 2021 14:27:02 +0800 Subject: [PATCH 22/72] =?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 d0a20cdc0..86a19f63f 100644 --- a/app/src/main/assets/updateLog.md +++ b/app/src/main/assets/updateLog.md @@ -3,7 +3,7 @@ * 关注合作公众号 **[小说拾遗]** 获取好看的小说。 * 旧版数据导入教程:先在旧版阅读(2.x)中进行备份,然后在新版阅读(3.x)【我的】->【备份与恢复】,选择【导入旧版本数据】。 -**2021/01/10** +**2021/01/12** * 修复bug * 朗读时翻页防止重复发送请求 by [litcc](https://github.com/litcc) From de19f42487bc80d95a1f986f00e1e152f19517ff Mon Sep 17 00:00:00 2001 From: gedoor Date: Tue, 12 Jan 2021 18:05:43 +0800 Subject: [PATCH 23/72] =?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/changesource/ChangeSourceViewModel.kt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/src/main/java/io/legado/app/ui/book/changesource/ChangeSourceViewModel.kt b/app/src/main/java/io/legado/app/ui/book/changesource/ChangeSourceViewModel.kt index 143d706ba..937370db9 100644 --- a/app/src/main/java/io/legado/app/ui/book/changesource/ChangeSourceViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/book/changesource/ChangeSourceViewModel.kt @@ -100,6 +100,8 @@ class ChangeSourceViewModel(application: Application) : BaseViewModel(applicatio private fun startSearch() { execute { App.db.searchBookDao.clear(name, author) + searchBooks.clear() + upAdapter() bookSourceList.clear() if (searchGroup.isBlank()) { bookSourceList.addAll(App.db.bookSourceDao.allEnabled) From 231e315fc62fc0c1c47ff88ce4a180613aab4fe3 Mon Sep 17 00:00:00 2001 From: gedoor Date: Tue, 12 Jan 2021 20:11:54 +0800 Subject: [PATCH 24/72] =?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 86a19f63f..922fbfa4f 100644 --- a/app/src/main/assets/updateLog.md +++ b/app/src/main/assets/updateLog.md @@ -6,6 +6,7 @@ **2021/01/12** * 修复bug * 朗读时翻页防止重复发送请求 by [litcc](https://github.com/litcc) +* 换源刷新之前删除原搜索记录 **2021/01/05** * 修复崩溃bug From a76d64f040a69bedcc0cfb29e72bd12815872386 Mon Sep 17 00:00:00 2001 From: gedoor Date: Tue, 12 Jan 2021 20:37:47 +0800 Subject: [PATCH 25/72] =?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/changesource/ChangeSourceViewModel.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/io/legado/app/ui/book/changesource/ChangeSourceViewModel.kt b/app/src/main/java/io/legado/app/ui/book/changesource/ChangeSourceViewModel.kt index 937370db9..0c738d93e 100644 --- a/app/src/main/java/io/legado/app/ui/book/changesource/ChangeSourceViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/book/changesource/ChangeSourceViewModel.kt @@ -88,6 +88,7 @@ class ChangeSourceViewModel(application: Application) : BaseViewModel(applicatio } private fun searchFinish(searchBook: SearchBook) { + if (searchBooks.contains(searchBook)) return App.db.searchBookDao.insert(searchBook) if (screenKey.isEmpty()) { searchBooks.add(searchBook) @@ -140,7 +141,6 @@ class ChangeSourceViewModel(application: Application) : BaseViewModel(applicatio } else { searchFinish(searchBook) } - return@onSuccess } } } From b159fb479f1efbadc5fca5480c4fef1fd8cb0f55 Mon Sep 17 00:00:00 2001 From: gedoor Date: Tue, 12 Jan 2021 21:35:43 +0800 Subject: [PATCH 26/72] =?UTF-8?q?=E4=BC=98=E5=8C=96web=E8=B0=83=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../io/legado/app/web/SourceDebugWebSocket.kt | 50 +++++++++++-------- 1 file changed, 28 insertions(+), 22 deletions(-) diff --git a/app/src/main/java/io/legado/app/web/SourceDebugWebSocket.kt b/app/src/main/java/io/legado/app/web/SourceDebugWebSocket.kt index 38d46fa6d..97a4ad0f1 100644 --- a/app/src/main/java/io/legado/app/web/SourceDebugWebSocket.kt +++ b/app/src/main/java/io/legado/app/web/SourceDebugWebSocket.kt @@ -22,12 +22,12 @@ class SourceDebugWebSocket(handshakeRequest: NanoHTTPD.IHTTPSession) : override fun onOpen() { launch(IO) { - do { - delay(30000) - runCatching { + kotlin.runCatching { + while (isOpen) { ping("ping".toByteArray()) + delay(30000) } - } while (isOpen) + } } } @@ -42,19 +42,21 @@ class SourceDebugWebSocket(handshakeRequest: NanoHTTPD.IHTTPSession) : override fun onMessage(message: NanoWSD.WebSocketFrame) { if (!message.textPayload.isJson()) return - kotlin.runCatching { - val debugBean = GSON.fromJsonObject>(message.textPayload) - if (debugBean != null) { - val tag = debugBean["tag"] - val key = debugBean["key"] - if (tag.isNullOrBlank() || key.isNullOrBlank()) { - send(App.INSTANCE.getString(R.string.cannot_empty)) - close(NanoWSD.WebSocketFrame.CloseCode.NormalClosure, "调试结束", false) - return - } - App.db.bookSourceDao.getBookSource(tag)?.let { - Debug.callback = this - Debug.startDebug(this, WebBook(it), key) + launch(IO) { + kotlin.runCatching { + val debugBean = GSON.fromJsonObject>(message.textPayload) + if (debugBean != null) { + val tag = debugBean["tag"] + val key = debugBean["key"] + if (tag.isNullOrBlank() || key.isNullOrBlank()) { + send(App.INSTANCE.getString(R.string.cannot_empty)) + close(NanoWSD.WebSocketFrame.CloseCode.NormalClosure, "调试结束", false) + return@launch + } + App.db.bookSourceDao.getBookSource(tag)?.let { + Debug.callback = this@SourceDebugWebSocket + Debug.startDebug(this, WebBook(it), key) + } } } } @@ -69,11 +71,15 @@ class SourceDebugWebSocket(handshakeRequest: NanoHTTPD.IHTTPSession) : } override fun printLog(state: Int, msg: String) { - kotlin.runCatching { - send(msg) - if (state == -1 || state == 1000) { - Debug.cancelDebug(true) - close(NanoWSD.WebSocketFrame.CloseCode.NormalClosure, "调试结束", false) + launch(IO) { + runCatching { + send(msg) + if (state == -1 || state == 1000) { + Debug.cancelDebug(true) + close(NanoWSD.WebSocketFrame.CloseCode.NormalClosure, "调试结束", false) + } + }.onFailure { + it.printStackTrace() } } } From eb854534956858224e532189e39c297be0623c17 Mon Sep 17 00:00:00 2001 From: gedoor Date: Tue, 12 Jan 2021 21:39:25 +0800 Subject: [PATCH 27/72] =?UTF-8?q?=E4=BC=98=E5=8C=96web=E8=B0=83=E8=AF=95?= 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 922fbfa4f..b0eba749d 100644 --- a/app/src/main/assets/updateLog.md +++ b/app/src/main/assets/updateLog.md @@ -7,6 +7,7 @@ * 修复bug * 朗读时翻页防止重复发送请求 by [litcc](https://github.com/litcc) * 换源刷新之前删除原搜索记录 +* 优化web调试 **2021/01/05** * 修复崩溃bug From 883f3f7e39b92728c1cc63210abeaff4994c67e9 Mon Sep 17 00:00:00 2001 From: gedoor Date: Wed, 13 Jan 2021 13:35:22 +0800 Subject: [PATCH 28/72] =?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/about/AboutFragment.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/java/io/legado/app/ui/about/AboutFragment.kt b/app/src/main/java/io/legado/app/ui/about/AboutFragment.kt index ca805475b..cb7730827 100644 --- a/app/src/main/java/io/legado/app/ui/about/AboutFragment.kt +++ b/app/src/main/java/io/legado/app/ui/about/AboutFragment.kt @@ -24,6 +24,7 @@ class AboutFragment : PreferenceFragmentCompat() { Pair("(QQ群VIP1)701903217", "-iolizL4cbJSutKRpeImHlXlpLDZnzeF"), Pair("(QQ群VIP2)263949160", "xwfh7_csb2Gf3Aw2qexEcEtviLfLfd4L"), Pair("(QQ群VIP3)680280282", "_N0i7yZObjKSeZQvzoe2ej7j02kLnOOK"), + Pair("(QQ群VIP4)680280282", "VF2UwvUCuaqlo6pddWTe_kw__a1_Fr8O"), Pair("(QQ群1)805192012", "6GlFKjLeIk5RhQnR3PNVDaKB6j10royo"), Pair("(QQ群2)773736122", "5Bm5w6OgLupXnICbYvbgzpPUgf0UlsJF"), Pair("(QQ群3)981838750", "g_Sgmp2nQPKqcZQ5qPcKLHziwX_mpps9"), From 644b21736da3abd8d2f611f33e482f2f3e917492 Mon Sep 17 00:00:00 2001 From: kunfei Date: Wed, 13 Jan 2021 15:40:29 +0800 Subject: [PATCH 29/72] Update legado.yml --- .github/workflows/legado.yml | 5 ----- 1 file changed, 5 deletions(-) diff --git a/.github/workflows/legado.yml b/.github/workflows/legado.yml index 57c22b832..787d81e48 100644 --- a/.github/workflows/legado.yml +++ b/.github/workflows/legado.yml @@ -39,11 +39,6 @@ jobs: run: | echo "清空18PlusList.txt" echo "">$GITHUB_WORKSPACE/app/src/main/assets/18PlusList.txt - - name: App Minify - if: ${{ github.event_name == 'release'}} - run: | - sed '/minifyEnabled/i\ shrinkResources true' $GITHUB_WORKSPACE/app/build.gradle -i - sed 's/minifyEnabled false/minifyEnabled true/' $GITHUB_WORKSPACE/app/build.gradle -i - name: Release Apk Sign run: | echo "给apk增加签名" From ce2f544017c728ae31b0fa456d59b08590b4a62f Mon Sep 17 00:00:00 2001 From: gedoor Date: Wed, 13 Jan 2021 15:45:20 +0800 Subject: [PATCH 30/72] =?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/web/index.html | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/app/src/main/assets/web/index.html b/app/src/main/assets/web/index.html index d44d08651..45edf04e6 100644 --- a/app/src/main/assets/web/index.html +++ b/app/src/main/assets/web/index.html @@ -228,29 +228,30 @@
章节信息:
+ placeholder="选择章节信息 (规则结果为String)">
翻页规则:
+ placeholder="选择目录下一页链接 (规则结果为List<String>或String)">

正文
+
+
脚本注入:
+ +
正文规则:
+ placeholder="选择正文内容 (规则结果为String)">
翻页规则:
- -
-
-
脚本注入:
- +
资源正则:
From dd5df930223abc0947a09640a51a5ace22e38b74 Mon Sep 17 00:00:00 2001 From: Dacer Date: Thu, 14 Jan 2021 23:06:11 +0900 Subject: [PATCH 31/72] add support for S Pen remote actions --- app/src/main/AndroidManifest.xml | 10 +++++++- .../app/ui/book/read/ReadBookActivity.kt | 8 +++++++ app/src/main/res/xml/spen_remote_actions.xml | 23 +++++++++++++++++++ 3 files changed, 40 insertions(+), 1 deletion(-) create mode 100644 app/src/main/res/xml/spen_remote_actions.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 35207bcbc..4fe52b196 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -150,7 +150,15 @@ + android:launchMode="singleTask"> + + + + + + { + binding.readView.pageDelegate?.keyTurnPage(PageDirection.PREV) + return true + } + keyCode == KeyEvent.KEYCODE_PAGE_DOWN -> { + binding.readView.pageDelegate?.keyTurnPage(PageDirection.NEXT) + return true + } keyCode == KeyEvent.KEYCODE_SPACE -> { binding.readView.pageDelegate?.keyTurnPage(PageDirection.NEXT) return true diff --git a/app/src/main/res/xml/spen_remote_actions.xml b/app/src/main/res/xml/spen_remote_actions.xml new file mode 100644 index 000000000..f38cfebe8 --- /dev/null +++ b/app/src/main/res/xml/spen_remote_actions.xml @@ -0,0 +1,23 @@ + + + + + + + + + \ No newline at end of file From 732cc8e531dc4d0a7b0abe84e63a976f6b18cd83 Mon Sep 17 00:00:00 2001 From: gedoor Date: Fri, 15 Jan 2021 08:25:27 +0800 Subject: [PATCH 32/72] =?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 b0eba749d..ff888e7de 100644 --- a/app/src/main/assets/updateLog.md +++ b/app/src/main/assets/updateLog.md @@ -3,6 +3,9 @@ * 关注合作公众号 **[小说拾遗]** 获取好看的小说。 * 旧版数据导入教程:先在旧版阅读(2.x)中进行备份,然后在新版阅读(3.x)【我的】->【备份与恢复】,选择【导入旧版本数据】。 +**2021/01/15 +* 增加三星 S Pen 支持 by [dacer](https://github.com/dacer) + **2021/01/12** * 修复bug * 朗读时翻页防止重复发送请求 by [litcc](https://github.com/litcc) From 92d90f8d6b85e292bbe3885b656b44764b1ba52c Mon Sep 17 00:00:00 2001 From: gedoor Date: Fri, 15 Jan 2021 09:18:36 +0800 Subject: [PATCH 33/72] =?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/StringExtensions.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 4263fc896..b6a6d23e2 100644 --- a/app/src/main/java/io/legado/app/utils/StringExtensions.kt +++ b/app/src/main/java/io/legado/app/utils/StringExtensions.kt @@ -10,7 +10,7 @@ import java.util.* val removeHtmlRegex = "]*>".toRegex() val imgRegex = "]*>".toRegex() -val notImgHtmlRegex = "]*>".toRegex() +val notImgHtmlRegex = "])[^<>]*>".toRegex() fun String?.safeTrim() = if (this.isNullOrBlank()) null else this.trim() From 019434da061d796435302e352083615c45ba4e5f Mon Sep 17 00:00:00 2001 From: gedoor Date: Fri, 15 Jan 2021 15:09:36 +0800 Subject: [PATCH 34/72] =?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/web/index.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/assets/web/index.js b/app/src/main/assets/web/index.js index 9d09d50de..ba67e7801 100644 --- a/app/src/main/assets/web/index.js +++ b/app/src/main/assets/web/index.js @@ -383,15 +383,15 @@ $('.menu').addEventListener('click', e => { ws.send(`{"tag":"${saveRule[0].bookSourceUrl}", "key":"${sKey}"}`); }; ws.onmessage = (msg) => { - DebugPrint(msg.data == 'finish' ? `\n[${Date().split(' ')[4]}] 调试任务已完成!` : msg.data); - if (msg.data == 'finish') setRule(saveRule[0]); + console.log('[调试]', msg); + DebugPrint(msg.data); }; ws.onerror = (err) => { throw `${err.data}`; } ws.onclose = () => { thisNode.setAttribute('class', ''); - DebugPrint(`[${Date().split(' ')[4]}] 调试服务已关闭!`); + DebugPrint(`\n调试服务已关闭!`); } } else throw `${sResult.errorMsg}`; }).catch(err => { From 21a20f26a880971589dbdefedd83218a5bce7439 Mon Sep 17 00:00:00 2001 From: gedoor Date: Fri, 15 Jan 2021 21:07:16 +0800 Subject: [PATCH 35/72] =?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/about/AboutFragment.kt | 6 +++++- app/src/main/res/xml/about.xml | 10 ++++++---- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/about/AboutFragment.kt b/app/src/main/java/io/legado/app/ui/about/AboutFragment.kt index cb7730827..507a05940 100644 --- a/app/src/main/java/io/legado/app/ui/about/AboutFragment.kt +++ b/app/src/main/java/io/legado/app/ui/about/AboutFragment.kt @@ -9,6 +9,7 @@ import androidx.preference.Preference import androidx.preference.PreferenceFragmentCompat import io.legado.app.App import io.legado.app.R +import io.legado.app.help.AppConfig import io.legado.app.lib.dialogs.alert import io.legado.app.ui.widget.dialog.TextDialog import io.legado.app.utils.openUrl @@ -36,8 +37,11 @@ class AboutFragment : PreferenceFragmentCompat() { override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { addPreferencesFromResource(R.xml.about) - findPreference("check_update")?.summary = + findPreference("update_log")?.summary = "${getString(R.string.version)} ${App.versionName}" + if (AppConfig.isGooglePlay) { + preferenceScreen.removePreferenceRecursively("check_update") + } } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { diff --git a/app/src/main/res/xml/about.xml b/app/src/main/res/xml/about.xml index e8881231a..847d8c7dc 100644 --- a/app/src/main/res/xml/about.xml +++ b/app/src/main/res/xml/about.xml @@ -9,13 +9,15 @@ app:iconSpaceReserved="false" /> From 6c965d1ebee37cf43abe3bcc89ceb084b24e6ea7 Mon Sep 17 00:00:00 2001 From: gedoor Date: Fri, 15 Jan 2021 21:55:11 +0800 Subject: [PATCH 36/72] =?UTF-8?q?=E4=BC=98=E5=8C=96=E8=B0=83=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/io/legado/app/model/Debug.kt | 17 +++++++++++------ .../main/java/io/legado/app/model/rss/Rss.kt | 4 ++-- .../app/ui/rss/article/RssArticlesViewModel.kt | 4 ++-- .../legado/app/ui/rss/read/ReadRssViewModel.kt | 2 +- .../ui/rss/source/debug/RssSourceDebugModel.kt | 2 +- 5 files changed, 17 insertions(+), 12 deletions(-) diff --git a/app/src/main/java/io/legado/app/model/Debug.kt b/app/src/main/java/io/legado/app/model/Debug.kt index ec3d31097..c74a36b5e 100644 --- a/app/src/main/java/io/legado/app/model/Debug.kt +++ b/app/src/main/java/io/legado/app/model/Debug.kt @@ -16,8 +16,8 @@ import java.text.SimpleDateFormat import java.util.* object Debug { - private var debugSource: String? = null var callback: Callback? = null + private var debugSource: String? = null private val tasks: CompositeCoroutine = CompositeCoroutine() @SuppressLint("ConstantLocale") @@ -59,12 +59,12 @@ object Debug { } } - fun startDebug(rssSource: RssSource) { + fun startDebug(scope: CoroutineScope, rssSource: RssSource) { cancelDebug() debugSource = rssSource.sourceUrl log(debugSource, "︾开始解析") val sort = rssSource.sortUrls().entries.first() - Rss.getArticles(sort.key, sort.value, rssSource, 1) + Rss.getArticles(scope, sort.key, sort.value, rssSource, 1) .onSuccess { if (it.articles.isEmpty()) { log(debugSource, "⇒列表页解析成功,为空") @@ -77,7 +77,7 @@ object Debug { if (ruleContent.isNullOrEmpty()) { log(debugSource, "⇒内容规则为空,默认获取整个网页", state = 1000) } else { - rssContentDebug(it.articles[0], ruleContent, rssSource) + rssContentDebug(scope, it.articles[0], ruleContent, rssSource) } } else { log(debugSource, "⇒存在描述规则,不解析内容页") @@ -90,9 +90,14 @@ object Debug { } } - private fun rssContentDebug(rssArticle: RssArticle, ruleContent: String, rssSource: RssSource) { + private fun rssContentDebug( + scope: CoroutineScope, + rssArticle: RssArticle, + ruleContent: String, + rssSource: RssSource + ) { log(debugSource, "︾开始解析内容页") - Rss.getContent(rssArticle, ruleContent, rssSource) + Rss.getContent(scope, rssArticle, ruleContent, rssSource) .onSuccess { log(debugSource, it) log(debugSource, "︽内容页解析完成", state = 1000) diff --git a/app/src/main/java/io/legado/app/model/rss/Rss.kt b/app/src/main/java/io/legado/app/model/rss/Rss.kt index afa6c06fd..71aa5b2b3 100644 --- a/app/src/main/java/io/legado/app/model/rss/Rss.kt +++ b/app/src/main/java/io/legado/app/model/rss/Rss.kt @@ -14,11 +14,11 @@ import kotlin.coroutines.CoroutineContext object Rss { fun getArticles( + scope: CoroutineScope, sortName: String, sortUrl: String, rssSource: RssSource, page: Int, - scope: CoroutineScope = Coroutine.DEFAULT, context: CoroutineContext = Dispatchers.IO ): Coroutine { return Coroutine.async(scope, context) { @@ -35,10 +35,10 @@ object Rss { } fun getContent( + scope: CoroutineScope, rssArticle: RssArticle, ruleContent: String, rssSource: RssSource?, - scope: CoroutineScope = Coroutine.DEFAULT, context: CoroutineContext = Dispatchers.IO ): Coroutine { return Coroutine.async(scope, context) { 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 5d5008145..1196e2ebd 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 @@ -30,7 +30,7 @@ class RssArticlesViewModel(application: Application) : BaseViewModel(application fun loadContent(rssSource: RssSource) { isLoading = true page = 1 - Rss.getArticles(sortName, sortUrl, rssSource, page) + Rss.getArticles(this, sortName, sortUrl, rssSource, page) .onSuccess(Dispatchers.IO) { nextPageUrl = it.nextPageUrl it.articles.let { list -> @@ -60,7 +60,7 @@ class RssArticlesViewModel(application: Application) : BaseViewModel(application page++ val pageUrl = nextPageUrl if (!pageUrl.isNullOrEmpty()) { - Rss.getArticles(sortName, pageUrl, rssSource, page) + Rss.getArticles(this, sortName, pageUrl, rssSource, page) .onSuccess(Dispatchers.IO) { nextPageUrl = it.nextPageUrl loadMoreSuccess(it.articles) 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 0c09f71e6..452f8c87f 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 @@ -94,7 +94,7 @@ class ReadRssViewModel(application: Application) : BaseViewModel(application), } private fun loadContent(rssArticle: RssArticle, ruleContent: String) { - Rss.getContent(rssArticle, ruleContent, rssSource, this) + Rss.getContent(this, rssArticle, ruleContent, rssSource) .onSuccess(IO) { body -> rssArticle.description = body App.db.rssArticleDao.insert(rssArticle) diff --git a/app/src/main/java/io/legado/app/ui/rss/source/debug/RssSourceDebugModel.kt b/app/src/main/java/io/legado/app/ui/rss/source/debug/RssSourceDebugModel.kt index 2d069deab..d903da070 100644 --- a/app/src/main/java/io/legado/app/ui/rss/source/debug/RssSourceDebugModel.kt +++ b/app/src/main/java/io/legado/app/ui/rss/source/debug/RssSourceDebugModel.kt @@ -31,7 +31,7 @@ class RssSourceDebugModel(application: Application) : BaseViewModel(application) rssSource?.let { start?.invoke() Debug.callback = this - Debug.startDebug(it) + Debug.startDebug(this, it) } ?: error?.invoke() } From a6cbb632f39f5e5d986fd704a39653137a85d8d8 Mon Sep 17 00:00:00 2001 From: gedoor Date: Fri, 15 Jan 2021 23:15:30 +0800 Subject: [PATCH 37/72] =?UTF-8?q?=E4=BC=98=E5=8C=96=E8=B0=83=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../io/legado/app/web/SourceDebugWebSocket.kt | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/io/legado/app/web/SourceDebugWebSocket.kt b/app/src/main/java/io/legado/app/web/SourceDebugWebSocket.kt index 97a4ad0f1..747a741f5 100644 --- a/app/src/main/java/io/legado/app/web/SourceDebugWebSocket.kt +++ b/app/src/main/java/io/legado/app/web/SourceDebugWebSocket.kt @@ -1,6 +1,7 @@ package io.legado.app.web +import android.os.Looper import fi.iki.elonen.NanoHTTPD import fi.iki.elonen.NanoWSD import io.legado.app.App @@ -71,7 +72,19 @@ class SourceDebugWebSocket(handshakeRequest: NanoHTTPD.IHTTPSession) : } override fun printLog(state: Int, msg: String) { - launch(IO) { + if (Looper.getMainLooper() == Looper.myLooper()) { + launch(IO) { + runCatching { + send(msg) + if (state == -1 || state == 1000) { + Debug.cancelDebug(true) + close(NanoWSD.WebSocketFrame.CloseCode.NormalClosure, "调试结束", false) + } + }.onFailure { + it.printStackTrace() + } + } + } else { runCatching { send(msg) if (state == -1 || state == 1000) { From f21682229f12bd5f8ea4679dba9a9792b4b03413 Mon Sep 17 00:00:00 2001 From: gedoor Date: Sat, 16 Jan 2021 12:09:16 +0800 Subject: [PATCH 38/72] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E4=B8=80=E4=B8=AA?= =?UTF-8?q?=E9=BB=98=E8=AE=A4=E8=AE=A2=E9=98=85=E6=BA=90,=E9=98=85?= =?UTF-8?q?=E8=AF=BB=E4=B8=8B=E8=BD=BD=E6=BA=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/assets/defaultData/rssSources.json | 21 +++++++++++++++++++ .../java/io/legado/app/help/DefaultData.kt | 13 ++++++++++++ .../java/io/legado/app/help/LocalConfig.kt | 3 +++ .../java/io/legado/app/help/storage/Backup.kt | 4 ++-- .../io/legado/app/help/storage/Restore.kt | 2 +- .../io/legado/app/ui/main/MainViewModel.kt | 3 +++ 6 files changed, 43 insertions(+), 3 deletions(-) create mode 100644 app/src/main/assets/defaultData/rssSources.json diff --git a/app/src/main/assets/defaultData/rssSources.json b/app/src/main/assets/defaultData/rssSources.json new file mode 100644 index 000000000..b4b2a70e0 --- /dev/null +++ b/app/src/main/assets/defaultData/rssSources.json @@ -0,0 +1,21 @@ +[ + { + "articleStyle": 0, + "customOrder": 1, + "enableJs": true, + "enabled": true, + "loadWithBaseUrl": false, + "ruleArticles": "class.release-main-section||tbody@tr", + "ruleContent": "@js:\nif(baseUrl.match(\/90pan\/)){\nresult=result.replace(\/true\\||<.*?>([^<]+)<\\\/span><\\\/a>\/g,'

$2<\/a><\/h4>

$1<\/p>\\n\\n')}\nelse{\nhtml=String(java.getString(\"@@class.markdown-body@html\",false)+java.getString(\"@@class.flex-justify-between.-1@html\",false));\nhref='https:\/\/github.com'+String(java.getString(\"@@class.flex-justify-between.-1@class.Box-body.0@a@href\",false))\nhtml+'

下载地址:<\/p>'+href+'<\/a>'\n}", + "ruleImage": "@js:if(baseUrl.match(\/legado|704\/g)){\nresult='https:\/\/urlmin.cn\/034'\n}else{result=\"https:\/\/urlmin.cn\/15c\"}", + "ruleLink": "tag.a.0@href\n@js:if(baseUrl.match(\/90pan\/)){\nresult='https:\/\/www.90pan.com\/ajax.php,{\"method\": \"POST\",\"body\": \"action=load_down_addr1&file_id='+result.match(\/b(\\d+)\/)[1]+'\"}'}else{\nresult='https:\/\/github.com'+result\n}", + "ruleNextPage": "text.Next@href", + "rulePubDate": "tag.td!0@text||class.markdown-body@text##\\n##·", + "ruleTitle": "tag.a.0@text", + "sortUrl": "阅读2.0·GitHub::https:\/\/github.com\/gedoor\/MyBookshelf\/releases\n阅读3.0·GitHub::https:\/\/github.com\/gedoor\/legado\/releases\n阅读2.0·90盘::https:\/\/www.90pan.com\/o138703\n阅读3.0·90盘::https:\/\/www.90pan.com\/o138704", + "sourceIcon": "http:\/\/ku.mumuceo.com\/static\/images\/applogo\/yuedu.png", + "sourceName": "阅读下载", + "sourceUrl": "https:\/\/github.com\/gedoor\/legado\/releases", + "style": "" + } +] \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/help/DefaultData.kt b/app/src/main/java/io/legado/app/help/DefaultData.kt index d2bab07f1..26d94814a 100644 --- a/app/src/main/java/io/legado/app/help/DefaultData.kt +++ b/app/src/main/java/io/legado/app/help/DefaultData.kt @@ -2,6 +2,7 @@ package io.legado.app.help import io.legado.app.App import io.legado.app.data.entities.HttpTTS +import io.legado.app.data.entities.RssSource import io.legado.app.data.entities.TxtTocRule import io.legado.app.utils.GSON import io.legado.app.utils.fromJsonArray @@ -45,6 +46,14 @@ object DefaultData { GSON.fromJsonArray(json)!! } + val rssSources by lazy { + val json = String( + App.INSTANCE.assets.open("defaultData${File.separator}rssSources.json") + .readBytes() + ) + GSON.fromJsonArray(json)!! + } + fun importDefaultHttpTTS() { App.db.httpTTSDao.deleteDefault() httpTTS.let { @@ -58,4 +67,8 @@ object DefaultData { App.db.txtTocRule.insert(*it.toTypedArray()) } } + + fun importDefaultRssSources() { + App.db.rssSourceDao.insert(*rssSources.toTypedArray()) + } } \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/help/LocalConfig.kt b/app/src/main/java/io/legado/app/help/LocalConfig.kt index ac0d3034d..71c529a04 100644 --- a/app/src/main/java/io/legado/app/help/LocalConfig.kt +++ b/app/src/main/java/io/legado/app/help/LocalConfig.kt @@ -69,4 +69,7 @@ object LocalConfig { val hasUpTxtTocRule: Boolean get() = isLastVersion(1, "txtTocRuleVersion") + + val hasUpRssSources: Boolean + get() = isLastVersion(1, "rssSourceVersion") } \ No newline at end of file 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 1686df19e..a26f5174f 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 @@ -29,7 +29,7 @@ object Backup { "bookmark.json", "bookGroup.json", "bookSource.json", - "rssSource.json", + "rssSources.json", "rssStar.json", "replaceRule.json", "readRecord.json", @@ -61,7 +61,7 @@ object Backup { writeListToJson(App.db.bookmarkDao.all, "bookmark.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.rssSourceDao.all, "rssSources.json", backupPath) writeListToJson(App.db.rssStarDao.all, "rssStar.json", backupPath) writeListToJson(App.db.replaceRuleDao.all, "replaceRule.json", backupPath) writeListToJson(App.db.readRecordDao.all, "readRecord.json", backupPath) 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 b0d833b0c..212152849 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 @@ -122,7 +122,7 @@ object Restore { fileToListT(path, "bookSource.json")?.let { App.db.bookSourceDao.insert(*it.toTypedArray()) } - fileToListT(path, "rssSource.json")?.let { + fileToListT(path, "rssSources.json")?.let { App.db.rssSourceDao.insert(*it.toTypedArray()) } fileToListT(path, "rssStar.json")?.let { 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 88969fe5d..c115e661a 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 @@ -157,6 +157,9 @@ class MainViewModel(application: Application) : BaseViewModel(application) { if (LocalConfig.hasUpTxtTocRule) { DefaultData.importDefaultTocRules() } + if (LocalConfig.hasUpRssSources) { + DefaultData.importDefaultRssSources() + } } } } \ No newline at end of file From ed2e80c13db1b3b743f85d64e653040c77f77781 Mon Sep 17 00:00:00 2001 From: gedoor Date: Sat, 16 Jan 2021 12:56:08 +0800 Subject: [PATCH 39/72] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E4=B8=80=E4=B8=AA?= =?UTF-8?q?=E9=BB=98=E8=AE=A4=E8=AE=A2=E9=98=85=E6=BA=90,=E9=98=85?= =?UTF-8?q?=E8=AF=BB=E4=B8=8B=E8=BD=BD=E6=BA=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/io/legado/app/help/LocalConfig.kt | 6 +++--- .../legado/app/ui/rss/source/manage/RssSourceActivity.kt | 1 + .../legado/app/ui/rss/source/manage/RssSourceViewModel.kt | 7 +++++++ app/src/main/res/menu/rss_source.xml | 6 ++++++ 4 files changed, 17 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/io/legado/app/help/LocalConfig.kt b/app/src/main/java/io/legado/app/help/LocalConfig.kt index 71c529a04..e6a22553d 100644 --- a/app/src/main/java/io/legado/app/help/LocalConfig.kt +++ b/app/src/main/java/io/legado/app/help/LocalConfig.kt @@ -65,11 +65,11 @@ object LocalConfig { get() = isLastVersion(1, "ruleHelpVersion") val hasUpHttpTTS: Boolean - get() = isLastVersion(1, "httpTtsVersion") + get() = !isLastVersion(1, "httpTtsVersion") val hasUpTxtTocRule: Boolean - get() = isLastVersion(1, "txtTocRuleVersion") + get() = !isLastVersion(1, "txtTocRuleVersion") val hasUpRssSources: Boolean - get() = isLastVersion(1, "rssSourceVersion") + get() = !isLastVersion(1, "rssSourceVersion") } \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/ui/rss/source/manage/RssSourceActivity.kt b/app/src/main/java/io/legado/app/ui/rss/source/manage/RssSourceActivity.kt index 4a5ac68cd..1e6156391 100644 --- a/app/src/main/java/io/legado/app/ui/rss/source/manage/RssSourceActivity.kt +++ b/app/src/main/java/io/legado/app/ui/rss/source/manage/RssSourceActivity.kt @@ -92,6 +92,7 @@ class RssSourceActivity : VMBaseActivity viewModel.shareSelection(adapter.getSelection()) { startActivity(Intent.createChooser(it, getString(R.string.share_selected_source))) } + R.id.menu_import_default -> viewModel.importDefault() R.id.menu_help -> showHelp() else -> if (item.groupId == R.id.source_group) { binding.titleBar.findViewById(R.id.search_view) diff --git a/app/src/main/java/io/legado/app/ui/rss/source/manage/RssSourceViewModel.kt b/app/src/main/java/io/legado/app/ui/rss/source/manage/RssSourceViewModel.kt index 9a90932df..7ff23307c 100644 --- a/app/src/main/java/io/legado/app/ui/rss/source/manage/RssSourceViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/rss/source/manage/RssSourceViewModel.kt @@ -9,6 +9,7 @@ import io.legado.app.App import io.legado.app.BuildConfig import io.legado.app.base.BaseViewModel import io.legado.app.data.entities.RssSource +import io.legado.app.help.DefaultData import io.legado.app.utils.* import org.jetbrains.anko.toast import java.io.File @@ -166,4 +167,10 @@ class RssSourceViewModel(application: Application) : BaseViewModel(application) } } + fun importDefault() { + execute { + DefaultData.importDefaultRssSources() + } + } + } \ No newline at end of file diff --git a/app/src/main/res/menu/rss_source.xml b/app/src/main/res/menu/rss_source.xml index b8915e094..739b68d58 100644 --- a/app/src/main/res/menu/rss_source.xml +++ b/app/src/main/res/menu/rss_source.xml @@ -48,6 +48,12 @@ android:title="@string/import_by_qr_code" app:showAsAction="never" /> + + Date: Sat, 16 Jan 2021 18:16:46 +0800 Subject: [PATCH 40/72] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E4=B8=80=E4=B8=AA?= =?UTF-8?q?=E9=BB=98=E8=AE=A4=E8=AE=A2=E9=98=85=E6=BA=90,=E9=98=85?= =?UTF-8?q?=E8=AF=BB=E4=B8=8B=E8=BD=BD=E6=BA=90?= 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 ff888e7de..7b596b95b 100644 --- a/app/src/main/assets/updateLog.md +++ b/app/src/main/assets/updateLog.md @@ -3,8 +3,9 @@ * 关注合作公众号 **[小说拾遗]** 获取好看的小说。 * 旧版数据导入教程:先在旧版阅读(2.x)中进行备份,然后在新版阅读(3.x)【我的】->【备份与恢复】,选择【导入旧版本数据】。 -**2021/01/15 +**2021/01/16 * 增加三星 S Pen 支持 by [dacer](https://github.com/dacer) +* 订阅添加阅读下载,可以从多个渠道下载 **2021/01/12** * 修复bug From 41b32f26ce20c531614c22533925b660342c8942 Mon Sep 17 00:00:00 2001 From: gedoor Date: Sat, 16 Jan 2021 19:19:38 +0800 Subject: [PATCH 41/72] =?UTF-8?q?=E5=AF=BC=E5=85=A5=E4=B9=A6=E6=BA=90?= =?UTF-8?q?=E6=98=AF=E8=87=AA=E5=AE=9A=E4=B9=89=E5=88=86=E7=BB=84=E5=8F=AF?= =?UTF-8?q?=E9=80=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/io/legado/app/data/dao/BookSourceDao.kt | 12 ++++++------ .../app/ui/association/ImportBookSourceDialog.kt | 15 +++++++++++---- .../ui/book/source/manage/BookSourceActivity.kt | 4 ++-- 3 files changed, 19 insertions(+), 12 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 c2f82bf13..7a40d4cc8 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 @@ -32,18 +32,15 @@ interface BookSourceDao { @Query("select * from book_sources where enabledExplore = 1 and trim(exploreUrl) <> '' and (bookSourceGroup like :key) order by customOrder asc") fun liveGroupExplore(key: String): LiveData> - @Query("select bookSourceGroup from book_sources where trim(bookSourceGroup) <> ''") + @Query("select distinct bookSourceGroup from book_sources where trim(bookSourceGroup) <> ''") fun liveGroup(): LiveData> - @Query("select bookSourceGroup from book_sources where enabled = 1 and trim(bookSourceGroup) <> ''") + @Query("select distinct bookSourceGroup from book_sources where enabled = 1 and trim(bookSourceGroup) <> ''") fun liveGroupEnabled(): LiveData> - @Query("select bookSourceGroup from book_sources where enabledExplore = 1 and trim(exploreUrl) <> '' and trim(bookSourceGroup) <> ''") + @Query("select distinct bookSourceGroup from book_sources where enabledExplore = 1 and trim(exploreUrl) <> '' and trim(bookSourceGroup) <> ''") fun liveExploreGroup(): LiveData> - @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("select * from book_sources where enabledExplore = 1 order by customOrder asc") fun observeFind(): DataSource.Factory @@ -68,6 +65,9 @@ interface BookSourceDao { @get:Query("select * from book_sources where enabled = 1 and bookSourceType = 0 order by customOrder") val allTextEnabled: List + @get:Query("select distinct bookSourceGroup from book_sources where trim(bookSourceGroup) <> ''") + val allGroup: List + @Query("select * from book_sources where bookSourceUrl = :key") fun getBookSource(key: String): BookSource? diff --git a/app/src/main/java/io/legado/app/ui/association/ImportBookSourceDialog.kt b/app/src/main/java/io/legado/app/ui/association/ImportBookSourceDialog.kt index 6aa236744..0f3e6008f 100644 --- a/app/src/main/java/io/legado/app/ui/association/ImportBookSourceDialog.kt +++ b/app/src/main/java/io/legado/app/ui/association/ImportBookSourceDialog.kt @@ -10,10 +10,12 @@ import android.view.View import android.view.ViewGroup import androidx.appcompat.widget.Toolbar import androidx.recyclerview.widget.LinearLayoutManager +import io.legado.app.App import io.legado.app.R import io.legado.app.base.BaseDialogFragment import io.legado.app.base.adapter.ItemViewHolder import io.legado.app.base.adapter.RecyclerAdapter +import io.legado.app.constant.AppPattern import io.legado.app.constant.PreferKey import io.legado.app.data.entities.BookSource import io.legado.app.databinding.DialogEditTextBinding @@ -21,10 +23,8 @@ import io.legado.app.databinding.DialogRecyclerViewBinding import io.legado.app.databinding.ItemSourceImportBinding import io.legado.app.help.AppConfig import io.legado.app.lib.dialogs.alert -import io.legado.app.utils.getViewModelOfActivity -import io.legado.app.utils.putPrefBoolean +import io.legado.app.utils.* import io.legado.app.utils.viewbindingdelegate.viewBinding -import io.legado.app.utils.visible import org.jetbrains.anko.sdk27.listeners.onClick /** @@ -85,7 +85,14 @@ class ImportBookSourceDialog : BaseDialogFragment(), Toolbar.OnMenuItemClickList when (item.itemId) { R.id.menu_new_group -> { alert(R.string.diy_edit_source_group) { - val alertBinding = DialogEditTextBinding.inflate(layoutInflater) + val alertBinding = DialogEditTextBinding.inflate(layoutInflater).apply { + val groups = linkedSetOf() + App.db.bookSourceDao.allGroup.forEach { group -> + groups.addAll(group.splitNotBlank(AppPattern.splitGroupRegex)) + } + editView.setFilterValues(groups.toList()) + editView.dropDownHeight = 180.dp + } customView = alertBinding.root okButton { alertBinding.editView.text?.toString()?.let { group -> 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 b23e1a641..aa78e4a5b 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 @@ -58,7 +58,7 @@ class BookSourceActivity : VMBaseActivity>? = null - private var groups = linkedSetOf() + private val groups = linkedSetOf() private var groupMenu: SubMenu? = null private var sort = Sort.Default private var sortAscending = true @@ -249,7 +249,7 @@ class BookSourceActivity : VMBaseActivity + it.forEach { group -> groups.addAll(group.splitNotBlank(AppPattern.splitGroupRegex)) } upGroupMenu() From 0da3abcc883c18b9ad7d2b56702547b34be5eef4 Mon Sep 17 00:00:00 2001 From: gedoor Date: Sat, 16 Jan 2021 19:36:49 +0800 Subject: [PATCH 42/72] =?UTF-8?q?=E5=AF=BC=E5=85=A5=E4=B9=A6=E6=BA=90?= =?UTF-8?q?=E6=98=AF=E8=87=AA=E5=AE=9A=E4=B9=89=E5=88=86=E7=BB=84=E5=8F=AF?= =?UTF-8?q?=E9=80=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/io/legado/app/data/dao/RssSourceDao.kt | 5 ++++- .../app/ui/association/ImportRssSourceDialog.kt | 15 +++++++++++---- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/io/legado/app/data/dao/RssSourceDao.kt b/app/src/main/java/io/legado/app/data/dao/RssSourceDao.kt index 001877246..deaa45726 100644 --- a/app/src/main/java/io/legado/app/data/dao/RssSourceDao.kt +++ b/app/src/main/java/io/legado/app/data/dao/RssSourceDao.kt @@ -37,9 +37,12 @@ interface RssSourceDao { @Query("SELECT * FROM rssSources where enabled = 1 and sourceGroup like :searchKey order by customOrder") fun liveEnabledByGroup(searchKey: String): LiveData> - @Query("select sourceGroup from rssSources where trim(sourceGroup) <> ''") + @Query("select distinct sourceGroup from rssSources where trim(sourceGroup) <> ''") fun liveGroup(): LiveData> + @get:Query("select distinct sourceGroup from rssSources where trim(sourceGroup) <> ''") + val allGroup: List + @get:Query("select min(customOrder) from rssSources") val minOrder: Int diff --git a/app/src/main/java/io/legado/app/ui/association/ImportRssSourceDialog.kt b/app/src/main/java/io/legado/app/ui/association/ImportRssSourceDialog.kt index 41bda67fd..5ad9aeee7 100644 --- a/app/src/main/java/io/legado/app/ui/association/ImportRssSourceDialog.kt +++ b/app/src/main/java/io/legado/app/ui/association/ImportRssSourceDialog.kt @@ -10,10 +10,12 @@ import android.view.View import android.view.ViewGroup import androidx.appcompat.widget.Toolbar import androidx.recyclerview.widget.LinearLayoutManager +import io.legado.app.App import io.legado.app.R import io.legado.app.base.BaseDialogFragment import io.legado.app.base.adapter.ItemViewHolder import io.legado.app.base.adapter.RecyclerAdapter +import io.legado.app.constant.AppPattern import io.legado.app.constant.PreferKey import io.legado.app.data.entities.RssSource import io.legado.app.databinding.DialogEditTextBinding @@ -21,10 +23,8 @@ import io.legado.app.databinding.DialogRecyclerViewBinding import io.legado.app.databinding.ItemSourceImportBinding import io.legado.app.help.AppConfig import io.legado.app.lib.dialogs.alert -import io.legado.app.utils.getViewModelOfActivity -import io.legado.app.utils.putPrefBoolean +import io.legado.app.utils.* import io.legado.app.utils.viewbindingdelegate.viewBinding -import io.legado.app.utils.visible import org.jetbrains.anko.sdk27.listeners.onClick /** @@ -85,7 +85,14 @@ class ImportRssSourceDialog : BaseDialogFragment(), Toolbar.OnMenuItemClickListe when (item.itemId) { R.id.menu_new_group -> { alert(R.string.diy_edit_source_group) { - val alertBinding = DialogEditTextBinding.inflate(layoutInflater) + val alertBinding = DialogEditTextBinding.inflate(layoutInflater).apply { + val groups = linkedSetOf() + App.db.rssSourceDao.allGroup.forEach { group -> + groups.addAll(group.splitNotBlank(AppPattern.splitGroupRegex)) + } + editView.setFilterValues(groups.toList()) + editView.dropDownHeight = 180.dp + } customView = alertBinding.root okButton { alertBinding.editView.text?.toString()?.let { group -> From 06d8f16e3021ed2ebacd6173d1d1ced8ac6c93f7 Mon Sep 17 00:00:00 2001 From: gedoor Date: Sun, 17 Jan 2021 22:19:32 +0800 Subject: [PATCH 43/72] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=B4=A9=E6=BA=83bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/io/legado/app/ui/book/read/ReadBookActivity.kt | 2 +- .../io/legado/app/ui/book/read/page/ContentTextView.kt | 8 ++++---- .../io/legado/app/ui/book/read/page/entities/TextLine.kt | 6 ++++-- .../io/legado/app/ui/book/read/page/entities/TextPage.kt | 6 ++++++ 4 files changed, 15 insertions(+), 7 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 a0b8ef515..4a2c8db88 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 @@ -784,7 +784,7 @@ class ReadBookActivity : ReadBookBaseActivity(), super.onActivityResult(requestCode, resultCode, data) if (resultCode == Activity.RESULT_OK) { when (requestCode) { - requestCodeEditSource -> viewModel.upBookSource() { + requestCodeEditSource -> viewModel.upBookSource { upView() } requestCodeChapterList -> diff --git a/app/src/main/java/io/legado/app/ui/book/read/page/ContentTextView.kt b/app/src/main/java/io/legado/app/ui/book/read/page/ContentTextView.kt index 4d431f8a5..24eebb6d1 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/page/ContentTextView.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/page/ContentTextView.kt @@ -347,8 +347,8 @@ class ContentTextView(context: Context, attrs: AttributeSet?) : View(context, at selectStart[0] = relativePage selectStart[1] = lineIndex selectStart[2] = charIndex - val textLine = relativePage(relativePage).textLines[lineIndex] - val textChar = textLine.textChars[charIndex] + val textLine = relativePage(relativePage).getLine(lineIndex) + val textChar = textLine.getTextChar(charIndex) upSelectedStart( textChar.start, textLine.lineBottom + relativeOffset(relativePage), @@ -364,8 +364,8 @@ class ContentTextView(context: Context, attrs: AttributeSet?) : View(context, at selectEnd[0] = relativePage selectEnd[1] = lineIndex selectEnd[2] = charIndex - val textLine = relativePage(relativePage).textLines[lineIndex] - val textChar = textLine.textChars[charIndex] + val textLine = relativePage(relativePage).getLine(lineIndex) + val textChar = textLine.getTextChar(lineIndex) upSelectedEnd(textChar.end, textLine.lineBottom + relativeOffset(relativePage)) upSelectChars() } diff --git a/app/src/main/java/io/legado/app/ui/book/read/page/entities/TextLine.kt b/app/src/main/java/io/legado/app/ui/book/read/page/entities/TextLine.kt index d921a217e..9d73757bb 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/page/entities/TextLine.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/page/entities/TextLine.kt @@ -28,8 +28,10 @@ data class TextLine( textChars.add(TextChar(charData, start = start, end = end)) } - fun getTextCharAt(index: Int): TextChar { - return textChars[index] + fun getTextChar(index: Int): TextChar { + return textChars.getOrElse(index) { + textChars.last() + } } fun getTextCharReverseAt(index: Int): TextChar { diff --git a/app/src/main/java/io/legado/app/ui/book/read/page/entities/TextPage.kt b/app/src/main/java/io/legado/app/ui/book/read/page/entities/TextPage.kt index e2d291141..ba57dbc48 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/page/entities/TextPage.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/page/entities/TextPage.kt @@ -25,6 +25,12 @@ data class TextPage( val lineSize get() = textLines.size val charSize get() = text.length + fun getLine(index: Int): TextLine { + return textLines.getOrElse(index) { + textLines.last() + } + } + fun upLinesPosition() = ChapterProvider.apply { if (!ReadBookConfig.textBottomJustify) return@apply if (textLines.size <= 1) return@apply From d3e0a1f60586deb90f92315d707661c64605cc8a Mon Sep 17 00:00:00 2001 From: gedoor Date: Mon, 18 Jan 2021 10:37:33 +0800 Subject: [PATCH 44/72] =?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/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 7e1977da9..9a4368608 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -174,8 +174,8 @@ dependencies { //网络 implementation 'com.squareup.okhttp3:okhttp:4.9.0' - implementation 'com.ljx.rxhttp:rxhttp:2.5.1' - kapt 'com.ljx.rxhttp:rxhttp-compiler:2.5.1' + implementation 'com.ljx.rxhttp:rxhttp:2.5.3' + kapt 'com.ljx.rxhttp:rxhttp-compiler:2.5.3' //Glide implementation 'com.github.bumptech.glide:glide:4.11.0' From 14bc109a2beb22c5ac5c8a14925b107194e4fd44 Mon Sep 17 00:00:00 2001 From: gedoor Date: Mon, 18 Jan 2021 15:24:57 +0800 Subject: [PATCH 45/72] =?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/help/ReadBook.kt | 32 +++++++-- .../app/ui/book/read/ReadBookActivity.kt | 68 +++++++++---------- .../app/ui/book/read/ReadBookViewModel.kt | 6 +- app/src/main/res/values/pref_key_value.xml | 1 + app/src/main/res/xml/about.xml | 6 ++ 5 files changed, 68 insertions(+), 45 deletions(-) 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 c76386bd6..512f7ff7e 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 @@ -240,19 +240,28 @@ object ReadBook { /** * 加载章节内容 */ - fun loadContent(resetPageOffset: Boolean) { - loadContent(durChapterIndex, resetPageOffset = resetPageOffset) + fun loadContent(resetPageOffset: Boolean, success: (() -> Unit)? = null) { + loadContent(durChapterIndex, resetPageOffset = resetPageOffset) { + success?.invoke() + } loadContent(durChapterIndex + 1, resetPageOffset = resetPageOffset) loadContent(durChapterIndex - 1, resetPageOffset = resetPageOffset) } - fun loadContent(index: Int, upContent: Boolean = true, resetPageOffset: Boolean) { + fun loadContent( + index: Int, + upContent: Boolean = true, + resetPageOffset: Boolean, + success: (() -> Unit)? = null + ) { book?.let { book -> if (addLoading(index)) { Coroutine.async { App.db.bookChapterDao.getChapter(book.bookUrl, index)?.let { chapter -> BookHelp.getContent(book, chapter)?.let { - contentLoadFinish(book, chapter, it, upContent, resetPageOffset) + contentLoadFinish(book, chapter, it, upContent, resetPageOffset) { + success?.invoke() + } removeLoading(chapter.index) } ?: download(chapter, resetPageOffset = resetPageOffset) } ?: removeLoading(index) @@ -282,7 +291,11 @@ object ReadBook { } } - private fun download(chapter: BookChapter, resetPageOffset: Boolean) { + private fun download( + chapter: BookChapter, + resetPageOffset: Boolean, + success: (() -> Unit)? = null + ) { val book = book val webBook = webBook if (book != null && webBook != null) { @@ -290,7 +303,9 @@ object ReadBook { } else if (book != null) { contentLoadFinish( book, chapter, "没有书源", resetPageOffset = resetPageOffset - ) + ) { + success?.invoke() + } removeLoading(chapter.index) } else { removeLoading(chapter.index) @@ -379,7 +394,8 @@ object ReadBook { chapter: BookChapter, content: String, upContent: Boolean = true, - resetPageOffset: Boolean + resetPageOffset: Boolean, + success: (() -> Unit)? = null ) { Coroutine.async { ImageProvider.clearOut(durChapterIndex) @@ -420,6 +436,8 @@ object ReadBook { }.onError { it.printStackTrace() App.INSTANCE.toast("ChapterProvider ERROR:\n${it.getStackTraceString()}") + }.onSuccess { + success?.invoke() } } 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 4a2c8db88..c46eb3dc4 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 @@ -806,43 +806,39 @@ class ReadBookActivity : ReadBookBaseActivity(), } private fun skipToSearch(index: Int, indexWithinChapter: Int) { - launch(IO) { - viewModel.openChapter(index) - // block until load correct chapter and pages - var pages = ReadBook.curTextChapter?.pages - while (ReadBook.durChapterIndex != index || pages == null) { - delay(100L) - pages = ReadBook.curTextChapter?.pages - } - val positions = ReadBook.searchResultPositions( - pages, - indexWithinChapter, - viewModel.searchContentQuery - ) - while (ReadBook.durPageIndex() != positions[0]) { - delay(100L) - ReadBook.skipToPage(positions[0]) - } - withContext(Main) { - binding.readView.curPage.selectStartMoveIndex(0, positions[1], positions[2]) - delay(20L) - when (positions[3]) { - 0 -> binding.readView.curPage.selectEndMoveIndex( - 0, - positions[1], - positions[2] + viewModel.searchContentQuery.length - 1 - ) - 1 -> binding.readView.curPage.selectEndMoveIndex( - 0, - positions[1] + 1, - positions[4] - ) - //consider change page, jump to scroll position - -1 -> binding.readView.curPage - .selectEndMoveIndex(1, 0, positions[4]) + viewModel.openChapter(index) { + launch(IO) { + val pages = ReadBook.curTextChapter?.pages ?: return@launch + val positions = ReadBook.searchResultPositions( + pages, + indexWithinChapter, + viewModel.searchContentQuery + ) + while (ReadBook.durPageIndex() != positions[0]) { + delay(100L) + ReadBook.skipToPage(positions[0]) + } + withContext(Main) { + binding.readView.curPage.selectStartMoveIndex(0, positions[1], positions[2]) + delay(20L) + when (positions[3]) { + 0 -> binding.readView.curPage.selectEndMoveIndex( + 0, + positions[1], + positions[2] + viewModel.searchContentQuery.length - 1 + ) + 1 -> binding.readView.curPage.selectEndMoveIndex( + 0, + positions[1] + 1, + positions[4] + ) + //consider change page, jump to scroll position + -1 -> binding.readView.curPage + .selectEndMoveIndex(1, 0, positions[4]) + } + binding.readView.isTextSelected = true + delay(100L) } - binding.readView.isTextSelected = true - delay(100L) } } } 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 7e718ff36..d73f96658 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 @@ -250,7 +250,7 @@ class ReadBookViewModel(application: Application) : BaseViewModel(application) { } } - fun openChapter(index: Int, durChapterPos: Int = 0) { + fun openChapter(index: Int, durChapterPos: Int = 0, success: (() -> Unit)? = null) { ReadBook.prevTextChapter = null ReadBook.curTextChapter = null ReadBook.nextTextChapter = null @@ -260,7 +260,9 @@ class ReadBookViewModel(application: Application) : BaseViewModel(application) { ReadBook.durChapterPos = durChapterPos } ReadBook.saveRead() - ReadBook.loadContent(resetPageOffset = true) + ReadBook.loadContent(resetPageOffset = true) { + success?.invoke() + } } fun removeFromBookshelf(success: (() -> Unit)?) { diff --git a/app/src/main/res/values/pref_key_value.xml b/app/src/main/res/values/pref_key_value.xml index 78e9f018d..ebaac231b 100644 --- a/app/src/main/res/values/pref_key_value.xml +++ b/app/src/main/res/values/pref_key_value.xml @@ -13,4 +13,5 @@ https://github.com/gedoor/legado/releases/latest https://api.github.com/repos/gedoor/legado/releases/latest https://t.me/yueduguanfang + https://discord.gg/qDE52P5xGW diff --git a/app/src/main/res/xml/about.xml b/app/src/main/res/xml/about.xml index 847d8c7dc..69e339435 100644 --- a/app/src/main/res/xml/about.xml +++ b/app/src/main/res/xml/about.xml @@ -53,6 +53,12 @@ android:summary="@string/this_github_url" app:iconSpaceReserved="false" /> + + Date: Mon, 18 Jan 2021 15:26:19 +0800 Subject: [PATCH 46/72] =?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/about/AboutFragment.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/java/io/legado/app/ui/about/AboutFragment.kt b/app/src/main/java/io/legado/app/ui/about/AboutFragment.kt index 507a05940..10a54b33b 100644 --- a/app/src/main/java/io/legado/app/ui/about/AboutFragment.kt +++ b/app/src/main/java/io/legado/app/ui/about/AboutFragment.kt @@ -63,6 +63,7 @@ class AboutFragment : PreferenceFragmentCompat() { "qq" -> showQqGroups() "gzGzh" -> requireContext().sendToClip(getString(R.string.legado_gzh)) "tg" -> openUrl(R.string.tg_url) + "discord" -> openUrl(R.string.discord_url) } return super.onPreferenceTreeClick(preference) } From ebb760aeb8fc8e1f671ab22c64236dfbbfb1887d Mon Sep 17 00:00:00 2001 From: gedoor Date: Mon, 18 Jan 2021 15:36:58 +0800 Subject: [PATCH 47/72] =?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/help/ReadBook.kt | 17 ++++++++-- .../app/ui/book/read/ReadBookActivity.kt | 33 +++++++++---------- 2 files changed, 30 insertions(+), 20 deletions(-) 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 512f7ff7e..1a2d7b340 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 @@ -183,9 +183,11 @@ object ReadBook { } } - fun skipToPage(index: Int) { + fun skipToPage(index: Int, success: (() -> Unit)? = null) { durChapterPos = curTextChapter?.getReadLength(index) ?: index - callBack?.upContent() + callBack?.upContent() { + success?.invoke() + } curPageChanged() saveRead() } @@ -478,10 +480,19 @@ object ReadBook { interface CallBack { fun loadChapterList(book: Book) - fun upContent(relativePosition: Int = 0, resetPageOffset: Boolean = true) + + fun upContent( + relativePosition: Int = 0, + resetPageOffset: Boolean = true, + success: (() -> Unit)? = null + ) + fun upView() + fun pageChanged() + fun contentLoadFinish() + fun upPageAnim() } 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 c46eb3dc4..14482296a 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 @@ -51,10 +51,8 @@ import io.legado.app.ui.widget.dialog.TextDialog import io.legado.app.utils.* import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers.IO -import kotlinx.coroutines.Dispatchers.Main import kotlinx.coroutines.delay import kotlinx.coroutines.launch -import kotlinx.coroutines.withContext import org.jetbrains.anko.startActivity import org.jetbrains.anko.startActivityForResult import org.jetbrains.anko.toast @@ -531,13 +529,18 @@ class ReadBookActivity : ReadBookBaseActivity(), /** * 更新内容 */ - override fun upContent(relativePosition: Int, resetPageOffset: Boolean) { - autoPageProgress = 0 + override fun upContent( + relativePosition: Int, + resetPageOffset: Boolean, + success: (() -> Unit)? + ) { launch { + autoPageProgress = 0 binding.readView.upContent(relativePosition, resetPageOffset) binding.readMenu.setSeekPage(ReadBook.durPageIndex()) + loadStates = false + success?.invoke() } - loadStates = false } /** @@ -807,18 +810,14 @@ class ReadBookActivity : ReadBookBaseActivity(), private fun skipToSearch(index: Int, indexWithinChapter: Int) { viewModel.openChapter(index) { - launch(IO) { - val pages = ReadBook.curTextChapter?.pages ?: return@launch - val positions = ReadBook.searchResultPositions( - pages, - indexWithinChapter, - viewModel.searchContentQuery - ) - while (ReadBook.durPageIndex() != positions[0]) { - delay(100L) - ReadBook.skipToPage(positions[0]) - } - withContext(Main) { + val pages = ReadBook.curTextChapter?.pages ?: return@openChapter + val positions = ReadBook.searchResultPositions( + pages, + indexWithinChapter, + viewModel.searchContentQuery + ) + ReadBook.skipToPage(positions[0]) { + launch { binding.readView.curPage.selectStartMoveIndex(0, positions[1], positions[2]) delay(20L) when (positions[3]) { From ae0aaa0ffc9d3763a9c43628defff1fe20775e7f Mon Sep 17 00:00:00 2001 From: gedoor Date: Mon, 18 Jan 2021 17:11:46 +0800 Subject: [PATCH 48/72] =?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/page/ContentTextView.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/io/legado/app/ui/book/read/page/ContentTextView.kt b/app/src/main/java/io/legado/app/ui/book/read/page/ContentTextView.kt index 24eebb6d1..10a454109 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/page/ContentTextView.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/page/ContentTextView.kt @@ -365,7 +365,7 @@ class ContentTextView(context: Context, attrs: AttributeSet?) : View(context, at selectEnd[1] = lineIndex selectEnd[2] = charIndex val textLine = relativePage(relativePage).getLine(lineIndex) - val textChar = textLine.getTextChar(lineIndex) + val textChar = textLine.getTextChar(charIndex) upSelectedEnd(textChar.end, textLine.lineBottom + relativeOffset(relativePage)) upSelectChars() } From a7d861b670b909c577d39b79434175bf0576c0c0 Mon Sep 17 00:00:00 2001 From: gedoor Date: Mon, 18 Jan 2021 17:17:11 +0800 Subject: [PATCH 49/72] =?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 ++- .../io/legado/app/ui/book/read/page/ReadView.kt | 13 ++----------- 2 files changed, 4 insertions(+), 12 deletions(-) diff --git a/app/src/main/assets/updateLog.md b/app/src/main/assets/updateLog.md index 7b596b95b..e613f031a 100644 --- a/app/src/main/assets/updateLog.md +++ b/app/src/main/assets/updateLog.md @@ -3,9 +3,10 @@ * 关注合作公众号 **[小说拾遗]** 获取好看的小说。 * 旧版数据导入教程:先在旧版阅读(2.x)中进行备份,然后在新版阅读(3.x)【我的】->【备份与恢复】,选择【导入旧版本数据】。 -**2021/01/16 +**2021/01/18 * 增加三星 S Pen 支持 by [dacer](https://github.com/dacer) * 订阅添加阅读下载,可以从多个渠道下载 +* 修复一些BUG **2021/01/12** * 修复bug diff --git a/app/src/main/java/io/legado/app/ui/book/read/page/ReadView.kt b/app/src/main/java/io/legado/app/ui/book/read/page/ReadView.kt index 8bc72438b..2ded3399f 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/page/ReadView.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/page/ReadView.kt @@ -338,17 +338,8 @@ class ReadView(context: Context, attrs: AttributeSet) : } end -= 1 } - kotlin.runCatching { - curPage.selectStartMoveIndex(firstRelativePage, lineStart, start) - curPage.selectEndMoveIndex(firstRelativePage, lineEnd, end) - }.onFailure { - print( - """ - curPage.selectStartMoveIndex($firstRelativePage, $lineStart, $start) - curPage.selectEndMoveIndex($firstRelativePage, $lineEnd, $end) - """.trimIndent() - ) - } + curPage.selectStartMoveIndex(firstRelativePage, lineStart, start) + curPage.selectEndMoveIndex(firstRelativePage, lineEnd, end) } } From 9a671fcbfcbc46b9b73ef20d709eaa4daa82cfbf Mon Sep 17 00:00:00 2001 From: gedoor Date: Mon, 18 Jan 2021 19:40:42 +0800 Subject: [PATCH 50/72] =?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 e613f031a..8d62b8ae0 100644 --- a/app/src/main/assets/updateLog.md +++ b/app/src/main/assets/updateLog.md @@ -3,7 +3,7 @@ * 关注合作公众号 **[小说拾遗]** 获取好看的小说。 * 旧版数据导入教程:先在旧版阅读(2.x)中进行备份,然后在新版阅读(3.x)【我的】->【备份与恢复】,选择【导入旧版本数据】。 -**2021/01/18 +**2021/01/18** * 增加三星 S Pen 支持 by [dacer](https://github.com/dacer) * 订阅添加阅读下载,可以从多个渠道下载 * 修复一些BUG From c2ea99acc4f554429a424ea128ec68a9ccfaf321 Mon Sep 17 00:00:00 2001 From: gedoor Date: Tue, 19 Jan 2021 08:22:23 +0800 Subject: [PATCH 51/72] =?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/about/AboutFragment.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/io/legado/app/ui/about/AboutFragment.kt b/app/src/main/java/io/legado/app/ui/about/AboutFragment.kt index 10a54b33b..992bf6931 100644 --- a/app/src/main/java/io/legado/app/ui/about/AboutFragment.kt +++ b/app/src/main/java/io/legado/app/ui/about/AboutFragment.kt @@ -32,7 +32,8 @@ class AboutFragment : PreferenceFragmentCompat() { Pair("(QQ群4)256929088", "czEJPLDnT4Pd9SKQ6RoRVzKhDxLchZrO"), Pair("(QQ群5)811843556", "zKZ2UYGZ7o5CzcA6ylxzlqi21si_iqaX"), Pair("(QQ群6)870270970", "FeCF8iSxfQbe90HPvGsvcqs5P5oSeY5n"), - Pair("(QQ群7)15987187", "S2g2TMD0LGd3sefUADd1AbyPEW2o2XfC") + Pair("(QQ群7)15987187", "S2g2TMD0LGd3sefUADd1AbyPEW2o2XfC"), + Pair("(QQ群8)1079926194", "gg2qFH8q9IPFaCHV3H7CqCN-YljvazE1"), ) override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { From 82f8369d83f2e4ad665ce3f8cc90047041ce0aff Mon Sep 17 00:00:00 2001 From: gedoor Date: Tue, 19 Jan 2021 13:58:20 +0800 Subject: [PATCH 52/72] =?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/help/ruleHelp.md | 15 +++++++++++++++ app/src/main/assets/updateLog.md | 13 +------------ 2 files changed, 16 insertions(+), 12 deletions(-) diff --git a/app/src/main/assets/help/ruleHelp.md b/app/src/main/assets/help/ruleHelp.md index c01ce2b1f..21d4dc860 100644 --- a/app/src/main/assets/help/ruleHelp.md +++ b/app/src/main/assets/help/ruleHelp.md @@ -93,3 +93,18 @@ variable // 自定义书籍变量信息(用于书源规则检索书籍信息) variable //变量 ``` +### 字体解析使用 + + > 使用方法,在正文替换规则中使用,原理根据f1字体的字形数据到f2中查找字形对应的编码 +``` +@js: +var b64=String(src).match(/ttf;base64,([^\)]+)/); +if (b64) { + var f1 = java.queryBase64TTF(b64[1]) + var f2 = java.queryTTF("/storage/emulated/0/Fonts/Source Han Sans CN Regular.ttf") + java.replaceFont(result, f1, f2) +}else{ + result +} +``` + diff --git a/app/src/main/assets/updateLog.md b/app/src/main/assets/updateLog.md index 8d62b8ae0..6b95b8bc1 100644 --- a/app/src/main/assets/updateLog.md +++ b/app/src/main/assets/updateLog.md @@ -79,18 +79,7 @@ * 阅读进度从页数改为字数,排版变化时定位更准确 * 修改viewBinding * 修复中文排序 -* 去掉FontJs规则,可以写在替换规则里,例:f2为正确的字体,根据文字数据去正确的字体里面查找,可以把错误的文字替换为正确的文字 -``` -@js: -var b64=String(src).match(/ttf;base64,([^\)]+)/); -if (b64) { - var f1 = java.queryBase64TTF(b64[1]) - var f2 = java.queryTTF("/storage/emulated/0/Fonts/Source Han Sans CN Regular.ttf") - java.replaceFont(result, f1, f2) -}else{ - result -} -``` +* 去掉FontJs规则,可以写在替换规则里,示例可在帮助文档查看 **2020/11/30** * 优化阅读界面设置 From 0968c8e260ddd2f59d9c28d3cb03a0c811fd345b Mon Sep 17 00:00:00 2001 From: gedoor Date: Tue, 19 Jan 2021 13:59:18 +0800 Subject: [PATCH 53/72] =?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/help/ruleHelp.md | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/app/src/main/assets/help/ruleHelp.md b/app/src/main/assets/help/ruleHelp.md index 21d4dc860..23072a407 100644 --- a/app/src/main/assets/help/ruleHelp.md +++ b/app/src/main/assets/help/ruleHelp.md @@ -78,8 +78,7 @@ variable // 自定义书籍变量信息(用于书源规则检索书籍信息) ``` ### chapter对象的可用属性 - - > 使用方法: 在js中或{{}}中使用chapter.属性的方式即可获取.如在正文内容后加上 ##{{chapter.title+chapter.index}} 可以净化 章节标题+序号(如 第二章 天仙下凡2) 这一类的字符. +> 使用方法: 在js中或{{}}中使用chapter.属性的方式即可获取.如在正文内容后加上 ##{{chapter.title+chapter.index}} 可以净化 章节标题+序号(如 第二章 天仙下凡2) 这一类的字符. ``` url // 章节地址 title // 章节标题 @@ -94,8 +93,7 @@ variable // 自定义书籍变量信息(用于书源规则检索书籍信息) ``` ### 字体解析使用 - - > 使用方法,在正文替换规则中使用,原理根据f1字体的字形数据到f2中查找字形对应的编码 +> 使用方法,在正文替换规则中使用,原理根据f1字体的字形数据到f2中查找字形对应的编码 ``` @js: var b64=String(src).match(/ttf;base64,([^\)]+)/); From 6038953f67212225d95c60748aea7deb80ddd63d Mon Sep 17 00:00:00 2001 From: lunhuil <37199384+lunhuil@users.noreply.github.com> Date: Tue, 19 Jan 2021 15:04:26 +0000 Subject: [PATCH 54/72] =?UTF-8?q?=E6=9A=82=E6=97=B6=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E7=99=BE=E5=BA=A6TTS?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 不知道啥时候会再次失效 --- app/src/main/assets/defaultData/httpTTS.json | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/app/src/main/assets/defaultData/httpTTS.json b/app/src/main/assets/defaultData/httpTTS.json index b62ea90e5..10e1ac4cb 100644 --- a/app/src/main/assets/defaultData/httpTTS.json +++ b/app/src/main/assets/defaultData/httpTTS.json @@ -97,46 +97,46 @@ { "id": -20, "name": "标准女声", - "url": "http://tsn.baidu.com/text2audio,{\n \"method\": \"POST\",\n \"body\": \"tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{(speakSpeed + 5) / 10 + 4}}&per=4100&cuid=baidu_speech_demo&idx=1&cod=2&lan=zh&ctp=1&pdt=1&vol=5&pit=5&_res_tag_=audio\"\n}" + "url": "http://tsn.baidu.com/text2audio,{\n \"method\": \"POST\",\n \"body\": \"tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{(speakSpeed + 5) / 10 + 4}}&per=4100&cuid=baidu_speech_demo&idx=1&cod=2&lan=zh&ctp=1&pdt=301&vol=5&pit=5&_res_tag_=audio\"\n}" }, { "id": -21, "name": "标准男声", - "url": "http://tsn.baidu.com/text2audio,{\n \"method\": \"POST\",\n \"body\": \"tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{(speakSpeed + 5) / 10 + 4}}&per=4121&cuid=baidu_speech_demo&idx=1&cod=2&lan=zh&ctp=1&pdt=1&vol=5&pit=5&_res_tag_=audio\"\n}" + "url": "http://tsn.baidu.com/text2audio,{\n \"method\": \"POST\",\n \"body\": \"tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{(speakSpeed + 5) / 10 + 4}}&per=4121&cuid=baidu_speech_demo&idx=1&cod=2&lan=zh&ctp=1&pdt=301&vol=5&pit=5&_res_tag_=audio\"\n}" }, { "id": -22, "name": "治愈女声", - "url": "http://tsn.baidu.com/text2audio,{\n \"method\": \"POST\",\n \"body\": \"tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{(speakSpeed + 5) / 10 + 4}}&per=5120&cuid=baidu_speech_demo&idx=1&cod=2&lan=zh&ctp=1&pdt=1&vol=5&pit=5&_res_tag_=audio\"\n}" + "url": "http://tsn.baidu.com/text2audio,{\n \"method\": \"POST\",\n \"body\": \"tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{(speakSpeed + 5) / 10 + 4}}&per=5120&cuid=baidu_speech_demo&idx=1&cod=2&lan=zh&ctp=1&pdt=301&vol=5&pit=5&_res_tag_=audio\"\n}" }, { "id": -23, "name": "治愈男声", - "url": "http://tsn.baidu.com/text2audio,{\n \"method\": \"POST\",\n \"body\": \"tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{(speakSpeed + 5) / 10 + 4}}&per=5121&cuid=baidu_speech_demo&idx=1&cod=2&lan=zh&ctp=1&pdt=1&vol=5&pit=5&_res_tag_=audio\"\n}" + "url": "http://tsn.baidu.com/text2audio,{\n \"method\": \"POST\",\n \"body\": \"tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{(speakSpeed + 5) / 10 + 4}}&per=5121&cuid=baidu_speech_demo&idx=1&cod=2&lan=zh&ctp=1&pdt=301&vol=5&pit=5&_res_tag_=audio\"\n}" }, { "id": -24, "name": "甜美女声①", - "url": "http://tsn.baidu.com/text2audio,{\n \"method\": \"POST\",\n \"body\": \"tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{(speakSpeed + 5) / 10 + 4}}&per=4117&cuid=baidu_speech_demo&idx=1&cod=2&lan=zh&ctp=1&pdt=1&vol=5&pit=5&_res_tag_=audio\"\n}" + "url": "http://tsn.baidu.com/text2audio,{\n \"method\": \"POST\",\n \"body\": \"tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{(speakSpeed + 5) / 10 + 4}}&per=4117&cuid=baidu_speech_demo&idx=1&cod=2&lan=zh&ctp=1&pdt=301&vol=5&pit=5&_res_tag_=audio\"\n}" }, { "id": -25, "name": "甜美女声②", - "url": "http://tsn.baidu.com/text2audio,{\n \"method\": \"POST\",\n \"body\": \"tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{(speakSpeed + 5) / 10 + 4}}&per=5117&cuid=baidu_speech_demo&idx=1&cod=2&lan=zh&ctp=1&pdt=1&vol=5&pit=5&_res_tag_=audio\"\n}" + "url": "http://tsn.baidu.com/text2audio,{\n \"method\": \"POST\",\n \"body\": \"tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{(speakSpeed + 5) / 10 + 4}}&per=5117&cuid=baidu_speech_demo&idx=1&cod=2&lan=zh&ctp=1&pdt=301&vol=5&pit=5&_res_tag_=audio\"\n}" }, { "id": -26, "name": "百度主持", - "url": "http://tts.baidu.com/text2audio,{\n \"method\": \"POST\",\n \"body\": \"tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{(speakSpeed + 5) / 10 + 4}}&per=9&cuid=baidu_speech_demo&idx=1&cod=2&lan=zh&ctp=1&pdt=1&vol=5&pit=5&_res_tag_=audio\"\n}" + "url": "http://tts.baidu.com/text2audio,{\n \"method\": \"POST\",\n \"body\": \"tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{(speakSpeed + 5) / 10 + 4}}&per=9&cuid=baidu_speech_demo&idx=1&cod=2&lan=zh&ctp=1&pdt=301&vol=5&pit=5&_res_tag_=audio\"\n}" }, { "id": -27, "name": "百度评书①", - "url": "http://tts.baidu.com/text2audio,{\n \"method\": \"POST\",\n \"body\": \"tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{(speakSpeed + 5) / 10 + 4}}&per=6&cuid=baidu_speech_demo&idx=1&cod=2&lan=zh&ctp=1&pdt=1&vol=5&pit=5&_res_tag_=audio\"\n}" + "url": "http://tts.baidu.com/text2audio,{\n \"method\": \"POST\",\n \"body\": \"tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{(speakSpeed + 5) / 10 + 4}}&per=6&cuid=baidu_speech_demo&idx=1&cod=2&lan=zh&ctp=1&pdt=301&vol=5&pit=5&_res_tag_=audio\"\n}" }, { "id": -28, "name": "百度评书②", - "url": "http://tsn.baidu.com/text2audio,{\n \"method\": \"POST\",\n \"body\": \"tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{(speakSpeed + 5) / 10 + 4}}&per=4114&cuid=baidu_speech_demo&idx=1&cod=2&lan=zh&ctp=1&pdt=1&vol=5&pit=5&_res_tag_=audio\"\n}" + "url": "http://tsn.baidu.com/text2audio,{\n \"method\": \"POST\",\n \"body\": \"tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{(speakSpeed + 5) / 10 + 4}}&per=4114&cuid=baidu_speech_demo&idx=1&cod=2&lan=zh&ctp=1&pdt=301&vol=5&pit=5&_res_tag_=audio\"\n}" } ] From 939be5b8cfaf22cef9332a57bb19b982125612aa Mon Sep 17 00:00:00 2001 From: Celeter <48249130+Celeter@users.noreply.github.com> Date: Wed, 20 Jan 2021 09:41:18 +0800 Subject: [PATCH 55/72] fix baidu tts --- app/src/main/assets/defaultData/httpTTS.json | 56 ++++++++++---------- 1 file changed, 28 insertions(+), 28 deletions(-) diff --git a/app/src/main/assets/defaultData/httpTTS.json b/app/src/main/assets/defaultData/httpTTS.json index b62ea90e5..331c8c8f3 100644 --- a/app/src/main/assets/defaultData/httpTTS.json +++ b/app/src/main/assets/defaultData/httpTTS.json @@ -2,141 +2,141 @@ { "id": -1, "name": "度丫丫", - "url": "http://tsn.baidu.com/text2audio,{\n \"method\": \"POST\",\n \"body\": \"tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{(speakSpeed + 5) / 10 + 4}}&per=4&cuid=baidu_speech_demo&idx=1&cod=2&lan=zh&ctp=1&pdt=1&vol=5&pit=5&_res_tag_=audio\"\n}" + "url": "http://tsn.baidu.com/text2audio,{\n \"method\": \"POST\",\n \"body\": \"tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{(speakSpeed + 5) / 10 + 4}}&per=4&cuid=baidu_speech_demo&idx=1&cod=2&lan=zh&ctp=1&pdt=301&vol=5&pit=5&_res_tag_=audio\"\n}" }, { "id": -2, "name": "度博文①", - "url": "http://tsn.baidu.com/text2audio,{\n \"method\": \"POST\",\n \"body\": \"tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{(speakSpeed + 5) / 10 + 4}}&per=106&cuid=baidu_speech_demo&idx=1&cod=2&lan=zh&ctp=1&pdt=1&vol=5&pit=5&_res_tag_=audio\"\n}" + "url": "http://tsn.baidu.com/text2audio,{\n \"method\": \"POST\",\n \"body\": \"tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{(speakSpeed + 5) / 10 + 4}}&per=106&cuid=baidu_speech_demo&idx=1&cod=2&lan=zh&ctp=1&pdt=301&vol=5&pit=5&_res_tag_=audio\"\n}" }, { "id": -3, "name": "度博文②", - "url": "http://tsn.baidu.com/text2audio,{\n \"method\": \"POST\",\n \"body\": \"tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{(speakSpeed + 5) / 10 + 4}}&per=4106&cuid=baidu_speech_demo&idx=1&cod=2&lan=zh&ctp=1&pdt=1&vol=5&pit=5&_res_tag_=audio\"\n}" + "url": "http://tsn.baidu.com/text2audio,{\n \"method\": \"POST\",\n \"body\": \"tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{(speakSpeed + 5) / 10 + 4}}&per=4106&cuid=baidu_speech_demo&idx=1&cod=2&lan=zh&ctp=1&pdt=301&vol=5&pit=5&_res_tag_=audio\"\n}" }, { "id": -4, "name": "度博文③", - "url": "http://tsn.baidu.com/text2audio,{\n \"method\": \"POST\",\n \"body\": \"tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{(speakSpeed + 5) / 10 + 4}}&per=5106&cuid=baidu_speech_demo&idx=1&cod=2&lan=zh&ctp=1&pdt=1&vol=5&pit=5&_res_tag_=audio\"\n}" + "url": "http://tsn.baidu.com/text2audio,{\n \"method\": \"POST\",\n \"body\": \"tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{(speakSpeed + 5) / 10 + 4}}&per=5106&cuid=baidu_speech_demo&idx=1&cod=2&lan=zh&ctp=1&pdt=301&vol=5&pit=5&_res_tag_=audio\"\n}" }, { "id": -5, "name": "度小娇", - "url": "http://tsn.baidu.com/text2audio,{\n \"method\": \"POST\",\n \"body\": \"tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{(speakSpeed + 5) / 10 + 4}}&per=5&cuid=baidu_speech_demo&idx=1&cod=2&lan=zh&ctp=1&pdt=1&vol=5&pit=5&_res_tag_=audio\"\n}" + "url": "http://tsn.baidu.com/text2audio,{\n \"method\": \"POST\",\n \"body\": \"tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{(speakSpeed + 5) / 10 + 4}}&per=5&cuid=baidu_speech_demo&idx=1&cod=2&lan=zh&ctp=1&pdt=301&vol=5&pit=5&_res_tag_=audio\"\n}" }, { "id": -6, "name": "度小宇", - "url": "http://tsn.baidu.com/text2audio,{\n \"method\": \"POST\",\n \"body\": \"tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{(speakSpeed + 5) / 10 + 4}}&per=1&cuid=baidu_speech_demo&idx=1&cod=2&lan=zh&ctp=1&pdt=1&vol=5&pit=5&_res_tag_=audio\"\n}" + "url": "http://tsn.baidu.com/text2audio,{\n \"method\": \"POST\",\n \"body\": \"tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{(speakSpeed + 5) / 10 + 4}}&per=1&cuid=baidu_speech_demo&idx=1&cod=2&lan=zh&ctp=1&pdt=301&vol=5&pit=5&_res_tag_=audio\"\n}" }, { "id": -7, "name": "度小童", - "url": "http://tsn.baidu.com/text2audio,{\n \"method\": \"POST\",\n \"body\": \"tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{(speakSpeed + 5) / 10 + 4}}&per=110&cuid=baidu_speech_demo&idx=1&cod=2&lan=zh&ctp=1&pdt=1&vol=5&pit=5&_res_tag_=audio\"\n}" + "url": "http://tsn.baidu.com/text2audio,{\n \"method\": \"POST\",\n \"body\": \"tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{(speakSpeed + 5) / 10 + 4}}&per=110&cuid=baidu_speech_demo&idx=1&cod=2&lan=zh&ctp=1&pdt=301&vol=5&pit=5&_res_tag_=audio\"\n}" }, { "id": -8, "name": "度小美", - "url": "http://tsn.baidu.com/text2audio,{\n \"method\": \"POST\",\n \"body\": \"tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{(speakSpeed + 5) / 10 + 4}}&per=0&cuid=baidu_speech_demo&idx=1&cod=2&lan=zh&ctp=1&pdt=1&vol=5&pit=5&_res_tag_=audio\"\n}" + "url": "http://tsn.baidu.com/text2audio,{\n \"method\": \"POST\",\n \"body\": \"tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{(speakSpeed + 5) / 10 + 4}}&per=0&cuid=baidu_speech_demo&idx=1&cod=2&lan=zh&ctp=1&pdt=301&vol=5&pit=5&_res_tag_=audio\"\n}" }, { "id": -9, "name": "度小萌", - "url": "http://tsn.baidu.com/text2audio,{\n \"method\": \"POST\",\n \"body\": \"tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{(speakSpeed + 5) / 10 + 4}}&per=111&cuid=baidu_speech_demo&idx=1&cod=2&lan=zh&ctp=1&pdt=1&vol=5&pit=5&_res_tag_=audio\"\n}" + "url": "http://tsn.baidu.com/text2audio,{\n \"method\": \"POST\",\n \"body\": \"tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{(speakSpeed + 5) / 10 + 4}}&per=111&cuid=baidu_speech_demo&idx=1&cod=2&lan=zh&ctp=1&pdt=301&vol=5&pit=5&_res_tag_=audio\"\n}" }, { "id": -10, "name": "度小鹿①", - "url": "http://tsn.baidu.com/text2audio,{\n \"method\": \"POST\",\n \"body\": \"tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{(speakSpeed + 5) / 10 + 4}}&per=4118&cuid=baidu_speech_demo&idx=1&cod=2&lan=zh&ctp=1&pdt=1&vol=5&pit=5&_res_tag_=audio\"\n}" + "url": "http://tsn.baidu.com/text2audio,{\n \"method\": \"POST\",\n \"body\": \"tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{(speakSpeed + 5) / 10 + 4}}&per=4118&cuid=baidu_speech_demo&idx=1&cod=2&lan=zh&ctp=1&pdt=301&vol=5&pit=5&_res_tag_=audio\"\n}" }, { "id": -11, "name": "度小鹿②", - "url": "http://tsn.baidu.com/text2audio,{\n \"method\": \"POST\",\n \"body\": \"tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{(speakSpeed + 5) / 10 + 4}}&per=5118&cuid=baidu_speech_demo&idx=1&cod=2&lan=zh&ctp=1&pdt=1&vol=5&pit=5&_res_tag_=audio\"\n}" + "url": "http://tsn.baidu.com/text2audio,{\n \"method\": \"POST\",\n \"body\": \"tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{(speakSpeed + 5) / 10 + 4}}&per=5118&cuid=baidu_speech_demo&idx=1&cod=2&lan=zh&ctp=1&pdt=301&vol=5&pit=5&_res_tag_=audio\"\n}" }, { "id": -12, "name": "度小鹿③", - "url": "http://tsn.baidu.com/text2audio,{\n \"method\": \"POST\",\n \"body\": \"tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{(speakSpeed + 5) / 10 + 4}}&per=4119&cuid=baidu_speech_demo&idx=1&cod=2&lan=zh&ctp=1&pdt=1&vol=5&pit=5&_res_tag_=audio\"\n}" + "url": "http://tsn.baidu.com/text2audio,{\n \"method\": \"POST\",\n \"body\": \"tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{(speakSpeed + 5) / 10 + 4}}&per=4119&cuid=baidu_speech_demo&idx=1&cod=2&lan=zh&ctp=1&pdt=301&vol=5&pit=5&_res_tag_=audio\"\n}" }, { "id": -13, "name": "度米朵①", - "url": "http://tsn.baidu.com/text2audio,{\n \"method\": \"POST\",\n \"body\": \"tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{(speakSpeed + 5) / 10 + 4}}&per=103&cuid=baidu_speech_demo&idx=1&cod=2&lan=zh&ctp=1&pdt=1&vol=5&pit=5&_res_tag_=audio\"\n}" + "url": "http://tsn.baidu.com/text2audio,{\n \"method\": \"POST\",\n \"body\": \"tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{(speakSpeed + 5) / 10 + 4}}&per=103&cuid=baidu_speech_demo&idx=1&cod=2&lan=zh&ctp=1&pdt=301&vol=5&pit=5&_res_tag_=audio\"\n}" }, { "id": -14, "name": "度米朵②", - "url": "http://tsn.baidu.com/text2audio,{\n \"method\": \"POST\",\n \"body\": \"tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{(speakSpeed + 5) / 10 + 4}}&per=4103&cuid=baidu_speech_demo&idx=1&cod=2&lan=zh&ctp=1&pdt=1&vol=5&pit=5&_res_tag_=audio\"\n}" + "url": "http://tsn.baidu.com/text2audio,{\n \"method\": \"POST\",\n \"body\": \"tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{(speakSpeed + 5) / 10 + 4}}&per=4103&cuid=baidu_speech_demo&idx=1&cod=2&lan=zh&ctp=1&pdt=301&vol=5&pit=5&_res_tag_=audio\"\n}" }, { "id": -15, "name": "度逍遥-基础", - "url": "http://tts.baidu.com/text2audio,{\n \"method\": \"POST\",\n \"body\": \"tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{(speakSpeed + 5) / 10 + 4}}&per=3&cuid=baidu_speech_demo&idx=1&cod=2&lan=zh&ctp=1&pdt=1&vol=5&pit=5&_res_tag_=audio\"\n}" + "url": "http://tts.baidu.com/text2audio,{\n \"method\": \"POST\",\n \"body\": \"tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{(speakSpeed + 5) / 10 + 4}}&per=3&cuid=baidu_speech_demo&idx=1&cod=2&lan=zh&ctp=1&pdt=301&vol=5&pit=5&_res_tag_=audio\"\n}" }, { "id": -16, "name": "度逍遥-精品①", - "url": "http://tsn.baidu.com/text2audio,{\n \"method\": \"POST\",\n \"body\": \"tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{(speakSpeed + 5) / 10 + 4}}&per=4003&cuid=baidu_speech_demo&idx=1&cod=2&lan=zh&ctp=1&pdt=1&vol=5&pit=5&_res_tag_=audio\"\n}" + "url": "http://tsn.baidu.com/text2audio,{\n \"method\": \"POST\",\n \"body\": \"tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{(speakSpeed + 5) / 10 + 4}}&per=4003&cuid=baidu_speech_demo&idx=1&cod=2&lan=zh&ctp=1&pdt=301&vol=5&pit=5&_res_tag_=audio\"\n}" }, { "id": -17, "name": "度逍遥-精品②", - "url": "http://tsn.baidu.com/text2audio,{\n \"method\": \"POST\",\n \"body\": \"tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{(speakSpeed + 5) / 10 + 4}}&per=5003&cuid=baidu_speech_demo&idx=1&cod=2&lan=zh&ctp=1&pdt=1&vol=5&pit=5&_res_tag_=audio\"\n}" + "url": "http://tsn.baidu.com/text2audio,{\n \"method\": \"POST\",\n \"body\": \"tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{(speakSpeed + 5) / 10 + 4}}&per=5003&cuid=baidu_speech_demo&idx=1&cod=2&lan=zh&ctp=1&pdt=301&vol=5&pit=5&_res_tag_=audio\"\n}" }, { "id": -18, "name": "情感女声", - "url": "http://tsn.baidu.com/text2audio,{\n \"method\": \"POST\",\n \"body\": \"tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{(speakSpeed + 5) / 10 + 4}}&per=4105&cuid=baidu_speech_demo&idx=1&cod=2&lan=zh&ctp=1&pdt=1&vol=5&pit=5&_res_tag_=audio\"\n}" + "url": "http://tsn.baidu.com/text2audio,{\n \"method\": \"POST\",\n \"body\": \"tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{(speakSpeed + 5) / 10 + 4}}&per=4105&cuid=baidu_speech_demo&idx=1&cod=2&lan=zh&ctp=1&pdt=301&vol=5&pit=5&_res_tag_=audio\"\n}" }, { "id": -19, "name": "情感男声", - "url": "http://tsn.baidu.com/text2audio,{\n \"method\": \"POST\",\n \"body\": \"tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{(speakSpeed + 5) / 10 + 4}}&per=4115&cuid=baidu_speech_demo&idx=1&cod=2&lan=zh&ctp=1&pdt=1&vol=5&pit=5&_res_tag_=audio\"\n}" + "url": "http://tsn.baidu.com/text2audio,{\n \"method\": \"POST\",\n \"body\": \"tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{(speakSpeed + 5) / 10 + 4}}&per=4115&cuid=baidu_speech_demo&idx=1&cod=2&lan=zh&ctp=1&pdt=301&vol=5&pit=5&_res_tag_=audio\"\n}" }, { "id": -20, "name": "标准女声", - "url": "http://tsn.baidu.com/text2audio,{\n \"method\": \"POST\",\n \"body\": \"tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{(speakSpeed + 5) / 10 + 4}}&per=4100&cuid=baidu_speech_demo&idx=1&cod=2&lan=zh&ctp=1&pdt=1&vol=5&pit=5&_res_tag_=audio\"\n}" + "url": "http://tsn.baidu.com/text2audio,{\n \"method\": \"POST\",\n \"body\": \"tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{(speakSpeed + 5) / 10 + 4}}&per=4100&cuid=baidu_speech_demo&idx=1&cod=2&lan=zh&ctp=1&pdt=301&vol=5&pit=5&_res_tag_=audio\"\n}" }, { "id": -21, "name": "标准男声", - "url": "http://tsn.baidu.com/text2audio,{\n \"method\": \"POST\",\n \"body\": \"tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{(speakSpeed + 5) / 10 + 4}}&per=4121&cuid=baidu_speech_demo&idx=1&cod=2&lan=zh&ctp=1&pdt=1&vol=5&pit=5&_res_tag_=audio\"\n}" + "url": "http://tsn.baidu.com/text2audio,{\n \"method\": \"POST\",\n \"body\": \"tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{(speakSpeed + 5) / 10 + 4}}&per=4121&cuid=baidu_speech_demo&idx=1&cod=2&lan=zh&ctp=1&pdt=301&vol=5&pit=5&_res_tag_=audio\"\n}" }, { "id": -22, "name": "治愈女声", - "url": "http://tsn.baidu.com/text2audio,{\n \"method\": \"POST\",\n \"body\": \"tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{(speakSpeed + 5) / 10 + 4}}&per=5120&cuid=baidu_speech_demo&idx=1&cod=2&lan=zh&ctp=1&pdt=1&vol=5&pit=5&_res_tag_=audio\"\n}" + "url": "http://tsn.baidu.com/text2audio,{\n \"method\": \"POST\",\n \"body\": \"tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{(speakSpeed + 5) / 10 + 4}}&per=5120&cuid=baidu_speech_demo&idx=1&cod=2&lan=zh&ctp=1&pdt=301&vol=5&pit=5&_res_tag_=audio\"\n}" }, { "id": -23, "name": "治愈男声", - "url": "http://tsn.baidu.com/text2audio,{\n \"method\": \"POST\",\n \"body\": \"tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{(speakSpeed + 5) / 10 + 4}}&per=5121&cuid=baidu_speech_demo&idx=1&cod=2&lan=zh&ctp=1&pdt=1&vol=5&pit=5&_res_tag_=audio\"\n}" + "url": "http://tsn.baidu.com/text2audio,{\n \"method\": \"POST\",\n \"body\": \"tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{(speakSpeed + 5) / 10 + 4}}&per=5121&cuid=baidu_speech_demo&idx=1&cod=2&lan=zh&ctp=1&pdt=301&vol=5&pit=5&_res_tag_=audio\"\n}" }, { "id": -24, "name": "甜美女声①", - "url": "http://tsn.baidu.com/text2audio,{\n \"method\": \"POST\",\n \"body\": \"tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{(speakSpeed + 5) / 10 + 4}}&per=4117&cuid=baidu_speech_demo&idx=1&cod=2&lan=zh&ctp=1&pdt=1&vol=5&pit=5&_res_tag_=audio\"\n}" + "url": "http://tsn.baidu.com/text2audio,{\n \"method\": \"POST\",\n \"body\": \"tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{(speakSpeed + 5) / 10 + 4}}&per=4117&cuid=baidu_speech_demo&idx=1&cod=2&lan=zh&ctp=1&pdt=301&vol=5&pit=5&_res_tag_=audio\"\n}" }, { "id": -25, "name": "甜美女声②", - "url": "http://tsn.baidu.com/text2audio,{\n \"method\": \"POST\",\n \"body\": \"tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{(speakSpeed + 5) / 10 + 4}}&per=5117&cuid=baidu_speech_demo&idx=1&cod=2&lan=zh&ctp=1&pdt=1&vol=5&pit=5&_res_tag_=audio\"\n}" + "url": "http://tsn.baidu.com/text2audio,{\n \"method\": \"POST\",\n \"body\": \"tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{(speakSpeed + 5) / 10 + 4}}&per=5117&cuid=baidu_speech_demo&idx=1&cod=2&lan=zh&ctp=1&pdt=301&vol=5&pit=5&_res_tag_=audio\"\n}" }, { "id": -26, "name": "百度主持", - "url": "http://tts.baidu.com/text2audio,{\n \"method\": \"POST\",\n \"body\": \"tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{(speakSpeed + 5) / 10 + 4}}&per=9&cuid=baidu_speech_demo&idx=1&cod=2&lan=zh&ctp=1&pdt=1&vol=5&pit=5&_res_tag_=audio\"\n}" + "url": "http://tts.baidu.com/text2audio,{\n \"method\": \"POST\",\n \"body\": \"tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{(speakSpeed + 5) / 10 + 4}}&per=9&cuid=baidu_speech_demo&idx=1&cod=2&lan=zh&ctp=1&pdt=301&vol=5&pit=5&_res_tag_=audio\"\n}" }, { "id": -27, "name": "百度评书①", - "url": "http://tts.baidu.com/text2audio,{\n \"method\": \"POST\",\n \"body\": \"tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{(speakSpeed + 5) / 10 + 4}}&per=6&cuid=baidu_speech_demo&idx=1&cod=2&lan=zh&ctp=1&pdt=1&vol=5&pit=5&_res_tag_=audio\"\n}" + "url": "http://tts.baidu.com/text2audio,{\n \"method\": \"POST\",\n \"body\": \"tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{(speakSpeed + 5) / 10 + 4}}&per=6&cuid=baidu_speech_demo&idx=1&cod=2&lan=zh&ctp=1&pdt=301&vol=5&pit=5&_res_tag_=audio\"\n}" }, { "id": -28, "name": "百度评书②", - "url": "http://tsn.baidu.com/text2audio,{\n \"method\": \"POST\",\n \"body\": \"tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{(speakSpeed + 5) / 10 + 4}}&per=4114&cuid=baidu_speech_demo&idx=1&cod=2&lan=zh&ctp=1&pdt=1&vol=5&pit=5&_res_tag_=audio\"\n}" + "url": "http://tsn.baidu.com/text2audio,{\n \"method\": \"POST\",\n \"body\": \"tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{(speakSpeed + 5) / 10 + 4}}&per=4114&cuid=baidu_speech_demo&idx=1&cod=2&lan=zh&ctp=1&pdt=301&vol=5&pit=5&_res_tag_=audio\"\n}" } ] From 4028194b0e9219ad9e7e4728f699200e5aa921a4 Mon Sep 17 00:00:00 2001 From: Celeter <48249130+Celeter@users.noreply.github.com> Date: Wed, 20 Jan 2021 10:05:38 +0800 Subject: [PATCH 56/72] add aliyun tts --- app/src/main/assets/defaultData/httpTTS.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/app/src/main/assets/defaultData/httpTTS.json b/app/src/main/assets/defaultData/httpTTS.json index 331c8c8f3..240eb05f5 100644 --- a/app/src/main/assets/defaultData/httpTTS.json +++ b/app/src/main/assets/defaultData/httpTTS.json @@ -138,5 +138,10 @@ "id": -28, "name": "百度评书②", "url": "http://tsn.baidu.com/text2audio,{\n \"method\": \"POST\",\n \"body\": \"tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{(speakSpeed + 5) / 10 + 4}}&per=4114&cuid=baidu_speech_demo&idx=1&cod=2&lan=zh&ctp=1&pdt=301&vol=5&pit=5&_res_tag_=audio\"\n}" + }, + { + "id": -29, + "name": "阿里云语音", + "url": "/*播音人Aiting可改其他,详见https://ai.aliyun.com/nls/tts*/;eval(''+java.ajax('https://cdn.jsdelivr.net/gh/Celeter/build/.github/scripts/ttsDemo.js'));ttsDemo(speakText,speakSpeed,'Aiting')" } ] From 05dbf5e4fc8accc7193ff187f39f688ed805ff8b Mon Sep 17 00:00:00 2001 From: Celeter <48249130+Celeter@users.noreply.github.com> Date: Wed, 20 Jan 2021 11:13:22 +0800 Subject: [PATCH 57/72] update --- app/src/main/assets/defaultData/httpTTS.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/assets/defaultData/httpTTS.json b/app/src/main/assets/defaultData/httpTTS.json index 240eb05f5..643ba2a7a 100644 --- a/app/src/main/assets/defaultData/httpTTS.json +++ b/app/src/main/assets/defaultData/httpTTS.json @@ -142,6 +142,6 @@ { "id": -29, "name": "阿里云语音", - "url": "/*播音人Aiting可改其他,详见https://ai.aliyun.com/nls/tts*/;eval(''+java.ajax('https://cdn.jsdelivr.net/gh/Celeter/build/.github/scripts/ttsDemo.js'));ttsDemo(speakText,speakSpeed,'Aiting')" + "url": "/*播音人Aiting可改其他https://cdn.jsdelivr.net/gh/Celeter/build/.github/scripts/speaker.json,详见https://ai.aliyun.com/nls/tts*/;eval(''+java.ajax('https://cdn.jsdelivr.net/gh/Celeter/build/.github/scripts/ttsDemo.js'));ttsDemo(speakText,speakSpeed,'Aiting')" } ] From 1e2addccdf8b5c926557776bbc38b8f7fa9c347c Mon Sep 17 00:00:00 2001 From: gedoor Date: Wed, 20 Jan 2021 15:36:27 +0800 Subject: [PATCH 58/72] =?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 +++ app/src/main/java/io/legado/app/help/LocalConfig.kt | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/app/src/main/assets/updateLog.md b/app/src/main/assets/updateLog.md index 6b95b8bc1..fce9ba7db 100644 --- a/app/src/main/assets/updateLog.md +++ b/app/src/main/assets/updateLog.md @@ -3,6 +3,9 @@ * 关注合作公众号 **[小说拾遗]** 获取好看的小说。 * 旧版数据导入教程:先在旧版阅读(2.x)中进行备份,然后在新版阅读(3.x)【我的】->【备份与恢复】,选择【导入旧版本数据】。 +**2021/01/20** +* 更新在线朗读 + **2021/01/18** * 增加三星 S Pen 支持 by [dacer](https://github.com/dacer) * 订阅添加阅读下载,可以从多个渠道下载 diff --git a/app/src/main/java/io/legado/app/help/LocalConfig.kt b/app/src/main/java/io/legado/app/help/LocalConfig.kt index e6a22553d..6278c0c55 100644 --- a/app/src/main/java/io/legado/app/help/LocalConfig.kt +++ b/app/src/main/java/io/legado/app/help/LocalConfig.kt @@ -65,7 +65,7 @@ object LocalConfig { get() = isLastVersion(1, "ruleHelpVersion") val hasUpHttpTTS: Boolean - get() = !isLastVersion(1, "httpTtsVersion") + get() = !isLastVersion(2, "httpTtsVersion") val hasUpTxtTocRule: Boolean get() = !isLastVersion(1, "txtTocRuleVersion") From 058501053d47a4983c80e9c0b7cb02499fd95287 Mon Sep 17 00:00:00 2001 From: gedoor Date: Wed, 20 Jan 2021 19:25:25 +0800 Subject: [PATCH 59/72] =?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/DefaultData.kt | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/io/legado/app/help/DefaultData.kt b/app/src/main/java/io/legado/app/help/DefaultData.kt index 26d94814a..ba06316b9 100644 --- a/app/src/main/java/io/legado/app/help/DefaultData.kt +++ b/app/src/main/java/io/legado/app/help/DefaultData.kt @@ -56,16 +56,12 @@ object DefaultData { fun importDefaultHttpTTS() { App.db.httpTTSDao.deleteDefault() - httpTTS.let { - App.db.httpTTSDao.insert(*it.toTypedArray()) - } + App.db.httpTTSDao.insert(*httpTTS.toTypedArray()) } fun importDefaultTocRules() { App.db.txtTocRule.deleteDefault() - txtTocRules.let { - App.db.txtTocRule.insert(*it.toTypedArray()) - } + App.db.txtTocRule.insert(*txtTocRules.toTypedArray()) } fun importDefaultRssSources() { From 590d6213adb7315a2f24ea49b9286e0eb421a7a6 Mon Sep 17 00:00:00 2001 From: gedoor Date: Wed, 20 Jan 2021 19:33:43 +0800 Subject: [PATCH 60/72] =?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/analyzeRule/AnalyzeRule.kt | 24 ++++++++++--------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/io/legado/app/model/analyzeRule/AnalyzeRule.kt b/app/src/main/java/io/legado/app/model/analyzeRule/AnalyzeRule.kt index 5445884bf..47789be84 100644 --- a/app/src/main/java/io/legado/app/model/analyzeRule/AnalyzeRule.kt +++ b/app/src/main/java/io/legado/app/model/analyzeRule/AnalyzeRule.kt @@ -636,17 +636,19 @@ class AnalyzeRule(val ruleData: RuleDataInterface) : JsExtensions { * 执行JS */ fun evalJS(jsStr: String, result: Any?): Any? { - val bindings = SimpleBindings() - bindings["java"] = this - bindings["cookie"] = CookieStore - bindings["cache"] = CacheManager - bindings["book"] = book - bindings["result"] = result - bindings["baseUrl"] = baseUrl - bindings["chapter"] = chapter - bindings["title"] = chapter?.title - bindings["src"] = content - return SCRIPT_ENGINE.eval(jsStr, bindings) + return runBlocking { + val bindings = SimpleBindings() + bindings["java"] = this + bindings["cookie"] = CookieStore + bindings["cache"] = CacheManager + bindings["book"] = book + bindings["result"] = result + bindings["baseUrl"] = baseUrl + bindings["chapter"] = chapter + bindings["title"] = chapter?.title + bindings["src"] = content + SCRIPT_ENGINE.eval(jsStr, bindings) + } } /** From fad4762fc2da534de091c2f70fe07cf6a3dcf983 Mon Sep 17 00:00:00 2001 From: Antecer Date: Wed, 20 Jan 2021 22:34:47 +0800 Subject: [PATCH 61/72] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=8D=8F=E7=A8=8B?= =?UTF-8?q?=E8=B0=83=E7=94=A8js=E5=BC=95=E6=93=8E=E5=AF=BC=E8=87=B4?= =?UTF-8?q?=E7=9A=84=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/model/analyzeRule/AnalyzeRule.kt | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/io/legado/app/model/analyzeRule/AnalyzeRule.kt b/app/src/main/java/io/legado/app/model/analyzeRule/AnalyzeRule.kt index 47789be84..98e590cf9 100644 --- a/app/src/main/java/io/legado/app/model/analyzeRule/AnalyzeRule.kt +++ b/app/src/main/java/io/legado/app/model/analyzeRule/AnalyzeRule.kt @@ -636,17 +636,17 @@ class AnalyzeRule(val ruleData: RuleDataInterface) : JsExtensions { * 执行JS */ fun evalJS(jsStr: String, result: Any?): Any? { + val bindings = SimpleBindings() + bindings["java"] = this + bindings["cookie"] = CookieStore + bindings["cache"] = CacheManager + bindings["book"] = book + bindings["result"] = result + bindings["baseUrl"] = baseUrl + bindings["chapter"] = chapter + bindings["title"] = chapter?.title + bindings["src"] = content return runBlocking { - val bindings = SimpleBindings() - bindings["java"] = this - bindings["cookie"] = CookieStore - bindings["cache"] = CacheManager - bindings["book"] = book - bindings["result"] = result - bindings["baseUrl"] = baseUrl - bindings["chapter"] = chapter - bindings["title"] = chapter?.title - bindings["src"] = content SCRIPT_ENGINE.eval(jsStr, bindings) } } From e57fd9fd729662007f0c74bc9332251a11d8bcb2 Mon Sep 17 00:00:00 2001 From: gedoor Date: Thu, 21 Jan 2021 20:59:00 +0800 Subject: [PATCH 62/72] =?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/build.gradle | 4 ++-- build.gradle | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 9a4368608..51a57aef2 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -142,10 +142,10 @@ dependencies { implementation "androidx.lifecycle:lifecycle-common-java8:$lifecycle_version" //room - def room_version = '2.2.5' + def room_version = '2.2.6' implementation "androidx.room:room-runtime:$room_version" kapt "androidx.room:room-compiler:$room_version" - testImplementation "androidx.room:room-testing:2.2.5" + testImplementation "androidx.room:room-testing:$room_version" //paging implementation 'androidx.paging:paging-runtime-ktx:2.1.2' diff --git a/build.gradle b/build.gradle index 4e4d97e17..5de0edc73 100644 --- a/build.gradle +++ b/build.gradle @@ -11,7 +11,7 @@ buildscript { maven { url "https://plugins.gradle.org/m2/" } } dependencies { - classpath "com.android.tools.build:gradle:4.1.1" + classpath 'com.android.tools.build:gradle:4.1.2' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath "de.timfreiheit.resourceplaceholders:placeholders:0.3" classpath "com.google.gms:google-services:4.3.4" From 37432af01e193873bc1389e210bf3440e3adcac8 Mon Sep 17 00:00:00 2001 From: david082321 Date: Sat, 23 Jan 2021 02:06:25 +0800 Subject: [PATCH 63/72] Update strings.xml --- app/src/main/res/values-zh-rTW/strings.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 1b64a2d78..1e4bc8d69 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -13,6 +13,7 @@ 離線快取書籍備份 匯出本機同時備份到legado資料夾下exports目錄 備份路徑 + 請選擇備份路徑 匯入舊版資料 匯入Github資料 淨化取代 From 48defdc67263a85f7d83874ac42a1bfce909feb5 Mon Sep 17 00:00:00 2001 From: david082321 Date: Sat, 23 Jan 2021 02:11:20 +0800 Subject: [PATCH 64/72] Update strings.xml --- app/src/main/res/values-zh-rTW/strings.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 1e4bc8d69..fddf32f18 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -30,6 +30,7 @@ 提醒 編輯 刪除 + 刪除所有 取代 取代淨化 配置取代淨化規則 From 78665b88a2019b878ca33201f94df3faa32e4baa Mon Sep 17 00:00:00 2001 From: david082321 Date: Sat, 23 Jan 2021 02:26:51 +0800 Subject: [PATCH 65/72] Update strings.xml --- app/src/main/res/values-zh-rTW/strings.xml | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index fddf32f18..836f1c4de 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -390,11 +390,14 @@ 源名稱(sourceName) 源URL(sourceUrl) 源分組(sourceGroup) + 自訂源分組 + 輸入自訂源分組名稱 + 【%s】 分類Url 登入URL(loginUrl) + 源注釋(sourceComment) 搜尋地址(url) 發現地址規則(url) - 源注釋(sourceComment) 書籍列表規則(bookList) 書名規則(name) 詳情頁url規則(bookUrl) @@ -417,6 +420,8 @@ 正文規則(content) 正文下一頁URL規則(nextContentUrl) WebViewJs(webJs) + 圖片樣式(imageStyle) + 取代規則(replaceRegex) 資源正則(sourceRegex) 圖示(sourceIcon) @@ -451,6 +456,7 @@ 請求頭(header) 除錯源 二維碼匯入 + 分享選取源 掃描二維碼 選中時點擊可彈出選單 主題 @@ -686,6 +692,7 @@ 訊息 切換布局 + 文章字重轉換 主色調 @@ -704,16 +711,14 @@ 夜間,底欄色 自動換源 文字兩端對齊 + 文字底部對齊 自動翻頁速度 地址排序 - 文章字體轉換 - 請選擇備份路徑 本機和 WebDav 一起備份 優先從 WebDav 復原,長按從本機復原 選擇舊版備份資料夾 已啟用 已禁用 - 文字底部對齊 正在啟動下載 該書已在下載列表 點擊打開 @@ -731,8 +736,6 @@ 復原忽略列表 復原時忽略一些內容不復原,方便不同手機配置不同 閱讀介面設定 - 圖片樣式(imageStyle) - 取代規則(replaceRegex) 分組名稱 備註內容 預設啟用取代淨化 @@ -757,7 +760,6 @@ 執行緒數 總閱讀時間 全不選 - 刪除所有 匯入 匯出 儲存主題配置 @@ -766,7 +768,6 @@ 主題列表 使用儲存主題,匯入,分享主題 切換預設主題 - 分享選中源 時間排序 全文搜尋 關注公眾號[开源阅读]獲取訂閱源! From cfab2bd55dacd76f99e484ca9a0ce8b0fba7b799 Mon Sep 17 00:00:00 2001 From: gedoor Date: Sat, 23 Jan 2021 22:55:56 +0800 Subject: [PATCH 66/72] =?UTF-8?q?=E6=A0=A1=E9=AA=8C=E4=B9=A6=E6=BA=90?= =?UTF-8?q?=E6=94=B9=E4=B8=BA=E4=BB=8E=E6=90=9C=E7=B4=A2=E5=88=B0=E6=AD=A3?= =?UTF-8?q?=E6=96=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../legado/app/service/CheckSourceService.kt | 36 +++++++--- .../io/legado/app/service/help/CheckSource.kt | 67 ++++++------------- 2 files changed, 46 insertions(+), 57 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 aa3bd6799..539c6c1ac 100644 --- a/app/src/main/java/io/legado/app/service/CheckSourceService.kt +++ b/app/src/main/java/io/legado/app/service/CheckSourceService.kt @@ -8,9 +8,11 @@ import io.legado.app.base.BaseService import io.legado.app.constant.AppConst import io.legado.app.constant.EventBus import io.legado.app.constant.IntentAction +import io.legado.app.data.entities.BookSource import io.legado.app.help.AppConfig import io.legado.app.help.IntentHelp import io.legado.app.help.coroutine.CompositeCoroutine +import io.legado.app.model.webBook.WebBook import io.legado.app.service.help.CheckSource import io.legado.app.ui.book.source.manage.BookSourceActivity import io.legado.app.utils.postEvent @@ -21,7 +23,7 @@ import kotlin.math.min class CheckSourceService : BaseService() { private var threadCount = AppConfig.threadCount - private var searchPool = Executors.newFixedThreadPool(threadCount).asCoroutineDispatcher() + private var searchCoroutine = Executors.newFixedThreadPool(threadCount).asCoroutineDispatcher() private var tasks = CompositeCoroutine() private val allIds = ArrayList() private val checkedIds = ArrayList() @@ -62,7 +64,7 @@ class CheckSourceService : BaseService() { override fun onDestroy() { super.onDestroy() tasks.clear() - searchPool.close() + searchCoroutine.close() postEvent(EventBus.CHECK_SOURCE_DONE, 0) } @@ -96,18 +98,34 @@ class CheckSourceService : BaseService() { if (index < allIds.size) { val sourceUrl = allIds[index] App.db.bookSourceDao.getBookSource(sourceUrl)?.let { source -> - if (source.searchUrl.isNullOrEmpty()) { - onNext(sourceUrl, source.bookSourceName) - } else { - CheckSource(source).check(this, searchPool) { - onNext(it, source.bookSourceName) - } - } + check(source) } ?: onNext(sourceUrl, "") } } } + fun check(source: BookSource) { + execute(context = searchCoroutine) { + val webBook = WebBook(source) + val books = webBook.searchBookAwait(this, CheckSource.keyword) + val book = webBook.getBookInfoAwait(this, books.first().toBook()) + val toc = webBook.getChapterListAwait(this, book) + val content = webBook.getContentAwait(this, book, toc.first()) + if (content.isBlank()) { + throw Exception("正文内容为空") + } + }.timeout(60000L) + .onError { + source.addGroup("失效") + App.db.bookSourceDao.update(source) + }.onSuccess { + source.removeGroup("失效") + App.db.bookSourceDao.update(source) + }.onFinally { + onNext(source.bookSourceUrl, source.bookSourceName) + } + } + private fun onNext(sourceUrl: String, sourceName: String) { synchronized(this) { check() 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 596662429..d38e6c225 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,64 +2,35 @@ package io.legado.app.service.help import android.content.Context import android.content.Intent -import io.legado.app.App import io.legado.app.R import io.legado.app.constant.IntentAction import io.legado.app.data.entities.BookSource -import io.legado.app.help.coroutine.Coroutine -import io.legado.app.model.webBook.WebBook import io.legado.app.service.CheckSourceService -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.Dispatchers import org.jetbrains.anko.toast -import kotlin.coroutines.CoroutineContext -class CheckSource(val source: BookSource) { +object CheckSource { + var keyword = "我的" - companion object { - var keyword = "我的" - - fun start(context: Context, sources: List) { - 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) - context.startService(it) - } + fun start(context: Context, sources: List) { + if (sources.isEmpty()) { + context.toast(R.string.non_select) + return } - - fun stop(context: Context) { - Intent(context, CheckSourceService::class.java).let { - it.action = IntentAction.stop - context.startService(it) - } + val selectedIds: ArrayList = arrayListOf() + sources.map { + selectedIds.add(it.bookSourceUrl) + } + Intent(context, CheckSourceService::class.java).let { + it.action = IntentAction.start + it.putExtra("selectIds", selectedIds) + context.startService(it) } } - fun check( - scope: CoroutineScope, - context: CoroutineContext, - onNext: (sourceUrl: String) -> Unit - ): Coroutine<*> { - val webBook = WebBook(source) - return webBook - .searchBook(scope, keyword, context = context) - .timeout(60000L) - .onError(Dispatchers.IO) { - source.addGroup("失效") - App.db.bookSourceDao.update(source) - }.onSuccess(Dispatchers.IO) { - source.removeGroup("失效") - App.db.bookSourceDao.update(source) - }.onFinally(Dispatchers.IO) { - onNext(source.bookSourceUrl) - } + fun stop(context: Context) { + Intent(context, CheckSourceService::class.java).let { + it.action = IntentAction.stop + context.startService(it) + } } } \ No newline at end of file From 201245a112fb9ece52f01f334316d4abcfa7eb25 Mon Sep 17 00:00:00 2001 From: gedoor Date: Sat, 23 Jan 2021 23:38:26 +0800 Subject: [PATCH 67/72] =?UTF-8?q?=E6=A0=A1=E9=AA=8C=E4=B9=A6=E6=BA=90?= =?UTF-8?q?=E6=94=B9=E4=B8=BA=E4=BB=8E=E6=90=9C=E7=B4=A2=E5=88=B0=E6=AD=A3?= =?UTF-8?q?=E6=96=87?= 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 fce9ba7db..9447fa317 100644 --- a/app/src/main/assets/updateLog.md +++ b/app/src/main/assets/updateLog.md @@ -3,6 +3,9 @@ * 关注合作公众号 **[小说拾遗]** 获取好看的小说。 * 旧版数据导入教程:先在旧版阅读(2.x)中进行备份,然后在新版阅读(3.x)【我的】->【备份与恢复】,选择【导入旧版本数据】。 +**2021/01/23** +* 优化书源校验,从搜索到正文全部校验 + **2021/01/20** * 更新在线朗读 From d3095035bc45fc4c1ffb192a6fb595a6dc314e78 Mon Sep 17 00:00:00 2001 From: gedoor Date: Sun, 24 Jan 2021 19:54:45 +0800 Subject: [PATCH 68/72] =?UTF-8?q?=E6=A0=A1=E9=AA=8C=E4=B9=A6=E6=BA=90?= =?UTF-8?q?=E6=94=B9=E4=B8=BA=E4=BB=8E=E6=90=9C=E7=B4=A2=E5=88=B0=E6=AD=A3?= =?UTF-8?q?=E6=96=87?= 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 539c6c1ac..f3ea90efc 100644 --- a/app/src/main/java/io/legado/app/service/CheckSourceService.kt +++ b/app/src/main/java/io/legado/app/service/CheckSourceService.kt @@ -117,6 +117,7 @@ class CheckSourceService : BaseService() { }.timeout(60000L) .onError { source.addGroup("失效") + source.bookSourceComment = "${source.bookSourceComment}\n${it.localizedMessage}" App.db.bookSourceDao.update(source) }.onSuccess { source.removeGroup("失效") From 62a91fd8ea0875493181dab2d8b99fc33bf28a4e Mon Sep 17 00:00:00 2001 From: gedoor Date: Sun, 24 Jan 2021 19:56:09 +0800 Subject: [PATCH 69/72] =?UTF-8?q?=E4=BF=AE=E5=A4=8Dbug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/io/legado/app/model/analyzeRule/AnalyzeUrl.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/io/legado/app/model/analyzeRule/AnalyzeUrl.kt b/app/src/main/java/io/legado/app/model/analyzeRule/AnalyzeUrl.kt index 0a0146874..318c1dcd3 100644 --- a/app/src/main/java/io/legado/app/model/analyzeRule/AnalyzeUrl.kt +++ b/app/src/main/java/io/legado/app/model/analyzeRule/AnalyzeUrl.kt @@ -309,7 +309,7 @@ class AnalyzeUrl( } return when (method) { RequestMethod.POST -> { - if (fieldMap.isNotEmpty()) { + if (fieldMap.isNotEmpty() || body.isNullOrBlank()) { RxHttp.postForm(url) .setAssemblyEnabled(false) .setOkClient(HttpHelper.getProxyClient(proxy)) @@ -338,7 +338,7 @@ class AnalyzeUrl( setCookie(tag) return when (method) { RequestMethod.POST -> { - if (fieldMap.isNotEmpty()) { + if (fieldMap.isNotEmpty() || body.isNullOrBlank()) { RxHttp.postForm(url) .setAssemblyEnabled(false) .setOkClient(HttpHelper.getProxyClient(proxy)) From 5fd83e87c8940739a0efdd1d9a3561d2964e9238 Mon Sep 17 00:00:00 2001 From: gedoor Date: Sun, 24 Jan 2021 21:47:40 +0800 Subject: [PATCH 70/72] =?UTF-8?q?=E4=B9=A6=E6=BA=90=E6=A0=A1=E9=AA=8C?= =?UTF-8?q?=E9=94=99=E8=AF=AF=E8=AE=B0=E5=BD=95=E5=88=B0=E6=B3=A8=E9=87=8A?= =?UTF-8?q?=E9=87=8C?= 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 | 3 ++- 1 file changed, 2 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 f3ea90efc..6bd72e7bf 100644 --- a/app/src/main/java/io/legado/app/service/CheckSourceService.kt +++ b/app/src/main/java/io/legado/app/service/CheckSourceService.kt @@ -117,7 +117,8 @@ class CheckSourceService : BaseService() { }.timeout(60000L) .onError { source.addGroup("失效") - source.bookSourceComment = "${source.bookSourceComment}\n${it.localizedMessage}" + source.bookSourceComment = + "error:${it.localizedMessage}\n${source.bookSourceComment}" App.db.bookSourceDao.update(source) }.onSuccess { source.removeGroup("失效") From 0c0862673ce5955b0cbb5ef45391f08d56cd3882 Mon Sep 17 00:00:00 2001 From: gedoor Date: Mon, 25 Jan 2021 22:59:59 +0800 Subject: [PATCH 71/72] =?UTF-8?q?=E8=AE=BE=E7=BD=AE=E5=9B=BE=E7=89=87?= =?UTF-8?q?=E8=83=8C=E6=99=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/io/legado/app/constant/PreferKey.kt | 2 + .../java/io/legado/app/help/ThemeConfig.kt | 1 + .../app/ui/config/OtherConfigFragment.kt | 9 +- .../app/ui/config/ThemeConfigFragment.kt | 97 +++++++++++++++++++ app/src/main/res/values-zh-rHK/strings.xml | 1 + app/src/main/res/values-zh-rTW/strings.xml | 1 + app/src/main/res/values-zh/strings.xml | 1 + app/src/main/res/values/strings.xml | 1 + app/src/main/res/xml/pref_config_theme.xml | 8 ++ 9 files changed, 117 insertions(+), 4 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 f4e902ba0..b8cbedf1c 100644 --- a/app/src/main/java/io/legado/app/constant/PreferKey.kt +++ b/app/src/main/java/io/legado/app/constant/PreferKey.kt @@ -70,10 +70,12 @@ object PreferKey { const val cAccent = "colorAccent" const val cBackground = "colorBackground" const val cBBackground = "colorBottomBackground" + const val bgImage = "backgroundImage" const val cNPrimary = "colorPrimaryNight" const val cNAccent = "colorAccentNight" const val cNBackground = "colorBackgroundNight" const val cNBBackground = "colorBottomBackgroundNight" + const val bgImageN = "backgroundImageNight" } \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/help/ThemeConfig.kt b/app/src/main/java/io/legado/app/help/ThemeConfig.kt index 9de5ceade..0b0298e91 100644 --- a/app/src/main/java/io/legado/app/help/ThemeConfig.kt +++ b/app/src/main/java/io/legado/app/help/ThemeConfig.kt @@ -204,6 +204,7 @@ object ThemeConfig { var primaryColor: String, var accentColor: String, var backgroundColor: String, + var backgroundImage: String? = null, var bottomBackground: String ) 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 3adaa20f0..42945d48f 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 @@ -88,13 +88,13 @@ class OtherConfigFragment : BasePreferenceFragment(), } PreferKey.cleanCache -> clearCache() PreferKey.defaultCover -> if (getPrefString(PreferKey.defaultCover).isNullOrEmpty()) { - selectDefaultCover() + selectImage(requestCodeCover) } else { selector(items = arrayListOf("删除图片", "选择图片")) { _, i -> if (i == 0) { removePref(PreferKey.defaultCover) } else { - selectDefaultCover() + selectImage(requestCodeCover) } } } @@ -183,11 +183,12 @@ class OtherConfigFragment : BasePreferenceFragment(), }.show() } - private fun selectDefaultCover() { + @Suppress("SameParameterValue") + private fun selectImage(requestCode: Int) { val intent = Intent(Intent.ACTION_GET_CONTENT) intent.addCategory(Intent.CATEGORY_OPENABLE) intent.type = "image/*" - startActivityForResult(intent, requestCodeCover) + startActivityForResult(intent, requestCode) } private fun isProcessTextEnabled(): Boolean { 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 b7a29434e..dbe344a53 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 @@ -1,13 +1,17 @@ package io.legado.app.ui.config import android.annotation.SuppressLint +import android.app.Activity +import android.content.Intent import android.content.SharedPreferences +import android.net.Uri import android.os.Build import android.os.Bundle import android.view.Menu import android.view.MenuInflater import android.view.MenuItem import android.view.View +import androidx.documentfile.provider.DocumentFile import androidx.preference.Preference import io.legado.app.App import io.legado.app.R @@ -19,18 +23,25 @@ import io.legado.app.databinding.DialogEditTextBinding import io.legado.app.help.AppConfig import io.legado.app.help.LauncherIconHelp import io.legado.app.help.ThemeConfig +import io.legado.app.help.permission.Permissions +import io.legado.app.help.permission.PermissionsCompat import io.legado.app.lib.dialogs.alert +import io.legado.app.lib.dialogs.selector import io.legado.app.lib.theme.ATH import io.legado.app.ui.widget.number.NumberPickerDialog import io.legado.app.ui.widget.prefs.ColorPreference import io.legado.app.ui.widget.prefs.IconListPreference import io.legado.app.utils.* +import java.io.File @Suppress("SameParameterValue") class ThemeConfigFragment : BasePreferenceFragment(), SharedPreferences.OnSharedPreferenceChangeListener { + private val requestCodeBgImage = 234 + private val requestCodeBgImageN = 342 + override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { addPreferencesFromResource(R.xml.pref_config_theme) if (Build.VERSION.SDK_INT < 26) { @@ -39,6 +50,8 @@ class ThemeConfigFragment : BasePreferenceFragment(), } } upPreferenceSummary(PreferKey.barElevation, AppConfig.elevation.toString()) + upPreferenceSummary(PreferKey.bgImage, getPrefString(PreferKey.bgImage)) + upPreferenceSummary(PreferKey.bgImageN, getPrefString(PreferKey.bgImageN)) findPreference(PreferKey.cBackground)?.let { it.onSaveColor = { color -> if (!ColorUtils.isColorLight(color)) { @@ -168,10 +181,39 @@ class ThemeConfigFragment : BasePreferenceFragment(), } "themeList" -> ThemeListDialog().show(childFragmentManager, "themeList") "saveDayTheme", "saveNightTheme" -> saveThemeAlert(key) + PreferKey.bgImage -> if (getPrefString(PreferKey.bgImage).isNullOrEmpty()) { + selectImage(requestCodeBgImage) + } else { + selector(items = arrayListOf("删除图片", "选择图片")) { _, i -> + if (i == 0) { + removePref(PreferKey.bgImage) + } else { + selectImage(requestCodeBgImage) + } + } + } + PreferKey.bgImageN -> if (getPrefString(PreferKey.bgImageN).isNullOrEmpty()) { + selectImage(requestCodeBgImageN) + } else { + selector(items = arrayListOf("删除图片", "选择图片")) { _, i -> + if (i == 0) { + removePref(PreferKey.bgImageN) + } else { + selectImage(requestCodeBgImageN) + } + } + } } return super.onPreferenceTreeClick(preference) } + private fun selectImage(requestCode: Int) { + val intent = Intent(Intent.ACTION_GET_CONTENT) + intent.addCategory(Intent.CATEGORY_OPENABLE) + intent.type = "image/*" + startActivityForResult(intent, requestCode) + } + @SuppressLint("InflateParams") private fun saveThemeAlert(key: String) { alert(R.string.theme_name) { @@ -211,6 +253,61 @@ class ThemeConfigFragment : BasePreferenceFragment(), when (preferenceKey) { PreferKey.barElevation -> preference.summary = getString(R.string.bar_elevation_s, value) + else -> preference.summary = value + } + } + + private fun setBgFromUri(uri: Uri, preferenceKey: String) { + if (uri.isContentScheme()) { + val doc = DocumentFile.fromSingleUri(requireContext(), uri) + doc?.name?.let { + var file = requireContext().externalFilesDir + file = FileUtils.createFileIfNotExist(file, preferenceKey, it) + kotlin.runCatching { + DocumentUtils.readBytes(requireContext(), doc.uri) + }.getOrNull()?.let { byteArray -> + file.writeBytes(byteArray) + putPrefString(preferenceKey, file.absolutePath) + + } ?: toast("获取文件出错") + } + } else { + PermissionsCompat.Builder(this) + .addPermissions( + Permissions.READ_EXTERNAL_STORAGE, + Permissions.WRITE_EXTERNAL_STORAGE + ) + .rationale(R.string.bg_image_per) + .onGranted { + RealPathUtil.getPath(requireContext(), uri)?.let { path -> + val imgFile = File(path) + if (imgFile.exists()) { + var file = requireContext().externalFilesDir + file = FileUtils.createFileIfNotExist(file, preferenceKey, imgFile.name) + file.writeBytes(imgFile.readBytes()) + putPrefString(preferenceKey, file.absolutePath) + + } + } + } + .request() } } + + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + super.onActivityResult(requestCode, resultCode, data) + when (requestCode) { + requestCodeBgImage -> if (resultCode == Activity.RESULT_OK) { + data?.data?.let { uri -> + setBgFromUri(uri, PreferKey.bgImage) + } + } + requestCodeBgImageN -> if (resultCode == Activity.RESULT_OK) { + data?.data?.let { uri -> + setBgFromUri(uri, PreferKey.bgImageN) + } + } + } + } + } \ No newline at end of file diff --git a/app/src/main/res/values-zh-rHK/strings.xml b/app/src/main/res/values-zh-rHK/strings.xml index 3192e781d..e4336c98a 100644 --- a/app/src/main/res/values-zh-rHK/strings.xml +++ b/app/src/main/res/values-zh-rHK/strings.xml @@ -800,5 +800,6 @@ 预下载 预先下载10章正文 启用排序 + 背景图片 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 836f1c4de..73f4ea493 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -804,5 +804,6 @@ 预下载 预先下载10章正文 启用排序 + 背景图片 diff --git a/app/src/main/res/values-zh/strings.xml b/app/src/main/res/values-zh/strings.xml index ad6bfbce7..6ff4b0be6 100644 --- a/app/src/main/res/values-zh/strings.xml +++ b/app/src/main/res/values-zh/strings.xml @@ -804,5 +804,6 @@ 预下载 预先下载10章正文 启用排序 + 背景图片 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index c38246704..2472dbe3c 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -807,5 +807,6 @@ 预下载 预先下载10章正文 启用排序 + 背景图片 diff --git a/app/src/main/res/xml/pref_config_theme.xml b/app/src/main/res/xml/pref_config_theme.xml index 081c49b37..f5aae055a 100644 --- a/app/src/main/res/xml/pref_config_theme.xml +++ b/app/src/main/res/xml/pref_config_theme.xml @@ -72,6 +72,10 @@ app:cpv_dialogType="preset" app:iconSpaceReserved="false" /> + + + + Date: Mon, 25 Jan 2021 23:06:58 +0800 Subject: [PATCH 72/72] =?UTF-8?q?=E8=AE=BE=E7=BD=AE=E5=9B=BE=E7=89=87?= =?UTF-8?q?=E8=83=8C=E6=99=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../legado/app/ui/config/ThemeConfigFragment.kt | 17 +++++++++++------ .../java/io/legado/app/ui/main/my/MyFragment.kt | 2 +- app/src/main/res/xml/pref_config_theme.xml | 2 ++ 3 files changed, 14 insertions(+), 7 deletions(-) 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 dbe344a53..8248a840a 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 @@ -30,7 +30,7 @@ import io.legado.app.lib.dialogs.selector import io.legado.app.lib.theme.ATH import io.legado.app.ui.widget.number.NumberPickerDialog import io.legado.app.ui.widget.prefs.ColorPreference -import io.legado.app.ui.widget.prefs.IconListPreference +import io.legado.app.ui.widget.prefs.PreferenceCategory import io.legado.app.utils.* import java.io.File @@ -45,13 +45,18 @@ class ThemeConfigFragment : BasePreferenceFragment(), override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { addPreferencesFromResource(R.xml.pref_config_theme) if (Build.VERSION.SDK_INT < 26) { - findPreference(PreferKey.launcherIcon)?.let { - preferenceScreen.removePreference(it) - } + preferenceScreen.removePreferenceRecursively(PreferKey.launcherIcon) + } + if (AppConfig.isGooglePlay) { + upPreferenceSummary(PreferKey.bgImage, getPrefString(PreferKey.bgImage)) + upPreferenceSummary(PreferKey.bgImageN, getPrefString(PreferKey.bgImageN)) + } else { + findPreference("dayThemeCategory") + ?.removePreferenceRecursively(PreferKey.bgImage) + findPreference("nightThemeCategory") + ?.removePreferenceRecursively(PreferKey.bgImageN) } upPreferenceSummary(PreferKey.barElevation, AppConfig.elevation.toString()) - upPreferenceSummary(PreferKey.bgImage, getPrefString(PreferKey.bgImage)) - upPreferenceSummary(PreferKey.bgImageN, getPrefString(PreferKey.bgImageN)) findPreference(PreferKey.cBackground)?.let { it.onSaveColor = { color -> if (!ColorUtils.isColorLight(color)) { 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 1fb43003b..ce6065e27 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 @@ -96,7 +96,7 @@ class MyFragment : BaseFragment(R.layout.fragment_my_config), FilePickerDialog.C } if (AppConfig.isGooglePlay) { findPreference("aboutCategory") - ?.removePreference(findPreference("donate")) + ?.removePreferenceRecursively("donate") } } diff --git a/app/src/main/res/xml/pref_config_theme.xml b/app/src/main/res/xml/pref_config_theme.xml index f5aae055a..ec131ec7a 100644 --- a/app/src/main/res/xml/pref_config_theme.xml +++ b/app/src/main/res/xml/pref_config_theme.xml @@ -42,6 +42,7 @@ app:iconSpaceReserved="false" />