Merge pull request #30 from gedoor/master

up
pull/379/head
口口吕 5 years ago committed by GitHub
commit fea0bcfcfe
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 14
      app/src/main/AndroidManifest.xml
  2. 126
      app/src/main/assets/help.md
  3. 4
      app/src/main/assets/updateLog.md
  4. 8
      app/src/main/java/io/legado/app/ui/main/my/MyFragment.kt
  5. 8
      app/src/main/java/io/legado/app/ui/rss/read/ReadRssActivity.kt
  6. 9
      app/src/main/java/io/legado/app/ui/rss/read/ReadRssViewModel.kt
  7. 1
      app/src/main/java/io/legado/app/ui/welcome/WelcomeActivity.kt
  8. 8
      app/src/main/java/io/legado/app/ui/widget/dialog/TextDialog.kt
  9. 66
      app/src/main/java/io/legado/app/utils/JsoupExtensions.kt
  10. 0
      app/src/main/res/drawable-v24/ic_launcher_4.xml
  11. 5
      app/src/main/res/drawable/ic_bottom_books.xml
  12. 18
      app/src/main/res/drawable/ic_bottom_books_e.xml
  13. 18
      app/src/main/res/drawable/ic_bottom_books_s.xml
  14. 5
      app/src/main/res/drawable/ic_bottom_explore.xml
  15. 12
      app/src/main/res/drawable/ic_bottom_explore_e.xml
  16. 10
      app/src/main/res/drawable/ic_bottom_explore_s.xml
  17. 5
      app/src/main/res/drawable/ic_bottom_person.xml
  18. 12
      app/src/main/res/drawable/ic_bottom_person_e.xml
  19. 14
      app/src/main/res/drawable/ic_bottom_person_s.xml
  20. 5
      app/src/main/res/drawable/ic_bottom_rss_feed.xml
  21. 12
      app/src/main/res/drawable/ic_bottom_rss_feed_e.xml
  22. 9
      app/src/main/res/drawable/ic_bottom_rss_feed_s.xml
  23. 9
      app/src/main/res/drawable/ic_explore_black_24dp.xml
  24. 14
      app/src/main/res/drawable/ic_launch.xml
  25. 18
      app/src/main/res/drawable/ic_launcher.xml
  26. 9
      app/src/main/res/drawable/ic_library_books_black_24dp.xml
  27. 9
      app/src/main/res/drawable/ic_person_black_24dp.xml
  28. 12
      app/src/main/res/drawable/ic_rss_feed.xml
  29. 12
      app/src/main/res/menu/main_bnv.xml
  30. 12
      app/src/main/res/menu/main_my.xml
  31. 2
      app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
  32. 5
      app/src/main/res/mipmap-anydpi-v26/launcher4.xml
  33. BIN
      app/src/main/res/mipmap-hdpi/ic_launcher.png
  34. BIN
      app/src/main/res/mipmap-mdpi/ic_launcher.png
  35. BIN
      app/src/main/res/mipmap-xhdpi/ic_launcher.png
  36. BIN
      app/src/main/res/mipmap-xxhdpi/ic_launcher.png
  37. BIN
      app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
  38. 2
      app/src/main/res/values/array_values.xml
  39. 1
      app/src/main/res/values/arrays.xml
  40. 2
      app/src/main/res/values/dimens.xml
  41. 12
      app/src/main/res/values/strings.xml
  42. 2
      build.gradle
  43. 2
      gradle.properties

@ -79,6 +79,20 @@
android:resource="@xml/shortcuts" android:resource="@xml/shortcuts"
android:launchMode="singleTask" /> android:launchMode="singleTask" />
</activity> </activity>
<!--图标4-->
<activity
android:name=".ui.welcome.Launcher4"
android:icon="@mipmap/launcher4"
android:enabled="false">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<meta-data
android:name="android.app.shortcuts"
android:resource="@xml/shortcuts"
android:launchMode="singleTask" />
</activity>
<!--主界面--> <!--主界面-->
<activity <activity
android:name=".ui.main.MainActivity" android:name=".ui.main.MainActivity"

@ -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怎么办?
* 清除软件数据试试看,不行再进行反馈。

@ -2,10 +2,14 @@
* 旧版数据导入教程:先在旧版阅读(2.x)中进行备份,然后在新版阅读(3.x)【我的】->【备份与恢复】,选择【导入旧版本数据】。 * 旧版数据导入教程:先在旧版阅读(2.x)中进行备份,然后在新版阅读(3.x)【我的】->【备份与恢复】,选择【导入旧版本数据】。
* 请关注[开源阅读软件]()支持我,同时关注合作公众号[小说拾遗](),阅读公众号小编。 * 请关注[开源阅读软件]()支持我,同时关注合作公众号[小说拾遗](),阅读公众号小编。
**2020/03/14**
* 修改导航栏图标
**2020/03/13** **2020/03/13**
* 更改书架控件,ViewPager2替换回2.0使用的ViewPager,解决下拉不流畅问题 * 更改书架控件,ViewPager2替换回2.0使用的ViewPager,解决下拉不流畅问题
* 修复点击作者搜索后,打开的详情页还是原来的书籍的bug * 修复点击作者搜索后,打开的详情页还是原来的书籍的bug
* 修改朗读菜单 * 修改朗读菜单
* 优化rss朗读
**2020/03/12** **2020/03/12**
* 导入本地添加需要权限模式 * 导入本地添加需要权限模式

@ -24,6 +24,7 @@ import io.legado.app.ui.config.ConfigActivity
import io.legado.app.ui.config.ConfigViewModel import io.legado.app.ui.config.ConfigViewModel
import io.legado.app.ui.filechooser.FileChooserDialog import io.legado.app.ui.filechooser.FileChooserDialog
import io.legado.app.ui.replacerule.ReplaceRuleActivity 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.NameListPreference
import io.legado.app.ui.widget.prefs.PreferenceCategory import io.legado.app.ui.widget.prefs.PreferenceCategory
import io.legado.app.ui.widget.prefs.SwitchPreference 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) { override fun onCompatOptionsItemSelected(item: MenuItem) {
when (item.itemId) { when (item.itemId) {
R.id.menu_help -> startActivity<AboutActivity>() R.id.menu_help -> {
R.id.menu_backup -> BackupRestoreUi.backup(this) val text = String(requireContext().assets.open("help.md").readBytes())
R.id.menu_restore -> BackupRestoreUi.restore(this) TextDialog.show(childFragmentManager, text, TextDialog.MD)
}
} }
} }

@ -22,7 +22,6 @@ import org.apache.commons.text.StringEscapeUtils
import org.jetbrains.anko.share import org.jetbrains.anko.share
import org.jetbrains.anko.toast import org.jetbrains.anko.toast
import org.jsoup.Jsoup import org.jsoup.Jsoup
import org.jsoup.safety.Whitelist
class ReadRssActivity : VMBaseActivity<ReadRssViewModel>(R.layout.activity_rss_read), class ReadRssActivity : VMBaseActivity<ReadRssViewModel>(R.layout.activity_rss_read),
@ -253,11 +252,8 @@ class ReadRssActivity : VMBaseActivity<ReadRssViewModel>(R.layout.activity_rss_r
web_view.settings.javaScriptEnabled = true web_view.settings.javaScriptEnabled = true
web_view.evaluateJavascript("document.documentElement.outerHTML") { web_view.evaluateJavascript("document.documentElement.outerHTML") {
val html = StringEscapeUtils.unescapeJson(it) val html = StringEscapeUtils.unescapeJson(it)
val text = Jsoup.clean(html, Whitelist.none()) Jsoup.parse(html).text()
.replace(Regex("""&\w+;"""), "") viewModel.readAloud(Jsoup.parse(html).textArray())
.trim()//朗读过程中总是听到一些杂音,清理一下
//longToast(需读内容)调试一下
viewModel.readAloud(text)
} }
} }
} }

@ -37,7 +37,7 @@ class ReadRssViewModel(application: Application) : BaseViewModel(application),
var star = false var star = false
var textToSpeech: TextToSpeech? = null var textToSpeech: TextToSpeech? = null
private var ttsInitFinish = false private var ttsInitFinish = false
private var ttsText = "" private var ttsTextList = arrayListOf<String>()
fun initData(intent: Intent) { fun initData(intent: Intent) {
execute { execute {
@ -163,13 +163,14 @@ class ReadRssViewModel(application: Application) : BaseViewModel(application),
private fun play() { private fun play() {
if (!ttsInitFinish) return if (!ttsInitFinish) return
textToSpeech?.stop() textToSpeech?.stop()
ttsText.split("\n", " ", "  ").forEach { ttsTextList.forEach {
textToSpeech?.speak(it, TextToSpeech.QUEUE_ADD, null, "rss") textToSpeech?.speak(it, TextToSpeech.QUEUE_ADD, null, "rss")
} }
} }
fun readAloud(text: String) { fun readAloud(textArray: Array<String>) {
ttsText = text ttsTextList.clear()
ttsTextList.addAll(textArray)
textToSpeech?.let { textToSpeech?.let {
play() play()
} ?: let { } ?: let {

@ -59,3 +59,4 @@ open class WelcomeActivity : BaseActivity(R.layout.activity_welcome) {
class Launcher1 : WelcomeActivity() class Launcher1 : WelcomeActivity()
class Launcher2 : WelcomeActivity() class Launcher2 : WelcomeActivity()
class Launcher3 : WelcomeActivity() class Launcher3 : WelcomeActivity()
class Launcher4 : WelcomeActivity()

@ -77,10 +77,16 @@ class TextDialog : BaseDialogFragment() {
time -= 1000 time -= 1000
badge_view.setBadgeCount((time / 1000).toInt()) badge_view.setBadgeCount((time / 1000).toInt())
if (time <= 0) { if (time <= 0) {
dialog?.setCancelable(true) view.post {
dialog?.setCancelable(true)
}
} }
} }
} }
} else {
view.post {
dialog?.setCancelable(true)
}
} }
} }

@ -0,0 +1,66 @@
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<String> {
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) {
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 {
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] == ' '
}

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/ic_bottom_books_e" android:state_checked="false" />
<item android:drawable="@drawable/ic_bottom_books_s" android:state_checked="true" />
</selector>

@ -0,0 +1,18 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
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" />
<path
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" />
<path
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" />
<path
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" />
</vector>

@ -0,0 +1,18 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
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" />
<path
android:pathData="M4.5,6h2C7.3,6 8,6.7 8,7.5v12C8,20.3 7.3,21 6.5,21h-2C3.7,21 3,20.3 3,19.5v-12C3,6.7 3.7,6 4.5,6z"
android:fillColor="#C8D0D9"
android:fillType="evenOdd" />
<path
android:pathData="M13,3h-2c-0.8,0 -1.5,0.7 -1.5,1.5v15c0,0.8 0.7,1.5 1.5,1.5h2c0.8,0 1.5,-0.7 1.5,-1.5v-15C14.5,3.7 13.8,3 13,3zM13,17c0,0.3 -0.2,0.5 -0.5,0.5h-1c-0.3,0 -0.5,-0.2 -0.5,-0.5v-0.5c0,-0.3 0.2,-0.5 0.5,-0.5h1c0.3,0 0.5,0.2 0.5,0.5V17z"
android:fillColor="#C8D0D9"
android:fillType="evenOdd" />
</vector>

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/ic_bottom_explore_e" android:state_checked="false" />
<item android:drawable="@drawable/ic_bottom_explore_s" android:state_checked="true" />
</selector>

@ -0,0 +1,12 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:pathData="M12,21c-5,0 -9,-4 -9,-9s4,-9 9,-9s9,4 9,9S17,21 12,21zM12,4.5c-4.1,0 -7.5,3.4 -7.5,7.5s3.4,7.5 7.5,7.5s7.5,-3.4 7.5,-7.5S16.1,4.5 12,4.5z"
android:fillColor="#959ECA" />
<path
android:pathData="M13.5,13c0.3,-0.5 0.7,-2.1 1.4,-4.8l0,0c0,-0.1 0,-0.2 -0.1,-0.2s-0.1,0 -0.2,0c-2.3,1.8 -3.6,3 -3.8,3.5c-0.4,0.7 -0.2,1.7 0.6,2.1C12.1,14 13,13.8 13.5,13z"
android:fillColor="#959ECA" />
</vector>

@ -0,0 +1,10 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:pathData="M12,3c5,0 9,4 9,9s-4,9 -9,9s-9,-4 -9,-9S7,3 12,3zM13.5,13c0.3,-0.5 0.7,-2.1 1.4,-4.8l0,0c0,-0.1 0,-0.2 -0.1,-0.2s-0.1,0 -0.2,0c-2.3,1.8 -3.5,3 -3.8,3.4c-0.4,0.7 -0.2,1.7 0.6,2.1C12.1,14 13,13.8 13.5,13z"
android:fillColor="#C8D0D9"
android:fillType="evenOdd" />
</vector>

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/ic_bottom_person_e" android:state_checked="false" />
<item android:drawable="@drawable/ic_bottom_person_s" android:state_checked="true" />
</selector>

@ -0,0 +1,12 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
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" />
<path
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" />
</vector>

@ -0,0 +1,14 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:pathData="M12,7m-4,0a4,4 0,1 1,8 0a4,4 0,1 1,-8 0"
android:fillColor="#C8D0D9"
android:fillType="evenOdd" />
<path
android:pathData="M8,13h8c2.2,0 4,1.8 4,4v2.5c0,0.8 -0.7,1.5 -1.5,1.5h-13C4.7,21 4,20.3 4,19.5V17C4,14.8 5.8,13 8,13z"
android:fillColor="#C8D0D9"
android:fillType="evenOdd" />
</vector>

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/ic_bottom_rss_feed_e" android:state_checked="false" />
<item android:drawable="@drawable/ic_bottom_rss_feed_s" android:state_checked="true" />
</selector>

@ -0,0 +1,12 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
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.2,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.4H18c0.2,0 0.4,0.2 0.4,0.4v14.1H18.2z"
android:fillColor="#5A5F64" />
<path
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.3h-2c-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" />
</vector>

@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
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,3zM15.8,11c0,0.4 -0.3,0.8 -0.8,0.8h-2.3V14c0,0.4 -0.3,0.8 -0.8,0.8s-0.8,-0.3 -0.8,-0.8v-2.3H9c-0.4,0 -0.8,-0.3 -0.8,-0.8s0.3,-0.8 0.8,-0.8h2.3V8c0,-0.4 0.3,-0.8 0.8,-0.8s0.8,0.3 0.8,0.8v2.3H15C15.4,10.3 15.8,10.6 15.8,11z"
android:fillColor="#C8D0D9" />
</vector>

@ -1,9 +0,0 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
<path
android:fillColor="#FF000000"
android:pathData="M12,10.9c-0.61,0 -1.1,0.49 -1.1,1.1s0.49,1.1 1.1,1.1c0.61,0 1.1,-0.49 1.1,-1.1s-0.49,-1.1 -1.1,-1.1zM12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM14.19,14.19L6,18l3.81,-8.19L18,6l-3.81,8.19z"/>
</vector>

@ -1,14 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="#595757"
android:pathData="M18.545,18.304c0,0.131-0.11,0.242-0.241,0.242H5.696c-0.131,0-0.242-0.111-0.242-0.242V5.697 c0-0.131,0.111-0.243,0.242-0.243H12V4H5.696C4.76,4,4,4.762,4,5.697v12.606C4,19.239,4.76,20,5.696,20h12.607 C19.239,20,20,19.239,20,18.304v-6.303h-1.455V18.304z" />
<path
android:fillColor="#595757"
android:pathData="M 19.272 4 L 13.843 4 L 13.843 5.454 L 17.517 5.454 L 7.464 15.508 L 8.491 16.536 L 18.545 6.482 L 18.545 10.157 L 20 10.157 L 20 4.727 L 20 4 Z" />
</vector>

@ -0,0 +1,18 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="108dp"
android:height="108dp"
android:viewportWidth="108"
android:viewportHeight="108">
<path
android:pathData="M50.8,56.9c-0.2,2.4 -2.4,4.2 -4.8,4c-1.2,-0.1 -2.3,-0.7 -3.1,-1.7l8.8,-5.1l0,0l0.5,-0.3c-0.1,-0.2 -0.2,-0.4 -0.3,-0.6c-1.8,-3.1 -5.7,-4.1 -8.7,-2.3c-3.1,1.8 -4.1,5.7 -2.3,8.7c1.8,3.1 5.7,4.1 8.7,2.3c1.8,-1.1 3,-3 3.2,-5.1H50.8zM44.1,52.6c1.7,-1 3.9,-0.7 5.3,0.6L42,57.5C41.6,55.6 42.4,53.6 44.1,52.6z"
android:fillColor="#333333" />
<path
android:pathData="M34.1,55c2.7,-0.6 4.4,-3.4 3.8,-6.1C37.4,46.6 35.4,45 33,45h-7v17.8h1.9V46.9H33c1.8,0 3.1,1.5 3.1,3.3c0,1.6 -1.3,3 -2.9,3.1h-2.1l5.1,9.5h2.2L34.1,55z"
android:fillColor="#2F45A6" />
<path
android:pathData="M61,50.1c-3.5,0.1 -6.3,3.1 -6.1,6.6c0.1,3.3 2.8,6 6.1,6.1h3.2v-1.9H61c-2.5,0 -4.5,-2 -4.5,-4.4c0,-2.5 2,-4.5 4.4,-4.5c2.5,0 4.5,2 4.5,4.4c0,0 0,0 0,0v6.4h1.9v-6.4C67.4,52.9 64.5,50.1 61,50.1L61,50.1z"
android:fillColor="#333333" />
<path
android:pathData="M80.1,45v11.5c0,2.5 -2,4.5 -4.5,4.5c-2.5,0 -4.5,-2 -4.5,-4.5c0,-2.5 2,-4.5 4.4,-4.5c0,0 0,0 0,0h3.2v-1.9h-3.2c-3.5,0 -6.4,2.8 -6.4,6.4c0,3.5 2.8,6.4 6.4,6.4c1.7,0 3.3,-0.7 4.5,-1.8v1.8H82V45H80.1z"
android:fillColor="#333333" />
</vector>

@ -1,9 +0,0 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
<path
android:fillColor="#FF000000"
android:pathData="M4,6L2,6v14c0,1.1 0.9,2 2,2h14v-2L4,20L4,6zM20,2L8,2c-1.1,0 -2,0.9 -2,2v12c0,1.1 0.9,2 2,2h12c1.1,0 2,-0.9 2,-2L22,4c0,-1.1 -0.9,-2 -2,-2zM19,11L9,11L9,9h10v2zM15,15L9,15v-2h6v2zM19,7L9,7L9,5h10v2z"/>
</vector>

@ -1,9 +0,0 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
<path
android:fillColor="#FF000000"
android:pathData="M12,12c2.21,0 4,-1.79 4,-4s-1.79,-4 -4,-4 -4,1.79 -4,4 1.79,4 4,4zM12,14c-2.67,0 -8,1.34 -8,4v2h16v-2c0,-2.66 -5.33,-4 -8,-4z"/>
</vector>

@ -1,12 +0,0 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
<path
android:fillColor="#FF000000"
android:pathData="M6.18,17.82m-2.18,0a2.18,2.18 0,1 1,4.36 0a2.18,2.18 0,1 1,-4.36 0" />
<path
android:fillColor="#FF000000"
android:pathData="M4,4.44v2.83c7.03,0 12.73,5.7 12.73,12.73h2.83c0,-8.59 -6.97,-15.56 -15.56,-15.56zM4,10.1v2.83c3.9,0 7.07,3.17 7.07,7.07h2.83c0,-5.47 -4.43,-9.9 -9.9,-9.9z" />
</vector>

@ -5,19 +5,19 @@
<item <item
android:id="@+id/menu_bookshelf" android:id="@+id/menu_bookshelf"
android:icon="@drawable/ic_library_books_black_24dp" android:icon="@drawable/ic_bottom_books"
android:title="@string/bookshelf"/> android:title="@string/bookshelf"/>
<item <item
android:id="@+id/menu_find_book" android:id="@+id/menu_find_book"
android:icon="@drawable/ic_explore_black_24dp" android:icon="@drawable/ic_bottom_explore"
android:title="@string/find"/> android:title="@string/find"/>
<item <item
android:id="@+id/menu_rss" android:id="@+id/menu_rss"
android:icon="@drawable/ic_rss_feed" android:icon="@drawable/ic_bottom_rss_feed"
android:title="@string/rss" /> android:title="@string/rss" />
<item <item
android:id="@+id/menu_my_config" android:id="@+id/menu_my_config"
android:icon="@drawable/ic_person_black_24dp" android:icon="@drawable/ic_bottom_person"
android:title="@string/my"/> android:title="@string/my"/>
</menu> </menu>

@ -10,16 +10,4 @@
app:showAsAction="always" app:showAsAction="always"
tools:ignore="AlwaysShowAction" /> tools:ignore="AlwaysShowAction" />
<item
android:id="@+id/menu_backup"
android:title="@string/backup"
android:icon="@drawable/ic_backup"
app:showAsAction="always" />
<item
android:id="@+id/menu_restore"
android:title="@string/restore"
android:icon="@drawable/ic_restore"
app:showAsAction="always" />
</menu> </menu>

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android"> <adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@color/md_grey_100" /> <background android:drawable="@color/md_grey_100" />
<foreground android:drawable="@drawable/ic_launcher_0" /> <foreground android:drawable="@drawable/ic_launcher" />
</adaptive-icon> </adaptive-icon>

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@color/md_grey_100" />
<foreground android:drawable="@drawable/ic_launcher_4" />
</adaptive-icon>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.5 KiB

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.3 KiB

After

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.9 KiB

After

Width:  |  Height:  |  Size: 7.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 12 KiB

@ -6,9 +6,9 @@
<item>launcher1</item> <item>launcher1</item>
<item>launcher2</item> <item>launcher2</item>
<item>launcher3</item> <item>launcher3</item>
<item>launcher4</item>
</string-array> </string-array>
<string-array name="screen_time_out_value"> <string-array name="screen_time_out_value">
<item>0</item> <item>0</item>
<item>60</item> <item>60</item>

@ -79,6 +79,7 @@
<item>icon1</item> <item>icon1</item>
<item>icon2</item> <item>icon2</item>
<item>icon3</item> <item>icon3</item>
<item>icon4</item>
</string-array> </string-array>
<string-array name="chinese_mode"> <string-array name="chinese_mode">

@ -35,4 +35,6 @@
<dimen name="fastscroll_scrollbar_margin_bottom">8dp</dimen> <dimen name="fastscroll_scrollbar_margin_bottom">8dp</dimen>
<dimen name="fastscroll_scrollbar_padding_start">8dp</dimen> <dimen name="fastscroll_scrollbar_padding_start">8dp</dimen>
<dimen name="fastscroll_scrollbar_padding_end">8dp</dimen> <dimen name="fastscroll_scrollbar_padding_end">8dp</dimen>
<dimen name="fixed_height_bottom_padding">8dp</dimen>
</resources> </resources>

@ -81,7 +81,7 @@
<string name="retry">重试</string> <string name="retry">重试</string>
<string name="web_service">Web 服务</string> <string name="web_service">Web 服务</string>
<string name="web_edit_source">web编辑书源</string> <string name="web_edit_source">web编辑书源</string>
<string name="http_ip">http://%s:%d</string> <string name="http_ip">http://%1$s:%2$d</string>
<string name="download_offline">离线下载</string> <string name="download_offline">离线下载</string>
<string name="download_offline_t">离线下载</string> <string name="download_offline_t">离线下载</string>
<string name="download_offline_s">下载选择的章节到本地</string> <string name="download_offline_s">下载选择的章节到本地</string>
@ -207,14 +207,14 @@
<string name="replace_rule_invalid">替换规则为空或者不满足正则表达式要求</string> <string name="replace_rule_invalid">替换规则为空或者不满足正则表达式要求</string>
<string name="select_action">选择操作</string> <string name="select_action">选择操作</string>
<string name="select_all">全选</string> <string name="select_all">全选</string>
<string name="select_all_count">全选(%d/%d)</string> <string name="select_all_count">全选(%1$d/%2$d)</string>
<string name="select_cancel_count">取消(%d/%d)</string> <string name="select_cancel_count">取消(%1$d/%2$d)</string>
<string name="dark_theme">深色模式</string> <string name="dark_theme">深色模式</string>
<string name="welcome">启动页</string> <string name="welcome">启动页</string>
<string name="download_start">开始下载</string> <string name="download_start">开始下载</string>
<string name="download_cancel">取消下载</string> <string name="download_cancel">取消下载</string>
<string name="no_download">暂无任务</string> <string name="no_download">暂无任务</string>
<string name="download_count">已下载 %d/%d</string> <string name="download_count">已下载 %1$d/%2$d</string>
<string name="import_select_book">导入选择书籍</string> <string name="import_select_book">导入选择书籍</string>
<string name="threads_num_title">更新和搜索线程数,太多会卡顿</string> <string name="threads_num_title">更新和搜索线程数,太多会卡顿</string>
<string name="change_icon">切换图标</string> <string name="change_icon">切换图标</string>
@ -289,7 +289,7 @@
<string name="padding_right">右边距</string> <string name="padding_right">右边距</string>
<string name="check_book_source">校验书源</string> <string name="check_book_source">校验书源</string>
<string name="check_select_source">校验所选</string> <string name="check_select_source">校验所选</string>
<string name="progress_show">进度 %d/%d</string> <string name="progress_show">进度 %1$d/%2$d</string>
<string name="tts_fix">请安装并选择中文TTS!</string> <string name="tts_fix">请安装并选择中文TTS!</string>
<string name="tts_init_failed">TTS初始化失败!</string> <string name="tts_init_failed">TTS初始化失败!</string>
<string name="jf_convert">简繁转换</string> <string name="jf_convert">简繁转换</string>
@ -599,7 +599,7 @@
<string name="auto_dark_mode_s">夜间模式跟随系统</string> <string name="auto_dark_mode_s">夜间模式跟随系统</string>
<string name="go_back">上级</string> <string name="go_back">上级</string>
<string name="tone_colour">在线朗读音色</string> <string name="tone_colour">在线朗读音色</string>
<string name="select_count">(%d/%d)</string> <string name="select_count">(%1$d/%2$d)</string>
<string name="show_rss">显示订阅</string> <string name="show_rss">显示订阅</string>
<string name="service_stop">服务已停止</string> <string name="service_stop">服务已停止</string>
<string name="service_start">正在启动服务\n具体信息查看通知栏</string> <string name="service_start">正在启动服务\n具体信息查看通知栏</string>

@ -1,7 +1,7 @@
// Top-level build file where you can add configuration options common to all sub-projects/modules. // Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript { buildscript {
ext.kotlin_version = '1.3.61' ext.kotlin_version = '1.3.70'
repositories { repositories {
google() google()
jcenter() jcenter()

@ -6,7 +6,7 @@
# http://www.gradle.org/docs/current/userguide/build_environment.html # http://www.gradle.org/docs/current/userguide/build_environment.html
# Specifies the JVM arguments used for the daemon process. # Specifies the JVM arguments used for the daemon process.
# The setting is particularly useful for tweaking memory settings. # 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. # When configured, Gradle will run in incubating parallel mode.
# This option should only be used with decoupled projects. More details, visit # 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 # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects

Loading…
Cancel
Save