From 8cd18581a8136b394402995de2847ea0f46545ec Mon Sep 17 00:00:00 2001 From: kunfei Date: Fri, 13 Mar 2020 18:24:48 +0800 Subject: [PATCH 01/47] =?UTF-8?q?feat:=20=E4=BC=98=E5=8C=96=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../legado/app/service/TTSReadAloudService.kt | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/io/legado/app/service/TTSReadAloudService.kt b/app/src/main/java/io/legado/app/service/TTSReadAloudService.kt index 61507bf7c..c7fc02b08 100644 --- a/app/src/main/java/io/legado/app/service/TTSReadAloudService.kt +++ b/app/src/main/java/io/legado/app/service/TTSReadAloudService.kt @@ -42,20 +42,21 @@ class TTSReadAloudService : BaseReadAloudService(), TextToSpeech.OnInitListener clearTTS() } + @Synchronized override fun onInit(status: Int) { - launch { - if (status == TextToSpeech.SUCCESS) { - textToSpeech?.language = Locale.CHINA - textToSpeech?.setOnUtteranceProgressListener(TTSUtteranceListener()) - ttsIsSuccess = true - play() - } else { + if (status == TextToSpeech.SUCCESS) { + textToSpeech?.language = Locale.CHINA + textToSpeech?.setOnUtteranceProgressListener(TTSUtteranceListener()) + ttsIsSuccess = true + play() + } else { + launch { toast(R.string.tts_init_failed) } } } - @Suppress("DEPRECATION") + @Synchronized override fun play() { if (contentList.isEmpty() || !ttsIsSuccess) { return From 8d5a1877aa2d08d206a631a801f73bf78e04c1ff Mon Sep 17 00:00:00 2001 From: kunfei Date: Fri, 13 Mar 2020 18:34:57 +0800 Subject: [PATCH 02/47] =?UTF-8?q?feat:=20=E4=BC=98=E5=8C=96=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../legado/app/service/TTSReadAloudService.kt | 6 +-- .../app/ui/rss/read/ReadRssViewModel.kt | 38 +++++++++++++------ 2 files changed, 30 insertions(+), 14 deletions(-) diff --git a/app/src/main/java/io/legado/app/service/TTSReadAloudService.kt b/app/src/main/java/io/legado/app/service/TTSReadAloudService.kt index c7fc02b08..1f63dac89 100644 --- a/app/src/main/java/io/legado/app/service/TTSReadAloudService.kt +++ b/app/src/main/java/io/legado/app/service/TTSReadAloudService.kt @@ -29,7 +29,7 @@ class TTSReadAloudService : BaseReadAloudService(), TextToSpeech.OnInitListener } } - private var ttsIsSuccess: Boolean = false + private var ttsInitFinish = false override fun onCreate() { super.onCreate() @@ -47,7 +47,7 @@ class TTSReadAloudService : BaseReadAloudService(), TextToSpeech.OnInitListener if (status == TextToSpeech.SUCCESS) { textToSpeech?.language = Locale.CHINA textToSpeech?.setOnUtteranceProgressListener(TTSUtteranceListener()) - ttsIsSuccess = true + ttsInitFinish = true play() } else { launch { @@ -58,7 +58,7 @@ class TTSReadAloudService : BaseReadAloudService(), TextToSpeech.OnInitListener @Synchronized override fun play() { - if (contentList.isEmpty() || !ttsIsSuccess) { + if (contentList.isEmpty() || !ttsInitFinish) { return } if (requestFocus()) { 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 6d90fd181..d2aaad80f 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 @@ -35,7 +35,9 @@ class ReadRssViewModel(application: Application) : BaseViewModel(application), val contentLiveData = MutableLiveData() val urlLiveData = MutableLiveData() var star = false - var textToSpeech: TextToSpeech = TextToSpeech(context, this) + var textToSpeech: TextToSpeech? = null + private var ttsInitFinish = false + private var ttsText = "" fun initData(intent: Intent) { execute { @@ -143,28 +145,42 @@ class ReadRssViewModel(application: Application) : BaseViewModel(application), } } + @Synchronized override fun onInit(status: Int) { - launch { - if (status == TextToSpeech.SUCCESS) { - textToSpeech.language = Locale.CHINA - textToSpeech.setOnUtteranceProgressListener(TTSUtteranceListener()) - } else { + if (status == TextToSpeech.SUCCESS) { + textToSpeech?.language = Locale.CHINA + textToSpeech?.setOnUtteranceProgressListener(TTSUtteranceListener()) + ttsInitFinish = true + play() + } else { + launch { toast(R.string.tts_init_failed) } } } + @Synchronized + private fun play() { + if (!ttsInitFinish) return + textToSpeech?.stop() + ttsText.split("\n", " ", "  ").forEach { + textToSpeech?.speak(it, TextToSpeech.QUEUE_ADD, null, "rss") + } + } + fun readAloud(text: String) { - textToSpeech.stop() - text.split("\n", " ", "  ").forEach { - textToSpeech.speak(it, TextToSpeech.QUEUE_ADD, null, "rss") + ttsText = text + textToSpeech?.let { + play() + } ?: let { + textToSpeech = TextToSpeech(context, this) } } override fun onCleared() { super.onCleared() - textToSpeech.stop() - textToSpeech.shutdown() + textToSpeech?.stop() + textToSpeech?.shutdown() } /** From d9f7e5333891694c319c85a1827d96a084f0e2eb Mon Sep 17 00:00:00 2001 From: kunfei Date: Fri, 13 Mar 2020 18:36:32 +0800 Subject: [PATCH 03/47] =?UTF-8?q?feat:=20=E4=BC=98=E5=8C=96=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/io/legado/app/ui/rss/read/ReadRssActivity.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/rss/read/ReadRssActivity.kt b/app/src/main/java/io/legado/app/ui/rss/read/ReadRssActivity.kt index 79ea599d1..c37fb3761 100644 --- a/app/src/main/java/io/legado/app/ui/rss/read/ReadRssActivity.kt +++ b/app/src/main/java/io/legado/app/ui/rss/read/ReadRssActivity.kt @@ -246,8 +246,8 @@ class ReadRssActivity : VMBaseActivity(R.layout.activity_rss_r @SuppressLint("SetJavaScriptEnabled") private fun readAloud() { - if (viewModel.textToSpeech.isSpeaking) { - viewModel.textToSpeech.stop() + if (viewModel.textToSpeech?.isSpeaking == true) { + viewModel.textToSpeech?.stop() upTtsMenu(false) } else { web_view.settings.javaScriptEnabled = true From 41789f5bc5d697996a0acd7f443e81fd92980186 Mon Sep 17 00:00:00 2001 From: kunfei Date: Fri, 13 Mar 2020 19:49:55 +0800 Subject: [PATCH 04/47] =?UTF-8?q?feat:=20=E4=BC=98=E5=8C=96=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../legado/app/ui/rss/read/ReadRssActivity.kt | 8 +-- .../app/ui/rss/read/ReadRssViewModel.kt | 9 +-- .../io/legado/app/utils/JsoupExtensions.kt | 69 +++++++++++++++++++ 3 files changed, 76 insertions(+), 10 deletions(-) create mode 100644 app/src/main/java/io/legado/app/utils/JsoupExtensions.kt diff --git a/app/src/main/java/io/legado/app/ui/rss/read/ReadRssActivity.kt b/app/src/main/java/io/legado/app/ui/rss/read/ReadRssActivity.kt index c37fb3761..9aa30235b 100644 --- a/app/src/main/java/io/legado/app/ui/rss/read/ReadRssActivity.kt +++ b/app/src/main/java/io/legado/app/ui/rss/read/ReadRssActivity.kt @@ -22,7 +22,6 @@ import org.apache.commons.text.StringEscapeUtils import org.jetbrains.anko.share import org.jetbrains.anko.toast import org.jsoup.Jsoup -import org.jsoup.safety.Whitelist class ReadRssActivity : VMBaseActivity(R.layout.activity_rss_read), @@ -253,11 +252,8 @@ class ReadRssActivity : VMBaseActivity(R.layout.activity_rss_r web_view.settings.javaScriptEnabled = true web_view.evaluateJavascript("document.documentElement.outerHTML") { val html = StringEscapeUtils.unescapeJson(it) - val text = Jsoup.clean(html, Whitelist.none()) - .replace(Regex("""&\w+;"""), "") - .trim()//朗读过程中总是听到一些杂音,清理一下 - //longToast(需读内容)调试一下 - viewModel.readAloud(text) + Jsoup.parse(html).text() + viewModel.readAloud(Jsoup.parse(html).textArray()) } } } 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 d2aaad80f..fd721e09b 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 @@ -37,7 +37,7 @@ class ReadRssViewModel(application: Application) : BaseViewModel(application), var star = false var textToSpeech: TextToSpeech? = null private var ttsInitFinish = false - private var ttsText = "" + private var ttsTextList = arrayListOf() fun initData(intent: Intent) { execute { @@ -163,13 +163,14 @@ class ReadRssViewModel(application: Application) : BaseViewModel(application), private fun play() { if (!ttsInitFinish) return textToSpeech?.stop() - ttsText.split("\n", " ", "  ").forEach { + ttsTextList.forEach { textToSpeech?.speak(it, TextToSpeech.QUEUE_ADD, null, "rss") } } - fun readAloud(text: String) { - ttsText = text + fun readAloud(textArray: Array) { + ttsTextList.clear() + ttsTextList.addAll(textArray) textToSpeech?.let { play() } ?: let { diff --git a/app/src/main/java/io/legado/app/utils/JsoupExtensions.kt b/app/src/main/java/io/legado/app/utils/JsoupExtensions.kt new file mode 100644 index 000000000..b40cdf391 --- /dev/null +++ b/app/src/main/java/io/legado/app/utils/JsoupExtensions.kt @@ -0,0 +1,69 @@ +package io.legado.app.utils + +import org.jsoup.internal.StringUtil +import org.jsoup.nodes.CDataNode +import org.jsoup.nodes.Element +import org.jsoup.nodes.Node +import org.jsoup.nodes.TextNode +import org.jsoup.select.NodeTraversor +import org.jsoup.select.NodeVisitor + + +fun Element.textArray(): Array { + val accum = StringUtil.borrowBuilder() + NodeTraversor.traverse(object : NodeVisitor { + override fun head(node: Node, depth: Int) { + if (node is TextNode) { + appendNormalisedText(accum, node) + } else if (node is Element) { + if (accum.isNotEmpty() && + (node.isBlock || node.tag().name == "br") && + !lastCharIsWhitespace(accum) + ) accum.append("\n") + } + } + + override fun tail(node: Node, depth: Int) { + // make sure there is a space between block tags and immediately following text nodes
One
Two should be "One Two". + if (node is Element) { + if (node.isBlock && node.nextSibling() is TextNode && !lastCharIsWhitespace( + accum + ) + ) accum.append("\n") + } + } + }, this) + val text = StringUtil.releaseBuilder(accum).trim { it <= ' ' } + return text.splitNotBlank("\n") +} + +private fun appendNormalisedText( + accum: StringBuilder, + textNode: TextNode +) { + val text = textNode.wholeText + if (preserveWhitespace(textNode.parentNode()) || textNode is CDataNode) accum.append(text) else StringUtil.appendNormalisedWhitespace( + accum, + text, + lastCharIsWhitespace(accum) + ) +} + +private fun preserveWhitespace(node: Node?): Boolean { + // looks only at this element and five levels up, to prevent recursion & needless stack searches + if (node is Element) { + var el = node as Element? + var i = 0 + do { + if (el!!.tag().preserveWhitespace()) return true + el = el.parent() + i++ + } while (i < 6 && el != null) + } + return false +} + +private fun lastCharIsWhitespace(sb: java.lang.StringBuilder): Boolean { + return sb.isNotEmpty() && sb[sb.length - 1] == ' ' +} + From a14e350591dbf2774b898484c8b449e282619a78 Mon Sep 17 00:00:00 2001 From: kunfei Date: Fri, 13 Mar 2020 19:55:27 +0800 Subject: [PATCH 05/47] =?UTF-8?q?feat:=20=E4=BC=98=E5=8C=96=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= 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 bab4ef9ab..0d0ff4bc6 100644 --- a/app/src/main/assets/updateLog.md +++ b/app/src/main/assets/updateLog.md @@ -6,6 +6,7 @@ * 更改书架控件,ViewPager2替换回2.0使用的ViewPager,解决下拉不流畅问题 * 修复点击作者搜索后,打开的详情页还是原来的书籍的bug * 修改朗读菜单 +* 优化rss朗读 **2020/03/12** * 导入本地添加需要权限模式 From 3a81d34a06eecfb11e4acea12128b3b4836de3bb Mon Sep 17 00:00:00 2001 From: kunfei Date: Fri, 13 Mar 2020 19:57:36 +0800 Subject: [PATCH 06/47] =?UTF-8?q?feat:=20=E4=BC=98=E5=8C=96=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/io/legado/app/utils/JsoupExtensions.kt | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/io/legado/app/utils/JsoupExtensions.kt b/app/src/main/java/io/legado/app/utils/JsoupExtensions.kt index b40cdf391..3f347e4a1 100644 --- a/app/src/main/java/io/legado/app/utils/JsoupExtensions.kt +++ b/app/src/main/java/io/legado/app/utils/JsoupExtensions.kt @@ -24,7 +24,6 @@ fun Element.textArray(): Array { } override fun tail(node: Node, depth: Int) { - // make sure there is a space between block tags and immediately following text nodes
One
Two should be "One Two". if (node is Element) { if (node.isBlock && node.nextSibling() is TextNode && !lastCharIsWhitespace( accum @@ -37,12 +36,11 @@ fun Element.textArray(): Array { return text.splitNotBlank("\n") } -private fun appendNormalisedText( - accum: StringBuilder, - textNode: TextNode -) { +private fun appendNormalisedText(accum: StringBuilder, textNode: TextNode) { val text = textNode.wholeText - if (preserveWhitespace(textNode.parentNode()) || textNode is CDataNode) accum.append(text) else StringUtil.appendNormalisedWhitespace( + if (preserveWhitespace(textNode.parentNode()) || textNode is CDataNode) + accum.append(text) + else StringUtil.appendNormalisedWhitespace( accum, text, lastCharIsWhitespace(accum) @@ -50,7 +48,6 @@ private fun appendNormalisedText( } private fun preserveWhitespace(node: Node?): Boolean { - // looks only at this element and five levels up, to prevent recursion & needless stack searches if (node is Element) { var el = node as Element? var i = 0 From d860028a00bc61fd9519f7c91d72ea578bca4693 Mon Sep 17 00:00:00 2001 From: kunfei Date: Sat, 14 Mar 2020 11:50:10 +0800 Subject: [PATCH 07/47] =?UTF-8?q?feat:=20=E4=BC=98=E5=8C=96=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/io/legado/app/ui/main/MainActivity.kt | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/main/MainActivity.kt b/app/src/main/java/io/legado/app/ui/main/MainActivity.kt index 462fb317d..96424cc9b 100644 --- a/app/src/main/java/io/legado/app/ui/main/MainActivity.kt +++ b/app/src/main/java/io/legado/app/ui/main/MainActivity.kt @@ -3,8 +3,6 @@ package io.legado.app.ui.main import android.os.Bundle import android.view.KeyEvent import android.view.MenuItem -import androidx.core.view.forEach -import androidx.core.view.forEachIndexed import androidx.fragment.app.Fragment import androidx.fragment.app.FragmentManager import androidx.fragment.app.FragmentStatePagerAdapter @@ -96,14 +94,6 @@ class MainActivity : VMBaseActivity(R.layout.activity_main), bottom_navigation_view.menu.getItem(3).isChecked = true } } - - -// bottom_navigation_view.menu.forEachIndexed { index, item -> -// if (item.isChecked) -// item.icon = getDrawable(res[1][index]) -// else -// item.icon = getDrawable(res[0][index]) -// } } override fun onKeyUp(keyCode: Int, event: KeyEvent?): Boolean { From d7e4debe6153d4323164f10d301a232eb3ddaea9 Mon Sep 17 00:00:00 2001 From: kunfei Date: Sat, 14 Mar 2020 11:52:11 +0800 Subject: [PATCH 08/47] =?UTF-8?q?feat:=20=E4=BC=98=E5=8C=96=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/res/drawable/ic_bottom_books.xml | 4 ++-- app/src/main/res/drawable/ic_bottom_explore_black.xml | 4 ++-- app/src/main/res/drawable/ic_bottom_person.xml | 4 ++-- app/src/main/res/drawable/ic_bottom_rss_feed.xml | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/app/src/main/res/drawable/ic_bottom_books.xml b/app/src/main/res/drawable/ic_bottom_books.xml index ffda5c5d6..807aaaf30 100644 --- a/app/src/main/res/drawable/ic_bottom_books.xml +++ b/app/src/main/res/drawable/ic_bottom_books.xml @@ -1,5 +1,5 @@ - - + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_bottom_explore_black.xml b/app/src/main/res/drawable/ic_bottom_explore_black.xml index 776e0cc40..32d8ef18c 100644 --- a/app/src/main/res/drawable/ic_bottom_explore_black.xml +++ b/app/src/main/res/drawable/ic_bottom_explore_black.xml @@ -1,5 +1,5 @@ - - + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_bottom_person.xml b/app/src/main/res/drawable/ic_bottom_person.xml index 9ecbba79f..50053997a 100644 --- a/app/src/main/res/drawable/ic_bottom_person.xml +++ b/app/src/main/res/drawable/ic_bottom_person.xml @@ -1,5 +1,5 @@ - - + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_bottom_rss_feed.xml b/app/src/main/res/drawable/ic_bottom_rss_feed.xml index 26d0b4322..4cd080b7f 100644 --- a/app/src/main/res/drawable/ic_bottom_rss_feed.xml +++ b/app/src/main/res/drawable/ic_bottom_rss_feed.xml @@ -1,5 +1,5 @@ - - + + \ No newline at end of file From 63e491a58f27f354f268f1a5348e63d63da88a70 Mon Sep 17 00:00:00 2001 From: kunfei Date: Sat, 14 Mar 2020 11:53:01 +0800 Subject: [PATCH 09/47] =?UTF-8?q?feat:=20=E4=BC=98=E5=8C=96=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= 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 0d0ff4bc6..8f2068940 100644 --- a/app/src/main/assets/updateLog.md +++ b/app/src/main/assets/updateLog.md @@ -2,6 +2,9 @@ * 旧版数据导入教程:先在旧版阅读(2.x)中进行备份,然后在新版阅读(3.x)【我的】->【备份与恢复】,选择【导入旧版本数据】。 * 请关注[开源阅读软件]()支持我,同时关注合作公众号[小说拾遗](),阅读公众号小编。 +**2020/03/14** +* 修改导航栏图标 + **2020/03/13** * 更改书架控件,ViewPager2替换回2.0使用的ViewPager,解决下拉不流畅问题 * 修复点击作者搜索后,打开的详情页还是原来的书籍的bug From 5613d2c215a1683ba4df51c92cda2e0450fbe7a3 Mon Sep 17 00:00:00 2001 From: kunfei Date: Sat, 14 Mar 2020 12:15:12 +0800 Subject: [PATCH 10/47] =?UTF-8?q?feat:=20=E4=BC=98=E5=8C=96=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/assets/help.md | 126 ++++++++++++++++++++++++++++++++++++ 1 file changed, 126 insertions(+) create mode 100644 app/src/main/assets/help.md diff --git a/app/src/main/assets/help.md b/app/src/main/assets/help.md new file mode 100644 index 000000000..124410667 --- /dev/null +++ b/app/src/main/assets/help.md @@ -0,0 +1,126 @@ +1.为什么第一次安装好之后什么东西都没有? +* 因为阅读只是一个转码工具,不提供内容,第一次安装app,需要自己手动导入书源,可以从QQ群、公众号“开源阅读软件”、酷安评论里获取由书友制作分享的书源。 + +2.如何导入本地书源文件? +* 下载群文件里的书源文件(书源格式后缀有txt、json,其中json文件某些情况下无法导入,需要修改后缀为txt格式才可导入); +* 打开阅读软件; +* 我的 - 点击“书源管理”; +* 点击右上角选择“本地导入”; +* 左下角选择书源文件所在的路径; +* 点击书源文件导入; +* 导入后返回书源管理界面; + +3.如何新建大佬发的单独书源? +* 复制书源代码; +* 打开阅读软件; +* 我的 - 点击“书源管理”; +* 右上角选择“新建书源”; +* 进入新建书源后点击右上角“粘贴源”; +* 粘贴书源完成后点击上方保存; +* 本次新建单独书源操作完成。 +* 注:如果书源有错误或者复制不全会显示格式错误,请重新复制。 + +4.为什么导入2.0书源后看不了书? +* 2.0部分书源并不适用3.0,建议导入后进行筛选。 + +5.阅读2.0数据如何导入阅读3.0? +* 先对阅读2.0的数据进行备份,然后进入阅读3.0,点击“我的”,选择“备份与恢复”,再点击“导入旧版本数据”。 + +6.如何给朋友分享我的书源? +* 打开阅读软件; +* 点击备份; +* 打开手机自带的文件管理; +* 手机自带内存根目录找到YueDu3.0文件夹; +* 找到myBookSource.json长按选择分享; +* 选择微信分享或者QQ分享; +* 选择你要分享的好友点击发送; +* 好友接收后在手机自带内存根目录找到myBookSource.json文件(QQ在tencent--QQfile_recv微信在Tencent--MicroMsg--Download); +* 复制该文件到手机自带内存根目录找到YueDu3.0文件夹(如已有该文件请先删除该文件或者备份到其他地方再复制到文件夹); +* 打开阅读软件点击恢复。 +* 注:备份路径如已修改过请在修改后的路径下查找书源文件。 + +7.目前阅读支持哪些格式的本地书籍? +* 目前支持TXT、EPUB格式(只支持显示EPUB里的文本内容,还不支持显示图片)。 + +8.如何刷新书架? +* 在书架界面下拉即可刷新。 + +9.书架界面书籍右上角的红色或者灰色背景小数字代表什么? +* 红色代表书籍有更新,灰色代表无更新,数字代表未读章节。 + +10.如何查看书籍详情? +* 长按书籍。 + +11.如何对书架上的书进行删除、切换书架的操作? +* 书籍详情页操作即可。 + +12.如何禁止或允许某本书更新? +* 书籍详情页,点击右上角 - “允许更新”。 + +13.如何更换小说封面、名字、作者或简介? +* 书籍详情页,点击右上角修改按钮。 + +14.怎么使用自定义字体? +* 阅读界面 - 字体-点击右上角选择字体文件路径。 + +15.目前支持哪些格式的字体文件? +* 目前支持ttf、otf格式。 + +16.书籍经常“正在加载中”怎么办? +* 在线书籍出现这个问题通常是由于源质量不好或不兼容引起的,可以换其它源多试试;本地书籍出现这个问题大概率是目录规则问题,手动切换规则可以解决。 + +17.书籍内容只有标题,正文内容是路径怎么办? +* 通常是缓存路径引起的,更换缓存路径即可。 + +18.效验书源显示失效就说明书源不能用了吗? +* 效验书源只是测试书源,可以做个参考,失效了不代表书源不能用了。 + +19.发现和正版书源能不能使用? +* 发现和正版书源只能用来找书,看排行榜,不能用来看书,如需看书请切换书源。 + +20.替换净化是什么? +* 替换净化可以去除书籍内容里的广告、错别字、屏蔽词等。 + +21.如何自己填写净化替换规则? +* 第一行:替换规则名称 - 根据自己需求对替换净化规则进行命名; +* 第二行:分组 - 净化规则的分组组别; +* 第三行:替换规则 - 填写需要被替换的内容; +* 第四行:替换为 - 填写想替换成的内容(如不填则默认表示删除第二行里填写的内容); +* 第五行:替换范围,选填书名或者源名 - 填写此替换净化规则需要对哪本书籍或者哪个书源生效(如不填则对所有书籍和书源生效)。 +* 注:如常规去除方法去除不掉,则需要勾选“使用正则表达式”,同时第二行里的替换规则也需要按照正则表达式来填写(正则表达式填写方法可自行百度学习)。 + +22.如何听书? +* 可以使用手机自带的朗读引擎,也可使用第三方如谷歌、小米等朗读引擎。 +* 【具体操作:安装-系统设置-其他高级设置-辅助功能-TTS输出-选择安装的朗读引擎(不同品牌手机的操作方法及步骤也不同,视情况而定)。】 + +23.如何设置屏幕方向、屏幕显示时长、显示/隐藏状态栏、显示/隐藏导航栏、音量键翻页、长按选择文本、点击总是翻下一页、自定义翻页案件? +* 阅读界面,设置(可上划,下面还有其他设置)。 + +24.搜索的时候感觉手机卡顿,如何解决? +* 我的 - 其他设置 - “更新和搜索线程数”调低。 + +25.更新前有什么注意事项? +* 要做好备份。 + +26.看书时如遇到“目录为空”、“加载失败”和长串英文等情况怎么办? +* 一般是书源问题,切换书源即可。 + +27.为什么书源这么多,发现里却只有一点点? +* 书源想要在发现界面里显示需要在书源里添加发现规则,并不是所有书源都有发现规则。 + +28.云备份在哪? +* 我的 - 备份与恢复 - WebDav设置。 + +29.如何操作进行云备份? +* 侧栏设置,WebDav设置; +* 正确填写WebDAV 服务器地址、WebDAV 账号、WebDAV 密码;(要获得这三项的信息,需要注册一个坚果云账号,如果直接在手机上注册,坚果云会让你下载app,过程比较麻烦,为了一步到位,最好是在电脑上打开这个注册链接:https://www.jianguoyun.com/d/signup;注册后,进入坚果云;点击右上角账户名处选择 “账户信息”,然后选择“安全选项”;在“安全选项” 中找到“第三方应用管理”,并选择“添加应用”,输入名称如“阅读”后,会生成密码,选择完成;其中https://dav.jianguoyun.com/dav/就是填入“WebDAV 服务器地址”的内容,“使用情况”后面的邮箱地址就是你的“WebDAV 账号”,点击显示密码后得到的密码就是你的“WebDAV 密码”。) +* 无需操作,APP默认每天自动云备份一次。 + +30.关于云备份的相关说明 +* 在正确设置好云备份的情况下,APP默认每天自动云备份一次,当日多次手动云备份会对当日的旧云备份文件进行覆盖,并不会覆盖之前及之后不同日期的备份文件,每天所自动云备份的文件会按照日期进行命名。 + +31.本地备份和云备份都能备份哪些东西? +* 书架、看书进度、搜索记录、书源、替换、APP设置等都会备份,基本涵盖所有内容。 + +32.出现某些未知bug怎么办? +* 清除软件数据试试看,不行再进行反馈。 \ No newline at end of file From 5d8df47bb46c5212275d166d650556dd37ba8046 Mon Sep 17 00:00:00 2001 From: kunfei Date: Sat, 14 Mar 2020 12:27:24 +0800 Subject: [PATCH 11/47] =?UTF-8?q?feat:=20=E4=BC=98=E5=8C=96=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/io/legado/app/ui/main/my/MyFragment.kt | 8 +++++--- .../io/legado/app/ui/widget/dialog/TextDialog.kt | 8 +++++++- app/src/main/res/menu/main_my.xml | 12 ------------ 3 files changed, 12 insertions(+), 16 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/main/my/MyFragment.kt b/app/src/main/java/io/legado/app/ui/main/my/MyFragment.kt index 7dcecaf11..f3087f5e7 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 @@ -24,6 +24,7 @@ import io.legado.app.ui.config.ConfigActivity import io.legado.app.ui.config.ConfigViewModel import io.legado.app.ui.filechooser.FileChooserDialog import io.legado.app.ui.replacerule.ReplaceRuleActivity +import io.legado.app.ui.widget.dialog.TextDialog import io.legado.app.ui.widget.prefs.NameListPreference import io.legado.app.ui.widget.prefs.PreferenceCategory import io.legado.app.ui.widget.prefs.SwitchPreference @@ -48,9 +49,10 @@ class MyFragment : BaseFragment(R.layout.fragment_my_config), FileChooserDialog. override fun onCompatOptionsItemSelected(item: MenuItem) { when (item.itemId) { - R.id.menu_help -> startActivity() - R.id.menu_backup -> BackupRestoreUi.backup(this) - R.id.menu_restore -> BackupRestoreUi.restore(this) + R.id.menu_help -> { + val text = String(requireContext().assets.open("help.md").readBytes()) + TextDialog.show(childFragmentManager, text, TextDialog.MD) + } } } diff --git a/app/src/main/java/io/legado/app/ui/widget/dialog/TextDialog.kt b/app/src/main/java/io/legado/app/ui/widget/dialog/TextDialog.kt index 648949abd..9c1c75d5e 100644 --- a/app/src/main/java/io/legado/app/ui/widget/dialog/TextDialog.kt +++ b/app/src/main/java/io/legado/app/ui/widget/dialog/TextDialog.kt @@ -77,10 +77,16 @@ class TextDialog : BaseDialogFragment() { time -= 1000 badge_view.setBadgeCount((time / 1000).toInt()) if (time <= 0) { - dialog?.setCancelable(true) + view.post { + dialog?.setCancelable(true) + } } } } + } else { + view.post { + dialog?.setCancelable(true) + } } } diff --git a/app/src/main/res/menu/main_my.xml b/app/src/main/res/menu/main_my.xml index db1161c28..74e555dff 100644 --- a/app/src/main/res/menu/main_my.xml +++ b/app/src/main/res/menu/main_my.xml @@ -10,16 +10,4 @@ app:showAsAction="always" tools:ignore="AlwaysShowAction" /> - - - - From bd24013c70e25b20d2add1b1b82aac1c84eaec6b Mon Sep 17 00:00:00 2001 From: kunfei Date: Sat, 14 Mar 2020 12:37:01 +0800 Subject: [PATCH 12/47] =?UTF-8?q?feat:=20=E4=BC=98=E5=8C=96=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/res/drawable/ic_bottom_books_e.xml | 23 ++++++++++++++----- .../main/res/drawable/ic_bottom_books_s.xml | 19 +++++++++++---- .../main/res/drawable/ic_bottom_explore.xml | 5 ++++ .../res/drawable/ic_bottom_explore_black.xml | 5 ---- .../drawable/ic_bottom_explore_black_e.xml | 5 ---- .../drawable/ic_bottom_explore_black_s.xml | 9 -------- .../main/res/drawable/ic_bottom_explore_e.xml | 12 ++++++++++ .../main/res/drawable/ic_bottom_explore_s.xml | 9 ++++++++ .../main/res/drawable/ic_bottom_person_e.xml | 15 ++++++++---- .../main/res/drawable/ic_bottom_person_s.xml | 21 ++++++++++++----- .../res/drawable/ic_bottom_rss_feed_e.xml | 21 ++++++++++++----- .../res/drawable/ic_bottom_rss_feed_s.xml | 11 ++++++--- app/src/main/res/menu/main_bnv.xml | 2 +- 13 files changed, 107 insertions(+), 50 deletions(-) create mode 100644 app/src/main/res/drawable/ic_bottom_explore.xml delete mode 100644 app/src/main/res/drawable/ic_bottom_explore_black.xml delete mode 100644 app/src/main/res/drawable/ic_bottom_explore_black_e.xml delete mode 100644 app/src/main/res/drawable/ic_bottom_explore_black_s.xml create mode 100644 app/src/main/res/drawable/ic_bottom_explore_e.xml create mode 100644 app/src/main/res/drawable/ic_bottom_explore_s.xml diff --git a/app/src/main/res/drawable/ic_bottom_books_e.xml b/app/src/main/res/drawable/ic_bottom_books_e.xml index ff159823a..b14222487 100644 --- a/app/src/main/res/drawable/ic_bottom_books_e.xml +++ b/app/src/main/res/drawable/ic_bottom_books_e.xml @@ -1,7 +1,18 @@ - - - - - + + + + + diff --git a/app/src/main/res/drawable/ic_bottom_books_s.xml b/app/src/main/res/drawable/ic_bottom_books_s.xml index eb36d0fa2..c2d369a30 100644 --- a/app/src/main/res/drawable/ic_bottom_books_s.xml +++ b/app/src/main/res/drawable/ic_bottom_books_s.xml @@ -1,6 +1,15 @@ - - - - + + + + diff --git a/app/src/main/res/drawable/ic_bottom_explore.xml b/app/src/main/res/drawable/ic_bottom_explore.xml new file mode 100644 index 000000000..439f69ba9 --- /dev/null +++ b/app/src/main/res/drawable/ic_bottom_explore.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_bottom_explore_black.xml b/app/src/main/res/drawable/ic_bottom_explore_black.xml deleted file mode 100644 index 32d8ef18c..000000000 --- a/app/src/main/res/drawable/ic_bottom_explore_black.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_bottom_explore_black_e.xml b/app/src/main/res/drawable/ic_bottom_explore_black_e.xml deleted file mode 100644 index fdbdedd39..000000000 --- a/app/src/main/res/drawable/ic_bottom_explore_black_e.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - diff --git a/app/src/main/res/drawable/ic_bottom_explore_black_s.xml b/app/src/main/res/drawable/ic_bottom_explore_black_s.xml deleted file mode 100644 index 1b7a47026..000000000 --- a/app/src/main/res/drawable/ic_bottom_explore_black_s.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/ic_bottom_explore_e.xml b/app/src/main/res/drawable/ic_bottom_explore_e.xml new file mode 100644 index 000000000..b29a19a72 --- /dev/null +++ b/app/src/main/res/drawable/ic_bottom_explore_e.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_bottom_explore_s.xml b/app/src/main/res/drawable/ic_bottom_explore_s.xml new file mode 100644 index 000000000..a72656e77 --- /dev/null +++ b/app/src/main/res/drawable/ic_bottom_explore_s.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_bottom_person_e.xml b/app/src/main/res/drawable/ic_bottom_person_e.xml index f2ee25675..82551bcef 100644 --- a/app/src/main/res/drawable/ic_bottom_person_e.xml +++ b/app/src/main/res/drawable/ic_bottom_person_e.xml @@ -1,5 +1,12 @@ - - - + + + diff --git a/app/src/main/res/drawable/ic_bottom_person_s.xml b/app/src/main/res/drawable/ic_bottom_person_s.xml index f0d729116..c11723b48 100644 --- a/app/src/main/res/drawable/ic_bottom_person_s.xml +++ b/app/src/main/res/drawable/ic_bottom_person_s.xml @@ -1,9 +1,18 @@ - - + - + + android:strokeColor="#00000000" + android:strokeWidth="1" /> diff --git a/app/src/main/res/drawable/ic_bottom_rss_feed_e.xml b/app/src/main/res/drawable/ic_bottom_rss_feed_e.xml index b69c2336d..f8e33c3d7 100644 --- a/app/src/main/res/drawable/ic_bottom_rss_feed_e.xml +++ b/app/src/main/res/drawable/ic_bottom_rss_feed_e.xml @@ -1,9 +1,18 @@ - - + - + + android:strokeColor="#00000000" + android:strokeWidth="1" /> diff --git a/app/src/main/res/drawable/ic_bottom_rss_feed_s.xml b/app/src/main/res/drawable/ic_bottom_rss_feed_s.xml index b14351098..d39f0fe7d 100644 --- a/app/src/main/res/drawable/ic_bottom_rss_feed_s.xml +++ b/app/src/main/res/drawable/ic_bottom_rss_feed_s.xml @@ -1,4 +1,9 @@ - - + + diff --git a/app/src/main/res/menu/main_bnv.xml b/app/src/main/res/menu/main_bnv.xml index a696febe9..15b355b31 100644 --- a/app/src/main/res/menu/main_bnv.xml +++ b/app/src/main/res/menu/main_bnv.xml @@ -9,7 +9,7 @@ android:title="@string/bookshelf"/> Date: Sat, 14 Mar 2020 13:28:57 +0800 Subject: [PATCH 13/47] =?UTF-8?q?feat:=20=E4=BC=98=E5=8C=96=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/res/drawable/ic_bottom_books_e.xml | 22 ++++++------- .../main/res/drawable/ic_bottom_books_s.xml | 31 ++++++++++++------- .../main/res/drawable/ic_bottom_explore_e.xml | 18 +++++------ .../main/res/drawable/ic_bottom_explore_s.xml | 19 +++++++----- .../main/res/drawable/ic_bottom_person_e.xml | 14 ++++----- .../main/res/drawable/ic_bottom_person_s.xml | 18 +++++------ .../res/drawable/ic_bottom_rss_feed_e.xml | 20 +++++------- .../res/drawable/ic_bottom_rss_feed_s.xml | 16 +++++++--- 8 files changed, 83 insertions(+), 75 deletions(-) diff --git a/app/src/main/res/drawable/ic_bottom_books_e.xml b/app/src/main/res/drawable/ic_bottom_books_e.xml index b14222487..d99a276ba 100644 --- a/app/src/main/res/drawable/ic_bottom_books_e.xml +++ b/app/src/main/res/drawable/ic_bottom_books_e.xml @@ -1,18 +1,18 @@ + android:viewportWidth="24" + android:viewportHeight="24"> + android:pathData="M18.8,21h-0.5c-1.2,0 -2.2,-1 -2.2,-2.2v-8.5c0,-1.2 1,-2.2 2.2,-2.2h0.5c1.2,0 2.2,1 2.2,2.2v8.5C21,20 20,21 18.8,21zM18.2,9.5c-0.4,0 -0.8,0.3 -0.8,0.8v8.5c0,0.4 0.3,0.8 0.8,0.8h0.5c0.4,0 0.8,-0.3 0.8,-0.8v-8.5c0,-0.4 -0.3,-0.8 -0.8,-0.8L18.2,9.5z" + android:fillColor="#2F45A6" /> + android:pathData="M12.2,21h-0.5c-1.2,0 -2.2,-1 -2.2,-2.2v-13.5c0,-1.2 1,-2.2 2.2,-2.2h0.5c1.2,0 2.2,1 2.2,2.2v13.5C14.5,20 13.5,21 12.2,21zM11.8,4.5c-0.4,0 -0.8,0.3 -0.8,0.8v13.5c0,0.4 0.3,0.8 0.8,0.8h0.5c0.4,0 0.8,-0.3 0.8,-0.8v-13.5c0,-0.4 -0.3,-0.8 -0.8,-0.8L11.8,4.5z" + android:fillColor="#2F45A6" /> + android:pathData="M5.8,21h-0.5c-1.2,0 -2.2,-1 -2.2,-2.2v-10.5c0,-1.2 1,-2.2 2.2,-2.2h0.5c1.2,0 2.2,1 2.2,2.2v10.5C8,20 7,21 5.8,21zM5.2,7.5c-0.4,0 -0.8,0.3 -0.8,0.8v10.5c0,0.4 0.3,0.8 0.8,0.8h0.5c0.4,0 0.8,-0.3 0.8,-0.8v-10.5c0,-0.4 -0.3,-0.8 -0.8,-0.8L5.2,7.5z" + android:fillColor="#2F45A6" /> + android:pathData="M11.5,16h1c0.3,0 0.5,0.2 0.5,0.5v0.5c0,0.3 -0.2,0.5 -0.5,0.5h-1c-0.3,0 -0.5,-0.2 -0.5,-0.5v-0.5C11,16.2 11.2,16 11.5,16z" + android:fillColor="#2F45A6" /> diff --git a/app/src/main/res/drawable/ic_bottom_books_s.xml b/app/src/main/res/drawable/ic_bottom_books_s.xml index c2d369a30..e42351298 100644 --- a/app/src/main/res/drawable/ic_bottom_books_s.xml +++ b/app/src/main/res/drawable/ic_bottom_books_s.xml @@ -1,15 +1,22 @@ - - - + android:viewportWidth="24" + android:viewportHeight="24"> + + + + diff --git a/app/src/main/res/drawable/ic_bottom_explore_e.xml b/app/src/main/res/drawable/ic_bottom_explore_e.xml index b29a19a72..13db8dc28 100644 --- a/app/src/main/res/drawable/ic_bottom_explore_e.xml +++ b/app/src/main/res/drawable/ic_bottom_explore_e.xml @@ -1,12 +1,12 @@ - - + android:viewportWidth="24" + android:viewportHeight="24"> + + diff --git a/app/src/main/res/drawable/ic_bottom_explore_s.xml b/app/src/main/res/drawable/ic_bottom_explore_s.xml index a72656e77..94a40b0f2 100644 --- a/app/src/main/res/drawable/ic_bottom_explore_s.xml +++ b/app/src/main/res/drawable/ic_bottom_explore_s.xml @@ -1,9 +1,14 @@ - + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + + diff --git a/app/src/main/res/drawable/ic_bottom_person_e.xml b/app/src/main/res/drawable/ic_bottom_person_e.xml index 82551bcef..2ddd441dc 100644 --- a/app/src/main/res/drawable/ic_bottom_person_e.xml +++ b/app/src/main/res/drawable/ic_bottom_person_e.xml @@ -1,12 +1,12 @@ + android:viewportWidth="24" + android:viewportHeight="24"> + android:pathData="M12,11c-2.2,0 -4,-1.8 -4,-4s1.8,-4 4,-4s4,1.8 4,4S14.2,11 12,11zM12,4.5c-1.4,0 -2.5,1.1 -2.5,2.5s1.1,2.5 2.5,2.5s2.5,-1.1 2.5,-2.5S13.4,4.5 12,4.5z" + android:fillColor="#959ECA" /> + android:pathData="M18.5,21h-13c-0.4,0 -0.8,-0.2 -1.1,-0.4C4.1,20.4 4,19.9 4,19.5V17c0,-1.1 0.4,-2.1 1.2,-2.8C5.9,13.4 6.9,13 8,13h8c1.1,0 2.1,0.4 2.8,1.2C19.6,15 20,16 20,17v2.5c0,0.4 -0.2,0.8 -0.4,1.1S18.9,21 18.5,21zM8,14.5c-0.7,0 -1.3,0.3 -1.8,0.7c-0.5,0.5 -0.7,1.1 -0.7,1.8v2.5h13V17c0,-0.7 -0.3,-1.3 -0.7,-1.8c-0.5,-0.5 -1.1,-0.7 -1.8,-0.7H8z" + android:fillColor="#959ECA" /> diff --git a/app/src/main/res/drawable/ic_bottom_person_s.xml b/app/src/main/res/drawable/ic_bottom_person_s.xml index c11723b48..d2a5d99d8 100644 --- a/app/src/main/res/drawable/ic_bottom_person_s.xml +++ b/app/src/main/res/drawable/ic_bottom_person_s.xml @@ -1,18 +1,14 @@ + android:viewportWidth="24" + android:viewportHeight="24"> + android:fillType="evenOdd" /> + android:fillType="evenOdd" /> diff --git a/app/src/main/res/drawable/ic_bottom_rss_feed_e.xml b/app/src/main/res/drawable/ic_bottom_rss_feed_e.xml index f8e33c3d7..db2282593 100644 --- a/app/src/main/res/drawable/ic_bottom_rss_feed_e.xml +++ b/app/src/main/res/drawable/ic_bottom_rss_feed_e.xml @@ -1,18 +1,12 @@ + android:viewportWidth="24" + android:viewportHeight="24"> + android:pathData="M18,3H6C4.9,3 4,3.9 4,5v15.1C4,20.6 4.4,21 4.9,21c0.1,0 0.2,0 0.3,0l5.7,-2.3c0.4,-0.1 0.7,-0.2 1.1,-0.2s0.8,0.1 1.1,0.2l5.7,2.3c0.1,0 0.2,0 0.3,0c0.5,0 0.9,-0.4 0.9,-0.9V5C20,3.9 19.1,3 18,3zM18.4,19.1l-4.7,-1.9l0,0l0,0c-0.5,-0.2 -1.1,-0.3 -1.6,-0.3s-1.1,0.1 -1.6,0.3l0,0l0,0l-4.7,1.9V5c0,-0.2 0.2,-0.4 0.4,-0.4h12c0.2,0 0.4,0.2 0.4,0.4V19.1z" + android:fillColor="#5A5F64" /> + android:pathData="M14.9,9.5h-2.2V7.2c0,-0.4 -0.4,-0.8 -0.8,-0.8c-0.4,0 -0.8,0.4 -0.8,0.8v2.3H9.1c-0.4,0 -0.8,0.4 -0.8,0.8c0,0.4 0.4,0.8 0.8,0.8h2.2v2.3c0,0.4 0.4,0.8 0.8,0.8c0.4,0 0.8,-0.4 0.8,-0.8v-2.3h2.2c0.4,0 0.8,-0.4 0.8,-0.8C15.7,9.9 15.4,9.5 14.9,9.5L14.9,9.5z" + android:fillColor="#5A5F64" /> diff --git a/app/src/main/res/drawable/ic_bottom_rss_feed_s.xml b/app/src/main/res/drawable/ic_bottom_rss_feed_s.xml index d39f0fe7d..5ad97a29d 100644 --- a/app/src/main/res/drawable/ic_bottom_rss_feed_s.xml +++ b/app/src/main/res/drawable/ic_bottom_rss_feed_s.xml @@ -1,9 +1,15 @@ + android:viewportWidth="24" + android:viewportHeight="24"> + android:pathData="M18,3H6C4.9,3 4,3.9 4,5v15.1C4,20.6 4.4,21 4.9,21c0.1,0 0.2,0 0.3,0l5.7,-2.3c0.4,-0.1 0.7,-0.2 1.1,-0.2s0.8,0.1 1.1,0.2l5.7,2.3c0.1,0 0.2,0 0.3,0c0.5,0 0.9,-0.4 0.9,-0.9V5C20,3.9 19.1,3 18,3z" + android:fillColor="#C8D0D9" /> + From 7e9bddcb1b1a32a2e85ad77f485da48c68c356aa Mon Sep 17 00:00:00 2001 From: kunfei Date: Sat, 14 Mar 2020 14:21:08 +0800 Subject: [PATCH 14/47] =?UTF-8?q?feat:=20=E4=BC=98=E5=8C=96=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/res/drawable/ic_bottom_books_s.xml | 8 ++------ app/src/main/res/drawable/ic_bottom_explore_s.xml | 6 +----- app/src/main/res/drawable/ic_bottom_rss_feed_e.xml | 2 +- app/src/main/res/drawable/ic_bottom_rss_feed_s.xml | 12 +++--------- 4 files changed, 7 insertions(+), 21 deletions(-) diff --git a/app/src/main/res/drawable/ic_bottom_books_s.xml b/app/src/main/res/drawable/ic_bottom_books_s.xml index e42351298..7ab340659 100644 --- a/app/src/main/res/drawable/ic_bottom_books_s.xml +++ b/app/src/main/res/drawable/ic_bottom_books_s.xml @@ -7,16 +7,12 @@ android:pathData="M17.5,8h2C20.3,8 21,8.7 21,9.5v10c0,0.8 -0.7,1.5 -1.5,1.5h-2c-0.8,0 -1.5,-0.7 -1.5,-1.5v-10C16,8.7 16.7,8 17.5,8z" android:fillColor="#C8D0D9" android:fillType="evenOdd" /> - diff --git a/app/src/main/res/drawable/ic_bottom_explore_s.xml b/app/src/main/res/drawable/ic_bottom_explore_s.xml index 94a40b0f2..df805a464 100644 --- a/app/src/main/res/drawable/ic_bottom_explore_s.xml +++ b/app/src/main/res/drawable/ic_bottom_explore_s.xml @@ -4,11 +4,7 @@ android:viewportWidth="24" android:viewportHeight="24"> - diff --git a/app/src/main/res/drawable/ic_bottom_rss_feed_e.xml b/app/src/main/res/drawable/ic_bottom_rss_feed_e.xml index db2282593..fb5bf8ae8 100644 --- a/app/src/main/res/drawable/ic_bottom_rss_feed_e.xml +++ b/app/src/main/res/drawable/ic_bottom_rss_feed_e.xml @@ -9,4 +9,4 @@ - + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_bottom_rss_feed_s.xml b/app/src/main/res/drawable/ic_bottom_rss_feed_s.xml index 5ad97a29d..4105b0154 100644 --- a/app/src/main/res/drawable/ic_bottom_rss_feed_s.xml +++ b/app/src/main/res/drawable/ic_bottom_rss_feed_s.xml @@ -3,13 +3,7 @@ android:height="24dp" android:viewportWidth="24" android:viewportHeight="24"> - - + From 00b10ad14f85d572935dcc88b2b7d55bbc1d424f Mon Sep 17 00:00:00 2001 From: kunfei Date: Sat, 14 Mar 2020 16:25:56 +0800 Subject: [PATCH 15/47] =?UTF-8?q?feat:=20=E4=BC=98=E5=8C=96=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 10 +++++++++- gradle.properties | 2 +- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index 5eb9c16b8..4769ff4a0 100644 --- a/build.gradle +++ b/build.gradle @@ -1,7 +1,7 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { - ext.kotlin_version = '1.3.61' + ext.kotlin_version = '1.3.70' repositories { google() jcenter() @@ -30,3 +30,11 @@ allprojects { task clean(type: Delete) { delete rootProject.buildDir } + +gradle.taskGraph.whenReady { + tasks.each { task -> + if (task.name.contains("crashlyticsUploadDeobsRelease")) { + task.enabled = false + } + } +} \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index 23339e0df..667087ef0 100644 --- a/gradle.properties +++ b/gradle.properties @@ -6,7 +6,7 @@ # http://www.gradle.org/docs/current/userguide/build_environment.html # Specifies the JVM arguments used for the daemon process. # The setting is particularly useful for tweaking memory settings. -org.gradle.jvmargs=-Xmx1536m +org.gradle.jvmargs=-Xmx2048m # When configured, Gradle will run in incubating parallel mode. # This option should only be used with decoupled projects. More details, visit # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects From 05997f46f206b7d4e90240f1a4a25db22b5f46a6 Mon Sep 17 00:00:00 2001 From: kunfei Date: Sat, 14 Mar 2020 16:36:23 +0800 Subject: [PATCH 16/47] =?UTF-8?q?feat:=20=E4=BC=98=E5=8C=96=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/res/values/strings.xml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 63efa5aee..5adc6647e 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -207,14 +207,14 @@ 替换规则为空或者不满足正则表达式要求 选择操作 全选 - 全选(%d/%d) - 取消(%d/%d) + 全选(%1$d/%2$d) + 取消(%1$d/%2$d) 深色模式 启动页 开始下载 取消下载 暂无任务 - 已下载 %d/%d + 已下载 %1$d/%2$d 导入选择书籍 更新和搜索线程数,太多会卡顿 切换图标 @@ -289,7 +289,7 @@ 右边距 校验书源 校验所选 - 进度 %d/%d + 进度 %1$d/%2$d 请安装并选择中文TTS! TTS初始化失败! 简繁转换 @@ -599,7 +599,7 @@ 夜间模式跟随系统 上级 在线朗读音色 - (%d/%d) + (%1$d/%2$d) 显示订阅 服务已停止 正在启动服务\n具体信息查看通知栏 From 4220451e3306d03afac865bbdd37bf29ba415269 Mon Sep 17 00:00:00 2001 From: kunfei Date: Sat, 14 Mar 2020 17:05:16 +0800 Subject: [PATCH 17/47] =?UTF-8?q?feat:=20=E4=BC=98=E5=8C=96=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/res/values/strings.xml | 2 +- build.gradle | 8 -------- 2 files changed, 1 insertion(+), 9 deletions(-) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 5adc6647e..a505fa785 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -81,7 +81,7 @@ 重试 Web 服务 web编辑书源 - http://%s:%d + http://%1$s:%2$d 离线下载 离线下载 下载选择的章节到本地 diff --git a/build.gradle b/build.gradle index 4769ff4a0..839736b35 100644 --- a/build.gradle +++ b/build.gradle @@ -29,12 +29,4 @@ allprojects { task clean(type: Delete) { delete rootProject.buildDir -} - -gradle.taskGraph.whenReady { - tasks.each { task -> - if (task.name.contains("crashlyticsUploadDeobsRelease")) { - task.enabled = false - } - } } \ No newline at end of file From f265b133f2b95e9de0a3453d5e23257066235466 Mon Sep 17 00:00:00 2001 From: kunfei Date: Sat, 14 Mar 2020 22:22:38 +0800 Subject: [PATCH 18/47] =?UTF-8?q?feat:=20=E4=BC=98=E5=8C=96=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/AndroidManifest.xml | 14 ++++++++++++++ .../legado/app/ui/welcome/WelcomeActivity.kt | 3 ++- .../{ic_launcher_0.xml => ic_launcher_4.xml} | 0 .../main/res/drawable/ic_bottom_rss_feed_e.xml | 6 +++--- app/src/main/res/drawable/ic_launch.xml | 14 -------------- app/src/main/res/drawable/ic_launcher.xml | 18 ++++++++++++++++++ .../main/res/mipmap-anydpi-v26/ic_launcher.xml | 2 +- .../main/res/mipmap-anydpi-v26/launcher4.xml | 5 +++++ 8 files changed, 43 insertions(+), 19 deletions(-) rename app/src/main/res/drawable-v24/{ic_launcher_0.xml => ic_launcher_4.xml} (100%) delete mode 100644 app/src/main/res/drawable/ic_launch.xml create mode 100644 app/src/main/res/drawable/ic_launcher.xml create mode 100644 app/src/main/res/mipmap-anydpi-v26/launcher4.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index a1b9f1846..8b943cc65 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -79,6 +79,20 @@ android:resource="@xml/shortcuts" android:launchMode="singleTask" /> + + + + + + + + - \ No newline at end of file + diff --git a/app/src/main/res/drawable/ic_launch.xml b/app/src/main/res/drawable/ic_launch.xml deleted file mode 100644 index 6b423cdc7..000000000 --- a/app/src/main/res/drawable/ic_launch.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_launcher.xml b/app/src/main/res/drawable/ic_launcher.xml new file mode 100644 index 000000000..1bb711f8f --- /dev/null +++ b/app/src/main/res/drawable/ic_launcher.xml @@ -0,0 +1,18 @@ + + + + + + diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml index e8409cf31..7f9b677b9 100644 --- a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -1,5 +1,5 @@ - + \ No newline at end of file diff --git a/app/src/main/res/mipmap-anydpi-v26/launcher4.xml b/app/src/main/res/mipmap-anydpi-v26/launcher4.xml new file mode 100644 index 000000000..22463230c --- /dev/null +++ b/app/src/main/res/mipmap-anydpi-v26/launcher4.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file From d63b264f2f981281a732c18102c78488e60adee3 Mon Sep 17 00:00:00 2001 From: kunfei Date: Sat, 14 Mar 2020 22:34:55 +0800 Subject: [PATCH 19/47] =?UTF-8?q?feat:=20=E4=BC=98=E5=8C=96=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/res/mipmap-hdpi/ic_launcher.png | Bin 3587 -> 1915 bytes app/src/main/res/mipmap-mdpi/ic_launcher.png | Bin 1957 -> 1175 bytes app/src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 5435 -> 2585 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 10087 -> 4139 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 15918 -> 5618 bytes 5 files changed, 0 insertions(+), 0 deletions(-) diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.png b/app/src/main/res/mipmap-hdpi/ic_launcher.png index a7e087bc8b52c9eeeefb6e6a96cfeda3778d9904..36cd968b59b1f99d6498131ef1c120c8d415efbe 100644 GIT binary patch delta 1787 zcma)7X*3&%7LKKfHkc3G*Lq$t%jpZSR4y~HL{G9X7`|-~C&bjxV@1Fae@7^CbP3cfNKY?hV4geUa zi^SJj#{vKVPz=`90kkY8Ee*HGZak(1006zQ_BPk!d7D%}m+Qf&Q)t`N60@EW70)yN zIT4PEKV_$4L^dLI*PmjbVU<_QqT9(}lV3B6|E)#P5I2ZnA{jj@=8EmeNFE1I41+itdavM56=A_aV4D8(9j` z$x=olUv}m`xVu;gDj|!!$srw^Yp;zy(lE|_O(bYsimfWAJ5P*Qoq92s8dc1UhTjLp zUy|5SR$#t!MxfQ||8OZ1Ln@o<)^-gQOswvY^@Y9l4isGh1O(~~I0s62UGRs*d#Izh zSEHZZ77?&62FlX2-aH@;OZv!^J+XEEqAs}BcebQ1J-rac*?ky=Ub~}XcB^W+xI(<- zA0Ym-`0t!>ig-dooSn{IpcgYjyjym5lqG@WYXO}zb(s~VmascVUo%%Z@VIb+SZa&=deXf2SIPg>8d!>C}0 zDv;v*8&EX~!b0lJ_VqW*bno>=X5!umEHN%2pL!Bp?=o(W@=pyQue)&C*4{Juill^o z{0#$Gk%6D>^pDZe(K>p1oX}q`>K}d_5_?NEWB<|Q)jqqq%;$H8&vXP&P0Y+-!@|z8 z*=#^FzW?hNnV7$4%fwUt=e(&B7$T8qy|S|Mo|RO#w-=LWr5wzCR?B3T93Ac#pX zATe>nj=Lq1$$cA3oSCph!IrH2fH?@EX%V-@K}zPHv3Sg008~^~KC;UsO1DSNTZM*( zN&wTYdwNpJ%ijojq-5G%)3I!*Hodh~8;yQaRi)-evvL(md3bop!C>l~0q>Mr!d_^%{Ua<1=awB8o#k;1fTU$ZfbNyZ2-R@Ve3{JJ+M4rd* zsO@jh*EcqvU?Ty=q9$OM&waJM-B8Z*Hz> zZznf5>+xo1XSzb5c6N4SWhQxLCQ-Qt`$ooPQV7i+hVV9nEx7Ig29ZD@JOGOx#9RUv z^==7TTUj6#OUv@YLb-5bMaNvF%ID7&{H7BQ1gfAP;2I_-uuQg1WTZh_TAGq|a^l#x z4dPVG(!Uzq-#@>nuA98|-s}RLn;!A1h7{0{15JqA4Ey#u3OEir7qFO=M3a;rKW$ zN?{?V6dks@x%qN4c5-r(-RRLoZ)&==@Io7kt)Il=@o;z^sC(Ac(GhfXbfkBaMctTg z?eu2@h2}FdGUEI3!j0bT{UDxZ^J~QHWje=EtJ$RLjYn6!5u z`8DZ6A2L-7{Q1JLxaR*2l2b46rD284+U?3LS8w&-SM6lVtVm8UIfrl_T1`JduKnI| zMD58{5qxeOdh+LogJ*e8_baVm^_GSV-%N*CgHy=FPqsJ3%yt-|rQ^o}kE`~bPJt}S z2vo^a$n)j?gaXJ5@Z~o(j^>6ZQJtDnVjCHdB4tojB>JMcVgIp2*tYW$1}4C%a*8g4 zXiS*mT3?s!0hBC%&d_{6<+R!~b@cmTwL%ycu@e3JZ{|9hC%`Wn8Rbh;mDlHf_^C#t^Z9gTvf*j2LrGUZuSgYLh642c-lXs delta 3445 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 diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher.png b/app/src/main/res/mipmap-mdpi/ic_launcher.png index f0e9ad5329c790de56e6f8ade8969a49496faf4b..c6f78616ed71f2bd73bd3c65c951e52669132db7 100644 GIT binary patch literal 1175 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-sEa{HEjtmSN`?>!lvI6-E$sR$z z3=CCj3=9n|3=F@3LJcn%7)pT}UnMXwSj}Ky5HFasE6|34f$>>@Plzi}!GHRKnM*Ef z*e|y5U1j36!rW)&o%sEStdSqnex^?UR{P_cv3JMAe3kzGeY#C4&P|MB(4^vC` z_Rc&96rVC>%C~RdX3m_cp`ig({OHjmM@PpiSFSvG@E{~4WX_y9?(XhDHE-U$`TY6w z(xpowCV0kdoH+Nw^XJckgM)i}d#$Xj_U_%=*w}dS;zctvGoT?ry^9tt0xDj*{^r$N zZ++r7J$(4U-rnBU)^^gQNo&@uIdI@WO-;@H`}cwBfeubiPM$Gi2GF|ci!Lo)cOxoi z$AM!{TwGjMu3Y)_=~E*kqpx4TUb=J%Xzbs=e}P&I4GqtpJ^Sw6J0N5J{Q0w&URkm6 z*25>C97ETA`t&I&DG4a<<>htl+O_T5w*xKJ*VmsmZ5q&P4kBpc5C{P*i(>o=LQ zxr{Pi&UyEM8W@wj-CY$)`=)TQj7r}F(Up_mEPnsy(0YI6@BoE}_t|4!{sGqEk( z7Vcdv9DDc6(&gLx&;4W6Gw4{D*wfS3o19dXHEZ9QGv_W^?mxgNHof7g=$dtjwaLZV z)$BKp-m~N5>$f=Yk+Yzx?Q{3()!7f8eS7zhvETo^{`&m=Ukk-PEN_(7-jMqGb;k_e z7oD=w1?t~|rtNE2SM<|4;GoYqb58yJ(-~G~BI~^7{g&vN|Gmd+?ZtmruD!gw*Y|Gu zu^EY#^(+C~fdQ{m6%tXBl30>zm0Xkxq!<_~ZW$XH7+o+mxMpg?X=t>`$c#ZLmzi6e pnVG@iH!GWRd~hF%zTEtj%(O~^`V@t=4+8Zuc)I$ztaD0e0s!9BQHcNm delta 1871 zcmV-V2e9~;38fE^83+ad00374`G=7qK7RlPVoOIv00000008+zyMF)x010qNS#tmY z4#NNd4#NS*Z>VGd000McNliruu7D6p}zp=HRd#+ku%fsD*dj4sh+amFQ@nYfr`$;@>AGyl+NVt-~# z9Gi>4=A?;18<{Lvx8iU>DTS6^Xm5YqTiV{<-|u^le-s$C-rn0wu@HIwxVd@X=e+0p zIX|A~oJT076t}TyD=pv-z)B0a1F+Hp{_g=S%lkP+&)_5<4o-0{m|#4TCY_cDA+g(Z zs)`)=S2?-Av4oat&$9F=mLm^@B7aGKcQioPsmsJt3Y0<#9bKf*0D(X%fq?*}fiNj^ zTlma96+GVV!)eu51|VUi`So7{ymLH+QUbR_qrJ(?J$HFo=X0~F*nQ2{kT4vc;bb7n z@e4EboS!CXfK8V?vCYSx_G*Oe}92&wf6%XHA&eNZ7$ZPZfW>W?)ALyfJAdbr} zdGSjvtXabTSTex7y&+!y!vGcm-`-Krr&}xY68@j|+R*^}{uab()A-4k*V0f~u>1hM z!&7{3Umv=J7anh7V|~f8h=0FoohL^5S?2{jP76Q(#zu-=wybS(p7*qA^3s6;3`6kD zBdeEPJixN~Yr`KRnoX<>}(%n=`;`M=vrFG3aRZvVC3ovWvfJPj)oWRORGU zAj*-`Az<;KkQ2aUG|7R#kK%PnzO}=@BtiLvxbN)rW6>?V+BKBbH-9I9citZ%Z7Ozu zq6WL3d-7IDvISL%T=1-}%uRcvhp`!h_xdIlZJ(2x!zaSnba?bWUrxfqvk6|@-_OPI z7_GI1JiDtAw{8B09GQ&q(p&um!!g#cF5(BfTF|e{A$zt~@$Q++9O@Zm>zd3y; zvXJT$JEw-@7^ay&z{v}9DStz4ZgCl4crt}m7wDRXMbj9YN-ppjn@*wY0!YfOdGfOjIg1DQ>UKYMWrds^nqhOJm-gm`YxtWF z`KhmPaxR!)+nOTU{0jl9i)~0D8Jo@n;PAi3Id(QoU73sawIwuH7G@PblQ22dGs2~C zoF}%`(b2m2tbgs?R1KRlzjxc`ZK(cpQQUH&n1=Q#sYe zAMb~xk)pf*GKW8$;G@9o+@e(Q!TBlPcxE#~J9VYKSi&fn(&V{) zy__G5v!%(!p7y$&+GS30n!=D^(dWw$aIJVHu7CYp4-SSjC@r+&u;q4pn~21D{>?KC zj;GmBTfp;=wdM?-aR$Eog+_{8I?=@3k=HO4N`bBk#;4-|OvMZYAeF>0B(anvm6p_( zI{5ys-0sc?yGMBH7pEByiNGbsSG} ztGK zK+!XBnbGMqv1AI15EMA9_(~nrmOCl1XD=D9Fu?!LZn;c+2jF(II{+(fw>`kW0i*Vj z-HhWD^#A|>E|VVw9AGdEF*33;Ftsu<&^EBJGB5xDK+^>UtKJAB0000kdQ@0+WMOn= zI&E)cX=Zr<0C?InGB7gGH89pSFbpv=vNABWGBMCLu&^>P002PK1qFiPpsN4?002ov JPDHLkV1mJbn4SOt diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/app/src/main/res/mipmap-xhdpi/ic_launcher.png index 371e045cdeff6018a3152f988c2578f02a165c17..df3591554e282985e7fe9f808e846045eccb9621 100644 GIT binary patch delta 2435 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 delta 5355 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
  • &kU)zOOTAIk}3DxZv%)fzU{=NK=*DgwgF%eflDijhY6zA-P57 z`Nga}q0GlAk*XC%!r~q@t|p?RJe?=C9Ff8|Onw?9R8*zkohrL(@|dtYEG0nws16_C z0;Lr+wj~PBb{O=cbX~n;i|cEfAVavt_(>2o3qM=El(OFyk(W?kUJ(RfV!iX9IE*fX zf~t#t8L7)UlxknOygq_ew?}<_>iEY+Cjr-UOPKSaw+xCXHQ>EhXcrD&;@o^9IcJVZ z#<#CrOB**yLu1@Mzi9lkj$a)jNty!uzG!*lniwifl)OY&YGg7mM}u{}fA)(w+{V+F z@#7t{MD+YnX?7E=PVJ78o$}%$Nx{WNyjtRqKcV4;=jMGrq%-{U(Vd*_Ta9kUEvmDzmjL^G#4dqoW_Nr@-*_ z>rTEAi^c z$f^!Q=}hakLmTt^3fhW$eOE4(Ox|R)|MFp7n(t$?G(&mV)PF@T?uPT1aLD`Z&c5hM zmCl;=_bkwo%u@M=pQ2&CstpnVT!+%X9EL4Jg31iG0>q1HT^5r!yV=a%`8p02qDF6Y zswO8-4R+UeO+Y27e^6aj%aFBc_w=&-B0AVKVQIKbq?`z{cnYl%|PS zV&fIvA5)du45zr4P#uYY%Ej;?KQS>k7ye)_D+*pScj5Zo!?cfE*M;u^Gnjpr{$9qk zKw$W(g!Je2#z!kV6F7#8YLzeGCZqIqNuHIRl&Hlr+P{re_m}i~I+$G{mbYU4gm@AI z{~!M0;s3jzPdEoX`|n;9_J^B#zq0YRm$vh?|8GE`q)K8^YbcqBXssx;K~!WyvbtIn z3IZui-Mfdu5^?@7=dIf-X9qtJ2)Q683KgA@fX+z#-)6{aF6KWIq^YW>QmJGe@;?OY BIcWd@ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png index feff4e9652acbf679c2896e7d767c23a27bee193..ebc3324f78cb3c1e19f0802cc53f299808b64467 100644 GIT binary patch literal 4139 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 literal 10087 zcmb_?RZtvEur5J@ySux~;_edMmOzlj-2;mT&EgW=-8D#p2Y1clzUYrFmf+-Y9`D<& zx_7F2zM7uts_w3u>gk@2(a}=D#-PAJKtRA&Q&rS^!{q-ZwD)iGkuvP(8z9@uY04oW zG$&y`TcNzI>8w@tG!YO2SP&4tL?R$OzOlX>BOv(lAt0PsA|QxoAs~=?7}XQ;-Mv0WfQg5d`}HMz7WzDQ*b=tMcds@DP}9)}(7KfUm! zdegg*#;TeHWy(T)yGq`ogq{T9u(cI}HDo7i4F|%i1ny$ZBH{MP{~yef{N68{@!AuA ziBs}>yFZ1^iiJtiJuFAVYf31j4Y5PnV(B0V3=j^6@bOUJ7c}gJ%{a@#+tsZh18KL8*r+j- zcO}n%;#pWWEa@^RtIV4-iG?8RB&jwTrCK0iRAK)kMA5au4J5d3GO~4eU8GCikrNbP zs4$`ysWkd2**kE)%6w>?o?i1k^&^L`$_c&xJ1XU+uPTd-uv`_QUkpTq3LOsYOwl0S zm1SE|z}n+la+f2Y{5??0&Lzh=n#qn>yIIkN3LGOqjm^KXpZyd6Pd z2c5+Q@-?w49%wPzDI0Dm>$Z5r$5N1iOI-E|(5LP5K-(ik?Hr zlLTxw2C^cLoPJL{VM3~xDMWbO4YY*Aln|kEE0^%YU-j7egQ*>#_Mz z0dq3yK-msL#9cT9=J{d9KJUdL$NR_9{qYjwq_2i@p0;?HP{}TRoP1gMmAV~vuN+G0 z>2J%|FG|co=$aDcHOQqzTt;?SB{T}rx=FG7#vD~>%zv={W{7t7{c2I^@;^D|Q!0hn zRmEI_96o$TERz1A*F_kZA-n6!YQci;JDp{rztt@?%R8gV-BHjxIP zV*mxH@Uzt}3Gnq<2~?QKjRagGT(Bpcq;t)QBA2QyqJtV`L}+VWGCk~RgH@FDvAVhR2tuid@G?& zI*nkXB>@(ajI11s-MOr%D;MiHkX`gA4=^LZeHXIECRIz(jRQN>-YE((UDD zCXRQ}j|h1tpa5Su#1HGRf&MC_>S$jW7k4$ca@5HFWVM7a-;KBU^ zcJ=)E3&bZ>bt)raUFEiG1%?ZS?GlfD)HrPpQO5wlA}Xl#`^2@Nz~6ez3<vf68AJgyD}+|BY1 zH~iD9A24e0v+?6?fWD#x$l57stcf^RquSVBCpx(NG}bGIwcp=NYn+&7o(+B8l?d`! zPkH>=tVZmHI2^~k#G&#PWFGv=R;fIR<*WR#W$2+0q2YS%3q(Vfyma2ag!2uHA#kvN z;4ywUSXDEZkr@t$(+z?ED3V$r#VA$5_nkY=+BnzsM^q8923)UQH2j$xw*Oo!^2Ll`>b?gzkNr zgrNu9Z)b8D@F|PCInc%qpfDWHimOZ^aOJaV*!u{Td);4sxy{6|DkWK+H{C2pzP335 zpI%di-rP8E026gJbMdWEx`%w$DJ*0Je;F5U%&Pjm_%yK)u(gIl~!&sUZlJY)XAD9PQ#2=WP}1mDQ3a`Ar;g3btko`+UC4$p3W4U;UfbmjAc^n%;ouYt7N4e10GJ{Qa^Wv39hox-$L{ z!8(OKj_)pD75((Q1 zvKLWAh;sN`#{H2yH{eu*t2H3ISz|a@R zGXt3+rZv2y38Iid?}UH1r8iUc?B*!U82o-$XQ!9X2gXTP3yd#JFxmE5p0il?x}1LJ zBNoxXHu(xA2Dq&CFFe!P@j?m_ddWo9&pD; zOY}KXmflcYLVNxM%s28VhwHF+`Os|b}tckT9 z{2$+J;Y9`8mkiJMT*Ngwmp8bF_m$h`%zyA7KHi1}DoDuFDU7kyfpr;qA>y8@ z+Xk12pOg-q?W4u`Eg?1%%fwy8;rQk210u6n9w5;X*!8S@o`YBd_O_jK;RS?f^CGd8dtd`E-zW~sR(rtd+*P0N&Flo0NhY6`4^=CCXo zDZwF2<9AF0Zq7E=q_Bp8WH#Y$50_+P?Ib)?ZI*r~&SdcJH0NYIuNafIH#qq}S_uU@ zVjk`KtJx!#OCUyXY!x#ACANLS&s=n@IJjq8Bj`B)@F|K6Hg?sPIU*`xP*(JQ9$5wP zm-?rN?Y^I5PAuTvu=TYE>38eubc;IgTXYOxuZ&4eyqLSg7ljn9)WEO%e7yO`gIUUA z(*Yccl<(*bvKFlLU(e#Ku~;k(=Okau4Z-du1E!frB4;g9WM^aF9?rksY-H6ERx5@{Fa`p9ys+H&L z(pp-2nxgGrilLuO)!TOey+ED>$U&p94Jh^1^?I*v(NLcz!Rey4QPwjU!P)iVs5ux*6c1}u?`r& znfdAsg{wcDz=;Y%ebVI36|}rnz=68j)RTZ&C+bTO~ymo`2+`vd0LG6OmF z%1arFV`dCKiGyK4k)#WFaTi%s4>P)v;k{3Zh!R~8+m8nDPvMrSF5{yPVRI{xTfzs) zVB5(nq?bI3)4f~O7%!?=bVFgnAwEUr2N)sa^W!t}jbkcjRoHKc$n5t1x`n7JI_^kQ z%;c6(yW_USn5zHjvu~bqWSOCyp=#C5@MyFe7UhLgR|TK;VHB<#_YJPQ+0pYk#UGd8 zfOMtVgKVX(Uh&zRxBL9Kfgc^{V$SR&?8qLWP|E?u3kkjwmU-FaZkT5GCFO81wDe*> zh*e#xhv57j<^Ug5LFNm*gBJ|~ec#B56dix**;>k8~ z7JJ#^NBZ!z?Dida2k`@cacdbQoygwq>>k^GJ)@x2L!R;gerbp88N*N7{ip zN!}d^&duMUFoXNcL#*ndVuQO<;M8##VeU&^D4x6_dbjst9Q8NnuS*_GUA1LD3Yl?&|)xu zowO#rEqZ2Vp<>qBgQ$*g&T!~4O@g){=#1(#5JaAT00Hs$!UH*32VTQ?J}Atv7#rj^ ziW;5duDh>4zqlgNNGwcNr$AH@!^DSgZh_hQs1kTr5+&~(;yqxNtobO#JZeBc4x%PcTkr zjJ4s$tNJCS0dZDpVf0_1dv?zGFDF+8v-j~(G^5`PH0tdmnT2A?HVQ!|6q9i6FHYgA z6Dtm^qtO_7UFlI=asu&X^fOt`?_z%V^NTWKWu)6{Uz9p*2FtJ@Vg2z1Wx4ARDOE4( zXVj9Lm)r85x8sdLylk4rjx&?=HKeFf=mmPCDANj2)QuT}UYd1TSTpY}J7Z%vQbNr$ z(d-%GDb)4$;*zkhpu1Zv2bvAKJ><6;k??N5kz1KO`}PbSk>T#Y+?c)T(Hz9J@*mRO zgLj#d&fxOW3J?XIzu0N~sk>#(MYvCwEpY$=cr$m&oG=OjAzrbiU}v1Vi+ugJ)JU-a zm2Nt@y4@9>n7-FNR`7p7(ofWC7p)DfcIh5e|3&o$fzxC{9pihM&ca`lvvMulUmW zk8b`EY4XV_su*%XxBQu*(eD#$J2EOMw$;>Y_|a+7pPTD(xeOzHfg^U7j0QbLhFAw| zKFfZT<=71Od~(}!A+9M+ z3sVZ!4S_HUU*{4Xzv%QF>*h}68lbfrgN8APZ75^x?H!TjnrVT4uz;gI^l`J z9K(l+KbV?7#ZWz^5=wb8yPQzI1K66obH?1Wr3f!nH-;UbU{W9?G`pZ1@FPa8FytI8 zQ~5CbhPJiNcuXQYL1yZqRDE6Ff1PF;|MU!`$rN!oJ^yciPL}oS9WxabTT^4DtVMOx z`N?Tb^y*^TX^VHaOz%kgIN*?U*#ks=e!f$#g6e;$%KIs5j!Q}DVr*E~G3EPhbcnV3 z?UxUpO?OdD%2fy~HZq8gQm)mb9e>`knre2_h11F4SF|%$$Dp?}`M;xS&NSEbMj8H`Mj{dEDWmMzz>eX15rx=f zJ06P-)f*+q-jcH0N6RqeqxA9vEaraQe=8nU?|tt_Hcap2dz?(F{2M-O?~gWG98F!x z6-aIk&lfW=2HVCa7{rcD*zcv9D9AL@osw{ApIBJ|Y(do{!!ZSftHhRCT z-w){M=t2zn^3mv1*fMX!YdS5;DJa6Z;;#((ErI`Q=F#pkI3 zsx5P(KQh>BeP^E+C}_22yj=qlP6>$*jj+vKbVSpW=ahS4ok!gJj83`@GmF{gb)F7I z-Qz*~n-Dxa&EN6SW?*v_#Z<+vcv;PRyG)q&iyA)|p_v~bVUSi{_iN(k!Qi-IXDnwL zX0(@XOu`^V(}F`ilPGRBg;Taw`32DI3i|0Hivk7SOaYKM{#9uYBZsTTRN3a7A}G=E!SMFg%?j+PN8ZN=K{aMYVr-pC$?i%^pihFXd^a?h=u3?4G_h(938J z_M|*{YZ=OavCw2xa6EE?w#UXA8=d&hB})3PBjF!}w;B}rxF>2+7NQOF0gPF_!QI>z zVKD)ZU6Vt0Nrtwq&C_^R0dCky*!agmyh=KcogmoPZA1XcTyOP`8xvGC=HgYkRRSA# zimMKmiz8Gd&)Bt10Yz0szs*Ahl(@b1%ho5nsOJMj2gUsu+ z+$7d`9 z$x5(UiHVz);lX!Br;!wr@$#}h6{Vsabwr_&ona7ZU<|E?In+0MPH ziuo=*x2xj{%bWrNl7ZmlDSWdCR%&+225}|vkPN)0<1cRLW4~S<@cz*}N`KNJka;z8 zuxjZ`VFEcJKl{QuA`W5JCUEo2nP|XbYWEDSlGx2Wa&JldjQ2oMjqb=_l31yoBmgBp zdVtj@<+q`?e%%EOS08NLGmtiDrd0QW_A^58d%ncbl|UHc7>Fi|VA6 ztB+99eh}=@K_OPeey_kZ5R>ATcz!zU@;&x%OOa-gRE*A5uG7#1rAGJ5E(1GtF^4*J ziM)OD2xb!YZ*sssgcfT}e}yLUFujKuS0><;B<@c)YJHjLyV3z`Yg;W^E^EVIlA%6KU*qsPfQvDd;i^Fn&nm>0Wx@kc%rumg5b4D`iVmOhEl)QQr`{=&UG_)>di{J zhlmb3lV*BS(8D|xA!tgv1yb{)9$zidW^N*gE}cw^q!5xK+x1T_&42PW4`^={*wk#{ zV=x=u#HOYVB3(}GJ+U1QocA7dS@@N>hJ6w?qD_LIeqoRd!b6k-&|jM3kLr=Y#Pn#BQ^;hTuTmSEcm~M{Hpt;M77Ip^?{s9aniFu(h$!Mou5|R)AyBr_V@Gf5w#Y! zTSlTd)H=^RD&Zh_ob|1rGQ>`EHTPUr1FZ~~Jn*x*9{urye;XHcClju96CvW(bTX-! z3WAmb83dF&1$zIS;U{AIqFAV05ViZyIlK##XYk9g)g*4L|NWmE;O;!K66mmx4bMa7 zM-y}|D9p>>`PVC<0pJ7;?M`*-_^UYu9Ssvo1_wdH(GMgzH08QnCMIKg%4Hr69 z6#3asxXJN1+b8bK#YZ^b3Ma8kFL~z`L6~SZd?O3`!XLOy^P1TLTP-yrt)BvpFW5ls znxE8jxSM3FZ9QDaueL+3rAb*h%9u0@S@-YRf}_%8z=sHLF0CLt+TJdvcSa8r$3$mU zi8CX&DBXg2Za4h;0+}<^F_$ziX*8pQPxfd!eUGiNYB=$~86c7g4$M2%khc?$36}bY z-hZFQlY7l;E;(ULLs=oXO2)iK-YN^zV*fZxs+DlLi+!*#CF%CNM^T2lm)<*Q^e!ll z>h2Fv%?8_E>-KVLo(8n%32I)yw8@JeeuU~x+*x!@tS@tN86wAxs`hk*(fbF0M*S=# z`;E2lba{|NRiH`M8pr8#5XUt9^g+MKlHVVbg|bgQ`kD)Y035(G`D}ZM+SZV?d36?9%r> z4gcMF^WGr4$X>73t*$m^+_&=Rmxpu+gD6xY4MN%C{Csi3(AUd1dv6x&7p_b1EW{6; zOSKA3x+HDPgRLsqs>iH)BuI2oE|!QUfk=|kS_uur!KOAnjcvIj3je*nNBT4>Du(78=I35_x%QRQU~}{He+`@qb5rHT zdM7u(OkvJGN{REYS|iGlND=u|XPn+HWr`}$j|UiN)R=}2Zjl(VqXHI!-G0G|7Cln^ zU-t}+*h>hk#yuE{nOO=T@%jo%y>~FVnRs79rRYtj7xuOA4mz~!PRSex&upu<4E`=7 zYp;%hs2C;bPO;Ip7=WI*r_Vk+8asz0*@{F(kELdwq7QJi*KKl4hcw47ezuOkxx_!+ zPNg@YujO@zDb%Bw)}&ulE8+9iSpPd3a&CT|#Q%6$(=c_9YnfLgVu~Hspgl&G+=N?Q z-^ZMf+&vw|ZQX{$(0NlFs3Tx)UmTRjq5g;aY}+B9BMFgE;yrCD#v;rzw|GCw7yUua zl<;lXRr_kBKuk-}cVtYp{8neWNJn?$Hp({r!?lQQuDK=exQ9>7i(e9}o0LS98>J<7 zQBdFH-E$m7+F5CH%vYM0)|H4_-+s6|7!EtV8--zo@m*2cOl7kv7UN3|&)+?TK^PvgKIw$zh= z{Rlf1$>nt-sw&-hdu!PS#b}6RbO?O&vi9U2l7L)x@+7ZbeoHO_Q$3R=jdvkchf}=s zz0CmO;1G!kP`(%O`(3jNVRWS<{dcis&n|MK!Nx?_THhZtF4}MvS-sobk z8^PGj6&d7qq_t*QA7O(r7@2Nde9{)fYN@oYJ#q#f?vUBmZZXP zKIk!L*ZQ^lN5!J22q%m$`WodpzcD$@3QZ0d6r*lLjI%%1(QlQ4Zj6#yfLMz`bHw%_ ztb!pZ`3d*UM$Eg!Bp<#tQ&5!zy86xc{?+cg^!;VR&WZq6ww_14*7c&aZP9p!hglK# z_eu2nz*=_WquPzEyrU&3gSW=S&<2L{BGFgZ2}+SFavUeTE21i|G8x!`AS(FTL54A( zKgJQy=MJQTw(saO|E(girABAmvN^-^bxpwC+}tk6DX~USl%H%Gg5X?az{R&f>FrT8 zRchUH29NuX1Bjtp%4<=|ILB%~z=mT0^nS~CY{+21&$NX49s9y0Qa;5Ot>LKSSN1OyRc6qw6qo27*x zYMYD8hkj*_b@A7|j%?br^A!etMY}}}Aa&k?w9j*^^nW9GfzP%D4sEbnn-hH!oh*|+$Iv-vXT<7_`A+Iyuurq?tRkq z;9pB7V4fFIFc)*p{DPL!CDU|FF}P0CMX8E{g_NV)*D9mDPH@@IAo&^lMs+yQ|HS6iY`%9Unfq4#9orxU-=O;PZB!$+ZstSBN4Vbj+D_#&J^r=~bWi!>btX9Rk5joaAmQ>vt-ib?2MGk{r^IR{C=Icu zbfXQ3*tuEb9L_Gnu?s?W@=U2z5O~BSrjc2iB-Ns|ZIvnJ)Wrak*#8U-OnM62{6KS` zccd6+9341$cB=Way;c6qNvMYnUmyYQ5Kx<1tmjBzzR2(q<7H+Hf%GG~sfyp*KhuiH zN`Fj5uq6M|q(f$;^3T+RbL%}Re$8MQ*+nF7t7%aU8~JjDe#qmD=FFzL32?f~wxE-= zu586Fx=?sBx<{AbJ`F_xmOHR;xQXA08^d6 znP?BPf}vKYxCG({S5nb`@RfFtSd`V7L%Rhh`x4@k6gnfm&{susP2&CN@C&h_Vf%GB z51-|fUY4F??I-*8mH6T%r2gCCjRuW_X_0onUG(9NW>GuJBeD=^Efj6tSh6K>o@I`; zNHbY`)ZARIy%}?kMTgQF^~t(mzM9XgWn|H!=j_fG!n#P6Ns2D`TwGoAng zppT7}kFB`1m+c!MAo#Bd3h)Wc0r-{xd|3Pf-v#*E1o-EKo08(XFx(iM7q1X z8-}`vk9V#6;ePzjT4$bf=FD@>diMUsv-f8$4P|1&M}ziF&9&Nhbd+MU%3%6HMY1;Br?0& zLC+6JGSFgj6G(h-q6-g`erQbXUsIDyTZqKJfB5<6V_TR)46DZ^rz$Or`+*u76hD^7 zRAm}jx}%VQBDelj%6Aj}SO12I zAU-{#-fIpSslBw2<7wXTRl=sL9t-L19eD?AnH}_1_-TgP5pK7icK;*{ejPC%riN<9j*^M)n|-)EU&|3yl- zibF=`c>c(A9!KpV$u`Ooc(C?`T3-J+irOoq5vbaezX4u4!@EN_*uK6;GH6ZX6a@s| za2*kq34DYqJwZqzB_PrAJk0_T*n1I7DKeBhe6ipVrHxHx+jn7tJ~q}VCo4iA4Bm4S z9N#RGm9TOdej_#Cl#-Jy@SxRLLSf;e2aP`r@G03JCg0Oaw94)fyTd=zNTc!- zU3XII8lTBeDevkq3Mg~kEA0i{op8iq;Of|5#i?MCP4I1AlT3%fI1>~TbK*= z4gd%vi$rhC6jPHVZp?6fBBCZ6kMUo`Z1fCk5^=6AX`$iyYJ%1BMD=7v@c~7QJ;gIVahG+)bU;CL2v7ZhA2MnGGsg9Q3d-$OOrw||Tp_I{+ z{CqCfGC;~?Y2}z-bJ~n|usfPKSV!Qn4-4ny0P?cVp!x6Z+@95Ejj^YtSW{2H3LpDH zU)SkIMHWw0H;$#WwaF1ac;MDxdU16%Tx`hid%6|26&&?>Xh>&!Ns^bhM7~zr%nW9Y z*w4$-i7YQKKmG}mpk)AB#39v+uU-*M*E+quI@_g}^i2R$W}IJ;M0_kS7r>luE9>Y` zz-Qd>Vq;_1^?o)szN~eeZ2K8-CHi42L0Izf<9~`vQIXHyb_%$!{Px%i<>BUD+z+~w z04Hr_b#>8GJfM$;k+E-Uv>5#^!caGwMCMgt{61mehI-WQ^z|UJvN8^qDpKLTs!B*m zSd!}&U~O%kCjKF^$?rTaF0SqGccJeueFR%uTb+1J0t2O<7?fC^@6GBN8ot2XUK}pJ zv$n2y^9#DPw3IAlOOmVfrER|XG-wE{VGL=~<+tCY?B-U{e^baWC|KFygL;$;DR&yz zE=tQdR0s@=Y?Zc0DOY7>1+%LqmOG4>8X!#^U~X>D%6?*a{Lc5-#l#x)m#wSE949No zR(p~_IE^e_JJ+Rt#3MaQoxcwMOv!n)60b=?MK!YI9znveG-;b@J^wQx{lvi{IhwfT z1*fXfvGn8^Inu?G>sRT{vd3Ib&f^T9HCjO-p{6`M92^194J`^vN&-^S^^?tEu$tKT z_>a@O1c_rQvuLw4bw_%u>jr)Xca&(4|@`tP`6ouqvZkN809_U6<67G{3W*!=mf#?Ccr% ze89_#g^vmf3eTrByu3uXxw&^Ht0GcT9#xO|pA0IW?9HY&c&uYeO2WdzUf!Gxn}3t$ z<&7@X%|EKjyeS#<^1lmrVhZ!i-m1kKc=WT6|72?h^RqlIIw-@c>n=dv=#q4Ii>|aO znV_!Y%Cx`MY5L+~`75$tTU(pgwEo}0T;;10E)db}?F#?lH~;$&?t_Vnw-KkaAVwNC z^HS?q6HOjHH8e2j973oe|1dEyz}(#hS(RfP-6g=OwwbK7E-|VKPe`CL<)bln5OJRQ z4d&B6vr_mtuMiKSwDlt%^8Mi8Ag_62GC0`q-)4vhW_2Ke53JANygpB>CNE1-IWO)` znOFm)ShcjZW$o>YM%A}KIeb9Fx6(=H;^>v$(9qC$i`jnn?wvOb-eCFzfrw2=7%8Z{ zS>+E}1m8F26&D}huozBfJfj&D6lC)^Syo@4y4V0I=KupwK=@iul)o{j>A1YS1OeMI zmASBBnGtYi6i&+IJf7L@H7f!D%g$fcZ+h`AdFrwT;jOZ_*YDJ&*Cf53N^TQ>F5s7x zoGmVN?Uy`%ZgQ!aDb)+IcCy|rcl4x?l9skRfm=6OD!@1QkA<08Zv<1IT|kDQwQ4a> z5QDU|G^6hZi`3PQ&~}c9q-1)o^4GY359D3W=WowmsH&=#^b6ViU6^tx+Z}1{4$Cva zV`iJkjL0Kek`8L_^7Z8fuh7n)-(G7j)%y-8il+E5uMKNTBl7Z~2c`!gyhqplS65dZ zr>Z~KIE=e5wG))>V`F2hsH$3xl^C^mbX=O=F0_86mky-A$ex`y0FkQxT`=tC>U`M? z4Ke~8)7Mx9B_$`Qn9q@sR@WDYN+Nz++hbTj{d+xLc|42uxqu8eDOK(~7%J@|ki3`A z5EM%djhIuPfh^hf_IB^y+!_ucq4;r&p!A&`$FeAS1l30+s3O-;;w<mj)xHc#hX4%~6=vp^VZ9+^kBfsh zbNC4VcV^7N#uf?+o?rmR6LWI7rz`4n^y8GQp}ASQqM~99ej34;wmtCqUKv;e(osU{ z>9uF-a6=`WmihVCznLUf{d4hp1`P!zo`+|dKdpXKHxUpW%vMlRQ7PDMkoFTMefw7N zVcWo<F5RU$Ty;{m@-)nzhotPXJ)*(6v(?d@k_ZT>bQ&5Y z`uh4f(2V&mAyC;~d3)D?pyA@=?0VEXWk5|$E!8h*7W?drjC90OYq#O+x|cO$ji+6Z z1jG6iQ=5%}?6JFTU*l~BMa9D&i`zI*imN97kd}L_Ym{XZgHm&Xk&=?i_=MlD=;P(( z6`@xOx^Ed;3y*|;VcMnHX&iO7H>(E137yz9@Q@N*Tir@F`TBbtMO|#4$;0}BhG8#+ z?Zt6$a9q!4;l~lu*R79o2GXi*`;Yd}`@SEf*xA{AdOZ$1XoTMVCTsDKJOD)}?R*g$ z5)u;4C^=PZN+;rIckIQ(!{ZHt$v;MGH!_+K>_7sJs89A*8?rt)z_w7lWh{fI9UUER z+sHa!7@d#}(eZk}%P8_sWF(=v?IOt0YRmkuTiu2$N#9C^G9Bu$dOWKUuHxLe5j+DDfUHW~t| z%tZ0f&QwhlLM=(h*m!EkD>5p|XEBUMMNO?L?{t4Y^Zjt%W!fEPyUccHq9Qoorxt7_ zbaZqc%{GbAfWTBwdESjuDJv~qyIjw-?MZz4G=m^bgR`)(u*AFxWg961?Wy)3VL^`QyOctu1>UU0om0=q4L|gg}cE zP1gXOL|9n(%WX}qjuc2?B07=37*idcwxy0JqiQ>H&eTGd`G#P9YhO2Bff8O2t#n6il6~u*xhgaGS<|xrL6L++?mpe`hf>n3LvMLW4 z$AA0Q0a_(KKK{ax8b3SOK@BoI2Bkj3dx-#KISE&FRolrH6IDJYUFRyOee2g)?Ai zK8GG`ROQ}lSZDM-+vz@9?Gd}z7c)gg+{wvFm@_BH4xi(-n%9@x{dY$_{KqpM{fFR` znhd9F61-rmH{QO@V8yh*2c8BvxK|ZX_!sky> zwVOrJ4%njv#G9?4_I}RHT>oTYzPR)Sex|FtjONZxc+AcHS-;o-Y;1{q!G?2XSUWH< z5LE4Bu(3EEGjXXw9gR2aRQ7o9){LuYXmGHwWY5a8rg(I-CmmcL_s6HDshgUbR%!Zj zBk)N{ZI4#EON?tGCH5PureD&I3HJkpNk6pcAJ@cx9e?-J1ejgr5E@7ZA)63nVEUYlb9_ZVLXjQ*Gwg}w8(I%C%5d@&1)zr zL1}4eS5{WE^z=ffckfj`@CNhDaYCRon)a<(bN#Hdm6cV=+(P(A95e+2JD!GZ3e<7llaPH9ZZY;ci-`}6S z${R9{062s3(Q2#;oajGT36RVwGYS^*Nw)=u2pvMp_*n#bPP~)0s{Z&FTnt%3Em}d& zGl%%#mu3CimM*U(l}{S(^b=S$SOrc{WI0+-&NEIAkw7Uk3L7-Of{4j9&LSvtAo^H` zs)dwV`#u07;lXQr_-5#aW$`wT^oRrm-0*>f@P{a%)wmV#xNxCQ5G98$=9;10h@#-j z-|~Vve!dNXs}WFJ06^AY-xAJP!{3LAesvE4cT^CkoIDmD_Q)%&t6&wh+S7KQ1*o&O z>aP7oSbxNlgC^zIQ9dpO!}EX2{*c1buv+X1o3O9Zvk00cdPls@(b;ns72&!cV<^0g zHx%%xCK|bFc@Y66?o%^ep@PJ*tQrzXEmrQ%939Kl!b1TA?ho}1-;MpB8SLsGdo$1O zNmAr|i@~a^)4R<6<`S-}N)6OOm?oQS<*J$K`eUWh!a{YJ(NC&{RV_HoxSL#*GxTjlxT^eI!U|TQff4J@{ctCv@{Xv5JUe6%P9yR4#9kAPQV*_; z@Q2K1_T4~kB}uc*(Hmn$ z!J{p4;gIR64ofp4mpWq1zePrHsYi%ANzj2-Y?C0(TjNG`OM zozy%Xx*#0+VkBTPiyhF?$%%c0PiUwK>@)5VSzE>=LF9LD+NW$ x1w{r#%F6}8O;wpITE!b6y^YWRBXd!k)db80UMXrQl*(ED^FNq%t#|+c literal 15918 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 From 825a912be537c73a278e227426e88312d87dfc81 Mon Sep 17 00:00:00 2001 From: kunfei Date: Sat, 14 Mar 2020 22:47:26 +0800 Subject: [PATCH 20/47] =?UTF-8?q?feat:=20=E4=BC=98=E5=8C=96=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/res/values/array_values.xml | 2 +- app/src/main/res/values/arrays.xml | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/values/array_values.xml b/app/src/main/res/values/array_values.xml index c517c46ce..dd0842163 100644 --- a/app/src/main/res/values/array_values.xml +++ b/app/src/main/res/values/array_values.xml @@ -6,9 +6,9 @@ launcher1 launcher2 launcher3 + launcher4 - 0 60 diff --git a/app/src/main/res/values/arrays.xml b/app/src/main/res/values/arrays.xml index a53546e7f..cb61d6daa 100644 --- a/app/src/main/res/values/arrays.xml +++ b/app/src/main/res/values/arrays.xml @@ -79,6 +79,7 @@ icon1 icon2 icon3 + icon4 From c931cfad3162648506b59d2a66837cdb029eb1f8 Mon Sep 17 00:00:00 2001 From: kunfei Date: Sat, 14 Mar 2020 22:54:48 +0800 Subject: [PATCH 21/47] =?UTF-8?q?feat:=20=E4=BC=98=E5=8C=96=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/res/mipmap-hdpi/ic_launcher.png | Bin 1915 -> 2943 bytes app/src/main/res/mipmap-mdpi/ic_launcher.png | Bin 1175 -> 2052 bytes app/src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 2585 -> 4414 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 4139 -> 7876 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 5618 -> 12102 bytes 5 files changed, 0 insertions(+), 0 deletions(-) diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.png b/app/src/main/res/mipmap-hdpi/ic_launcher.png index 36cd968b59b1f99d6498131ef1c120c8d415efbe..66ab5d53de22caa35d95ccd53841cbc7ef0bf425 100644 GIT binary patch delta 2784 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 f3yEKmW+i delta 1748 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 SVXKw^0000!lvI6-E$sR$z z3=CCj3=9n|3=F@3LJcn%7)pT}UnMXwSj}Ky5HFasE6|34f$>>@Plzi}!GHRKnM*Ef z*e|y5U1j36!rW)&o%sEStdSqnex^?UR{P_cv3JMAe3kzGeY#C4&P|MB(4^vC` z_Rc&96rVC>%C~RdX3m_cp`ig({OHjmM@PpiSFSvG@E{~4WX_y9?(XhDHE-U$`TY6w z(xpowCV0kdoH+Nw^XJckgM)i}d#$Xj_U_%=*w}dS;zctvGoT?ry^9tt0xDj*{^r$N zZ++r7J$(4U-rnBU)^^gQNo&@uIdI@WO-;@H`}cwBfeubiPM$Gi2GF|ci!Lo)cOxoi z$AM!{TwGjMu3Y)_=~E*kqpx4TUb=J%Xzbs=e}P&I4GqtpJ^Sw6J0N5J{Q0w&URkm6 z*25>C97ETA`t&I&DG4a<<>htl+O_T5w*xKJ*VmsmZ5q&P4kBpc5C{P*i(>o=LQ zxr{Pi&UyEM8W@wj-CY$)`=)TQj7r}F(Up_mEPnsy(0YI6@BoE}_t|4!{sGqEk( z7Vcdv9DDc6(&gLx&;4W6Gw4{D*wfS3o19dXHEZ9QGv_W^?mxgNHof7g=$dtjwaLZV z)$BKp-m~N5>$f=Yk+Yzx?Q{3()!7f8eS7zhvETo^{`&m=Ukk-PEN_(7-jMqGb;k_e z7oD=w1?t~|rtNE2SM<|4;GoYqb58yJ(-~G~BI~^7{g&vN|Gmd+?ZtmruD!gw*Y|Gu zu^EY#^(+C~fdQ{m6%tXBl30>zm0Xkxq!<_~ZW$XH7+o+mxMpg?X=t>`$c#ZLmzi6e pnVG@iH!GWRd~hF%zTEtj%(O~^`V@t=4+8Zuc)I$ztaD0e0s!9BQHcNm diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/app/src/main/res/mipmap-xhdpi/ic_launcher.png index df3591554e282985e7fe9f808e846045eccb9621..e7b02cc36ff55d7d13ca3575b386bb1576891e45 100644 GIT binary patch delta 4266 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 delta 2423 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 diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png index ebc3324f78cb3c1e19f0802cc53f299808b64467..b41e4253dd56e260b0137c85190dad6d2012a36b 100644 GIT binary patch literal 7876 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 ip)vknSGsvPxHty1(q5VBq2s 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 diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png index 8e55509d82ddacf9cd1c394e13aa38ec547c49ff..5ec22890168987242743b88e61250291e2b38b0e 100644 GIT binary patch literal 12102 zcmd6NWmHsO`0fxREl8JufOJbUbazX4jnds+(jXnuA<~U>NQ=}DDd`fC?hx+gzwVd& z?S8uJ&RU1PIA_k8cklDY^E~^FQd5z|LMKIsKpsbwcnlGGAd$iko=Cp>=ddW>=qZ-r4 zkzgivKl>!gMf`p3)tPlE9_F(Q6xx?tuT&iO+(d`!w=d}o>S-0<#(b>wFOt$oX=P7O zzgqd?x|7hR{Y6ndg(a%3`RE1#dBoRNK>Naf*KhZ(>nwFmBvGMcLrka^K^KDsDGiZF zOn42l5zshrTq2I7*@MG@Y50r{l81y6Y|&G^$?v-OK>)8!i%A>B55tSZ3mu*_!_4Wo zOpJ7i;0WnPWSa=*`lSh#E73rle|FD!j2kfF!10S!U`=u@5TV%`dFtY5AwF|D58LNs>h(`ihSs+A3e%-A9~`^1s~EQWf$L&DFZJ}&s9)fz|@pj zKvLXU-=qJUf9x??7wkVs4U(u*iAEiJ{ib~a$Prkx{in%-ay3r zJia>@ne`tiU!PkTeu}6;VO%pCa#m4&+=zHV<#>BfAajjnLP@^ns9ByO{4XX`DPQ@z zKce^8-JJPNh6I#OZDsrB1zp|v@kKGV?l%7qx#QmR7i(5e=5=u+J+j@3^CNBI@~(}UQa>i@1l=QErbjO`g|3U# z;d)_KCqP#FSWNj+o+DmAH`EDAk6ES$m(HrRm|jbZ%ypA#whXE1!}GN_bnM>rIWq7d z*Xo%Y=0!|ztE0hm|Gp*0ls2#W#;#$@kwQHdi%6`H`5L#oG`d$U8a2u!Z`G7Ro|X>L zj=_x9daAu3>_(zV94n%ROa=k-b(}gxQr-f;M{SxI%8|nT|NhkFGNr^OQ3hesBa-#) zUt^AcUZp)v>pxm;p*UVa$S+aEFre!;oQ;$4b)$5>UiVKYSEe4&D5i9Y{OThbw}iV)_(?S6m}Akj74I+rc^IRGP{8k1<7sJvL?Q-n z+pM_tKb0_=o{KsuI3yUi#nms=%=%CR!LI;cq9{zlHuxj(AE5j(wLb$os8(KWGr}o=uZo43oqOiUmm+{D7)^iS>DqLpsRT$kS z`Xwc7qWk_2M|FJBUq)_p&i!}jyAaa*Tw`>WcduB<#zGeVAT#T5pZ)Hysx;GIZi9&ZLQuW$Z_XHJ7WC#v5`5`jygeL7KiBFB;*4ae67yQ64cj1ysk!TL5 zLAcR_W+;)bae`quos#jjhC)PS zO^7~~8k}1n-UEGI=QQPm%h(`Sk7}MD`JyIZfz$rmU5vbyQlY66FBVq`VM2O& z)+q<|-R>069lEwmvkgtof%%93pjkHDpV(+~#z!lKDbJ-c2K;+?N62bCT>sj6V_Fh5 zHP2J`hM|e+(x2B)KGOmk)XEBXV6o7)C1{@3U6lC1)yN{b&!0uy0IlZ^VF_`^Zmu=I zfr-q!r_I>V%UQ8B;uqI{)Z87qhEFh(?k~Oj92GozqY$*^0~yCeiXh8$g&wQRCH3Nx z*d0*0J(nhY4Vw(WTrc%yl3OGkBYX|7G!a+SeEE3Z;O`gU^Pw_6G?o)quyD7BM)3z; z?Bgzs#(Z@1Vh(QyGa@tN4Cf0WuL5eL7F9j!!K+3oxSrSTXFe^H#}}w9B}pr^+9QmD zZ)Z>bOXK}AYRGa>kV;!-UyY^gbZJPL$r!9AAJ%+|64fS$6(O->h>+5();H=KIZW@Y z58v>{82O}V(wHUn*L>OemwREpNut&~#jrkCpZx4KkWMP(9I2YpFz68NXy zK`W-@E%OQdO_DfV(j?XXpVRGC9x|@Vh(tLWbE&e7?!x?hp}uUW|9uZ%a=5K4>N@$H z0J|1~o7AovLX$%7@a$L5U8Ro<@T=T27V}fG8hBTt?~O}S`DRJYZTB?A3F_1PhZSm^!4LdaZer_v~I zdLGI>70H|a@JFoH8u#xS{k16E!im*&TQLE>cGnwv#q49kGM2>|NssCQU6K;Yz8mq+ zLSB6-_}lDQCr6L-b7doAjgmQ5TdQ86e^9ood?~3s9~p1YHzRj?cE&-DXF=iUydDbjQtXSyri-+7Wi=U z@=pKyrDSCEGR=zMeERC6SP*Q&!p<(Xt4joAED|y@i}&xN-2|1XlTZm7N=qZ!+61$* zvOWx$yIQAt=SEuTZMg{0(b4tYr74tTJyysPki-`xGe0IAYz9BN`}j zFW`U64Q`B$i%S}@MEAKJ9aY$w$eY+0h|#OJM60T*s?={nA9C)?74%_!gSKOL;9|u0 zePP0q>uIHmWD{K0`=D$lUEjCI(n-k4F_#Gb^5MmA9=CVjwO8uag-B65uWm7p>PR4n z6-}Zd=SCPlAJn9vp-Eoy9G8xCrF9SUZcor}xI3DL(K|GUdN z$5oMPqjnkI?18h6NsqYa2feGw$;ml_?$MfMD(X5qL;cvI-|XaZJ1bC&VT1QFaIv|7f41DlaTbfFNfTSP5v;wo0?Kr$%RFwd?a9gTkC)4@v~B| z9|;>KW@Tm7D{v@v-LSx-Q)9gSEeh}NQcJ>w$Q{dHmO^VY4(exDR6f?WFUNT{P?V($=b;&@!#E5gX^w} z$m6{$Yy!jgz9;v&@|SmaGGM{Bzznv|_h#&tn&XI!y@Cf~h&J2UPP}0F^Xw9n`+@f- zLw@H|vTmN9kqQK;e#b&^)y7C{5mDz23JP8s2i#aKE-p%7j}Y~`8;Sfo*Ie;CQ+`eXlVeL~ z<`C{7$~D~}+xlVCuyEY|dD5yu@A7b&EKAv-*{-0xygXm0D;0OXd3<;nbtwL&1vvh$ zbP9E-sOQ4R9j)MHq&90Zn*I8Yd!xKUm@s?MDX_BNzQVwk% zZuM#ko+>j>N;EP|`}anfh<+k=&Faqw_2?!6WA~G^EP-~=7 zd%t}{ru095@zpSX_2$!RK~)uN4iR$S3!?-4mB^0Tw(7AY8rkbT)xgoIBH8|29)1~Z zZ35u4+}zx11_p{;ncwPJN=r+@(@cTKfJZ-j_DtgS^RUMD_Uyd-EqV~3Cw&;~wWhrx zA-Q)EHhAi%z>@`qgl=vo0)K#K_sM(1D2C2pc1xvgZCRzIbfjct<&~A+oXMG(nEGrJ zj2m!5ykI}RXjeoF;^G@2;Gn;DL3KghqpxEWt033ErijgWJ^Z39aMI$@X72hzRv1&6 zc8Z}`4lkj%ZT1Xqps!+;8CEG}i}4D^!d-n@p`e>4ZDK-s)Olq*e}+PVUd00Fp8w!NgU#OlKFE;h$Kh5Ww}KEyIPN_1PXNnE zvWdCQI=nQpV3$^1&1M|<&pn<}RD~@aqmw^=v(|D1_h+@ySOgZCZk;()TU#4Sr_P(b z{p+i%n}>%Bh;)@tf&;)`Kz0aXpOlo8{5xNVG~|3e$k!$A?tT$_5FHY^t*ofn+uM767egzG<`phgZ=(sykeEj= zVM(cfG0$+Y^iKjEIYdil()G3CZrzK3i^shDc9fLQV)M!Qnk?_DZI;qd%2`@YepTk# zGu<~qNXf=NqQ1(^%Gv?X?MJ!dT@x&Q1D1Ey>J{26J2zTLxL`S3N2Hd{O^*t1L zTWuI+ztmc7g8J(Bg(D$*RMz`}!r$mrAKv7iwoVK6{$_yVdXa`{c`=P`r3|GqYm#4& zJF9&9svx+z7R41dDfcQv$D|iSwPvUHQicil9Si>A*)FDn9M!W?={4t@Q>%cRF%uVH zZU~B+iOB?C_l>f#_cj43DXBzWfaw=0DD5?jFh*Tny;oCJm;n7g^No$fx|30Qg-%U9 zNU-|)`tyzNGuKK4NvJo}cl$3-YEVZ0XE3$J2KHP^G6QC}UqH5%u zp6!fprs^1*fjZgoaJ&Ds%5H)$FE5RZj5_WP+n-j=X}ynxelmA=y^XEi^T_&WrE}d< zqI9Q6MxNv#R^?tM$-GNR#P9rl9Rgx`z`;+HNL3_JU zPUExQqTO8I_;iy1fgEC)PNo@G`{EQcRY5_)(XXz%*XJ{;dq+p?PIpk@b5J`3ypE~J zce%S0Zl@1V z;JIv|6m`;CvZ~0d?D2@D91;I4kb9p3*(oe5cW`oHVdUZ8oqUM~w45r2kac4_-DGEJ z^}&Om`fD{=yhHW=k3TCpxdz&W=xgkraRGl~=ecan4vzS3|(dWx}Rz;^|ER-a}MWRES$72+EURt`k$! z)3`pG*67P9*l!u7nNl|vn{53+ZS1&O@ilC7WAw}K4aHRY_~+02jT3%6JUlHOoz=-r zXrIf*H?$wQ!ejwD#>PKNm9xE028bBh*-;!Cvu&sa>!G~&({8jh_L$i)=WJMufwn5CkQk@ugjl#u)kkaRu-9* z^x{1zK}ugRh}b4)X7HG*cD=Qzkdz5v zC&NrDi{3d?@=y;%9r2RntsBS6?Q;68cjY=Mic$ZO6n`jal6nVi1;XsMg^AqbGBUc1 ztn62}J&lYFNSBQjNNQ&9A%>I)h23v5G1J+MHV#@=t*;K33#ur|={e$XqmWrySz(v+ z7JmB%tL9)D1>QIea{sv#&)BlE_raHVfwA0te9205HcB=>tQ#yF^hB=Lke3wHPSS@px2 zNW_~E!$Aw`^v#}Ni%Q3ud<$t-g`hGXh4vPuiz`?{ZY~8^rcyAGHCSQr)(I*f>g}^Z z&d(Bhysdd0E!Qj?-gYU#c%v4g%OYcM&w6lh@RT;600Q8k99iTU!f()IO>f~cp4$9z0Nr|%ygCYPhmG|923mCA0o7nLh)RKO$uT+!E3w-cywp+lJiLucq z~JdoW$teH)Iolz94#&|(7(j@ zeh*(8fjhr3uhDvm6Nl|1Io5?UuSi=+E_0-ul`8{Qe?J=vw$a9kET#2!G}DF#UJG)y z%h?fS#xf6T7_TkWaPK!|TV+*MY)Zdl1jp`wy#D_FP+k#3lN&8f&3>8$Sf6Lt*~>Im zgSR*zqJ1O{=U9mmLXJXzW&T#EqBNoN2&>By%}y$^SO1fu7H1)3uGIr^2}%bbPxXP10Z-n{X4tA$ z8_Rw?m7bak>L3ghU9ZEhySiO|0<*KTJ#jI6tYd{OE$LUQfq9`Q*bysvmRuvZ7yI59 zvpP=#2D)TEe()Noj_50P<=;FdvG&~{1%Jb((4`oo_`DlcWuMb|E%Mb3b0UT_m2vY7PlrF?mh{3sMs7aH z<6q0@FXUHJ{C2WLjaOG!4S+L0C+F`04gu5%W}Ij$2K<--xUKDGOTd1M*Y$d2KXT(| zPZV^b3}lD#r_7nBqodOR5+6r2d4~3g<;TIn!4S6%0I3KYn}`9^;-EzL+mo(d;!kIAS~^!O;Yi8c4l#Lc-;aIt`}d1{75en%Ey-rnAZb}j=NB)RHqx+_~DIp3`8?=Q^Wd5*i(Y;VyU0xj63 zr^=#xfdvDgWom9tClQf6Vd&la_e{j$A+ED?bCE+J_zb_ggpZ7jI8hs7KKgKFV(!XK zbv#l*J4#D;a%COajXQ|560XLOZ*e;e6}Kw*?nv@UAICYGk98-vj_+p@G`7EqS&pC$ z6x%p&{Kfe+RK3B3!MB@k_(E=yP-5PYy=>!ZI(U~_-=FG}O7e)M#1*`eS_(#CGnU4B zzlI{ZHmhS|^1fc1S7Msp=!zJQAP_Sa;QP`sp~qGGS1Ie5Xb z2Kcsha@yLnSTxBR(ZRt8Kk`J6M8CGfm(JZM#4@11qUmykMhIce_X-Yu(jzR3h$YAx zlJ1$NPbJO@&?jr+GhMat~d7e7MpBC=XC4GnIhWfNwXmtR^NKihR7kAz|n zPA)F`^j{2_a}u)X_5ei$2fgq5n*S+!7wmZ5R#zO0Q&^1JxW9{GrR0OMVpu{L>%_+# zz(dyCCB8eex;hbzgwi+bcy%CnbQRYbOmbw9sLq%%r#q-=prdB+I%+>uP0g8DMSS}uYrx9x7xMm*JXyZb>P!Q; zGBnD#Vda}&0*`>e2!Q_le%DT|UBvlczh+{Q@rF_4|6bG!T3pnp@ZNf1xAgoh%kSSWVE9rJBe<;WlznNqyM{RU zXMpM%SU3P8fP!MVj+OY4KF{x?=;N8F&E4ezAo}?8T`hN1jXwde``EJL!~C5etJ)0A z)9zPmovA#n;ly^r(B{)CE2vOslm@Bu@s#}$SLH)YZ@twR+|d!cXgk<`Wp;J|h+-L8 zSxm!^kJQLCpLcKexk2HLtBqGn^mG%wo@Nx|*5BW~w1Iz)JJ~AL{!eFVzE2V!Q*IZl zs59+Xdq*otBLI6P_TI9K?Q#wYQcS26s z0k?Z)K!FfNt56JjOiX7r7~C1perIP#d&~CA)TD~1PB%6jg9w;NXtzX17{kfKGw`H! z00~ft&8SU^ZMR!`*IJRu=GLw>tDq(3XV&Sd3rMB&wPr}o_K_0VDrMe4Mfe|WWNXV( zJiC-VASx?I9dG&!2Ew|tv-AGKBe(}a5af_#=w)YEFN30(-C@%)6=G(hFyM{ zfwyIW8-VRFezxXaM#9CpShoQ})WOn_=);j<*EkTHrv-b&KVh3JJ0ttfPcC8F!=zN9iw_Z^+1^JnWW<}@$pb`rm z-fu=Mxng4&N?KjE(H*;P=xVwj1Ocyymj9X&`tW;I-Ek=jkN$ccJ5bKX#zvg#Fn}$w zF5ozn@_yUsrFdc>cCGBsS#lu(iQU~!II@O83jJoKe{BShy}Pc$ZH-teo9Q+)ziq~a z`M-2H?dVt?o)x)}b8u7?c{R#(bW&zkVIj-lpHvJvx_k3>jUfcG*RZhTL|u4^JS{Fa z56{%>thA$}W3T`h7grykm7vc60JDf$%)+EKvBZ$b8K5Q#9d-0i1U{TOE!(?ggXDG` z8F(G}Jx^2=HmHQni>jvm_N@k})4=-Q&yicf)*XnXC$PvkJ(VRkL)0W&^nJ>(aE+%J z1)HL{tc)Ii{>v983cq7m4b+z{AQRtbJI@%_XmfDp0-HdzyH#sLy5W-iY+oc#@_wiB0-o? z<#Q2R_h)KkIITf8z%wI!T}!f}Iwy`;eQJMM^$|rd*ZzMG3h` z5{US!qW|1l|Ll8wC=D=3lLjIdF@lKGn%KOiZ>}t0{Xi&R7sl9N1D;~W^Y!G!89bMm zocu|3R-(gW(py7);y%pd{?abN$Z7TBK3m0oc=C-n0Z=|%2IkO@dTR29=5oy8C9HN6 zy^@8MjqDo@8O8eVVe223vGiigJG6ktKaGBG2+l zTqj?fT+upczv~ZBQUQdO08sw%82eGo#)keWnD=^UXlQ_fu zhoeUkFcuuECJ6kpqb5Vu*3`u7zVhvsRaC@yyq|a^XEVb@-+qpb{RReu*?w{3o@NO% z1wdo{+k?jrWa=vtPPO;v^74ZE`j5-)o{@^Lk+7$L-VEHy&D}kmqKfK*#_8zU6^s5y z8Pr}trAM3Xm#(wBZ?Z%B+FZwtx)}^Gh@{vaNioI}2EXv*q9~IWG@z~%7FX;|-URNq z@ZGWx^aLiy4r{!n*etj>yV+VJVY{?e8|^*&Lfo3Rv1w$Z*J($g(hxfRF6_HmR6fjn zy&vmmbHG*msud8#o}@Bh2!Wkv1DeHu-%w$K%F4=it6iUzvw7=WwnsVE4^&*d?Ut+` z?r&g^_h%sEocs_va=O1hahg(SRKBWcaWhH>I-|aU!A+>>H4@-YH@}M#0Nq4AlKl@k z=BM5#heN1s3_w;u*k-xI<%d`^74zu)a%W5YD3E9je?YBD+^TIvL1(F#`*dP5pTVx_ z@{d5yse*v@;jW8?3WGZIB_4~>;&3yoE%D0K$Qm5|HF;zD*7=A?JjGr~frr5MHfc!% zs$oVNC+SNxkdokVcz#t?9N7PfeG+@l&(Aq{c(hGbRcl&ETA>C&nE~>XUUz`-SUP)I zU0ofOo`cWj_5n^#QF%GgNSo{YZd{&lc&@N-tJewjo||9})oP8H9=G+>;^L@nP3K^n z`~G})py=Jz(G&Xr#hW!Q@UII>BMG+do=R~7>=c#xZDoF4T@p}@LsBm8dX1RH)Pk`N z$V4>a@fxaMxudHx*tzI(ed2RvF+q?L(UD!%XFx`5JP%YPVw}->n^Lz|H$X1nl2u+F zQ0j(mDE)rg;wl%Z(ziCezMgndQ*NxyEH?9S?{h`PX5A1)QBzaule_|C5vR+)dZ2WF z>*;|2MzkJQTUi+kA{mgi!PD)rCp`+lssHBYR@VkHjM=t4(4uXFO_s{Q1HiX2HXt^Wl9DDJ*u2=@u=Hh?3!W*7+>zwDZs~)aQviNI;;er^%hc?!JPJ?* zKiJ0vYMVJ6&fu2*?1~1cy+E4=n-;q59;{D0nhW(-07-?tRB&3(R4UCEcGcroEY>J* z*Wd|%#;A_Ur6;fIC`!bRMP)C~TgH%pp-%}f{aXG!hLPpfxR-3t5nUXVu}d+fGI`AaHizb0nt%1B zs;Z>9In4`ZTuW+Kjru*B>J{tf8do0755UI|B#_r%fuGE>k|A3pq*xLjaTbfem+1;VHvb4^8EHDea~R(gfPjT+B!5V?7)ZO!D#RN;n-!S#u`-y|$X$VbO<8$RYk zbB9l*R|&{J;h`kS4HR~>Rxw`A|rD*$CTt+`fGgZ_%i?W zVh!AP@?lO>ix&-I+ANL|GY_KF~!Xh;Ux`V1~Cr4#$CvTW$H1t0kk~3~F zBtab>ca&>ZaN>|x=3zcs?Mg-r#sE z9LZ&hnh{BG2(;CyC~*6VqDbvXH|&!(ap>0P z6)GB;&AeiFz(MTSm9miktp8shLr_66C%P%ayQjWC(jrL2$HD(^P9kAa3s^uJGRoAdRVGT`daIu*=UaS%s;gQEEv|4&2XhASF5iw84i z1humo;!seXdCNCb2E;r$Q`~u-ziGsnSD6%RDQ@H_YjNf+gHMg62mC5*!_ZrTL}rf| z%!s?;iFF^YUsh}V<}Jgft*YmcBS~X~Q|rk`CXWhm`C9_{&|HE&e zebz55hM+1G-(Y)7^oA{Z0vm62>8M}vXB*q(7-oEAX|rqnNx6$D;_yZ4w8>^)Yd*_-@CHcP+L z!t2O~G9ku@mqd5bm=Q}`T*q++XrjNYt@wwWBZ5FLG23M-31-V0ZNNm}sRwV@!Sn~v zyNbY$^vF)9W_|5)%GNa=c;exC4H`zzk~WSI0uhU&{hOXiQb6x*)(jeyy=*qplGn16 z6iOC@x}nX4cYm;6kCUvaI_&Ir6L=cFTy)Nv>G4>5M7)jmC&GL^gnUdH9C@U5z0M{R z#89sF<=M4oPdD`aQxmd@EmzMf(&IZH^QBKts`yk?sS4VNs{?uTl^t_Kd@0<*JqbaN zB;&i?20Kz>pi>u_0;vnh4+EZE;Y!l=^Bm&1$!;1bsypb#p6Ocfow*+gv;eD{veshi zx`_U8ydHIecB>rhUeBV7BB%(&zbTtlc;Ndmv22c;wtfye$k}|fbloh?+^hsGT&%zV zfp{&x;o{($8(XFx(iM7q1X z8-}`vk9V#6;ePzjT4$bf=FD@>diMUsv-f8$4P|1&M}ziF&9&Nhbd+MU%3%6HMY1;Br?0& zLC+6JGSFgj6G(h-q6-g`erQbXUsIDyTZqKJfB5<6V_TR)46DZ^rz$Or`+*u76hD^7 zRAm}jx}%VQBDelj%6Aj}SO12I zAU-{#-fIpSslBw2<7wXTRl=sL9t-L19eD?AnH}_1_-TgP5pK7icK;*{ejPC%riN<9j*^M)n|-)EU&|3yl- zibF=`c>c(A9!KpV$u`Ooc(C?`T3-J+irOoq5vbaezX4u4!@EN_*uK6;GH6ZX6a@s| za2*kq34DYqJwZqzB_PrAJk0_T*n1I7DKeBhe6ipVrHxHx+jn7tJ~q}VCo4iA4Bm4S z9N#RGm9TOdej_#Cl#-Jy@SxRLLSf;e2aP`r@G03JCg0Oaw94)fyTd=zNTc!- zU3XII8lTBeDevkq3Mg~kEA0i{op8iq;Of|5#i?MCP4I1AlT3%fI1>~TbK*= z4gd%vi$rhC6jPHVZp?6fBBCZ6kMUo`Z1fCk5^=6AX`$iyYJ%1BMD=7v@c~7QJ;gIVahG+)bU;CL2v7ZhA2MnGGsg9Q3d-$OOrw||Tp_I{+ z{CqCfGC;~?Y2}z-bJ~n|usfPKSV!Qn4-4ny0P?cVp!x6Z+@95Ejj^YtSW{2H3LpDH zU)SkIMHWw0H;$#WwaF1ac;MDxdU16%Tx`hid%6|26&&?>Xh>&!Ns^bhM7~zr%nW9Y z*w4$-i7YQKKmG}mpk)AB#39v+uU-*M*E+quI@_g}^i2R$W}IJ;M0_kS7r>luE9>Y` zz-Qd>Vq;_1^?o)szN~eeZ2K8-CHi42L0Izf<9~`vQIXHyb_%$!{Px%i<>BUD+z+~w z04Hr_b#>8GJfM$;k+E-Uv>5#^!caGwMCMgt{61mehI-WQ^z|UJvN8^qDpKLTs!B*m zSd!}&U~O%kCjKF^$?rTaF0SqGccJeueFR%uTb+1J0t2O<7?fC^@6GBN8ot2XUK}pJ zv$n2y^9#DPw3IAlOOmVfrER|XG-wE{VGL=~<+tCY?B-U{e^baWC|KFygL;$;DR&yz zE=tQdR0s@=Y?Zc0DOY7>1+%LqmOG4>8X!#^U~X>D%6?*a{Lc5-#l#x)m#wSE949No zR(p~_IE^e_JJ+Rt#3MaQoxcwMOv!n)60b=?MK!YI9znveG-;b@J^wQx{lvi{IhwfT z1*fXfvGn8^Inu?G>sRT{vd3Ib&f^T9HCjO-p{6`M92^194J`^vN&-^S^^?tEu$tKT z_>a@O1c_rQvuLw4bw_%u>jr)Xca&(4|@`tP`6ouqvZkN809_U6<67G{3W*!=mf#?Ccr% ze89_#g^vmf3eTrByu3uXxw&^Ht0GcT9#xO|pA0IW?9HY&c&uYeO2WdzUf!Gxn}3t$ z<&7@X%|EKjyeS#<^1lmrVhZ!i-m1kKc=WT6|72?h^RqlIIw-@c>n=dv=#q4Ii>|aO znV_!Y%Cx`MY5L+~`75$tTU(pgwEo}0T;;10E)db}?F#?lH~;$&?t_Vnw-KkaAVwNC z^HS?q6HOjHH8e2j973oe|1dEyz}(#hS(RfP-6g=OwwbK7E-|VKPe`CL<)bln5OJRQ z4d&B6vr_mtuMiKSwDlt%^8Mi8Ag_62GC0`q-)4vhW_2Ke53JANygpB>CNE1-IWO)` znOFm)ShcjZW$o>YM%A}KIeb9Fx6(=H;^>v$(9qC$i`jnn?wvOb-eCFzfrw2=7%8Z{ zS>+E}1m8F26&D}huozBfJfj&D6lC)^Syo@4y4V0I=KupwK=@iul)o{j>A1YS1OeMI zmASBBnGtYi6i&+IJf7L@H7f!D%g$fcZ+h`AdFrwT;jOZ_*YDJ&*Cf53N^TQ>F5s7x zoGmVN?Uy`%ZgQ!aDb)+IcCy|rcl4x?l9skRfm=6OD!@1QkA<08Zv<1IT|kDQwQ4a> z5QDU|G^6hZi`3PQ&~}c9q-1)o^4GY359D3W=WowmsH&=#^b6ViU6^tx+Z}1{4$Cva zV`iJkjL0Kek`8L_^7Z8fuh7n)-(G7j)%y-8il+E5uMKNTBl7Z~2c`!gyhqplS65dZ zr>Z~KIE=e5wG))>V`F2hsH$3xl^C^mbX=O=F0_86mky-A$ex`y0FkQxT`=tC>U`M? z4Ke~8)7Mx9B_$`Qn9q@sR@WDYN+Nz++hbTj{d+xLc|42uxqu8eDOK(~7%J@|ki3`A z5EM%djhIuPfh^hf_IB^y+!_ucq4;r&p!A&`$FeAS1l30+s3O-;;w<mj)xHc#hX4%~6=vp^VZ9+^kBfsh zbNC4VcV^7N#uf?+o?rmR6LWI7rz`4n^y8GQp}ASQqM~99ej34;wmtCqUKv;e(osU{ z>9uF-a6=`WmihVCznLUf{d4hp1`P!zo`+|dKdpXKHxUpW%vMlRQ7PDMkoFTMefw7N zVcWo<F5RU$Ty;{m@-)nzhotPXJ)*(6v(?d@k_ZT>bQ&5Y z`uh4f(2V&mAyC;~d3)D?pyA@=?0VEXWk5|$E!8h*7W?drjC90OYq#O+x|cO$ji+6Z z1jG6iQ=5%}?6JFTU*l~BMa9D&i`zI*imN97kd}L_Ym{XZgHm&Xk&=?i_=MlD=;P(( z6`@xOx^Ed;3y*|;VcMnHX&iO7H>(E137yz9@Q@N*Tir@F`TBbtMO|#4$;0}BhG8#+ z?Zt6$a9q!4;l~lu*R79o2GXi*`;Yd}`@SEf*xA{AdOZ$1XoTMVCTsDKJOD)}?R*g$ z5)u;4C^=PZN+;rIckIQ(!{ZHt$v;MGH!_+K>_7sJs89A*8?rt)z_w7lWh{fI9UUER z+sHa!7@d#}(eZk}%P8_sWF(=v?IOt0YRmkuTiu2$N#9C^G9Bu$dOWKUuHxLe5j+DDfUHW~t| z%tZ0f&QwhlLM=(h*m!EkD>5p|XEBUMMNO?L?{t4Y^Zjt%W!fEPyUccHq9Qoorxt7_ zbaZqc%{GbAfWTBwdESjuDJv~qyIjw-?MZz4G=m^bgR`)(u*AFxWg961?Wy)3VL^`QyOctu1>UU0om0=q4L|gg}cE zP1gXOL|9n(%WX}qjuc2?B07=37*idcwxy0JqiQ>H&eTGd`G#P9YhO2Bff8O2t#n6il6~u*xhgaGS<|xrL6L++?mpe`hf>n3LvMLW4 z$AA0Q0a_(KKK{ax8b3SOK@BoI2Bkj3dx-#KISE&FRolrH6IDJYUFRyOee2g)?Ai zK8GG`ROQ}lSZDM-+vz@9?Gd}z7c)gg+{wvFm@_BH4xi(-n%9@x{dY$_{KqpM{fFR` znhd9F61-rmH{QO@V8yh*2c8BvxK|ZX_!sky> zwVOrJ4%njv#G9?4_I}RHT>oTYzPR)Sex|FtjONZxc+AcHS-;o-Y;1{q!G?2XSUWH< z5LE4Bu(3EEGjXXw9gR2aRQ7o9){LuYXmGHwWY5a8rg(I-CmmcL_s6HDshgUbR%!Zj zBk)N{ZI4#EON?tGCH5PureD&I3HJkpNk6pcAJ@cx9e?-J1ejgr5E@7ZA)63nVEUYlb9_ZVLXjQ*Gwg}w8(I%C%5d@&1)zr zL1}4eS5{WE^z=ffckfj`@CNhDaYCRon)a<(bN#Hdm6cV=+(P(A95e+2JD!GZ3e<7llaPH9ZZY;ci-`}6S z${R9{062s3(Q2#;oajGT36RVwGYS^*Nw)=u2pvMp_*n#bPP~)0s{Z&FTnt%3Em}d& zGl%%#mu3CimM*U(l}{S(^b=S$SOrc{WI0+-&NEIAkw7Uk3L7-Of{4j9&LSvtAo^H` zs)dwV`#u07;lXQr_-5#aW$`wT^oRrm-0*>f@P{a%)wmV#xNxCQ5G98$=9;10h@#-j z-|~Vve!dNXs}WFJ06^AY-xAJP!{3LAesvE4cT^CkoIDmD_Q)%&t6&wh+S7KQ1*o&O z>aP7oSbxNlgC^zIQ9dpO!}EX2{*c1buv+X1o3O9Zvk00cdPls@(b;ns72&!cV<^0g zHx%%xCK|bFc@Y66?o%^ep@PJ*tQrzXEmrQ%939Kl!b1TA?ho}1-;MpB8SLsGdo$1O zNmAr|i@~a^)4R<6<`S-}N)6OOm?oQS<*J$K`eUWh!a{YJ(NC&{RV_HoxSL#*GxTjlxT^eI!U|TQff4J@{ctCv@{Xv5JUe6%P9yR4#9kAPQV*_; z@Q2K1_T4~kB}uc*(Hmn$ z!J{p4;gIR64ofp4mpWq1zePrHsYi%ANzj2-Y?C0(TjNG`OM zozy%Xx*#0+VkBTPiyhF?$%%c0PiUwK>@)5VSzE>=LF9LD+NW$ x1w{r#%F6}8O;wpITE!b6y^YWRBXd!k)db80UMXrQl*(ED^FNq%t#|+c From 7b115402824466355c7bd781048a49cd9b0836d8 Mon Sep 17 00:00:00 2001 From: kunfei Date: Sun, 15 Mar 2020 09:14:08 +0800 Subject: [PATCH 22/47] =?UTF-8?q?feat:=20=E4=BC=98=E5=8C=96=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/res/drawable/ic_bottom_books_e.xml | 14 ++---- .../main/res/drawable/ic_bottom_books_s.xml | 47 ++++++++++++++----- .../main/res/drawable/ic_bottom_explore_e.xml | 8 ++-- .../main/res/drawable/ic_bottom_explore_s.xml | 22 +++++++-- .../main/res/drawable/ic_bottom_person_e.xml | 8 ++-- .../main/res/drawable/ic_bottom_person_s.xml | 43 +++++++++++++---- .../res/drawable/ic_bottom_rss_feed_e.xml | 12 ++--- .../res/drawable/ic_bottom_rss_feed_s.xml | 21 +++++++-- 8 files changed, 124 insertions(+), 51 deletions(-) diff --git a/app/src/main/res/drawable/ic_bottom_books_e.xml b/app/src/main/res/drawable/ic_bottom_books_e.xml index d99a276ba..16efedae5 100644 --- a/app/src/main/res/drawable/ic_bottom_books_e.xml +++ b/app/src/main/res/drawable/ic_bottom_books_e.xml @@ -4,15 +4,9 @@ android:viewportWidth="24" android:viewportHeight="24"> + android:pathData="M20.5,5a2.54,2.54 0,0 1,1.1 -0.48,0.49 0.49,0 0,0 0.4,-0.48V3.5a0.5,0.5 0,0 0,-0.5 -0.5H6.17A4.12,4.12 0,0 0,2 6.61,4 4,0 0,0 6,11H21.5a0.5,0.5 0,0 0,0.5 -0.5V10a0.49,0.49 0,0 0,-0.4 -0.48A2.49,2.49 0,0 1,20.5 5ZM6,9.5A2.51,2.51 0,0 1,3.51 6.74,2.61 2.61,0 0,1 6.15,4.5H18.9a3.92,3.92 0,0 0,0 5Z" + android:fillColor="#2f45a6" /> - - + android:pathData="M3.5,19a2.54,2.54 0,0 1,-1.1 0.48A0.49,0.49 0,0 0,2 20v0.55a0.5,0.5 0,0 0,0.5 0.5H17.83A4.12,4.12 0,0 0,22 17.39,4 4,0 0,0 18,13H2.5a0.5,0.5 0,0 0,-0.5 0.5v0.55a0.49,0.49 0,0 0,0.4 0.48A2.54,2.54 0,0 1,3.5 15a2.48,2.48 0,0 1,0 4ZM18,14.5a2.51,2.51 0,0 1,2.49 2.76,2.61 2.61,0 0,1 -2.64,2.24H5.1a3.92,3.92 0,0 0,0 -5Z" + android:fillColor="#2f45a6" /> diff --git a/app/src/main/res/drawable/ic_bottom_books_s.xml b/app/src/main/res/drawable/ic_bottom_books_s.xml index 7ab340659..0c6d1144b 100644 --- a/app/src/main/res/drawable/ic_bottom_books_s.xml +++ b/app/src/main/res/drawable/ic_bottom_books_s.xml @@ -1,18 +1,41 @@ - - - + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_bottom_explore_e.xml b/app/src/main/res/drawable/ic_bottom_explore_e.xml index 13db8dc28..37f7a5929 100644 --- a/app/src/main/res/drawable/ic_bottom_explore_e.xml +++ b/app/src/main/res/drawable/ic_bottom_explore_e.xml @@ -4,9 +4,9 @@ android:viewportWidth="24" android:viewportHeight="24"> + android:pathData="M12,3.5A8.5,8.5 0,1 1,3.5 12,8.51 8.51,0 0,1 12,3.5M12,2A10,10 0,1 0,22 12,10 10,0 0,0 12,2Z" + android:fillColor="#2f45a6" /> + android:pathData="M14.23,9.82 L13,12.91 9.87,14.18l1.27,-3.09 3.09,-1.27m2.38,-2.57h-0.08L10.06,9.9A0.2,0.2 0,0 0,10 10L7.31,16.48a0.2,0.2 0,0 0,0.18 0.27h0.08L14,14.1a0.2,0.2 0,0 0,0.11 -0.11l2.64,-6.47a0.2,0.2 0,0 0,-0.18 -0.27Z" + android:fillColor="#2f45a6" /> diff --git a/app/src/main/res/drawable/ic_bottom_explore_s.xml b/app/src/main/res/drawable/ic_bottom_explore_s.xml index df805a464..be7cba1eb 100644 --- a/app/src/main/res/drawable/ic_bottom_explore_s.xml +++ b/app/src/main/res/drawable/ic_bottom_explore_s.xml @@ -1,10 +1,24 @@ - + + + + + + + + diff --git a/app/src/main/res/drawable/ic_bottom_person_e.xml b/app/src/main/res/drawable/ic_bottom_person_e.xml index 2ddd441dc..e14f45566 100644 --- a/app/src/main/res/drawable/ic_bottom_person_e.xml +++ b/app/src/main/res/drawable/ic_bottom_person_e.xml @@ -4,9 +4,9 @@ android:viewportWidth="24" android:viewportHeight="24"> + android:pathData="M4.5,20A3.5,3.5 0,0 1,8 16.5h8A3.5,3.5 0,0 1,19.5 20v2h0.7a0.8,0.8 0,0 0,0.8 -0.8V20a5,5 0,0 0,-5 -5H8a5,5 0,0 0,-5 5v1.2a0.8,0.8 0,0 0,0.8 0.8h0.7Z" + android:fillColor="#2f45a6" /> + android:pathData="M12,3.5a4,4 0,1 1,-4 4,4 4,0 0,1 4,-4M12,2a5.5,5.5 0,1 0,5.5 5.5A5.5,5.5 0,0 0,12 2Z" + android:fillColor="#2f45a6" /> diff --git a/app/src/main/res/drawable/ic_bottom_person_s.xml b/app/src/main/res/drawable/ic_bottom_person_s.xml index d2a5d99d8..be5213686 100644 --- a/app/src/main/res/drawable/ic_bottom_person_s.xml +++ b/app/src/main/res/drawable/ic_bottom_person_s.xml @@ -1,14 +1,41 @@ - - + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_bottom_rss_feed_e.xml b/app/src/main/res/drawable/ic_bottom_rss_feed_e.xml index 2575ba9d4..08f219fcb 100644 --- a/app/src/main/res/drawable/ic_bottom_rss_feed_e.xml +++ b/app/src/main/res/drawable/ic_bottom_rss_feed_e.xml @@ -3,10 +3,10 @@ android:height="24dp" android:viewportWidth="24" android:viewportHeight="24"> - - + + diff --git a/app/src/main/res/drawable/ic_bottom_rss_feed_s.xml b/app/src/main/res/drawable/ic_bottom_rss_feed_s.xml index 4105b0154..60374f709 100644 --- a/app/src/main/res/drawable/ic_bottom_rss_feed_s.xml +++ b/app/src/main/res/drawable/ic_bottom_rss_feed_s.xml @@ -1,9 +1,24 @@ - + + + + + + + + From 475dd5f21d34ab4c4bdba60f19cab4edc671424a Mon Sep 17 00:00:00 2001 From: kunfei Date: Sun, 15 Mar 2020 10:20:58 +0800 Subject: [PATCH 23/47] =?UTF-8?q?feat:=20=E4=BC=98=E5=8C=96=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/build.gradle b/build.gradle index 839736b35..2511f97a1 100644 --- a/build.gradle +++ b/build.gradle @@ -15,6 +15,13 @@ buildscript { classpath 'com.google.gms:google-services:4.3.3' classpath 'io.fabric.tools:gradle:1.31.2' } + gradle.taskGraph.whenReady { + tasks.each { task -> + if (task.name.contains("crashlyticsUploadDeobsAppRelease")) { + task.enabled = false + } + } + } } allprojects { From 8cffb48c5a3a1714b8ba800d09634c36d98c8e44 Mon Sep 17 00:00:00 2001 From: kunfei Date: Sun, 15 Mar 2020 10:46:12 +0800 Subject: [PATCH 24/47] =?UTF-8?q?feat:=20=E4=BC=98=E5=8C=96=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/io/legado/app/help/LauncherIconHelp.kt | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/io/legado/app/help/LauncherIconHelp.kt b/app/src/main/java/io/legado/app/help/LauncherIconHelp.kt index 76bcd6116..70f72f55a 100644 --- a/app/src/main/java/io/legado/app/help/LauncherIconHelp.kt +++ b/app/src/main/java/io/legado/app/help/LauncherIconHelp.kt @@ -5,10 +5,7 @@ import android.content.pm.PackageManager import android.os.Build import io.legado.app.App import io.legado.app.R -import io.legado.app.ui.welcome.Launcher1 -import io.legado.app.ui.welcome.Launcher2 -import io.legado.app.ui.welcome.Launcher3 -import io.legado.app.ui.welcome.WelcomeActivity +import io.legado.app.ui.welcome.* import org.jetbrains.anko.toast /** @@ -20,7 +17,8 @@ object LauncherIconHelp { private val componentNames = arrayListOf( ComponentName(App.INSTANCE, Launcher1::class.java.name), ComponentName(App.INSTANCE, Launcher2::class.java.name), - ComponentName(App.INSTANCE, Launcher3::class.java.name) + ComponentName(App.INSTANCE, Launcher3::class.java.name), + ComponentName(App.INSTANCE, Launcher4::class.java.name) ) fun changeIcon(icon: String?) { From f2c223a9789358ec994641ab259576a2173ba052 Mon Sep 17 00:00:00 2001 From: kunfei Date: Sun, 15 Mar 2020 13:53:37 +0800 Subject: [PATCH 25/47] =?UTF-8?q?feat:=20=E4=BC=98=E5=8C=96=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../io/legado/app/service/help/ReadBook.kt | 19 ++++++++++++++----- .../app/ui/book/read/ReadBookViewModel.kt | 8 ++++++-- 2 files changed, 20 insertions(+), 7 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 85f2fff45..7b61ca628 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 @@ -36,7 +36,7 @@ object ReadBook { var webBook: WebBook? = null private val loadingChapters = arrayListOf() - fun resetData(book: Book) { + fun resetData(book: Book, noSource: () -> Unit) { this.book = book titleDate.postValue(book.name) durChapterIndex = book.durChapterIndex @@ -46,12 +46,21 @@ object ReadBook { prevTextChapter = null curTextChapter = null nextTextChapter = null - upWebBook(book.origin) + upWebBook(book.origin, noSource) } - fun upWebBook(origin: String) { - val bookSource = App.db.bookSourceDao().getBookSource(origin) - webBook = if (bookSource != null) WebBook(bookSource) else null + fun upWebBook(origin: String, noSource: () -> Unit) { + if (origin == BookType.local) { + webBook = null + } else { + val bookSource = App.db.bookSourceDao().getBookSource(origin) + if (bookSource != null) { + webBook = WebBook(bookSource) + } else { + webBook = null + noSource.invoke() + } + } } fun moveToNextPage() { 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 2ebab7875..2ce667b14 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 @@ -39,7 +39,9 @@ class ReadBookViewModel(application: Application) : BaseViewModel(application) { private fun initBook(book: Book) { if (ReadBook.book?.bookUrl != book.bookUrl) { - ReadBook.resetData(book) + ReadBook.resetData(book) { + autoChangeSource() + } isInitFinish = true ReadBook.chapterSize = App.db.bookChapterDao().getChapterCount(book.bookUrl) if (ReadBook.chapterSize == 0) { @@ -60,7 +62,9 @@ class ReadBookViewModel(application: Application) : BaseViewModel(application) { } else { isInitFinish = true ReadBook.titleDate.postValue(book.name) - ReadBook.upWebBook(book.origin) + ReadBook.upWebBook(book.origin) { + autoChangeSource() + } ReadBook.chapterSize = App.db.bookChapterDao().getChapterCount(book.bookUrl) if (ReadBook.chapterSize == 0) { if (book.tocUrl.isEmpty()) { From a767619320ea9efaa1a16c9cb6c35287f9172c54 Mon Sep 17 00:00:00 2001 From: kunfei Date: Sun, 15 Mar 2020 17:45:51 +0800 Subject: [PATCH 26/47] =?UTF-8?q?feat:=20=E4=BC=98=E5=8C=96=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 7 ------- 1 file changed, 7 deletions(-) diff --git a/build.gradle b/build.gradle index 2511f97a1..839736b35 100644 --- a/build.gradle +++ b/build.gradle @@ -15,13 +15,6 @@ buildscript { classpath 'com.google.gms:google-services:4.3.3' classpath 'io.fabric.tools:gradle:1.31.2' } - gradle.taskGraph.whenReady { - tasks.each { task -> - if (task.name.contains("crashlyticsUploadDeobsAppRelease")) { - task.enabled = false - } - } - } } allprojects { From 9588c1a62213a9ae9900752c291690f5f469abfe Mon Sep 17 00:00:00 2001 From: kunfei Date: Sun, 15 Mar 2020 18:48:03 +0800 Subject: [PATCH 27/47] =?UTF-8?q?feat:=20=E4=BC=98=E5=8C=96=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../io/legado/app/data/dao/BookSourceDao.kt | 5 ++- .../main/java/io/legado/app/model/WebBook.kt | 42 +++++++++++-------- .../io/legado/app/service/help/ReadBook.kt | 15 +++---- .../app/ui/book/read/ReadBookViewModel.kt | 31 ++++++++++---- .../app/ui/book/read/page/TextPageFactory.kt | 9 ++++ 5 files changed, 69 insertions(+), 33 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 9ce5c65be..55d5ada4c 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 @@ -50,9 +50,12 @@ interface BookSourceDao { @get:Query("select * from book_sources order by customOrder asc") val all: List - @get:Query("select * from book_sources where enabled = 1 order by customOrder asc") + @get:Query("select * from book_sources where enabled = 1 order by customOrder") val allEnabled: List + @get:Query("select * from book_sources where enabled = 1 and bookSourceType = 0 order by customOrder") + val allTextEnabled: List + @Query("select * from book_sources where bookSourceUrl = :key") fun getBookSource(key: String): BookSource? diff --git a/app/src/main/java/io/legado/app/model/WebBook.kt b/app/src/main/java/io/legado/app/model/WebBook.kt index 69dfb943c..7d14ea8bc 100644 --- a/app/src/main/java/io/legado/app/model/WebBook.kt +++ b/app/src/main/java/io/legado/app/model/WebBook.kt @@ -29,26 +29,34 @@ class WebBook(val bookSource: BookSource) { context: CoroutineContext = Dispatchers.IO ): Coroutine> { return Coroutine.async(scope, context) { - bookSource.searchUrl?.let { searchUrl -> - val analyzeUrl = AnalyzeUrl( - ruleUrl = searchUrl, - key = key, - page = page, - baseUrl = sourceUrl, - headerMapF = bookSource.getHeaderMap() - ) - val res = analyzeUrl.getResponseAwait(bookSource.bookSourceUrl) - BookList.analyzeBookList( - res.body, - bookSource, - analyzeUrl, - res.url, - true - ) - } ?: arrayListOf() + searchBookSuspend(key, page) } } + suspend fun searchBookSuspend( + key: String, + page: Int? = 1 + ): ArrayList { + bookSource.searchUrl?.let { searchUrl -> + val analyzeUrl = AnalyzeUrl( + ruleUrl = searchUrl, + key = key, + page = page, + baseUrl = sourceUrl, + headerMapF = bookSource.getHeaderMap() + ) + val res = analyzeUrl.getResponseAwait(bookSource.bookSourceUrl) + return BookList.analyzeBookList( + res.body, + bookSource, + analyzeUrl, + res.url, + true + ) + } + return arrayListOf() + } + /** * 发现 */ 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 7b61ca628..a05009dc8 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 @@ -21,7 +21,6 @@ import org.jetbrains.anko.toast object ReadBook { - var titleDate = MutableLiveData() var book: Book? = null var inBookshelf = false @@ -34,9 +33,10 @@ object ReadBook { var curTextChapter: TextChapter? = null var nextTextChapter: TextChapter? = null var webBook: WebBook? = null + var msg: String? = null private val loadingChapters = arrayListOf() - fun resetData(book: Book, noSource: () -> Unit) { + fun resetData(book: Book, noSource: (name: String, author: String) -> Unit) { this.book = book titleDate.postValue(book.name) durChapterIndex = book.durChapterIndex @@ -46,19 +46,20 @@ object ReadBook { prevTextChapter = null curTextChapter = null nextTextChapter = null - upWebBook(book.origin, noSource) + upWebBook(book, noSource) } - fun upWebBook(origin: String, noSource: () -> Unit) { - if (origin == BookType.local) { + fun upWebBook(book: Book?, noSource: (name: String, author: String) -> Unit) { + book ?: return + if (book.origin == BookType.local) { webBook = null } else { - val bookSource = App.db.bookSourceDao().getBookSource(origin) + val bookSource = App.db.bookSourceDao().getBookSource(book.origin) if (bookSource != null) { webBook = WebBook(bookSource) } else { webBook = null - noSource.invoke() + noSource.invoke(book.name, book.author) } } } 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 2ce667b14..3519f3b08 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 @@ -39,8 +39,8 @@ class ReadBookViewModel(application: Application) : BaseViewModel(application) { private fun initBook(book: Book) { if (ReadBook.book?.bookUrl != book.bookUrl) { - ReadBook.resetData(book) { - autoChangeSource() + ReadBook.resetData(book) { name, author -> + autoChangeSource(name, author) } isInitFinish = true ReadBook.chapterSize = App.db.bookChapterDao().getChapterCount(book.bookUrl) @@ -62,8 +62,8 @@ class ReadBookViewModel(application: Application) : BaseViewModel(application) { } else { isInitFinish = true ReadBook.titleDate.postValue(book.name) - ReadBook.upWebBook(book.origin) { - autoChangeSource() + ReadBook.upWebBook(book) { name, author -> + autoChangeSource(name, author) } ReadBook.chapterSize = App.db.bookChapterDao().getChapterCount(book.bookUrl) if (ReadBook.chapterSize == 0) { @@ -126,7 +126,7 @@ class ReadBookViewModel(application: Application) : BaseViewModel(application) { } }?.onError { toast(R.string.error_load_toc) - } ?: autoChangeSource() + } ?: autoChangeSource(book.name, book.author) } } } @@ -155,8 +155,23 @@ class ReadBookViewModel(application: Application) : BaseViewModel(application) { } } - private fun autoChangeSource() { + private fun autoChangeSource(name: String, author: String) { + execute { + App.db.bookSourceDao().allTextEnabled.forEach { + try { + val searchBooks = WebBook(it).searchBookSuspend(name) + + } catch (e: Exception) { + } + } + }.onStart { + ReadBook.msg = "正在自动换源" + ReadBook.callBack?.upContent() + }.onFinally { + ReadBook.msg = null + ReadBook.callBack?.upContent() + } } private fun upChangeDurChapterIndex(book: Book, chapters: List) { @@ -212,9 +227,9 @@ class ReadBookViewModel(application: Application) : BaseViewModel(application) { execute { App.db.bookChapterDao().getChapter(book.bookUrl, ReadBook.durChapterIndex) ?.let { chapter -> - BookHelp.delContent(book, chapter) + BookHelp.delContent(book, chapter) ReadBook.loadContent(ReadBook.durChapterIndex) - } + } } } diff --git a/app/src/main/java/io/legado/app/ui/book/read/page/TextPageFactory.kt b/app/src/main/java/io/legado/app/ui/book/read/page/TextPageFactory.kt index a867daf3d..27a407cd6 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/page/TextPageFactory.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/page/TextPageFactory.kt @@ -59,6 +59,9 @@ class TextPageFactory(dataSource: DataSource) : PageFactory(dataSource override val currentPage: TextPage get() = with(dataSource) { + ReadBook.msg?.let { + return@with TextPage(text = it).format() + } currentChapter?.let { return@with it.page(pageIndex) ?: TextPage(title = it.title).format() @@ -68,6 +71,9 @@ class TextPageFactory(dataSource: DataSource) : PageFactory(dataSource override val nextPage: TextPage get() = with(dataSource) { + ReadBook.msg?.let { + return@with TextPage(text = it).format() + } currentChapter?.let { if (pageIndex < it.pageSize() - 1) { return@with it.page(pageIndex + 1)?.removePageAloudSpan() @@ -86,6 +92,9 @@ class TextPageFactory(dataSource: DataSource) : PageFactory(dataSource override val prevPage: TextPage get() = with(dataSource) { + ReadBook.msg?.let { + return@with TextPage(text = it).format() + } if (pageIndex > 0) { currentChapter?.let { return@with it.page(pageIndex - 1)?.removePageAloudSpan() From 10d239cef568ae0900640b29fca1d4a1db748fe2 Mon Sep 17 00:00:00 2001 From: kunfei Date: Sun, 15 Mar 2020 19:03:27 +0800 Subject: [PATCH 28/47] =?UTF-8?q?feat:=20=E4=BC=98=E5=8C=96=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/ui/main/bookshelf/books/BooksAdapterGrid.kt | 2 -- app/src/main/res/layout/item_bookshelf_grid.xml | 13 ------------- 2 files changed, 15 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/main/bookshelf/books/BooksAdapterGrid.kt b/app/src/main/java/io/legado/app/ui/main/bookshelf/books/BooksAdapterGrid.kt index d647afd3b..1438c4507 100644 --- a/app/src/main/java/io/legado/app/ui/main/bookshelf/books/BooksAdapterGrid.kt +++ b/app/src/main/java/io/legado/app/ui/main/bookshelf/books/BooksAdapterGrid.kt @@ -21,7 +21,6 @@ class BooksAdapterGrid(context: Context, private val callBack: CallBack) : if (bundle == null) { ATH.applyBackgroundTint(this) tv_name.text = item.name - bv_author.text = item.author iv_cover.load(item.getDisplayCover(), item.name, item.author) if (item.origin != BookType.local && callBack.isUpdate(item.bookUrl)) { bv_unread.invisible() @@ -35,7 +34,6 @@ class BooksAdapterGrid(context: Context, private val callBack: CallBack) : bundle.keySet().map { when (it) { "name" -> tv_name.text = item.name - "author" -> bv_author.text = item.author "cover" -> iv_cover.load(item.getDisplayCover(), item.name, item.author) "refresh" -> if (item.origin != BookType.local && callBack.isUpdate(item.bookUrl)) { bv_unread.invisible() diff --git a/app/src/main/res/layout/item_bookshelf_grid.xml b/app/src/main/res/layout/item_bookshelf_grid.xml index 666d67098..a038fa4fb 100644 --- a/app/src/main/res/layout/item_bookshelf_grid.xml +++ b/app/src/main/res/layout/item_bookshelf_grid.xml @@ -48,19 +48,6 @@ tools:ignore="RtlHardcoded" /> - - Date: Sun, 15 Mar 2020 19:13:20 +0800 Subject: [PATCH 29/47] =?UTF-8?q?feat:=20=E4=BC=98=E5=8C=96=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/io/legado/app/ui/book/group/GroupManageDialog.kt | 2 ++ .../io/legado/app/ui/rss/source/manage/GroupManageDialog.kt | 6 ++---- app/src/main/res/layout/dialog_recycler_view.xml | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/book/group/GroupManageDialog.kt b/app/src/main/java/io/legado/app/ui/book/group/GroupManageDialog.kt index 1086f0416..8be9ed34f 100644 --- a/app/src/main/java/io/legado/app/ui/book/group/GroupManageDialog.kt +++ b/app/src/main/java/io/legado/app/ui/book/group/GroupManageDialog.kt @@ -33,6 +33,7 @@ import io.legado.app.ui.widget.recycler.VerticalDivider import io.legado.app.utils.applyTint import io.legado.app.utils.getViewModel import io.legado.app.utils.requestInputMethod +import io.legado.app.utils.visible import kotlinx.android.synthetic.main.dialog_edit_text.view.* import kotlinx.android.synthetic.main.dialog_recycler_view.* import kotlinx.android.synthetic.main.item_group_manage.view.* @@ -74,6 +75,7 @@ class GroupManageDialog : DialogFragment(), Toolbar.OnMenuItemClickListener { recycler_view.addItemDecoration(VerticalDivider(requireContext())) recycler_view.adapter = adapter tv_ok.setTextColor(requireContext().accentColor) + tv_ok.visible() tv_ok.onClick { dismiss() } App.db.bookGroupDao().liveDataAll().observe(viewLifecycleOwner, Observer { val diffResult = diff --git a/app/src/main/java/io/legado/app/ui/rss/source/manage/GroupManageDialog.kt b/app/src/main/java/io/legado/app/ui/rss/source/manage/GroupManageDialog.kt index ed09cec93..ce2313f5a 100644 --- a/app/src/main/java/io/legado/app/ui/rss/source/manage/GroupManageDialog.kt +++ b/app/src/main/java/io/legado/app/ui/rss/source/manage/GroupManageDialog.kt @@ -24,10 +24,7 @@ import io.legado.app.lib.dialogs.noButton import io.legado.app.lib.dialogs.yesButton import io.legado.app.lib.theme.accentColor import io.legado.app.ui.widget.recycler.VerticalDivider -import io.legado.app.utils.applyTint -import io.legado.app.utils.getViewModelOfActivity -import io.legado.app.utils.requestInputMethod -import io.legado.app.utils.splitNotBlank +import io.legado.app.utils.* import kotlinx.android.synthetic.main.dialog_edit_text.view.* import kotlinx.android.synthetic.main.dialog_recycler_view.* import kotlinx.android.synthetic.main.item_group_manage.view.* @@ -68,6 +65,7 @@ class GroupManageDialog : DialogFragment(), Toolbar.OnMenuItemClickListener { recycler_view.addItemDecoration(VerticalDivider(requireContext())) recycler_view.adapter = adapter tv_ok.setTextColor(requireContext().accentColor) + tv_ok.visible() tv_ok.onClick { dismiss() } App.db.rssSourceDao().liveGroup().observe(viewLifecycleOwner, Observer { val groups = linkedSetOf() diff --git a/app/src/main/res/layout/dialog_recycler_view.xml b/app/src/main/res/layout/dialog_recycler_view.xml index 98f67043f..5b1d900a9 100644 --- a/app/src/main/res/layout/dialog_recycler_view.xml +++ b/app/src/main/res/layout/dialog_recycler_view.xml @@ -15,7 +15,7 @@ android:id="@+id/recycler_view" android:background="@color/background_card" android:layout_width="match_parent" - android:layout_height="match_parent" + android:layout_height="0dp" android:layout_weight="1" /> From ba0937e2430b98925a9e233f6cc7635beb1ad0ee Mon Sep 17 00:00:00 2001 From: kunfei Date: Sun, 15 Mar 2020 19:41:14 +0800 Subject: [PATCH 30/47] =?UTF-8?q?feat:=20=E4=BC=98=E5=8C=96=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= 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/ReadBookViewModel.kt | 13 +++++++++---- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/app/src/main/assets/updateLog.md b/app/src/main/assets/updateLog.md index 8f2068940..250688fe3 100644 --- a/app/src/main/assets/updateLog.md +++ b/app/src/main/assets/updateLog.md @@ -2,6 +2,9 @@ * 旧版数据导入教程:先在旧版阅读(2.x)中进行备份,然后在新版阅读(3.x)【我的】->【备份与恢复】,选择【导入旧版本数据】。 * 请关注[开源阅读软件]()支持我,同时关注合作公众号[小说拾遗](),阅读公众号小编。 +**2020/03/14** +* 加载正文无书源时自动换源 + **2020/03/14** * 修改导航栏图标 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 3519f3b08..75021a323 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 @@ -157,12 +157,17 @@ class ReadBookViewModel(application: Application) : BaseViewModel(application) { private fun autoChangeSource(name: String, author: String) { execute { - App.db.bookSourceDao().allTextEnabled.forEach { + App.db.bookSourceDao().allTextEnabled.forEach { source -> try { - val searchBooks = WebBook(it).searchBookSuspend(name) - + val searchBooks = WebBook(source).searchBookSuspend(name) + searchBooks.getOrNull(0)?.let { + if (it.name == name && (it.author == author || author == "")) { + changeTo(it.toBook()) + return@forEach + } + } } catch (e: Exception) { - + //nothing } } }.onStart { From 1523fd6487dd66695c68d64c951f9ddd0cc25745 Mon Sep 17 00:00:00 2001 From: kunfei Date: Sun, 15 Mar 2020 19:48:25 +0800 Subject: [PATCH 31/47] =?UTF-8?q?feat:=20=E4=BC=98=E5=8C=96=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/io/legado/app/utils/DocumentUtils.kt | 2 +- app/src/main/res/menu/main_bnv.xml | 22 +++++++++---------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/app/src/main/java/io/legado/app/utils/DocumentUtils.kt b/app/src/main/java/io/legado/app/utils/DocumentUtils.kt index f4fd0e8eb..b53cebb14 100644 --- a/app/src/main/java/io/legado/app/utils/DocumentUtils.kt +++ b/app/src/main/java/io/legado/app/utils/DocumentUtils.kt @@ -98,7 +98,7 @@ object DocumentUtils { DocumentsContract.Document.COLUMN_LAST_MODIFIED, DocumentsContract.Document.COLUMN_SIZE, DocumentsContract.Document.COLUMN_MIME_TYPE - ), null, null, null + ), null, null, DocumentsContract.Document.COLUMN_DISPLAY_NAME ) c?.let { val ici = c.getColumnIndex(DocumentsContract.Document.COLUMN_DOCUMENT_ID) diff --git a/app/src/main/res/menu/main_bnv.xml b/app/src/main/res/menu/main_bnv.xml index 15b355b31..9197bec7b 100644 --- a/app/src/main/res/menu/main_bnv.xml +++ b/app/src/main/res/menu/main_bnv.xml @@ -4,20 +4,20 @@ tools:showIn="bottom_navigation_view"> + android:id="@+id/menu_bookshelf" + android:icon="@drawable/ic_bottom_books" + android:title="@string/bookshelf" /> + android:title="@string/find" /> + android:id="@+id/menu_rss" + android:icon="@drawable/ic_bottom_rss_feed" + android:title="@string/rss" /> + android:id="@+id/menu_my_config" + android:icon="@drawable/ic_bottom_person" + android:title="@string/my" /> From e65efa516947cd4253d95af41071ded9dbb5eb44 Mon Sep 17 00:00:00 2001 From: kunfei Date: Sun, 15 Mar 2020 19:58:52 +0800 Subject: [PATCH 32/47] =?UTF-8?q?feat:=20=E4=BC=98=E5=8C=96=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/io/legado/app/data/entities/Book.kt | 2 +- app/src/main/res/values/strings.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/io/legado/app/data/entities/Book.kt b/app/src/main/java/io/legado/app/data/entities/Book.kt index 833561f1b..d9acbb34e 100644 --- a/app/src/main/java/io/legado/app/data/entities/Book.kt +++ b/app/src/main/java/io/legado/app/data/entities/Book.kt @@ -32,7 +32,7 @@ data class Book( var customIntro: String? = null, // 简介内容(用户修改) var charset: String? = null, // 自定义字符集名称(仅适用于本地书籍) var type: Int = 0, // @BookType - var group: Int = 0, // 自定义分组索引号 + var group: Int = 1, // 自定义分组索引号 var latestChapterTitle: String? = null, // 最新章节标题 var latestChapterTime: Long = System.currentTimeMillis(), // 最新章节标题更新时间 var lastCheckTime: Long = System.currentTimeMillis(), // 最近一次更新书籍信息的时间 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index a505fa785..4e5410f09 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -225,7 +225,7 @@ 内容简介 简介:%s 打开外部书籍 - 来源:%s + 来源: %s 本地导入 导入在线规则 检查更新间隔 From 8a3febd0074f3713168393ac7a32775275fc9a7e Mon Sep 17 00:00:00 2001 From: kunfei Date: Sun, 15 Mar 2020 20:01:00 +0800 Subject: [PATCH 33/47] =?UTF-8?q?feat:=20=E4=BC=98=E5=8C=96=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/io/legado/app/data/entities/Book.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/io/legado/app/data/entities/Book.kt b/app/src/main/java/io/legado/app/data/entities/Book.kt index d9acbb34e..9e50a6d4c 100644 --- a/app/src/main/java/io/legado/app/data/entities/Book.kt +++ b/app/src/main/java/io/legado/app/data/entities/Book.kt @@ -31,7 +31,7 @@ data class Book( var intro: String? = null, // 简介内容(书源获取) var customIntro: String? = null, // 简介内容(用户修改) var charset: String? = null, // 自定义字符集名称(仅适用于本地书籍) - var type: Int = 0, // @BookType + var type: Int = 0, // 0:text 1:audio var group: Int = 1, // 自定义分组索引号 var latestChapterTitle: String? = null, // 最新章节标题 var latestChapterTime: Long = System.currentTimeMillis(), // 最新章节标题更新时间 From 0a3791f87f4b0c83f24c44deb034f72d49dfbf7e Mon Sep 17 00:00:00 2001 From: kunfei Date: Sun, 15 Mar 2020 20:15:15 +0800 Subject: [PATCH 34/47] =?UTF-8?q?feat:=20=E4=BC=98=E5=8C=96=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/res/values/dimens.xml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index 6b7b8e2b1..b1a2429b4 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -1,11 +1,12 @@ - + 16dp 16dp 8dp 176dp 16dp - + 12sp + 12sp 14sp 16sp From 1348b431986cb6c317507d1d9f15bfcd10706a04 Mon Sep 17 00:00:00 2001 From: kunfei Date: Sun, 15 Mar 2020 20:21:59 +0800 Subject: [PATCH 35/47] =?UTF-8?q?feat:=20=E4=BC=98=E5=8C=96=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/io/legado/app/lib/theme/ATH.kt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/app/src/main/java/io/legado/app/lib/theme/ATH.kt b/app/src/main/java/io/legado/app/lib/theme/ATH.kt index 0bcbb114b..19304862c 100644 --- a/app/src/main/java/io/legado/app/lib/theme/ATH.kt +++ b/app/src/main/java/io/legado/app/lib/theme/ATH.kt @@ -199,13 +199,12 @@ object ATH { fun applyBottomNavigationColor(bottomBar: BottomNavigationView?) { bottomBar?.apply { - setBackgroundColor(ThemeStore.backgroundColor(context)) + setBackgroundColor(ThemeStore.bottomBackground(context)) val colorStateList = Selector.colorBuild() .setDefaultColor(context.getCompatColor(R.color.btn_bg_press_tp)) .setSelectedColor(ThemeStore.accentColor(bottom_navigation_view.context)).create() itemIconTintList = colorStateList itemTextColor = colorStateList - setBackgroundColor(ThemeStore.bottomBackground(context)) } } From 3e7fb6193e5f8c4b0015afb3eee503bbb467dffb Mon Sep 17 00:00:00 2001 From: kunfei Date: Sun, 15 Mar 2020 20:26:48 +0800 Subject: [PATCH 36/47] =?UTF-8?q?feat:=20=E4=BC=98=E5=8C=96=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/res/layout/activity_main.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 9f2d2044e..a36be8b9d 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -11,6 +11,7 @@ android:elevation="10dp" android:background="@color/background" app:labelVisibilityMode="labeled" + app:itemIconSize="26dp" app:menu="@menu/main_bnv" app:layout_constraintBottom_toBottomOf="parent" /> From 81492a19a2fd5c38ccabdf5edd13935817ebc682 Mon Sep 17 00:00:00 2001 From: kunfei Date: Sun, 15 Mar 2020 20:36:22 +0800 Subject: [PATCH 37/47] =?UTF-8?q?feat:=20=E4=BC=98=E5=8C=96=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/res/layout/activity_main.xml | 3 +-- app/src/main/res/values/dimens.xml | 4 +--- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index a36be8b9d..77ed85415 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -10,8 +10,7 @@ android:layout_height="wrap_content" android:elevation="10dp" android:background="@color/background" - app:labelVisibilityMode="labeled" - app:itemIconSize="26dp" + app:labelVisibilityMode="unlabeled" app:menu="@menu/main_bnv" app:layout_constraintBottom_toBottomOf="parent" /> diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index b1a2429b4..f7ecf2030 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -1,12 +1,10 @@ - + 16dp 16dp 8dp 176dp 16dp - 12sp - 12sp 14sp 16sp From e14498b9e81ae73c90f16ad0ed9aa13dd096ea3e Mon Sep 17 00:00:00 2001 From: kunfei Date: Sun, 15 Mar 2020 21:08:26 +0800 Subject: [PATCH 38/47] =?UTF-8?q?feat:=20=E4=BC=98=E5=8C=96=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/assets/help.md | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/assets/help.md b/app/src/main/assets/help.md index 124410667..145139a13 100644 --- a/app/src/main/assets/help.md +++ b/app/src/main/assets/help.md @@ -9,6 +9,7 @@ * 左下角选择书源文件所在的路径; * 点击书源文件导入; * 导入后返回书源管理界面; +* 新版qq下载路径:Android/data/com.tencent.mobileqq/Tencent/QQfile_recv/ 3.如何新建大佬发的单独书源? * 复制书源代码; From 94b71960669162801f9e935b556f42920599b517 Mon Sep 17 00:00:00 2001 From: kunfei Date: Mon, 16 Mar 2020 15:41:46 +0800 Subject: [PATCH 39/47] =?UTF-8?q?feat:=20=E4=BC=98=E5=8C=96=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/res/layout/dialog_read_aloud.xml | 6 +++++- app/src/main/res/values/strings.xml | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/layout/dialog_read_aloud.xml b/app/src/main/res/layout/dialog_read_aloud.xml index 278117426..504865171 100644 --- a/app/src/main/res/layout/dialog_read_aloud.xml +++ b/app/src/main/res/layout/dialog_read_aloud.xml @@ -221,6 +221,7 @@ android:layout_gravity="center_horizontal" android:layout_marginTop="3dp" android:text="@string/chapter_list" + android:maxLines="1" android:textColor="@color/tv_text_default" android:textSize="12sp" /> @@ -256,6 +257,7 @@ android:layout_gravity="center_horizontal" android:layout_marginTop="3dp" android:text="@string/main_menu" + android:maxLines="1" android:textColor="@color/tv_text_default" android:textSize="12sp" /> @@ -291,6 +293,7 @@ android:layout_gravity="center_horizontal" android:layout_marginTop="3dp" android:text="@string/to_backstage" + android:maxLines="1" android:textColor="@color/tv_text_default" android:textSize="12sp" /> @@ -325,7 +328,8 @@ android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:layout_marginTop="3dp" - android:text="@string/aloud_config" + android:text="@string/setting" + android:maxLines="1" android:textColor="@color/tv_text_default" android:textSize="12sp" /> diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 4e5410f09..41c3005f7 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -581,7 +581,7 @@ 类型: 文本 音频 - 转到后台 + 后台 正在导入 正在导出 自定义翻页按键 From c35c9d02672accc0a68558f4a91aa19dbe30e796 Mon Sep 17 00:00:00 2001 From: kunfei Date: Mon, 16 Mar 2020 18:41:09 +0800 Subject: [PATCH 40/47] =?UTF-8?q?feat:=20=E4=BC=98=E5=8C=96=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= 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 ++ app/src/main/java/io/legado/app/ui/main/MainActivity.kt | 8 -------- 2 files changed, 2 insertions(+), 8 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 138d676be..6d636f728 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 @@ -25,6 +25,7 @@ import io.legado.app.data.entities.BookChapter import io.legado.app.help.BookHelp import io.legado.app.help.ReadBookConfig import io.legado.app.help.coroutine.Coroutine +import io.legado.app.help.storage.Backup import io.legado.app.help.storage.SyncBookProgress import io.legado.app.lib.dialogs.alert import io.legado.app.lib.dialogs.noButton @@ -684,6 +685,7 @@ class ReadBookActivity : VMBaseActivity(R.layout.activity_boo page_view.onDestroy() if (!BuildConfig.DEBUG) { SyncBookProgress.uploadBookProgress() + Backup.autoBack(this) } } diff --git a/app/src/main/java/io/legado/app/ui/main/MainActivity.kt b/app/src/main/java/io/legado/app/ui/main/MainActivity.kt index 96424cc9b..0aa49ede7 100644 --- a/app/src/main/java/io/legado/app/ui/main/MainActivity.kt +++ b/app/src/main/java/io/legado/app/ui/main/MainActivity.kt @@ -15,7 +15,6 @@ import io.legado.app.base.VMBaseActivity import io.legado.app.constant.EventBus import io.legado.app.constant.PreferKey import io.legado.app.help.AppConfig -import io.legado.app.help.storage.Backup import io.legado.app.lib.theme.ATH import io.legado.app.service.BaseReadAloudService import io.legado.app.service.help.ReadAloud @@ -114,13 +113,6 @@ class MainActivity : VMBaseActivity(R.layout.activity_main), return super.onKeyUp(keyCode, event) } - override fun finish() { - if (!BuildConfig.DEBUG) { - Backup.autoBack(this) - } - super.finish() - } - override fun onDestroy() { super.onDestroy() ReadAloud.stop(this) From 12a90a4531d8def1667d0e66ddef7e66651bbf5b Mon Sep 17 00:00:00 2001 From: kunfei Date: Mon, 16 Mar 2020 19:33:25 +0800 Subject: [PATCH 41/47] =?UTF-8?q?feat:=20=E4=BC=98=E5=8C=96=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/io/legado/app/ui/book/read/page/ContentView.kt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/io/legado/app/ui/book/read/page/ContentView.kt b/app/src/main/java/io/legado/app/ui/book/read/page/ContentView.kt index 6dc89f716..b748c2b4a 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/page/ContentView.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/page/ContentView.kt @@ -108,8 +108,10 @@ class ContentView(context: Context) : FrameLayout(context) { } } - fun setContent(textPage: TextPage) { + fun setContent(textPage: TextPage, resetPageOffset: Boolean) { setProgress(textPage) + if (resetPageOffset) + resetPageOffset() content_text_view.setContent(textPage) } From bbc5b3637bda8850f9336e5f00f83d18c66359db Mon Sep 17 00:00:00 2001 From: kunfei Date: Mon, 16 Mar 2020 20:06:47 +0800 Subject: [PATCH 42/47] =?UTF-8?q?feat:=20=E4=BC=98=E5=8C=96=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../io/legado/app/help/storage/Restore.kt | 2 +- .../io/legado/app/service/help/ReadBook.kt | 51 +++++++++++-------- .../app/ui/book/read/ReadBookActivity.kt | 14 ++--- .../app/ui/book/read/ReadBookViewModel.kt | 14 ++--- .../app/ui/book/read/page/ContentView.kt | 2 +- .../app/ui/book/read/page/DataSource.kt | 2 +- .../legado/app/ui/book/read/page/PageView.kt | 6 +-- .../app/ui/book/read/page/TextPageFactory.kt | 4 +- 8 files changed, 52 insertions(+), 43 deletions(-) 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 5393249c3..f174a6f5e 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 @@ -128,7 +128,7 @@ object Restore { bodyIndentCount = App.INSTANCE.getPrefInt(PreferKey.bodyIndent, 2) } ChapterProvider.upStyle() - ReadBook.loadContent() + ReadBook.loadContent(resetPageOffset = false) } withContext(Main) { if (AppConfig.isNightTheme && AppCompatDelegate.getDefaultNightMode() != AppCompatDelegate.MODE_NIGHT_YES) { 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 a05009dc8..68b1601ac 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 @@ -79,11 +79,11 @@ object ReadBook { nextTextChapter = null book?.let { if (curTextChapter == null) { - loadContent(durChapterIndex, upContent) + loadContent(durChapterIndex, upContent, false) } else if (upContent) { callBack?.upContent() } - loadContent(durChapterIndex.plus(1), upContent) + loadContent(durChapterIndex.plus(1), upContent, false) GlobalScope.launch(Dispatchers.IO) { for (i in 2..10) { delay(100) @@ -109,11 +109,11 @@ object ReadBook { prevTextChapter = null book?.let { if (curTextChapter == null) { - loadContent(durChapterIndex, upContent) + loadContent(durChapterIndex, upContent, false) } else if (upContent) { callBack?.upContent() } - loadContent(durChapterIndex.minus(1), upContent) + loadContent(durChapterIndex.minus(1), upContent, false) GlobalScope.launch(Dispatchers.IO) { for (i in -5..-2) { delay(100) @@ -194,21 +194,21 @@ object ReadBook { /** * 加载章节内容 */ - fun loadContent() { - loadContent(durChapterIndex) - loadContent(durChapterIndex + 1) - loadContent(durChapterIndex - 1) + fun loadContent(resetPageOffset: Boolean) { + loadContent(durChapterIndex, resetPageOffset = resetPageOffset) + loadContent(durChapterIndex + 1, resetPageOffset = resetPageOffset) + loadContent(durChapterIndex - 1, resetPageOffset = resetPageOffset) } - fun loadContent(index: Int, upContent: Boolean = true) { + fun loadContent(index: Int, upContent: Boolean = true, resetPageOffset: Boolean) { book?.let { book -> if (addLoading(index)) { Coroutine.async { App.db.bookChapterDao().getChapter(book.bookUrl, index)?.let { chapter -> BookHelp.getContent(book, chapter)?.let { - contentLoadFinish(chapter, it, upContent) + contentLoadFinish(chapter, it, upContent, resetPageOffset) removeLoading(chapter.index) - } ?: download(chapter) + } ?: download(chapter, resetPageOffset = resetPageOffset) } ?: removeLoading(index) }.onError { removeLoading(index) @@ -226,7 +226,7 @@ object ReadBook { if (BookHelp.hasContent(book, chapter)) { removeLoading(chapter.index) } else { - download(chapter) + download(chapter, false) } } ?: removeLoading(index) }.onError { @@ -236,20 +236,28 @@ object ReadBook { } } - private fun download(chapter: BookChapter) { + private fun download(chapter: BookChapter, resetPageOffset: Boolean) { book?.let { book -> webBook?.getContent(book, chapter) ?.onSuccess(Dispatchers.IO) { content -> if (content.isNullOrEmpty()) { - contentLoadFinish(chapter, App.INSTANCE.getString(R.string.content_empty)) + contentLoadFinish( + chapter, + App.INSTANCE.getString(R.string.content_empty), + resetPageOffset = resetPageOffset + ) removeLoading(chapter.index) } else { BookHelp.saveContent(book, chapter, content) - contentLoadFinish(chapter, content) + contentLoadFinish(chapter, content, resetPageOffset = resetPageOffset) removeLoading(chapter.index) } }?.onError { - contentLoadFinish(chapter, it.localizedMessage ?: "未知错误") + contentLoadFinish( + chapter, + it.localizedMessage ?: "未知错误", + resetPageOffset = resetPageOffset + ) removeLoading(chapter.index) } } @@ -275,7 +283,8 @@ object ReadBook { private fun contentLoadFinish( chapter: BookChapter, content: String, - upContent: Boolean = true + upContent: Boolean = true, + resetPageOffset: Boolean ) { Coroutine.async { if (chapter.index in durChapterIndex - 1..durChapterIndex + 1) { @@ -289,18 +298,18 @@ object ReadBook { when (chapter.index) { durChapterIndex -> { curTextChapter = ChapterProvider.getTextChapter(chapter, c, chapterSize) - if (upContent) callBack?.upContent() + if (upContent) callBack?.upContent(resetPageOffset = resetPageOffset) callBack?.upView() curPageChanged() callBack?.contentLoadFinish() } durChapterIndex - 1 -> { prevTextChapter = ChapterProvider.getTextChapter(chapter, c, chapterSize) - if (upContent) callBack?.upContent(-1) + if (upContent) callBack?.upContent(-1, resetPageOffset) } durChapterIndex + 1 -> { nextTextChapter = ChapterProvider.getTextChapter(chapter, c, chapterSize) - if (upContent) callBack?.upContent(1) + if (upContent) callBack?.upContent(1, resetPageOffset) } } } @@ -326,7 +335,7 @@ object ReadBook { } interface CallBack { - fun upContent(relativePosition: Int = 0) + fun upContent(relativePosition: Int = 0, resetPageOffset: Boolean = true) fun upView() fun upPageProgress() fun contentLoadFinish() 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 6d636f728..6808baf83 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 @@ -116,7 +116,7 @@ class ReadBookActivity : VMBaseActivity(R.layout.activity_boo override fun onConfigurationChanged(newConfig: Configuration) { super.onConfigurationChanged(newConfig) - ReadBook.loadContent() + ReadBook.loadContent(resetPageOffset = false) } override fun onResume() { @@ -482,9 +482,9 @@ class ReadBookActivity : VMBaseActivity(R.layout.activity_boo /** * 更新内容 */ - override fun upContent(relativePosition: Int) { + override fun upContent(relativePosition: Int, resetPageOffset: Boolean) { launch { - page_view.upContent(relativePosition) + page_view.upContent(relativePosition, resetPageOffset) } } @@ -580,7 +580,7 @@ class ReadBookActivity : VMBaseActivity(R.layout.activity_boo override fun onReplaceRuleSave() { Coroutine.async { BookHelp.upReplaceRules() - ReadBook.loadContent() + ReadBook.loadContent(resetPageOffset = false) } } @@ -709,9 +709,9 @@ class ReadBookActivity : VMBaseActivity(R.layout.activity_boo page_view.upBg() page_view.upStyle() if (it) { - ReadBook.loadContent() + ReadBook.loadContent(resetPageOffset = false) } else { - page_view.upContent() + page_view.upContent(resetPageOffset = false) } } observeEvent(EventBus.ALOUD_STATE) { @@ -720,7 +720,7 @@ class ReadBookActivity : VMBaseActivity(R.layout.activity_boo val page = textChapter.page(ReadBook.durPageIndex) if (page != null) { page.removePageAloudSpan() - page_view.upContent() + page_view.upContent(resetPageOffset = false) } } } 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 75021a323..6c6d52aca 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 @@ -54,7 +54,7 @@ class ReadBookViewModel(application: Application) : BaseViewModel(application) { if (ReadBook.durChapterIndex > ReadBook.chapterSize - 1) { ReadBook.durChapterIndex = ReadBook.chapterSize - 1 } - ReadBook.loadContent() + ReadBook.loadContent(resetPageOffset = true) } if (ReadBook.inBookshelf) { ReadBook.saveRead() @@ -74,7 +74,7 @@ class ReadBookViewModel(application: Application) : BaseViewModel(application) { } } else { if (ReadBook.curTextChapter != null) { - ReadBook.callBack?.upContent() + ReadBook.callBack?.upContent(resetPageOffset = false) } } } @@ -107,7 +107,7 @@ class ReadBookViewModel(application: Application) : BaseViewModel(application) { App.db.bookChapterDao().insert(*it.toTypedArray()) App.db.bookDao().update(book) ReadBook.chapterSize = it.size - ReadBook.loadContent() + ReadBook.loadContent(resetPageOffset = true) } } else { ReadBook.webBook?.getChapterList(book, this) @@ -117,7 +117,7 @@ class ReadBookViewModel(application: Application) : BaseViewModel(application) { App.db.bookChapterDao().insert(*cList.toTypedArray()) App.db.bookDao().update(book) ReadBook.chapterSize = cList.size - ReadBook.loadContent() + ReadBook.loadContent(resetPageOffset = true) } else { changeDruChapterIndex(cList) } @@ -191,7 +191,7 @@ class ReadBookViewModel(application: Application) : BaseViewModel(application) { App.db.bookDao().update(book) App.db.bookChapterDao().insert(*chapters.toTypedArray()) ReadBook.chapterSize = chapters.size - ReadBook.loadContent() + ReadBook.loadContent(resetPageOffset = true) } } @@ -205,7 +205,7 @@ class ReadBookViewModel(application: Application) : BaseViewModel(application) { ReadBook.durPageIndex = pageIndex } ReadBook.saveRead() - ReadBook.loadContent() + ReadBook.loadContent(resetPageOffset = true) } fun removeFromBookshelf(success: (() -> Unit)?) { @@ -233,7 +233,7 @@ class ReadBookViewModel(application: Application) : BaseViewModel(application) { App.db.bookChapterDao().getChapter(book.bookUrl, ReadBook.durChapterIndex) ?.let { chapter -> BookHelp.delContent(book, chapter) - ReadBook.loadContent(ReadBook.durChapterIndex) + ReadBook.loadContent(ReadBook.durChapterIndex, resetPageOffset = false) } } } diff --git a/app/src/main/java/io/legado/app/ui/book/read/page/ContentView.kt b/app/src/main/java/io/legado/app/ui/book/read/page/ContentView.kt index b748c2b4a..1cc006512 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/page/ContentView.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/page/ContentView.kt @@ -108,7 +108,7 @@ class ContentView(context: Context) : FrameLayout(context) { } } - fun setContent(textPage: TextPage, resetPageOffset: Boolean) { + fun setContent(textPage: TextPage, resetPageOffset: Boolean = true) { setProgress(textPage) if (resetPageOffset) resetPageOffset() diff --git a/app/src/main/java/io/legado/app/ui/book/read/page/DataSource.kt b/app/src/main/java/io/legado/app/ui/book/read/page/DataSource.kt index 4f7afa04f..3a128f969 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/page/DataSource.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/page/DataSource.kt @@ -17,5 +17,5 @@ interface DataSource { fun hasPrevChapter(): Boolean - fun upContent(relativePosition: Int = 0) + fun upContent(relativePosition: Int = 0, resetPageOffset: Boolean = true) } \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/ui/book/read/page/PageView.kt b/app/src/main/java/io/legado/app/ui/book/read/page/PageView.kt index 1b7b71b07..dd19fdc0e 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/page/PageView.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/page/PageView.kt @@ -38,7 +38,7 @@ class PageView(context: Context, attrs: AttributeSet) : prevPage.x = -w.toFloat() pageDelegate?.setViewSize(w, h) if (oldw != 0 && oldh != 0) { - ReadBook.loadContent() + ReadBook.loadContent(resetPageOffset = false) } } @@ -93,9 +93,9 @@ class PageView(context: Context, attrs: AttributeSet) : upContent() } - override fun upContent(relativePosition: Int) { + override fun upContent(relativePosition: Int, resetPageOffset: Boolean) { if (ReadBookConfig.isScroll) { - curPage.setContent(pageFactory.currentPage) + curPage.setContent(pageFactory.currentPage, resetPageOffset) } else { when (relativePosition) { -1 -> prevPage.setContent(pageFactory.prevPage) diff --git a/app/src/main/java/io/legado/app/ui/book/read/page/TextPageFactory.kt b/app/src/main/java/io/legado/app/ui/book/read/page/TextPageFactory.kt index 27a407cd6..a38ed6e51 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/page/TextPageFactory.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/page/TextPageFactory.kt @@ -38,7 +38,7 @@ class TextPageFactory(dataSource: DataSource) : PageFactory(dataSource } else { ReadBook.setPageIndex(pageIndex.plus(1)) } - if (upContent) upContent() + if (upContent) upContent(resetPageOffset = false) true } else false @@ -51,7 +51,7 @@ class TextPageFactory(dataSource: DataSource) : PageFactory(dataSource } else { ReadBook.setPageIndex(pageIndex.minus(1)) } - if (upContent) upContent() + if (upContent) upContent(resetPageOffset = false) true } else false From 14be9913f3ba8f9c4f38cd47cabf09169a2ea5c5 Mon Sep 17 00:00:00 2001 From: kunfei Date: Mon, 16 Mar 2020 20:17:24 +0800 Subject: [PATCH 43/47] =?UTF-8?q?feat:=20=E4=BC=98=E5=8C=96=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/assets/updateLog.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/app/src/main/assets/updateLog.md b/app/src/main/assets/updateLog.md index 250688fe3..cde7fc6ec 100644 --- a/app/src/main/assets/updateLog.md +++ b/app/src/main/assets/updateLog.md @@ -1,6 +1,10 @@ ## 更新日志 * 旧版数据导入教程:先在旧版阅读(2.x)中进行备份,然后在新版阅读(3.x)【我的】->【备份与恢复】,选择【导入旧版本数据】。 -* 请关注[开源阅读软件]()支持我,同时关注合作公众号[小说拾遗](),阅读公众号小编。 +* 请关注[开源阅读]()支持我,同时关注合作公众号[小说拾遗](),阅读公众号小编。 + +**2020/03/15** +* 弄了个企业公众号[开源阅读](),后面弄好后会把原来的开源阅读软件迁移过来 +* 修复滚动模式切换章节位置不归0的bug **2020/03/14** * 加载正文无书源时自动换源 From d0b0a9c749a22593aac48ce37c061f3a7c2be8e4 Mon Sep 17 00:00:00 2001 From: kunfei Date: Mon, 16 Mar 2020 22:15:26 +0800 Subject: [PATCH 44/47] =?UTF-8?q?feat:=20=E4=BC=98=E5=8C=96=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/ui/book/read/ReadBookActivity.kt | 5 +- .../legado/app/ui/book/read/TextActionMenu.kt | 57 +++++++++++-------- app/src/main/res/layout/popup_action_menu.xml | 39 +++++++++++-- 3 files changed, 70 insertions(+), 31 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 6808baf83..8cd1915cc 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 @@ -403,11 +403,10 @@ class ReadBookActivity : VMBaseActivity(R.layout.activity_boo */ override fun showTextActionMenu() { textActionMenu ?: let { - textActionMenu = TextActionMenu(this, this).apply { - contentView.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED) - } + textActionMenu = TextActionMenu(this, this) } textActionMenu?.let { popup -> + popup.contentView.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED) val popupHeight = popup.contentView.measuredHeight val x = text_menu_position.x.toInt() var y = text_menu_position.y.toInt() - popupHeight diff --git a/app/src/main/java/io/legado/app/ui/book/read/TextActionMenu.kt b/app/src/main/java/io/legado/app/ui/book/read/TextActionMenu.kt index 9d7046f6e..55c1855e4 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/TextActionMenu.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/TextActionMenu.kt @@ -15,13 +15,11 @@ import androidx.annotation.RequiresApi import androidx.appcompat.view.SupportMenuInflater import androidx.appcompat.view.menu.MenuBuilder import androidx.appcompat.view.menu.MenuItemImpl -import androidx.appcompat.widget.PopupMenu -import androidx.core.view.size -import androidx.recyclerview.widget.LinearLayoutManager -import androidx.recyclerview.widget.RecyclerView +import androidx.core.view.isVisible import io.legado.app.R import io.legado.app.base.adapter.ItemViewHolder import io.legado.app.base.adapter.SimpleRecyclerAdapter +import io.legado.app.utils.gone import io.legado.app.utils.isAbsUrl import io.legado.app.utils.sendToClip import io.legado.app.utils.visible @@ -35,6 +33,10 @@ import org.jetbrains.anko.toast class TextActionMenu(private val context: Context, private val callBack: CallBack) : PopupWindow(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT) { + private val adapter = Adapter(context) + private val menu = MenuBuilder(context) + private val moreMenu = MenuBuilder(context) + init { @SuppressLint("InflateParams") contentView = LayoutInflater.from(context).inflate(R.layout.popup_action_menu, null) @@ -44,33 +46,40 @@ class TextActionMenu(private val context: Context, private val callBack: CallBac isFocusable = false initRecyclerView() + setOnDismissListener { + contentView.apply { + iv_menu_more.setImageResource(R.drawable.ic_more_vert) + recycler_view_top.gone() + recycler_view_bottom.gone() + adapter.setItems(menu.visibleItems) + recycler_view.visible() + } + } } private fun initRecyclerView() = with(contentView) { - val adapter = Adapter(context) - recycler_view.layoutManager = LinearLayoutManager(context, RecyclerView.HORIZONTAL, false) recycler_view.adapter = adapter - val menu = MenuBuilder(context) SupportMenuInflater(context).inflate(R.menu.content_select_action, menu) adapter.setItems(menu.visibleItems) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - val popupMenu = PopupMenu(context, iv_menu_more) - onInitializeMenu(popupMenu.menu) - if (popupMenu.menu.size > 0) { - iv_menu_more.visible() - popupMenu.setOnMenuItemClickListener { item -> - item.intent?.let { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - it.putExtra(Intent.EXTRA_PROCESS_TEXT, callBack.selectedText) - context.startActivity(it) - } - } - this@TextActionMenu.dismiss() - true - } - } - iv_menu_more.onClick { - popupMenu.show() + onInitializeMenu(moreMenu) + } + if (moreMenu.size() > 0) { + iv_menu_more.visible() + } + iv_menu_more.onClick { + if (recycler_view.isVisible) { + iv_menu_more.setImageResource(R.drawable.ic_arrow_back) + recycler_view_top.adapter = adapter + adapter.setItems(moreMenu.visibleItems) + recycler_view.gone() + recycler_view_top.visible() + } else { + iv_menu_more.setImageResource(R.drawable.ic_more_vert) + recycler_view_top.gone() + recycler_view_bottom.gone() + adapter.setItems(menu.visibleItems) + recycler_view.visible() } } } diff --git a/app/src/main/res/layout/popup_action_menu.xml b/app/src/main/res/layout/popup_action_menu.xml index 98cceb33c..bf55912fd 100644 --- a/app/src/main/res/layout/popup_action_menu.xml +++ b/app/src/main/res/layout/popup_action_menu.xml @@ -1,7 +1,8 @@ - @@ -10,7 +11,13 @@ android:id="@+id/recycler_view" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_gravity="center" /> + android:layout_gravity="center" + android:orientation="horizontal" + app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" + app:layout_constraintLeft_toLeftOf="parent" + app:layout_constraintTop_toTopOf="@+id/iv_menu_more" + app:layout_constraintRight_toLeftOf="@+id/iv_menu_more" + app:layout_constraintBottom_toBottomOf="@+id/iv_menu_more" /> + android:layout_gravity="center_vertical" + app:layout_constraintRight_toRightOf="parent" + app:layout_constraintTop_toBottomOf="@+id/recycler_view_top" /> - + + + + + From 9bbad137bbda7becfd9a5d222405d49bb2140447 Mon Sep 17 00:00:00 2001 From: kunfei Date: Mon, 16 Mar 2020 22:17:12 +0800 Subject: [PATCH 45/47] =?UTF-8?q?feat:=20=E4=BC=98=E5=8C=96=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/io/legado/app/ui/book/read/TextActionMenu.kt | 2 -- app/src/main/res/layout/popup_action_menu.xml | 11 ----------- 2 files changed, 13 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/book/read/TextActionMenu.kt b/app/src/main/java/io/legado/app/ui/book/read/TextActionMenu.kt index 55c1855e4..af3ee3c75 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/TextActionMenu.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/TextActionMenu.kt @@ -50,7 +50,6 @@ class TextActionMenu(private val context: Context, private val callBack: CallBac contentView.apply { iv_menu_more.setImageResource(R.drawable.ic_more_vert) recycler_view_top.gone() - recycler_view_bottom.gone() adapter.setItems(menu.visibleItems) recycler_view.visible() } @@ -77,7 +76,6 @@ class TextActionMenu(private val context: Context, private val callBack: CallBac } else { iv_menu_more.setImageResource(R.drawable.ic_more_vert) recycler_view_top.gone() - recycler_view_bottom.gone() adapter.setItems(menu.visibleItems) recycler_view.visible() } diff --git a/app/src/main/res/layout/popup_action_menu.xml b/app/src/main/res/layout/popup_action_menu.xml index bf55912fd..a708d9310 100644 --- a/app/src/main/res/layout/popup_action_menu.xml +++ b/app/src/main/res/layout/popup_action_menu.xml @@ -43,16 +43,5 @@ app:layout_constraintBottom_toTopOf="@+id/iv_menu_more" app:layout_constraintRight_toRightOf="parent" /> - - From 68becb21fdb5f154b20aa91e479d1a0e8b6f83d9 Mon Sep 17 00:00:00 2001 From: kunfei Date: Mon, 16 Mar 2020 22:18:31 +0800 Subject: [PATCH 46/47] =?UTF-8?q?feat:=20=E4=BC=98=E5=8C=96=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= 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 cde7fc6ec..cd3772d30 100644 --- a/app/src/main/assets/updateLog.md +++ b/app/src/main/assets/updateLog.md @@ -5,6 +5,7 @@ **2020/03/15** * 弄了个企业公众号[开源阅读](),后面弄好后会把原来的开源阅读软件迁移过来 * 修复滚动模式切换章节位置不归0的bug +* 修复文字选择更多菜单在部分手机上报错的bug **2020/03/14** * 加载正文无书源时自动换源 From 9da86a4d371dcee651091377afcef5085a5a7ed4 Mon Sep 17 00:00:00 2001 From: kunfei Date: Mon, 16 Mar 2020 22:42:35 +0800 Subject: [PATCH 47/47] =?UTF-8?q?feat:=20=E4=BC=98=E5=8C=96=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/io/legado/app/ui/book/read/TextActionMenu.kt | 8 ++++---- app/src/main/res/layout/popup_action_menu.xml | 10 +++++----- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/book/read/TextActionMenu.kt b/app/src/main/java/io/legado/app/ui/book/read/TextActionMenu.kt index af3ee3c75..b64ec996d 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/TextActionMenu.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/TextActionMenu.kt @@ -49,7 +49,7 @@ class TextActionMenu(private val context: Context, private val callBack: CallBac setOnDismissListener { contentView.apply { iv_menu_more.setImageResource(R.drawable.ic_more_vert) - recycler_view_top.gone() + recycler_view_more.gone() adapter.setItems(menu.visibleItems) recycler_view.visible() } @@ -58,6 +58,7 @@ class TextActionMenu(private val context: Context, private val callBack: CallBac private fun initRecyclerView() = with(contentView) { recycler_view.adapter = adapter + recycler_view_more.adapter = adapter SupportMenuInflater(context).inflate(R.menu.content_select_action, menu) adapter.setItems(menu.visibleItems) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { @@ -69,13 +70,12 @@ class TextActionMenu(private val context: Context, private val callBack: CallBac iv_menu_more.onClick { if (recycler_view.isVisible) { iv_menu_more.setImageResource(R.drawable.ic_arrow_back) - recycler_view_top.adapter = adapter adapter.setItems(moreMenu.visibleItems) recycler_view.gone() - recycler_view_top.visible() + recycler_view_more.visible() } else { iv_menu_more.setImageResource(R.drawable.ic_more_vert) - recycler_view_top.gone() + recycler_view_more.gone() adapter.setItems(menu.visibleItems) recycler_view.visible() } diff --git a/app/src/main/res/layout/popup_action_menu.xml b/app/src/main/res/layout/popup_action_menu.xml index a708d9310..547d9bce1 100644 --- a/app/src/main/res/layout/popup_action_menu.xml +++ b/app/src/main/res/layout/popup_action_menu.xml @@ -29,18 +29,18 @@ android:visibility="gone" android:contentDescription="@string/more_menu" android:layout_gravity="center_vertical" - app:layout_constraintRight_toRightOf="parent" - app:layout_constraintTop_toBottomOf="@+id/recycler_view_top" /> + app:layout_constraintTop_toTopOf="parent" + app:layout_constraintRight_toRightOf="parent" />