Merge pull request #31 from gedoor/master

up
pull/379/head
口口吕 5 years ago committed by GitHub
commit 4097cc36fa
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 28
      app/src/main/AndroidManifest.xml
  2. 1
      app/src/main/assets/help.md
  3. 11
      app/src/main/assets/updateLog.md
  4. 5
      app/src/main/java/io/legado/app/data/dao/BookSourceDao.kt
  5. 4
      app/src/main/java/io/legado/app/data/entities/Book.kt
  6. 9
      app/src/main/java/io/legado/app/help/LauncherIconHelp.kt
  7. 2
      app/src/main/java/io/legado/app/help/storage/Restore.kt
  8. 3
      app/src/main/java/io/legado/app/lib/theme/ATH.kt
  9. 42
      app/src/main/java/io/legado/app/model/WebBook.kt
  10. 73
      app/src/main/java/io/legado/app/service/help/ReadBook.kt
  11. 2
      app/src/main/java/io/legado/app/ui/book/group/GroupManageDialog.kt
  12. 21
      app/src/main/java/io/legado/app/ui/book/read/ReadBookActivity.kt
  13. 52
      app/src/main/java/io/legado/app/ui/book/read/ReadBookViewModel.kt
  14. 100
      app/src/main/java/io/legado/app/ui/book/read/TextActionMenu.kt
  15. 4
      app/src/main/java/io/legado/app/ui/book/read/page/ContentView.kt
  16. 2
      app/src/main/java/io/legado/app/ui/book/read/page/DataSource.kt
  17. 6
      app/src/main/java/io/legado/app/ui/book/read/page/PageView.kt
  18. 13
      app/src/main/java/io/legado/app/ui/book/read/page/TextPageFactory.kt
  19. 6
      app/src/main/java/io/legado/app/ui/book/search/SearchActivity.kt
  20. 8
      app/src/main/java/io/legado/app/ui/main/MainActivity.kt
  21. 2
      app/src/main/java/io/legado/app/ui/main/bookshelf/books/BooksAdapterGrid.kt
  22. 21
      app/src/main/java/io/legado/app/ui/main/bookshelf/books/BooksFragment.kt
  23. 10
      app/src/main/java/io/legado/app/ui/main/explore/ExploreAdapter.kt
  24. 6
      app/src/main/java/io/legado/app/ui/rss/source/manage/GroupManageDialog.kt
  25. 4
      app/src/main/java/io/legado/app/ui/welcome/WelcomeActivity.kt
  26. 2
      app/src/main/java/io/legado/app/utils/DocumentUtils.kt
  27. 24
      app/src/main/res/drawable-v24/ic_launcher_2.xml
  28. 56
      app/src/main/res/drawable-v24/ic_launcher_2b.xml
  29. 7
      app/src/main/res/drawable/bg_find_book_group.xml
  30. 11
      app/src/main/res/drawable/bg_searchview.xml
  31. 9
      app/src/main/res/drawable/ic_arrow_down.xml
  32. 9
      app/src/main/res/drawable/ic_arrow_right.xml
  33. 14
      app/src/main/res/drawable/ic_bottom_books_e.xml
  34. 14
      app/src/main/res/drawable/ic_bottom_books_s.xml
  35. 8
      app/src/main/res/drawable/ic_bottom_explore_e.xml
  36. 5
      app/src/main/res/drawable/ic_bottom_explore_s.xml
  37. 8
      app/src/main/res/drawable/ic_bottom_person_e.xml
  38. 10
      app/src/main/res/drawable/ic_bottom_person_s.xml
  39. 12
      app/src/main/res/drawable/ic_bottom_rss_feed_e.xml
  40. 6
      app/src/main/res/drawable/ic_bottom_rss_feed_s.xml
  41. 15
      app/src/main/res/drawable/ic_help.xml
  42. 69
      app/src/main/res/drawable/ic_launcher1.xml
  43. 56
      app/src/main/res/drawable/ic_launcher1_b.xml
  44. 0
      app/src/main/res/drawable/ic_launcher2.xml
  45. 0
      app/src/main/res/drawable/ic_launcher3.xml
  46. 0
      app/src/main/res/drawable/ic_launcher4.xml
  47. 54
      app/src/main/res/drawable/ic_launcher5.xml
  48. 12
      app/src/main/res/drawable/ic_launcher5_b.xml
  49. 0
      app/src/main/res/drawable/ic_launcher6.xml
  50. 54
      app/src/main/res/drawable/ic_launcher7.xml
  51. 12
      app/src/main/res/drawable/ic_launcher7_b.xml
  52. 9
      app/src/main/res/drawable/ic_live_help_black_24dp.xml
  53. 2
      app/src/main/res/drawable/shape_fillet_btn.xml
  54. 2
      app/src/main/res/drawable/shape_fillet_btn_press.xml
  55. 2
      app/src/main/res/layout/activity_main.xml
  56. 6
      app/src/main/res/layout/dialog_read_aloud.xml
  57. 4
      app/src/main/res/layout/dialog_recycler_view.xml
  58. 13
      app/src/main/res/layout/item_bookshelf_grid.xml
  59. 5
      app/src/main/res/layout/item_fillet_text.xml
  60. 30
      app/src/main/res/layout/item_find_book.xml
  61. 1
      app/src/main/res/layout/item_text.xml
  62. 49
      app/src/main/res/layout/popup_action_menu.xml
  63. 9
      app/src/main/res/layout/view_search.xml
  64. 4
      app/src/main/res/menu/content_select_action.xml
  65. 22
      app/src/main/res/menu/main_bnv.xml
  66. 2
      app/src/main/res/menu/main_my.xml
  67. 4
      app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
  68. 2
      app/src/main/res/mipmap-anydpi-v26/launcher1.xml
  69. 4
      app/src/main/res/mipmap-anydpi-v26/launcher2.xml
  70. 2
      app/src/main/res/mipmap-anydpi-v26/launcher3.xml
  71. 2
      app/src/main/res/mipmap-anydpi-v26/launcher4.xml
  72. 5
      app/src/main/res/mipmap-anydpi-v26/launcher5.xml
  73. 5
      app/src/main/res/mipmap-anydpi-v26/launcher6.xml
  74. BIN
      app/src/main/res/mipmap-hdpi/ic_launcher.png
  75. BIN
      app/src/main/res/mipmap-mdpi/ic_launcher.png
  76. BIN
      app/src/main/res/mipmap-xhdpi/ic_launcher.png
  77. BIN
      app/src/main/res/mipmap-xxhdpi/ic_launcher.png
  78. BIN
      app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
  79. 1
      app/src/main/res/values-night/colors.xml
  80. 2
      app/src/main/res/values/array_values.xml
  81. 2
      app/src/main/res/values/arrays.xml
  82. 1
      app/src/main/res/values/colors.xml
  83. 1
      app/src/main/res/values/dimens.xml
  84. 5
      app/src/main/res/values/strings.xml

@ -93,6 +93,34 @@
android:resource="@xml/shortcuts" android:resource="@xml/shortcuts"
android:launchMode="singleTask" /> android:launchMode="singleTask" />
</activity> </activity>
<!--图标5-->
<activity
android:name=".ui.welcome.Launcher5"
android:icon="@mipmap/launcher5"
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>
<!--图标6-->
<activity
android:name=".ui.welcome.Launcher6"
android:icon="@mipmap/launcher6"
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"

@ -9,6 +9,7 @@
* 左下角选择书源文件所在的路径; * 左下角选择书源文件所在的路径;
* 点击书源文件导入; * 点击书源文件导入;
* 导入后返回书源管理界面; * 导入后返回书源管理界面;
* 新版qq下载路径:Android/data/com.tencent.mobileqq/Tencent/QQfile_recv/
3.如何新建大佬发的单独书源? 3.如何新建大佬发的单独书源?
* 复制书源代码; * 复制书源代码;

@ -1,6 +1,15 @@
## 更新日志 ## 更新日志
* 旧版数据导入教程:先在旧版阅读(2.x)中进行备份,然后在新版阅读(3.x)【我的】->【备份与恢复】,选择【导入旧版本数据】。 * 旧版数据导入教程:先在旧版阅读(2.x)中进行备份,然后在新版阅读(3.x)【我的】->【备份与恢复】,选择【导入旧版本数据】。
* 请关注[开源阅读软件]()支持我,同时关注合作公众号[小说拾遗](),阅读公众号小编。 * 请关注[开源阅读]()支持我,同时关注合作公众号[小说拾遗](),阅读公众号小编。
**2020/03/16**
* 弄了个企业公众号[开源阅读](),后面弄好后会把原来的开源阅读软件迁移过来
* 修复滚动模式切换章节位置不归0的bug
* 修复文字选择更多菜单在部分手机上报错的bug
* 修复文字选择菜单问题
**2020/03/15**
* 加载正文无书源时自动换源
**2020/03/14** **2020/03/14**
* 修改导航栏图标 * 修改导航栏图标

@ -50,9 +50,12 @@ interface BookSourceDao {
@get:Query("select * from book_sources order by customOrder asc") @get:Query("select * from book_sources order by customOrder asc")
val all: List<BookSource> val all: List<BookSource>
@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<BookSource> val allEnabled: List<BookSource>
@get:Query("select * from book_sources where enabled = 1 and bookSourceType = 0 order by customOrder")
val allTextEnabled: List<BookSource>
@Query("select * from book_sources where bookSourceUrl = :key") @Query("select * from book_sources where bookSourceUrl = :key")
fun getBookSource(key: String): BookSource? fun getBookSource(key: String): BookSource?

@ -31,8 +31,8 @@ data class Book(
var intro: String? = null, // 简介内容(书源获取) var intro: String? = null, // 简介内容(书源获取)
var customIntro: String? = null, // 简介内容(用户修改) var customIntro: String? = null, // 简介内容(用户修改)
var charset: String? = null, // 自定义字符集名称(仅适用于本地书籍) var charset: String? = null, // 自定义字符集名称(仅适用于本地书籍)
var type: Int = 0, // @BookType var type: Int = 0, // 0:text 1:audio
var group: Int = 0, // 自定义分组索引号 var group: Int = 1, // 自定义分组索引号
var latestChapterTitle: String? = null, // 最新章节标题 var latestChapterTitle: String? = null, // 最新章节标题
var latestChapterTime: Long = System.currentTimeMillis(), // 最新章节标题更新时间 var latestChapterTime: Long = System.currentTimeMillis(), // 最新章节标题更新时间
var lastCheckTime: Long = System.currentTimeMillis(), // 最近一次更新书籍信息的时间 var lastCheckTime: Long = System.currentTimeMillis(), // 最近一次更新书籍信息的时间

@ -5,10 +5,7 @@ import android.content.pm.PackageManager
import android.os.Build import android.os.Build
import io.legado.app.App import io.legado.app.App
import io.legado.app.R import io.legado.app.R
import io.legado.app.ui.welcome.Launcher1 import io.legado.app.ui.welcome.*
import io.legado.app.ui.welcome.Launcher2
import io.legado.app.ui.welcome.Launcher3
import io.legado.app.ui.welcome.WelcomeActivity
import org.jetbrains.anko.toast import org.jetbrains.anko.toast
/** /**
@ -20,7 +17,9 @@ object LauncherIconHelp {
private val componentNames = arrayListOf( private val componentNames = arrayListOf(
ComponentName(App.INSTANCE, Launcher1::class.java.name), ComponentName(App.INSTANCE, Launcher1::class.java.name),
ComponentName(App.INSTANCE, Launcher2::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),
ComponentName(App.INSTANCE, Launcher5::class.java.name)
) )
fun changeIcon(icon: String?) { fun changeIcon(icon: String?) {

@ -128,7 +128,7 @@ object Restore {
bodyIndentCount = App.INSTANCE.getPrefInt(PreferKey.bodyIndent, 2) bodyIndentCount = App.INSTANCE.getPrefInt(PreferKey.bodyIndent, 2)
} }
ChapterProvider.upStyle() ChapterProvider.upStyle()
ReadBook.loadContent() ReadBook.loadContent(resetPageOffset = false)
} }
withContext(Main) { withContext(Main) {
if (AppConfig.isNightTheme && AppCompatDelegate.getDefaultNightMode() != AppCompatDelegate.MODE_NIGHT_YES) { if (AppConfig.isNightTheme && AppCompatDelegate.getDefaultNightMode() != AppCompatDelegate.MODE_NIGHT_YES) {

@ -199,13 +199,12 @@ object ATH {
fun applyBottomNavigationColor(bottomBar: BottomNavigationView?) { fun applyBottomNavigationColor(bottomBar: BottomNavigationView?) {
bottomBar?.apply { bottomBar?.apply {
setBackgroundColor(ThemeStore.backgroundColor(context)) setBackgroundColor(ThemeStore.bottomBackground(context))
val colorStateList = Selector.colorBuild() val colorStateList = Selector.colorBuild()
.setDefaultColor(context.getCompatColor(R.color.btn_bg_press_tp)) .setDefaultColor(context.getCompatColor(R.color.btn_bg_press_tp))
.setSelectedColor(ThemeStore.accentColor(bottom_navigation_view.context)).create() .setSelectedColor(ThemeStore.accentColor(bottom_navigation_view.context)).create()
itemIconTintList = colorStateList itemIconTintList = colorStateList
itemTextColor = colorStateList itemTextColor = colorStateList
setBackgroundColor(ThemeStore.bottomBackground(context))
} }
} }

@ -29,26 +29,34 @@ class WebBook(val bookSource: BookSource) {
context: CoroutineContext = Dispatchers.IO context: CoroutineContext = Dispatchers.IO
): Coroutine<List<SearchBook>> { ): Coroutine<List<SearchBook>> {
return Coroutine.async(scope, context) { return Coroutine.async(scope, context) {
bookSource.searchUrl?.let { searchUrl -> searchBookSuspend(key, page)
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()
} }
} }
suspend fun searchBookSuspend(
key: String,
page: Int? = 1
): ArrayList<SearchBook> {
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()
}
/** /**
* 发现 * 发现
*/ */

@ -21,7 +21,6 @@ import org.jetbrains.anko.toast
object ReadBook { object ReadBook {
var titleDate = MutableLiveData<String>() var titleDate = MutableLiveData<String>()
var book: Book? = null var book: Book? = null
var inBookshelf = false var inBookshelf = false
@ -34,9 +33,10 @@ object ReadBook {
var curTextChapter: TextChapter? = null var curTextChapter: TextChapter? = null
var nextTextChapter: TextChapter? = null var nextTextChapter: TextChapter? = null
var webBook: WebBook? = null var webBook: WebBook? = null
var msg: String? = null
private val loadingChapters = arrayListOf<Int>() private val loadingChapters = arrayListOf<Int>()
fun resetData(book: Book) { fun resetData(book: Book, noSource: (name: String, author: String) -> Unit) {
this.book = book this.book = book
titleDate.postValue(book.name) titleDate.postValue(book.name)
durChapterIndex = book.durChapterIndex durChapterIndex = book.durChapterIndex
@ -46,12 +46,22 @@ object ReadBook {
prevTextChapter = null prevTextChapter = null
curTextChapter = null curTextChapter = null
nextTextChapter = null nextTextChapter = null
upWebBook(book.origin) upWebBook(book, noSource)
} }
fun upWebBook(origin: String) { fun upWebBook(book: Book?, noSource: (name: String, author: String) -> Unit) {
val bookSource = App.db.bookSourceDao().getBookSource(origin) book ?: return
webBook = if (bookSource != null) WebBook(bookSource) else null if (book.origin == BookType.local) {
webBook = null
} else {
val bookSource = App.db.bookSourceDao().getBookSource(book.origin)
if (bookSource != null) {
webBook = WebBook(bookSource)
} else {
webBook = null
noSource.invoke(book.name, book.author)
}
}
} }
fun moveToNextPage() { fun moveToNextPage() {
@ -69,11 +79,11 @@ object ReadBook {
nextTextChapter = null nextTextChapter = null
book?.let { book?.let {
if (curTextChapter == null) { if (curTextChapter == null) {
loadContent(durChapterIndex, upContent) loadContent(durChapterIndex, upContent, false)
} else if (upContent) { } else if (upContent) {
callBack?.upContent() callBack?.upContent()
} }
loadContent(durChapterIndex.plus(1), upContent) loadContent(durChapterIndex.plus(1), upContent, false)
GlobalScope.launch(Dispatchers.IO) { GlobalScope.launch(Dispatchers.IO) {
for (i in 2..10) { for (i in 2..10) {
delay(100) delay(100)
@ -99,11 +109,11 @@ object ReadBook {
prevTextChapter = null prevTextChapter = null
book?.let { book?.let {
if (curTextChapter == null) { if (curTextChapter == null) {
loadContent(durChapterIndex, upContent) loadContent(durChapterIndex, upContent, false)
} else if (upContent) { } else if (upContent) {
callBack?.upContent() callBack?.upContent()
} }
loadContent(durChapterIndex.minus(1), upContent) loadContent(durChapterIndex.minus(1), upContent, false)
GlobalScope.launch(Dispatchers.IO) { GlobalScope.launch(Dispatchers.IO) {
for (i in -5..-2) { for (i in -5..-2) {
delay(100) delay(100)
@ -184,21 +194,21 @@ object ReadBook {
/** /**
* 加载章节内容 * 加载章节内容
*/ */
fun loadContent() { fun loadContent(resetPageOffset: Boolean) {
loadContent(durChapterIndex) loadContent(durChapterIndex, resetPageOffset = resetPageOffset)
loadContent(durChapterIndex + 1) loadContent(durChapterIndex + 1, resetPageOffset = resetPageOffset)
loadContent(durChapterIndex - 1) loadContent(durChapterIndex - 1, resetPageOffset = resetPageOffset)
} }
fun loadContent(index: Int, upContent: Boolean = true) { fun loadContent(index: Int, upContent: Boolean = true, resetPageOffset: Boolean) {
book?.let { book -> book?.let { book ->
if (addLoading(index)) { if (addLoading(index)) {
Coroutine.async { Coroutine.async {
App.db.bookChapterDao().getChapter(book.bookUrl, index)?.let { chapter -> App.db.bookChapterDao().getChapter(book.bookUrl, index)?.let { chapter ->
BookHelp.getContent(book, chapter)?.let { BookHelp.getContent(book, chapter)?.let {
contentLoadFinish(chapter, it, upContent) contentLoadFinish(chapter, it, upContent, resetPageOffset)
removeLoading(chapter.index) removeLoading(chapter.index)
} ?: download(chapter) } ?: download(chapter, resetPageOffset = resetPageOffset)
} ?: removeLoading(index) } ?: removeLoading(index)
}.onError { }.onError {
removeLoading(index) removeLoading(index)
@ -216,7 +226,7 @@ object ReadBook {
if (BookHelp.hasContent(book, chapter)) { if (BookHelp.hasContent(book, chapter)) {
removeLoading(chapter.index) removeLoading(chapter.index)
} else { } else {
download(chapter) download(chapter, false)
} }
} ?: removeLoading(index) } ?: removeLoading(index)
}.onError { }.onError {
@ -226,20 +236,28 @@ object ReadBook {
} }
} }
private fun download(chapter: BookChapter) { private fun download(chapter: BookChapter, resetPageOffset: Boolean) {
book?.let { book -> book?.let { book ->
webBook?.getContent(book, chapter) webBook?.getContent(book, chapter)
?.onSuccess(Dispatchers.IO) { content -> ?.onSuccess(Dispatchers.IO) { content ->
if (content.isNullOrEmpty()) { 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) removeLoading(chapter.index)
} else { } else {
BookHelp.saveContent(book, chapter, content) BookHelp.saveContent(book, chapter, content)
contentLoadFinish(chapter, content) contentLoadFinish(chapter, content, resetPageOffset = resetPageOffset)
removeLoading(chapter.index) removeLoading(chapter.index)
} }
}?.onError { }?.onError {
contentLoadFinish(chapter, it.localizedMessage ?: "未知错误") contentLoadFinish(
chapter,
it.localizedMessage ?: "未知错误",
resetPageOffset = resetPageOffset
)
removeLoading(chapter.index) removeLoading(chapter.index)
} }
} }
@ -265,7 +283,8 @@ object ReadBook {
private fun contentLoadFinish( private fun contentLoadFinish(
chapter: BookChapter, chapter: BookChapter,
content: String, content: String,
upContent: Boolean = true upContent: Boolean = true,
resetPageOffset: Boolean
) { ) {
Coroutine.async { Coroutine.async {
if (chapter.index in durChapterIndex - 1..durChapterIndex + 1) { if (chapter.index in durChapterIndex - 1..durChapterIndex + 1) {
@ -279,18 +298,18 @@ object ReadBook {
when (chapter.index) { when (chapter.index) {
durChapterIndex -> { durChapterIndex -> {
curTextChapter = ChapterProvider.getTextChapter(chapter, c, chapterSize) curTextChapter = ChapterProvider.getTextChapter(chapter, c, chapterSize)
if (upContent) callBack?.upContent() if (upContent) callBack?.upContent(resetPageOffset = resetPageOffset)
callBack?.upView() callBack?.upView()
curPageChanged() curPageChanged()
callBack?.contentLoadFinish() callBack?.contentLoadFinish()
} }
durChapterIndex - 1 -> { durChapterIndex - 1 -> {
prevTextChapter = ChapterProvider.getTextChapter(chapter, c, chapterSize) prevTextChapter = ChapterProvider.getTextChapter(chapter, c, chapterSize)
if (upContent) callBack?.upContent(-1) if (upContent) callBack?.upContent(-1, resetPageOffset)
} }
durChapterIndex + 1 -> { durChapterIndex + 1 -> {
nextTextChapter = ChapterProvider.getTextChapter(chapter, c, chapterSize) nextTextChapter = ChapterProvider.getTextChapter(chapter, c, chapterSize)
if (upContent) callBack?.upContent(1) if (upContent) callBack?.upContent(1, resetPageOffset)
} }
} }
} }
@ -316,7 +335,7 @@ object ReadBook {
} }
interface CallBack { interface CallBack {
fun upContent(relativePosition: Int = 0) fun upContent(relativePosition: Int = 0, resetPageOffset: Boolean = true)
fun upView() fun upView()
fun upPageProgress() fun upPageProgress()
fun contentLoadFinish() fun contentLoadFinish()

@ -33,6 +33,7 @@ import io.legado.app.ui.widget.recycler.VerticalDivider
import io.legado.app.utils.applyTint import io.legado.app.utils.applyTint
import io.legado.app.utils.getViewModel import io.legado.app.utils.getViewModel
import io.legado.app.utils.requestInputMethod 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_edit_text.view.*
import kotlinx.android.synthetic.main.dialog_recycler_view.* import kotlinx.android.synthetic.main.dialog_recycler_view.*
import kotlinx.android.synthetic.main.item_group_manage.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.addItemDecoration(VerticalDivider(requireContext()))
recycler_view.adapter = adapter recycler_view.adapter = adapter
tv_ok.setTextColor(requireContext().accentColor) tv_ok.setTextColor(requireContext().accentColor)
tv_ok.visible()
tv_ok.onClick { dismiss() } tv_ok.onClick { dismiss() }
App.db.bookGroupDao().liveDataAll().observe(viewLifecycleOwner, Observer { App.db.bookGroupDao().liveDataAll().observe(viewLifecycleOwner, Observer {
val diffResult = val diffResult =

@ -25,6 +25,7 @@ import io.legado.app.data.entities.BookChapter
import io.legado.app.help.BookHelp import io.legado.app.help.BookHelp
import io.legado.app.help.ReadBookConfig import io.legado.app.help.ReadBookConfig
import io.legado.app.help.coroutine.Coroutine 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.help.storage.SyncBookProgress
import io.legado.app.lib.dialogs.alert import io.legado.app.lib.dialogs.alert
import io.legado.app.lib.dialogs.noButton import io.legado.app.lib.dialogs.noButton
@ -115,7 +116,7 @@ class ReadBookActivity : VMBaseActivity<ReadBookViewModel>(R.layout.activity_boo
override fun onConfigurationChanged(newConfig: Configuration) { override fun onConfigurationChanged(newConfig: Configuration) {
super.onConfigurationChanged(newConfig) super.onConfigurationChanged(newConfig)
ReadBook.loadContent() ReadBook.loadContent(resetPageOffset = false)
} }
override fun onResume() { override fun onResume() {
@ -402,11 +403,10 @@ class ReadBookActivity : VMBaseActivity<ReadBookViewModel>(R.layout.activity_boo
*/ */
override fun showTextActionMenu() { override fun showTextActionMenu() {
textActionMenu ?: let { textActionMenu ?: let {
textActionMenu = TextActionMenu(this, this).apply { textActionMenu = TextActionMenu(this, this)
contentView.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED)
}
} }
textActionMenu?.let { popup -> textActionMenu?.let { popup ->
popup.contentView.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED)
val popupHeight = popup.contentView.measuredHeight val popupHeight = popup.contentView.measuredHeight
val x = text_menu_position.x.toInt() val x = text_menu_position.x.toInt()
var y = text_menu_position.y.toInt() - popupHeight var y = text_menu_position.y.toInt() - popupHeight
@ -481,9 +481,9 @@ class ReadBookActivity : VMBaseActivity<ReadBookViewModel>(R.layout.activity_boo
/** /**
* 更新内容 * 更新内容
*/ */
override fun upContent(relativePosition: Int) { override fun upContent(relativePosition: Int, resetPageOffset: Boolean) {
launch { launch {
page_view.upContent(relativePosition) page_view.upContent(relativePosition, resetPageOffset)
} }
} }
@ -579,7 +579,7 @@ class ReadBookActivity : VMBaseActivity<ReadBookViewModel>(R.layout.activity_boo
override fun onReplaceRuleSave() { override fun onReplaceRuleSave() {
Coroutine.async { Coroutine.async {
BookHelp.upReplaceRules() BookHelp.upReplaceRules()
ReadBook.loadContent() ReadBook.loadContent(resetPageOffset = false)
} }
} }
@ -684,6 +684,7 @@ class ReadBookActivity : VMBaseActivity<ReadBookViewModel>(R.layout.activity_boo
page_view.onDestroy() page_view.onDestroy()
if (!BuildConfig.DEBUG) { if (!BuildConfig.DEBUG) {
SyncBookProgress.uploadBookProgress() SyncBookProgress.uploadBookProgress()
Backup.autoBack(this)
} }
} }
@ -707,9 +708,9 @@ class ReadBookActivity : VMBaseActivity<ReadBookViewModel>(R.layout.activity_boo
page_view.upBg() page_view.upBg()
page_view.upStyle() page_view.upStyle()
if (it) { if (it) {
ReadBook.loadContent() ReadBook.loadContent(resetPageOffset = false)
} else { } else {
page_view.upContent() page_view.upContent(resetPageOffset = false)
} }
} }
observeEvent<Int>(EventBus.ALOUD_STATE) { observeEvent<Int>(EventBus.ALOUD_STATE) {
@ -718,7 +719,7 @@ class ReadBookActivity : VMBaseActivity<ReadBookViewModel>(R.layout.activity_boo
val page = textChapter.page(ReadBook.durPageIndex) val page = textChapter.page(ReadBook.durPageIndex)
if (page != null) { if (page != null) {
page.removePageAloudSpan() page.removePageAloudSpan()
page_view.upContent() page_view.upContent(resetPageOffset = false)
} }
} }
} }

@ -39,7 +39,9 @@ class ReadBookViewModel(application: Application) : BaseViewModel(application) {
private fun initBook(book: Book) { private fun initBook(book: Book) {
if (ReadBook.book?.bookUrl != book.bookUrl) { if (ReadBook.book?.bookUrl != book.bookUrl) {
ReadBook.resetData(book) ReadBook.resetData(book) { name, author ->
autoChangeSource(name, author)
}
isInitFinish = true isInitFinish = true
ReadBook.chapterSize = App.db.bookChapterDao().getChapterCount(book.bookUrl) ReadBook.chapterSize = App.db.bookChapterDao().getChapterCount(book.bookUrl)
if (ReadBook.chapterSize == 0) { if (ReadBook.chapterSize == 0) {
@ -52,7 +54,7 @@ class ReadBookViewModel(application: Application) : BaseViewModel(application) {
if (ReadBook.durChapterIndex > ReadBook.chapterSize - 1) { if (ReadBook.durChapterIndex > ReadBook.chapterSize - 1) {
ReadBook.durChapterIndex = ReadBook.chapterSize - 1 ReadBook.durChapterIndex = ReadBook.chapterSize - 1
} }
ReadBook.loadContent() ReadBook.loadContent(resetPageOffset = true)
} }
if (ReadBook.inBookshelf) { if (ReadBook.inBookshelf) {
ReadBook.saveRead() ReadBook.saveRead()
@ -60,7 +62,9 @@ class ReadBookViewModel(application: Application) : BaseViewModel(application) {
} else { } else {
isInitFinish = true isInitFinish = true
ReadBook.titleDate.postValue(book.name) ReadBook.titleDate.postValue(book.name)
ReadBook.upWebBook(book.origin) ReadBook.upWebBook(book) { name, author ->
autoChangeSource(name, author)
}
ReadBook.chapterSize = App.db.bookChapterDao().getChapterCount(book.bookUrl) ReadBook.chapterSize = App.db.bookChapterDao().getChapterCount(book.bookUrl)
if (ReadBook.chapterSize == 0) { if (ReadBook.chapterSize == 0) {
if (book.tocUrl.isEmpty()) { if (book.tocUrl.isEmpty()) {
@ -70,7 +74,7 @@ class ReadBookViewModel(application: Application) : BaseViewModel(application) {
} }
} else { } else {
if (ReadBook.curTextChapter != null) { if (ReadBook.curTextChapter != null) {
ReadBook.callBack?.upContent() ReadBook.callBack?.upContent(resetPageOffset = false)
} }
} }
} }
@ -103,7 +107,7 @@ class ReadBookViewModel(application: Application) : BaseViewModel(application) {
App.db.bookChapterDao().insert(*it.toTypedArray()) App.db.bookChapterDao().insert(*it.toTypedArray())
App.db.bookDao().update(book) App.db.bookDao().update(book)
ReadBook.chapterSize = it.size ReadBook.chapterSize = it.size
ReadBook.loadContent() ReadBook.loadContent(resetPageOffset = true)
} }
} else { } else {
ReadBook.webBook?.getChapterList(book, this) ReadBook.webBook?.getChapterList(book, this)
@ -113,7 +117,7 @@ class ReadBookViewModel(application: Application) : BaseViewModel(application) {
App.db.bookChapterDao().insert(*cList.toTypedArray()) App.db.bookChapterDao().insert(*cList.toTypedArray())
App.db.bookDao().update(book) App.db.bookDao().update(book)
ReadBook.chapterSize = cList.size ReadBook.chapterSize = cList.size
ReadBook.loadContent() ReadBook.loadContent(resetPageOffset = true)
} else { } else {
changeDruChapterIndex(cList) changeDruChapterIndex(cList)
} }
@ -122,7 +126,7 @@ class ReadBookViewModel(application: Application) : BaseViewModel(application) {
} }
}?.onError { }?.onError {
toast(R.string.error_load_toc) toast(R.string.error_load_toc)
} ?: autoChangeSource() }
} }
} }
} }
@ -151,8 +155,28 @@ class ReadBookViewModel(application: Application) : BaseViewModel(application) {
} }
} }
private fun autoChangeSource() { private fun autoChangeSource(name: String, author: String) {
execute {
App.db.bookSourceDao().allTextEnabled.forEach { source ->
try {
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 {
ReadBook.msg = "正在自动换源"
ReadBook.callBack?.upContent()
}.onFinally {
ReadBook.msg = null
ReadBook.callBack?.upContent()
}
} }
private fun upChangeDurChapterIndex(book: Book, chapters: List<BookChapter>) { private fun upChangeDurChapterIndex(book: Book, chapters: List<BookChapter>) {
@ -167,7 +191,7 @@ class ReadBookViewModel(application: Application) : BaseViewModel(application) {
App.db.bookDao().update(book) App.db.bookDao().update(book)
App.db.bookChapterDao().insert(*chapters.toTypedArray()) App.db.bookChapterDao().insert(*chapters.toTypedArray())
ReadBook.chapterSize = chapters.size ReadBook.chapterSize = chapters.size
ReadBook.loadContent() ReadBook.loadContent(resetPageOffset = true)
} }
} }
@ -181,7 +205,7 @@ class ReadBookViewModel(application: Application) : BaseViewModel(application) {
ReadBook.durPageIndex = pageIndex ReadBook.durPageIndex = pageIndex
} }
ReadBook.saveRead() ReadBook.saveRead()
ReadBook.loadContent() ReadBook.loadContent(resetPageOffset = true)
} }
fun removeFromBookshelf(success: (() -> Unit)?) { fun removeFromBookshelf(success: (() -> Unit)?) {
@ -208,9 +232,9 @@ class ReadBookViewModel(application: Application) : BaseViewModel(application) {
execute { execute {
App.db.bookChapterDao().getChapter(book.bookUrl, ReadBook.durChapterIndex) App.db.bookChapterDao().getChapter(book.bookUrl, ReadBook.durChapterIndex)
?.let { chapter -> ?.let { chapter ->
BookHelp.delContent(book, chapter) BookHelp.delContent(book, chapter)
ReadBook.loadContent(ReadBook.durChapterIndex) ReadBook.loadContent(ReadBook.durChapterIndex, resetPageOffset = false)
} }
} }
} }

@ -7,6 +7,7 @@ import android.content.Intent
import android.content.pm.ResolveInfo import android.content.pm.ResolveInfo
import android.net.Uri import android.net.Uri
import android.os.Build import android.os.Build
import android.speech.tts.TextToSpeech
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.Menu import android.view.Menu
import android.view.ViewGroup import android.view.ViewGroup
@ -15,13 +16,12 @@ import androidx.annotation.RequiresApi
import androidx.appcompat.view.SupportMenuInflater import androidx.appcompat.view.SupportMenuInflater
import androidx.appcompat.view.menu.MenuBuilder import androidx.appcompat.view.menu.MenuBuilder
import androidx.appcompat.view.menu.MenuItemImpl import androidx.appcompat.view.menu.MenuItemImpl
import androidx.appcompat.widget.PopupMenu import androidx.core.view.isVisible
import androidx.core.view.size
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import io.legado.app.R import io.legado.app.R
import io.legado.app.base.adapter.ItemViewHolder import io.legado.app.base.adapter.ItemViewHolder
import io.legado.app.base.adapter.SimpleRecyclerAdapter import io.legado.app.base.adapter.SimpleRecyclerAdapter
import io.legado.app.service.BaseReadAloudService
import io.legado.app.utils.gone
import io.legado.app.utils.isAbsUrl import io.legado.app.utils.isAbsUrl
import io.legado.app.utils.sendToClip import io.legado.app.utils.sendToClip
import io.legado.app.utils.visible import io.legado.app.utils.visible
@ -30,10 +30,16 @@ import kotlinx.android.synthetic.main.popup_action_menu.view.*
import org.jetbrains.anko.sdk27.listeners.onClick import org.jetbrains.anko.sdk27.listeners.onClick
import org.jetbrains.anko.share import org.jetbrains.anko.share
import org.jetbrains.anko.toast import org.jetbrains.anko.toast
import java.util.*
@SuppressLint("RestrictedApi") @SuppressLint("RestrictedApi")
class TextActionMenu(private val context: Context, private val callBack: CallBack) : class TextActionMenu(private val context: Context, private val callBack: CallBack) :
PopupWindow(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT) { PopupWindow(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT),
TextToSpeech.OnInitListener {
private val adapter = Adapter(context)
private val menu = MenuBuilder(context)
private val moreMenu = MenuBuilder(context)
init { init {
@SuppressLint("InflateParams") @SuppressLint("InflateParams")
@ -44,33 +50,38 @@ class TextActionMenu(private val context: Context, private val callBack: CallBac
isFocusable = false isFocusable = false
initRecyclerView() initRecyclerView()
setOnDismissListener {
contentView.apply {
iv_menu_more.setImageResource(R.drawable.ic_more_vert)
recycler_view_more.gone()
adapter.setItems(menu.visibleItems)
recycler_view.visible()
}
}
} }
private fun initRecyclerView() = with(contentView) { private fun initRecyclerView() = with(contentView) {
val adapter = Adapter(context)
recycler_view.layoutManager = LinearLayoutManager(context, RecyclerView.HORIZONTAL, false)
recycler_view.adapter = adapter recycler_view.adapter = adapter
val menu = MenuBuilder(context) recycler_view_more.adapter = adapter
SupportMenuInflater(context).inflate(R.menu.content_select_action, menu) SupportMenuInflater(context).inflate(R.menu.content_select_action, menu)
adapter.setItems(menu.visibleItems) adapter.setItems(menu.visibleItems)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
val popupMenu = PopupMenu(context, iv_menu_more) onInitializeMenu(moreMenu)
onInitializeMenu(popupMenu.menu) }
if (popupMenu.menu.size > 0) { if (moreMenu.size() > 0) {
iv_menu_more.visible() iv_menu_more.visible()
popupMenu.setOnMenuItemClickListener { item -> }
item.intent?.let { iv_menu_more.onClick {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { if (recycler_view.isVisible) {
it.putExtra(Intent.EXTRA_PROCESS_TEXT, callBack.selectedText) iv_menu_more.setImageResource(R.drawable.ic_arrow_back)
context.startActivity(it) adapter.setItems(moreMenu.visibleItems)
} recycler_view.gone()
} recycler_view_more.visible()
this@TextActionMenu.dismiss() } else {
true iv_menu_more.setImageResource(R.drawable.ic_more_vert)
} recycler_view_more.gone()
} adapter.setItems(menu.visibleItems)
iv_menu_more.onClick { recycler_view.visible()
popupMenu.show()
} }
} }
} }
@ -104,6 +115,13 @@ class TextActionMenu(private val context: Context, private val callBack: CallBac
when (item.itemId) { when (item.itemId) {
R.id.menu_copy -> context.sendToClip(callBack.selectedText) R.id.menu_copy -> context.sendToClip(callBack.selectedText)
R.id.menu_share_str -> context.share(callBack.selectedText) R.id.menu_share_str -> context.share(callBack.selectedText)
R.id.menu_aloud -> {
if (BaseReadAloudService.isRun) {
context.toast(R.string.alouding_disable)
return
}
readAloud(callBack.selectedText)
}
R.id.menu_browser -> { R.id.menu_browser -> {
try { try {
val intent = if (callBack.selectedText.isAbsUrl()) { val intent = if (callBack.selectedText.isAbsUrl()) {
@ -121,9 +139,41 @@ class TextActionMenu(private val context: Context, private val callBack: CallBac
context.toast(e.localizedMessage ?: "ERROR") context.toast(e.localizedMessage ?: "ERROR")
} }
} }
else -> item.intent?.let {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
it.putExtra(Intent.EXTRA_PROCESS_TEXT, callBack.selectedText)
context.startActivity(it)
}
}
} }
} }
private var textToSpeech: TextToSpeech? = null
private var ttsInitFinish = false
private var lastText: String = ""
@SuppressLint("SetJavaScriptEnabled")
private fun readAloud(text: String) {
lastText = text
if (textToSpeech == null) {
textToSpeech = TextToSpeech(context, this)
return
}
if (!ttsInitFinish) return
if (text == "") return
if (textToSpeech?.isSpeaking == true)
textToSpeech?.stop()
textToSpeech?.speak(text, TextToSpeech.QUEUE_ADD, null, "select_text")
lastText = ""
}
@Synchronized
override fun onInit(status: Int) {
textToSpeech?.language = Locale.CHINA
ttsInitFinish = true
readAloud(lastText)
}
@RequiresApi(Build.VERSION_CODES.M) @RequiresApi(Build.VERSION_CODES.M)
private fun createProcessTextIntent(): Intent { private fun createProcessTextIntent(): Intent {
return Intent() return Intent()

@ -108,8 +108,10 @@ class ContentView(context: Context) : FrameLayout(context) {
} }
} }
fun setContent(textPage: TextPage) { fun setContent(textPage: TextPage, resetPageOffset: Boolean = true) {
setProgress(textPage) setProgress(textPage)
if (resetPageOffset)
resetPageOffset()
content_text_view.setContent(textPage) content_text_view.setContent(textPage)
} }

@ -17,5 +17,5 @@ interface DataSource {
fun hasPrevChapter(): Boolean fun hasPrevChapter(): Boolean
fun upContent(relativePosition: Int = 0) fun upContent(relativePosition: Int = 0, resetPageOffset: Boolean = true)
} }

@ -38,7 +38,7 @@ class PageView(context: Context, attrs: AttributeSet) :
prevPage.x = -w.toFloat() prevPage.x = -w.toFloat()
pageDelegate?.setViewSize(w, h) pageDelegate?.setViewSize(w, h)
if (oldw != 0 && oldh != 0) { if (oldw != 0 && oldh != 0) {
ReadBook.loadContent() ReadBook.loadContent(resetPageOffset = false)
} }
} }
@ -93,9 +93,9 @@ class PageView(context: Context, attrs: AttributeSet) :
upContent() upContent()
} }
override fun upContent(relativePosition: Int) { override fun upContent(relativePosition: Int, resetPageOffset: Boolean) {
if (ReadBookConfig.isScroll) { if (ReadBookConfig.isScroll) {
curPage.setContent(pageFactory.currentPage) curPage.setContent(pageFactory.currentPage, resetPageOffset)
} else { } else {
when (relativePosition) { when (relativePosition) {
-1 -> prevPage.setContent(pageFactory.prevPage) -1 -> prevPage.setContent(pageFactory.prevPage)

@ -38,7 +38,7 @@ class TextPageFactory(dataSource: DataSource) : PageFactory<TextPage>(dataSource
} else { } else {
ReadBook.setPageIndex(pageIndex.plus(1)) ReadBook.setPageIndex(pageIndex.plus(1))
} }
if (upContent) upContent() if (upContent) upContent(resetPageOffset = false)
true true
} else } else
false false
@ -51,7 +51,7 @@ class TextPageFactory(dataSource: DataSource) : PageFactory<TextPage>(dataSource
} else { } else {
ReadBook.setPageIndex(pageIndex.minus(1)) ReadBook.setPageIndex(pageIndex.minus(1))
} }
if (upContent) upContent() if (upContent) upContent(resetPageOffset = false)
true true
} else } else
false false
@ -59,6 +59,9 @@ class TextPageFactory(dataSource: DataSource) : PageFactory<TextPage>(dataSource
override val currentPage: TextPage override val currentPage: TextPage
get() = with(dataSource) { get() = with(dataSource) {
ReadBook.msg?.let {
return@with TextPage(text = it).format()
}
currentChapter?.let { currentChapter?.let {
return@with it.page(pageIndex) return@with it.page(pageIndex)
?: TextPage(title = it.title).format() ?: TextPage(title = it.title).format()
@ -68,6 +71,9 @@ class TextPageFactory(dataSource: DataSource) : PageFactory<TextPage>(dataSource
override val nextPage: TextPage override val nextPage: TextPage
get() = with(dataSource) { get() = with(dataSource) {
ReadBook.msg?.let {
return@with TextPage(text = it).format()
}
currentChapter?.let { currentChapter?.let {
if (pageIndex < it.pageSize() - 1) { if (pageIndex < it.pageSize() - 1) {
return@with it.page(pageIndex + 1)?.removePageAloudSpan() return@with it.page(pageIndex + 1)?.removePageAloudSpan()
@ -86,6 +92,9 @@ class TextPageFactory(dataSource: DataSource) : PageFactory<TextPage>(dataSource
override val prevPage: TextPage override val prevPage: TextPage
get() = with(dataSource) { get() = with(dataSource) {
ReadBook.msg?.let {
return@with TextPage(text = it).format()
}
if (pageIndex > 0) { if (pageIndex > 0) {
currentChapter?.let { currentChapter?.let {
return@with it.page(pageIndex - 1)?.removePageAloudSpan() return@with it.page(pageIndex - 1)?.removePageAloudSpan()

@ -283,10 +283,12 @@ class SearchActivity : VMBaseActivity<SearchViewModel>(R.layout.activity_book_se
*/ */
@Synchronized @Synchronized
private fun upSearchItems(items: List<SearchBook>, isMandatoryUpdate: Boolean) { private fun upSearchItems(items: List<SearchBook>, isMandatoryUpdate: Boolean) {
val searchItems = ArrayList(items)
if (isMandatoryUpdate || System.currentTimeMillis() - refreshTime > 500) { if (isMandatoryUpdate || System.currentTimeMillis() - refreshTime > 500) {
refreshTime = System.currentTimeMillis() refreshTime = System.currentTimeMillis()
val diffResult = DiffUtil.calculateDiff(DiffCallBack(adapter.getItems(), items)) val diffResult =
adapter.setItems(items, diffResult) DiffUtil.calculateDiff(DiffCallBack(adapter.getItems(), searchItems))
adapter.setItems(searchItems, diffResult)
} }
} }

@ -15,7 +15,6 @@ import io.legado.app.base.VMBaseActivity
import io.legado.app.constant.EventBus import io.legado.app.constant.EventBus
import io.legado.app.constant.PreferKey import io.legado.app.constant.PreferKey
import io.legado.app.help.AppConfig import io.legado.app.help.AppConfig
import io.legado.app.help.storage.Backup
import io.legado.app.lib.theme.ATH import io.legado.app.lib.theme.ATH
import io.legado.app.service.BaseReadAloudService import io.legado.app.service.BaseReadAloudService
import io.legado.app.service.help.ReadAloud import io.legado.app.service.help.ReadAloud
@ -114,13 +113,6 @@ class MainActivity : VMBaseActivity<MainViewModel>(R.layout.activity_main),
return super.onKeyUp(keyCode, event) return super.onKeyUp(keyCode, event)
} }
override fun finish() {
if (!BuildConfig.DEBUG) {
Backup.autoBack(this)
}
super.finish()
}
override fun onDestroy() { override fun onDestroy() {
super.onDestroy() super.onDestroy()
ReadAloud.stop(this) ReadAloud.stop(this)

@ -21,7 +21,6 @@ class BooksAdapterGrid(context: Context, private val callBack: CallBack) :
if (bundle == null) { if (bundle == null) {
ATH.applyBackgroundTint(this) ATH.applyBackgroundTint(this)
tv_name.text = item.name tv_name.text = item.name
bv_author.text = item.author
iv_cover.load(item.getDisplayCover(), item.name, item.author) iv_cover.load(item.getDisplayCover(), item.name, item.author)
if (item.origin != BookType.local && callBack.isUpdate(item.bookUrl)) { if (item.origin != BookType.local && callBack.isUpdate(item.bookUrl)) {
bv_unread.invisible() bv_unread.invisible()
@ -35,7 +34,6 @@ class BooksAdapterGrid(context: Context, private val callBack: CallBack) :
bundle.keySet().map { bundle.keySet().map {
when (it) { when (it) {
"name" -> tv_name.text = item.name "name" -> tv_name.text = item.name
"author" -> bv_author.text = item.author
"cover" -> iv_cover.load(item.getDisplayCover(), item.name, item.author) "cover" -> iv_cover.load(item.getDisplayCover(), item.name, item.author)
"refresh" -> if (item.origin != BookType.local && callBack.isUpdate(item.bookUrl)) { "refresh" -> if (item.origin != BookType.local && callBack.isUpdate(item.bookUrl)) {
bv_unread.invisible() bv_unread.invisible()

@ -7,6 +7,7 @@ import androidx.lifecycle.Observer
import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.DiffUtil
import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import io.legado.app.App import io.legado.app.App
import io.legado.app.R import io.legado.app.R
import io.legado.app.base.BaseFragment import io.legado.app.base.BaseFragment
@ -26,6 +27,7 @@ import io.legado.app.utils.getViewModelOfActivity
import io.legado.app.utils.observeEvent import io.legado.app.utils.observeEvent
import kotlinx.android.synthetic.main.fragment_books.* import kotlinx.android.synthetic.main.fragment_books.*
import org.jetbrains.anko.startActivity import org.jetbrains.anko.startActivity
import kotlin.math.max
class BooksFragment : BaseFragment(R.layout.fragment_books), class BooksFragment : BaseFragment(R.layout.fragment_books),
@ -71,9 +73,26 @@ class BooksFragment : BaseFragment(R.layout.fragment_books),
booksAdapter = BooksAdapterList(requireContext(), this) booksAdapter = BooksAdapterList(requireContext(), this)
} else { } else {
rv_bookshelf.layoutManager = GridLayoutManager(context, bookshelfLayout + 2) rv_bookshelf.layoutManager = GridLayoutManager(context, bookshelfLayout + 2)
booksAdapter = BooksAdapterGrid(requireContext(),this) booksAdapter = BooksAdapterGrid(requireContext(), this)
} }
rv_bookshelf.adapter = booksAdapter rv_bookshelf.adapter = booksAdapter
booksAdapter.registerAdapterDataObserver(object : RecyclerView.AdapterDataObserver() {
override fun onItemRangeInserted(positionStart: Int, itemCount: Int) {
val layoutManager = rv_bookshelf.layoutManager
if (positionStart == 0 && layoutManager is LinearLayoutManager) {
val scrollTo = layoutManager.findFirstVisibleItemPosition() - itemCount
rv_bookshelf.scrollToPosition(max(0, scrollTo))
}
}
override fun onItemRangeMoved(fromPosition: Int, toPosition: Int, itemCount: Int) {
val layoutManager = rv_bookshelf.layoutManager
if (toPosition == 0 && layoutManager is LinearLayoutManager) {
val scrollTo = layoutManager.findFirstVisibleItemPosition() - itemCount
rv_bookshelf.scrollToPosition(max(0, scrollTo))
}
}
})
} }
private fun upRecyclerData() { private fun upRecyclerData() {

@ -12,6 +12,7 @@ import io.legado.app.data.entities.BookSource
import io.legado.app.help.coroutine.Coroutine import io.legado.app.help.coroutine.Coroutine
import io.legado.app.lib.theme.accentColor import io.legado.app.lib.theme.accentColor
import io.legado.app.utils.ACache import io.legado.app.utils.ACache
import io.legado.app.utils.dp
import io.legado.app.utils.gone import io.legado.app.utils.gone
import io.legado.app.utils.visible import io.legado.app.utils.visible
import kotlinx.android.synthetic.main.item_fillet_text.view.* import kotlinx.android.synthetic.main.item_fillet_text.view.*
@ -28,11 +29,16 @@ class ExploreAdapter(context: Context, private val scope: CoroutineScope, val ca
override fun convert(holder: ItemViewHolder, item: BookSource, payloads: MutableList<Any>) { override fun convert(holder: ItemViewHolder, item: BookSource, payloads: MutableList<Any>) {
with(holder.itemView) { with(holder.itemView) {
if (holder.layoutPosition == getActualItemCount() - 1) {
setPadding(16.dp, 12.dp, 16.dp, 12.dp)
} else {
setPadding(16.dp, 12.dp, 16.dp, 0)
}
if (payloads.isEmpty()) { if (payloads.isEmpty()) {
tv_name.text = item.bookSourceName tv_name.text = item.bookSourceName
} }
if (exIndex == holder.layoutPosition) { if (exIndex == holder.layoutPosition) {
iv_status.setImageResource(R.drawable.ic_remove) iv_status.setImageResource(R.drawable.ic_arrow_down)
rotate_loading.loadingColor = context.accentColor rotate_loading.loadingColor = context.accentColor
rotate_loading.show() rotate_loading.show()
if (scrollTo >= 0) { if (scrollTo >= 0) {
@ -68,7 +74,7 @@ class ExploreAdapter(context: Context, private val scope: CoroutineScope, val ca
} }
} }
} else { } else {
iv_status.setImageResource(R.drawable.ic_add) iv_status.setImageResource(R.drawable.ic_arrow_right)
rotate_loading.hide() rotate_loading.hide()
gl_child.gone() gl_child.gone()
} }

@ -24,10 +24,7 @@ import io.legado.app.lib.dialogs.noButton
import io.legado.app.lib.dialogs.yesButton import io.legado.app.lib.dialogs.yesButton
import io.legado.app.lib.theme.accentColor import io.legado.app.lib.theme.accentColor
import io.legado.app.ui.widget.recycler.VerticalDivider import io.legado.app.ui.widget.recycler.VerticalDivider
import io.legado.app.utils.applyTint import io.legado.app.utils.*
import io.legado.app.utils.getViewModelOfActivity
import io.legado.app.utils.requestInputMethod
import io.legado.app.utils.splitNotBlank
import kotlinx.android.synthetic.main.dialog_edit_text.view.* import kotlinx.android.synthetic.main.dialog_edit_text.view.*
import kotlinx.android.synthetic.main.dialog_recycler_view.* import kotlinx.android.synthetic.main.dialog_recycler_view.*
import kotlinx.android.synthetic.main.item_group_manage.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.addItemDecoration(VerticalDivider(requireContext()))
recycler_view.adapter = adapter recycler_view.adapter = adapter
tv_ok.setTextColor(requireContext().accentColor) tv_ok.setTextColor(requireContext().accentColor)
tv_ok.visible()
tv_ok.onClick { dismiss() } tv_ok.onClick { dismiss() }
App.db.rssSourceDao().liveGroup().observe(viewLifecycleOwner, Observer { App.db.rssSourceDao().liveGroup().observe(viewLifecycleOwner, Observer {
val groups = linkedSetOf<String>() val groups = linkedSetOf<String>()

@ -59,4 +59,6 @@ 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() class Launcher4 : WelcomeActivity()
class Launcher5 : WelcomeActivity()
class Launcher6 : WelcomeActivity()

@ -98,7 +98,7 @@ object DocumentUtils {
DocumentsContract.Document.COLUMN_LAST_MODIFIED, DocumentsContract.Document.COLUMN_LAST_MODIFIED,
DocumentsContract.Document.COLUMN_SIZE, DocumentsContract.Document.COLUMN_SIZE,
DocumentsContract.Document.COLUMN_MIME_TYPE DocumentsContract.Document.COLUMN_MIME_TYPE
), null, null, null ), null, null, DocumentsContract.Document.COLUMN_DISPLAY_NAME
) )
c?.let { c?.let {
val ici = c.getColumnIndex(DocumentsContract.Document.COLUMN_DOCUMENT_ID) val ici = c.getColumnIndex(DocumentsContract.Document.COLUMN_DOCUMENT_ID)

@ -1,24 +0,0 @@
<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="M34.73,33.55l-0.09,13.54A5.17,5.17 0,0 1,33.23 50c-0.23,0.06 -0.38,0 -0.44,-0.18l0.09,-6.41L33,34.25l-0.09,-2.55 2,0.71c0.18,0.06 0.21,0.17 0.09,0.35ZM43.08,40.41c0.11,0.06 0.11,0.14 0,0.26l-0.27,0.53 -0.52,2.55c-0.12,0.47 0,0.73 0.35,0.79a4.7,4.7 0,0 0,1.84 -0.18c0.41,0 0.74,-0.38 1,-1.14a0.26,0.26 0,0 1,0.18 -0.09s0.08,0.06 0.08,0.18c-0.11,0.7 0,1.11 0.27,1.23 0.64,0.76 0.44,1.32 -0.62,1.67a6,6 0,0 1,-2.72 0.17c-1.06,-0.29 -1.56,-1.23 -1.5,-2.81l0.09,-2.2L41.26,39.79L39.47,39.79l1.23,0.53c0.12,0.06 0.12,0.15 0,0.26l-0.26,0.35a19.72,19.72 0,0 1,-5.62 7c-0.18,0.05 -0.21,0 -0.09,-0.18a19.79,19.79 0,0 0,4.22 -8h-0.71a3.35,3.35 0,0 1,-1.05 1.41c-0.3,0.17 -0.47,0.14 -0.53,-0.09l0.09,-2.46L36.75,37.42q0,-0.44 -0.09,-1.41v-0.79q0,-0.09 0.18,-0.09l1.49,0.79 2.9,-0.08a16,16 0,0 0,1.14 -4l1.94,0.62c0.11,0 0.11,0.17 0,0.35s-0.5,0.52 -1,1l-1.76,1.94L43,35.75l0.79,-1 1.76,1c0.11,0 0.11,0 0,0.17l-0.44,0.7L45,39.35l0.18,0.27c0,0.11 0,0.17 -0.09,0.17L41.76,39.79ZM35.17,28.72a0.87,0.87 0,0 1,0.26 0.08c1.93,0.65 2.87,1.18 2.81,1.59s-0.26,1 -1,1.67c-0.41,0.17 -0.68,0.08 -0.79,-0.27a8,8 0,0 0,-1.5 -2.9C34.93,28.72 35,28.66 35.17,28.72ZM37.89,32.41c1.47,0.64 2.23,1.23 2.29,1.76a1.51,1.51 0,0 1,-0.88 1.23c-0.35,0.06 -0.56,-0.06 -0.62,-0.36a3.14,3.14 0,0 0,-0.88 -2.46C37.74,32.41 37.77,32.35 37.89,32.41ZM38.24,36.41v3L43,39.26v-3ZM42.46,31.41a20,20 0,0 0,-2.72 0.18L39,31l7.65,-0.26 1,-1.06 1.67,1.15h0.09c0.05,0.05 0,0.14 -0.09,0.26l-0.62,1 0.09,8.79L49,45.68a4.38,4.38 0,0 1,-2.73 4.13,0.66 0.66,0 0,1 -0.26,0.09c-0.06,-0.06 -0.06,-0.15 0,-0.26a2.43,2.43 0,0 0,-0.88 -1.85,0.26 0.26,0 0,1 -0.09,-0.18c0,-0.06 0,-0.08 0.09,-0.08 1.23,0 1.79,-0.24 1.67,-0.88l-0.09,-15.47Z"
android:fillColor="#fff" />
<path
android:pathData="M63.27,43.66c0.18,-0.06 0.21,0 0.09,0.17L60.28,47a21.87,21.87 0,0 0,-1.67 1.67c-0.06,0.12 -0.14,0.12 -0.26,0L57,47.35c-0.17,-0.12 -0.2,-0.2 -0.09,-0.26 0.82,-0.41 1.44,-0.71 1.85,-0.88l-0.09,-10 -1.49,0.09a6.65,6.65 0,0 0,-1.76 0.17l-0.79,-0.7 3.78,-0.09 1,-1.14 1.75,1q0.18,0.09 0,0.27l-0.44,0.61 -0.61,9ZM57.27,29.24c1.69,0.65 2.69,1.26 3,1.85a1.93,1.93 0,0 1,-1 1.85,0.6 0.6,0 0,1 -0.88,-0.27 6.33,6.33 0,0 0,-1.32 -3.25C57.06,29.24 57.12,29.19 57.3,29.24ZM67.84,36.1l2.38,0.79c0.17,0.06 0.2,0.21 0.08,0.44l-0.43,0.62 -0.27,2.9a9.75,9.75 0,0 1,-0.26 1.4l3.6,-0.09 1.23,-1.4 1.76,1.58q0.18,0.18 -0.09,0.18l-6.59,0.26q-0.61,5.1 -11.51,7.56 -0.27,0 -0.27,-0.09a0.28,0.28 0,0 1,0.18 -0.26q9,-2.46 9.75,-7.21L64.77,43a13,13 0,0 0,-2 0.17,1.48 1.48,0 0,1 -0.44,0.09l-0.53,-0.7 5.71,-0.18A5.35,5.35 0,0 0,67.67 41l0.17,-1.76a18,18 0,0 0,0 -2.55ZM65.91,32.58c-0.82,0.06 -1.58,0.15 -2.29,0.27l-0.7,-0.71 4.31,-0.08v-0.62c0,-1.17 0,-2.08 -0.09,-2.72l2.37,0.61q0.18,0 0.18,0.09a0.28,0.28 0,0 1,-0.09 0.35,1.9 1.9,0 0,0 -0.35,1.32l-0.09,0.88 2.29,-0.09 1,-1.05 1.41,1.23 0.09,0.17a0.26,0.26 0,0 1,-0.18 0.09l-4.66,0.18v2.63L72.68,35l0.88,-1 2.11,1.84a0.29,0.29 0,0 1,0.17 0.27,0.9 0.9,0 0,1 -0.26,0.17 5.83,5.83 0,0 0,-3.34 1.41q-0.27,0.09 -0.18,-0.18l0.62,-2 -7.3,0.18a7.26,7.26 0,0 0,-0.79 0.09c-0.94,0.11 -1.55,0.2 -1.84,0.26L62,35.4l5.19,-0.18L67.19,32.58ZM62.83,38.74c1.82,0.47 2.79,0.93 2.9,1.4a1.47,1.47 0,0 1,-0.52 1.41c-0.36,0.29 -0.62,0.23 -0.79,-0.18A8.87,8.87 0,0 0,62.75 39C62.63,38.82 62.66,38.74 62.83,38.74ZM64.15,36.36c1.58,0.35 2.4,0.71 2.46,1.06a1.54,1.54 0,0 1,-0.44 1.32c-0.35,0.23 -0.58,0.17 -0.7,-0.18a3.66,3.66 0,0 0,-1.32 -2Q63.9,36.45 64.15,36.36ZM69.15,44.36q3.87,1.23 4.92,2.46c0.24,0.47 0.09,1.15 -0.44,2 -0.23,0.24 -0.41,0.36 -0.52,0.36s-0.27,-0.15 -0.44,-0.44a11.71,11.71 0,0 0,-3.61 -4.22Q69,44.45 69.16,44.36Z"
android:fillColor="#fff" />
<path
android:pathData="M44.5,53.5l0,0 0,0a2,2 0,0 1,0.57 -0.33,2.29 2.29,0 0,1 0.69,-0.14v0.49a1.39,1.39 0,0 0,-0.5 0.09,1.27 1.27,0 0,0 -0.42,0.25 1.23,1.23 0,0 0,-0.29 0.35,1.33 1.33,0 0,0 -0.14,0.44v2.16H44V53h0.52Z"
android:fillColor="#fff" />
<path
android:pathData="M51.49,56.35a2.72,2.72 0,0 1,-0.71 0.29,2.57 2.57,0 0,1 -0.72,0.11 2.42,2.42 0,0 1,-1 -0.2,2.22 2.22,0 0,1 -0.42,-0.25 1.88,1.88 0,0 1,-0.34 -0.35,1.54 1.54,0 0,1 -0.24,-0.48 2,2 0,0 1,-0.09 -0.61,2 2,0 0,1 0.09,-0.62 1.69,1.69 0,0 1,0.23 -0.51,1.86 1.86,0 0,1 0.36,-0.38 2.43,2.43 0,0 1,0.44 -0.26,2.06 2.06,0 0,1 0.76,-0.17 1.92,1.92 0,0 1,0.74 0.15,2.22 2.22,0 0,1 0.42,0.25 1.48,1.48 0,0 1,0.33 0.37,1.76 1.76,0 0,1 0.22,0.48 2.23,2.23 0,0 1,0.08 0.6L51.64,55L48.51,55a1.41,1.41 0,0 0,0.09 0.38,1.29 1.29,0 0,0 0.16,0.31 1.47,1.47 0,0 0,0.55 0.44,2 2,0 0,0 0.75,0.14 2.36,2.36 0,0 0,0.58 -0.07,2.31 2.31,0 0,0 0.57,-0.24ZM49.33,53.51a1.51,1.51 0,0 0,-0.5 0.38,1.4 1.4,0 0,0 -0.29,0.64h2.58a1.3,1.3 0,0 0,-0.24 -0.66,1.35 1.35,0 0,0 -0.49,-0.37 1.27,1.27 0,0 0,-0.52 -0.1A1.37,1.37 0,0 0,49.33 53.51Z"
android:fillColor="#fff" />
<path
android:pathData="M53.9,53.46a1.72,1.72 0,0 1,0.53 -0.34,2.83 2.83,0 0,1 0.5,-0.13 2.45,2.45 0,0 1,0.54 0,1.86 1.86,0 0,1 0.52,0.11 1.13,1.13 0,0 1,0.43 0.26,0.89 0.89,0 0,1 0.25,0.34 1.4,1.4 0,0 1,0.14 0.56c0,0.2 0,0.43 0,0.68h0v1.76h-0.51v-0.34a1.82,1.82 0,0 1,-0.36 0.2,2.35 2.35,0 0,1 -0.37,0.14 1.71,1.71 0,0 1,-0.84 0,1.09 1.09,0 0,1 -0.83,-0.73 1.17,1.17 0,0 1,-0.05 -0.38,1 1,0 0,1 0.08,-0.42 1.13,1.13 0,0 1,0.24 -0.36,1.31 1.31,0 0,1 0.28,-0.2l0.32,-0.11 0.34,-0.05 0.38,0 0.39,0a2.7,2.7 0,0 0,0.41 -0.06,1.44 1.44,0 0,0 -0.1,-0.48 0.72,0.72 0,0 0,-0.14 -0.19,0.85 0.85,0 0,0 -0.28,-0.16 1.53,1.53 0,0 0,-0.36 -0.07,1.8 1.8,0 0,0 -0.8,0.13 0.75,0.75 0,0 0,-0.2 0.1,0.76 0.76,0 0,0 -0.17,0.13ZM56.32,54.92h0v-0.1l-0.41,0 -0.38,0 -0.56,0a0.82,0.82 0,0 0,-0.42 0.19,0.53 0.53,0 0,0 -0.12,0.2 0.49,0.49 0,0 0,0 0.25,0.69 0.69,0 0,0 0.13,0.43 0.61,0.61 0,0 0,0.36 0.23,1.18 1.18,0 0,0 0.59,0 2,2 0,0 0,0.43 -0.19,2.15 2.15,0 0,0 0.43,-0.33Z"
android:fillColor="#fff" />
<path
android:pathData="M62,56.74h-0.9a1.67,1.67 0,0 1,-0.71 -0.15,1.79 1.79,0 0,1 -0.56,-0.42 2,2 0,0 1,-0.36 -0.6,1.92 1.92,0 0,1 -0.13,-0.72 2,2 0,0 1,0.49 -1.34,1.76 1.76,0 0,1 0.56,-0.41 1.67,1.67 0,0 1,0.71 -0.15L62,52.95v-1.4h0.51v5.19L62,56.74ZM62,53.43h-0.9a1.12,1.12 0,0 0,-0.48 0.1,1.24 1.24,0 0,0 -0.39,0.29 1.29,1.29 0,0 0,-0.27 0.45,1.57 1.57,0 0,0 -0.1,0.58 1.47,1.47 0,0 0,0.1 0.56,1.29 1.29,0 0,0 0.27,0.45 1.11,1.11 0,0 0,0.39 0.29,1.13 1.13,0 0,0 0.48,0.11L62,56.26Z"
android:fillColor="#fff" />
</vector>

@ -1,56 +0,0 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:aapt="http://schemas.android.com/aapt"
android:width="108dp"
android:height="108dp"
android:viewportWidth="108"
android:viewportHeight="108">
<path
android:pathData="M0,0h108v108h-108z"
android:fillColor="#4d4d4d" />
<path android:pathData="M0,108H54V64c0,-12 -54,-5 -54,-5Z">
<aapt:attr name="android:fillColor">
<gradient
android:startY="79.39"
android:startX="0.55"
android:endY="88.08"
android:endX="53.13"
android:type="linear">
<item
android:offset="0"
android:color="#FFFFFFFF" />
<item
android:offset="1"
android:color="#FFCCCCCC" />
</gradient>
</aapt:attr>
</path>
<path
android:pathData="M108,108H54V64c0,-12 54,-5 54,-5Z"
android:fillColor="#fff" />
<path android:pathData="M71.5,70 L78,76V57a94.89,94.89 0,0 0,-13 0.75V76Z">
<aapt:attr name="android:fillColor">
<gradient
android:startY="57.11"
android:startX="71.5"
android:endY="76"
android:endX="71.5"
android:type="linear">
<item
android:offset="0"
android:color="#FFFFFFFF" />
<item
android:offset="0.24"
android:color="#FFFFE1DD" />
<item
android:offset="0.58"
android:color="#FFFFBEB6" />
<item
android:offset="0.84"
android:color="#FFFFA89D" />
<item
android:offset="1"
android:color="#FFFFA094" />
</gradient>
</aapt:attr>
</path>
</vector>

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" >
<!-- 角度 -->
<corners android:radius="6dp"/>
<!-- 填充色 -->
<solid android:color="@color/transparent10" />
</shape>

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" >
<!-- 角度 -->
<corners android:radius="35dp"/>
<!-- 填充色 -->
<solid android:color="@color/transparent10" />
<!-- 描边 设置线宽及颜色 -->
<stroke
android:color="@color/transparent10"
android:width="0.5dp" />
</shape>

@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="64dp"
android:height="64dp"
android:viewportWidth="1024"
android:viewportHeight="1024">
<path
android:pathData="M512,685.25l-278.62,-278.62 45.25,-45.25L512,594.75l233.38,-233.38 45.25,45.25z"
android:fillColor="#181818"/>
</vector>

@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="64dp"
android:height="64dp"
android:viewportWidth="1024"
android:viewportHeight="1024">
<path
android:pathData="M434.94,790.62l-45.25,-45.25L623.04,512l-233.38,-233.38 45.25,-45.25L713.57,512z"
android:fillColor="#181818"/>
</vector>

@ -4,15 +4,9 @@
android:viewportWidth="24" android:viewportWidth="24"
android:viewportHeight="24"> android:viewportHeight="24">
<path <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:pathData="M23,3V2.5a0.5,0.5 0,0 0,-0.5 -0.5H5.69A4.63,4.63 0,0 0,1 6.06,4.51 4.51,0 0,0 5.5,11h17a0.5,0.5 0,0 0,0.5 -0.5V10a0.5,0.5 0,0 0,-0.41 -0.5,3 3,0 0,1 0,-5.94A0.5,0.5 0,0 0,23 3ZM2.56,5.9A3.09,3.09 0,0 1,5.62 3.5H19.67a4.43,4.43 0,0 0,0 6H5.5A3,3 0,0 1,2.56 5.9Z"
android:fillColor="#2F45A6" /> android:fillColor="#2f45a6" />
<path <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:pathData="M1,21v0.53a0.5,0.5 0,0 0,0.5 0.5H18.31A4.63,4.63 0,0 0,23 17.94,4.51 4.51,0 0,0 18.5,13H1.5a0.5,0.5 0,0 0,-0.5 0.5V14a0.5,0.5 0,0 0,0.41 0.5,3 3,0 0,1 0,5.94A0.5,0.5 0,0 0,1 21ZM21.44,18.1a3.09,3.09 0,0 1,-3.06 2.4h-14a4.43,4.43 0,0 0,0 -6H18.5A3,3 0,0 1,21.44 18.1Z"
android:fillColor="#2F45A6" /> 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> </vector>

@ -4,15 +4,9 @@
android:viewportWidth="24" android:viewportWidth="24"
android:viewportHeight="24"> android:viewportHeight="24">
<path <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:pathData="M20,6.5a3,3 0,0 1,2.59 -3A0.5,0.5 0,0 0,23 3V2.5a0.5,0.5 0,0 0,-0.5 -0.5H5.69A4.63,4.63 0,0 0,1 6.06,4.51 4.51,0 0,0 5.5,11h17a0.5,0.5 0,0 0,0.5 -0.5V10a0.5,0.5 0,0 0,-0.41 -0.5A3,3 0,0 1,20 6.5Z"
android:fillColor="#C8D0D9" android:fillColor="#2f45a6" />
android:fillType="evenOdd" />
<path <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:pathData="M4,17.5a3,3 0,0 1,-2.59 3A0.5,0.5 0,0 0,1 21v0.53a0.5,0.5 0,0 0,0.5 0.5H18.31A4.63,4.63 0,0 0,23 17.94,4.51 4.51,0 0,0 18.5,13H1.5a0.5,0.5 0,0 0,-0.5 0.5V14a0.5,0.5 0,0 0,0.41 0.5A3,3 0,0 1,4 17.5Z"
android:fillColor="#C8D0D9" android:fillColor="#2f45a6" />
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> </vector>

@ -4,9 +4,9 @@
android:viewportWidth="24" android:viewportWidth="24"
android:viewportHeight="24"> android:viewportHeight="24">
<path <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:pathData="M12,2.5A9.5,9.5 0,1 1,2.5 12,9.51 9.51,0 0,1 12,2.5M12,1A11,11 0,1 0,23 12,11 11,0 0,0 12,1Z"
android:fillColor="#959ECA" /> android:fillColor="#2f45a6" />
<path <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:pathData="M13.93,10.07l-1.29,2.57 -2.57,1.29 1.29,-2.57 2.57,-1.29M16.85,7a0.18,0.18 0,0 0,-0.1 0l-6.51,3.26L7,16.75a0.2,0.2 0,0 0,0.17 0.29,0.18 0.18,0 0,0 0.1,0l6.51,-3.26L17,7.25A0.2,0.2 0,0 0,16.85 7Z"
android:fillColor="#959ECA" /> android:fillColor="#2f45a6" />
</vector> </vector>

@ -4,7 +4,6 @@
android:viewportWidth="24" android:viewportWidth="24"
android:viewportHeight="24"> android:viewportHeight="24">
<path <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:pathData="M12,1A11,11 0,1 0,23 12,11 11,0 0,0 12,1ZM17,7.25 L13.74,13.76L7.25,17A0.2,0.2 0,0 1,7 16.75l3.26,-6.51L16.75,7A0.2,0.2 0,0 1,17 7.25Z"
android:fillColor="#C8D0D9" android:fillColor="#2f45a6" />
android:fillType="evenOdd" />
</vector> </vector>

@ -4,9 +4,9 @@
android:viewportWidth="24" android:viewportWidth="24"
android:viewportHeight="24"> android:viewportHeight="24">
<path <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:pathData="M12,2.5A4.5,4.5 0,1 1,7.5 7,4.51 4.51,0 0,1 12,2.5M12,1a6,6 0,1 0,6 6,6 6,0 0,0 -6,-6Z"
android:fillColor="#959ECA" /> android:fillColor="#2f45a6" />
<path <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:pathData="M3.5,21A4.49,4.49 0,0 1,8 16.5h8A4.49,4.49 0,0 1,20.5 21v2H21a1,1 0,0 0,1 -1V21a6,6 0,0 0,-6 -6H8a6,6 0,0 0,-6 6v1a1,1 0,0 0,1 1h0.5Z"
android:fillColor="#959ECA" /> android:fillColor="#2f45a6" />
</vector> </vector>

@ -4,11 +4,9 @@
android:viewportWidth="24" android:viewportWidth="24"
android:viewportHeight="24"> android:viewportHeight="24">
<path <path
android:pathData="M12,7m-4,0a4,4 0,1 1,8 0a4,4 0,1 1,-8 0" android:pathData="M12,7m-6,0a6,6 0,1 1,12 0a6,6 0,1 1,-12 0"
android:fillColor="#C8D0D9" android:fillColor="#2f45a6" />
android:fillType="evenOdd" />
<path <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:pathData="M8,15h8a6,6 0,0 1,6 6v1a1,1 0,0 1,-1 1H3a1,1 0,0 1,-1 -1V21A6,6 0,0 1,8 15Z"
android:fillColor="#C8D0D9" android:fillColor="#2f45a6" />
android:fillType="evenOdd" />
</vector> </vector>

@ -3,10 +3,10 @@
android:height="24dp" android:height="24dp"
android:viewportWidth="24" android:viewportWidth="24"
android:viewportHeight="24"> android:viewportHeight="24">
<path <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:pathData="M19,2.5a0.5,0.5 0,0 1,0.5 0.5V20.45l-6.77,-3.76L12,16.28l-0.73,0.41L4.5,20.45V3A0.5,0.5 0,0 1,5 2.5H19M19,1H5A2,2 0,0 0,3 3V21.3a1,1 0,0 0,1.49 0.87L12,18l7.51,4.17A1,1 0,0 0,21 21.3V3a2,2 0,0 0,-2 -2Z"
android:fillColor="#5A5F64" /> android:fillColor="#2f45a6" />
<path <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:pathData="M15.5,8.75H12.75V6a0.5,0.5 0,0 0,-0.5 -0.5h-0.5a0.5,0.5 0,0 0,-0.5 0.5V8.75H8.5a0.5,0.5 0,0 0,-0.5 0.5v0.5a0.5,0.5 0,0 0,0.5 0.5h2.75V13a0.5,0.5 0,0 0,0.5 0.5h0.5a0.5,0.5 0,0 0,0.5 -0.5V10.25H15.5a0.5,0.5 0,0 0,0.5 -0.5v-0.5A0.5,0.5 0,0 0,15.5 8.75Z"
android:fillColor="#5A5F64" /> android:fillColor="#2f45a6" />
</vector> </vector>

@ -3,7 +3,7 @@
android:height="24dp" android:height="24dp"
android:viewportWidth="24" android:viewportWidth="24"
android:viewportHeight="24"> android:viewportHeight="24">
<path <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:pathData="M19,1H5A2,2 0,0 0,3 3V21.3a1,1 0,0 0,1.49 0.87L12,18l7.51,4.17A1,1 0,0 0,21 21.3V3A2,2 0,0 0,19 1ZM16,9.75a0.5,0.5 0,0 1,-0.5 0.5H12.75V13a0.5,0.5 0,0 1,-0.5 0.5h-0.5a0.5,0.5 0,0 1,-0.5 -0.5V10.25H8.5a0.5,0.5 0,0 1,-0.5 -0.5v-0.5a0.5,0.5 0,0 1,0.5 -0.5h2.75V6a0.5,0.5 0,0 1,0.5 -0.5h0.5a0.5,0.5 0,0 1,0.5 0.5V8.75H15.5a0.5,0.5 0,0 1,0.5 0.5Z"
android:fillColor="#C8D0D9" /> android:fillColor="#2f45a6" />
</vector> </vector>

@ -0,0 +1,15 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="200dp"
android:height="200dp"
android:viewportWidth="200"
android:viewportHeight="200">
<path
android:fillColor="#FF000000"
android:pathData="M100.1,181.4c-10.9,0 -21.5,-2.1 -31.4,-6.3c-9.6,-4.1 -18.2,-9.9 -25.7,-17.3s-13.2,-16 -17.3,-25.7c-4.2,-10 -6.3,-20.5 -6.3,-31.4c0,-10.9 2.1,-21.5 6.3,-31.4C29.8,59.7 35.6,51 43,43.6c7.4,-7.4 16,-13.2 25.7,-17.3c10,-4.2 20.5,-6.3 31.4,-6.3s21.5,2.1 31.4,6.3c9.6,4.1 18.2,9.9 25.7,17.3c7.4,7.4 13.2,16 17.3,25.7c4.2,10 6.3,20.5 6.3,31.4s-2.1,21.5 -6.3,31.4c-4.1,9.6 -9.9,18.2 -17.3,25.7c-7.4,7.4 -16,13.2 -25.7,17.3C121.6,179.3 111,181.4 100.1,181.4zM100.1,31.6C62,31.6 31,62.6 31,100.7c0,38.1 31,69.2 69.2,69.2s69.2,-31 69.2,-69.2C169.3,62.6 138.2,31.6 100.1,31.6L100.1,31.6z" />
<path
android:fillColor="#FF000000"
android:pathData="M114.1,78.8c0,-7.1 -4.2,-12.9 -14,-12.9c-6.3,0 -12.2,3.1 -18,9.2l-3.5,-3.3C84.8,65.5 91,61 100.6,61c12.1,0 19.2,7.3 19.2,17.4c0,15.1 -22.3,19 -19,34.4h-5.3C92,95.9 114.1,90.9 114.1,78.8zM98.5,122.6c3.3,0 6.4,2.3 6.4,6.4c0,4.2 -3.1,6.5 -6.4,6.5c-3.4,0 -6.4,-2.3 -6.4,-6.5C92,125 95.1,122.6 98.5,122.6z" />
<path
android:fillColor="#FF000000"
android:pathData="M98.5,138.1c-5.1,0 -8.9,-3.8 -8.9,-9c0,-5.1 3.7,-8.9 8.9,-8.9c5.1,0 8.9,3.8 8.9,8.9C107.4,134.9 102.8,138.1 98.5,138.1zM98.5,125.1c-1.8,0 -4,1 -4,4c0,3 2.2,4.1 4,4.1c2,0 4,-1.3 4,-4.1C102.5,126.3 100.4,125.1 98.5,125.1zM103.8,115.2H93.6l-0.4,-1.9c-1,-4.9 -0.2,-9.4 2.4,-13.6c2.2,-3.6 5.3,-6.5 8.3,-9.3c4.2,-3.9 7.9,-7.4 7.9,-11.6c0,-3.9 -1.5,-10.4 -11.5,-10.4c-5.5,0 -10.8,2.8 -16.2,8.4l-1.7,1.8l-7.1,-6.7l1.7,-1.8c6.8,-6.9 13.4,-11.5 23.7,-11.5c13,0 21.7,8 21.7,19.8c0,8.3 -5.7,13.6 -10.8,18.2c-5.2,4.8 -9.7,9 -8.3,15.6L103.8,115.2L103.8,115.2zM97.7,110.3h0.4c-0.3,-7.7 5.2,-12.8 10.1,-17.3c4.7,-4.4 9.2,-8.5 9.2,-14.6c0,-9.1 -6.6,-14.9 -16.8,-14.9c-0.1,0 -0.2,0 -0.3,0c10,0.1 16.2,5.9 16.2,15.3c0,6.3 -4.8,10.8 -9.4,15.2C102,98.7 97.1,103.3 97.7,110.3L97.7,110.3zM95.2,64c-3,0.7 -5.7,1.9 -8.2,3.7C89.7,65.9 92.4,64.7 95.2,64z" />
</vector>

@ -0,0 +1,69 @@
<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="M36.77,46.15l-1.87,1.83l0,-18.23l1.98,0.72l-0.11,15.68z"
android:fillColor="#fff" />
<path
android:pathData="M40.09,28.44l-1.4,1.7l-1.77,-3.33l3.17,1.63z"
android:fillColor="#fff" />
<path
android:pathData="M40.13,30.58l2.44,1.62l-1.1,1.27l-1.34,-2.89z"
android:fillColor="#fff" />
<path
android:pathData="M51.49,30.1l-0.04,16.01l-1.88,1.89l-2.67,-2.66l2.67,0.55l0,-16.67l-7.69,0l-0.44,-0.43l8.04,0l0.97,-1.09l1.78,1.33l-0.74,1.07z"
android:fillColor="#fff" />
<path
android:pathData="M43.91,45.12l1.55,-0.67h3.33l-1.33,-1.66 -0.83,1.1L45.46,43.89L45.46,38.35l-1.09,-0.56h3L47.37,34.73l0.54,-0.7L46.15,32.9l-0.78,1L44,33.9l2.82,-3.28 -2,-0.66 -1.14,3.94h-3l-1.57,-0.67L39.11,39l1.57,-1.2h0.59L38,45.52l5.09,-7.17 -1.37,-0.56h2.08l0.06,6.1ZM40.65,37.27v-3h4.72v3Z"
android:fillColor="#fff" />
<path
android:pathData="M57.78,46.56l-1.67,-1.67c0.82,-0.4 1.53,-0.83 1.53,-0.83V34.21H55l-0.45,-0.53H57.4l1,-1.13 1.86,1.14 -0.55,0.78v8.65l2.77,-1.56Z"
android:fillColor="#fff" />
<path
android:pathData="M68.24,40.26l3.58,0l1.23,-1.51l2.15,2.04l-6.94,0.04l-6.27,7.14l4.33,-7.14l-5.07,0l-0.53,-0.57l5.57,0l0,-6.14l1.95,0.68l0,5.46z"
android:fillColor="#fff" />
<path
android:pathData="M68.06,29.92l2.28,0l1.05,-1.05l1.7,1.6l-5.03,0l0,2.6l3.92,-0.05l0.45,-0.91l2.05,1.87l-3.5,1.82l0.78,-2.22l-10.3,0.01l-0.48,-0.52l5.16,0l0,-2.6l-3.8,0l-0.48,-0.55l4.28,0l0,-3.14l1.92,0.58l0,2.56z"
android:fillColor="#fff" />
<path
android:pathData="M63.08,34.38l2.69,0.97l-0.89,1.55l-1.8,-2.52z"
android:fillColor="#fff" />
<path
android:pathData="M61.63,36.71l3.25,1.19l-1.09,1.78l-2.16,-2.97z"
android:fillColor="#fff" />
<path
android:pathData="M73.64,45.23l-1.53,2.13l-4.13,-4.85l5.66,2.72z"
android:fillColor="#fff" />
<path
android:pathData="M59.55,29.14l-1.66,1.88l-1.78,-3.66l3.44,1.78z"
android:fillColor="#fff" />
<path
android:pathData="M39,50.55H37.18a0.18,0.18 0,0 0,-0.18 0.18v4.78a0.18,0.18 0,0 0,0.18 0.19h0.19a0.18,0.18 0,0 0,0.18 -0.19V51.1H39Z"
android:fillColor="#fff" />
<path
android:pathData="M39.35,53.45a1.47,1.47 0,0 0,-0.33 -2.9v0.55a0.92,0.92 0,0 1,0.92 0.92,0.91 0.91,0 0,1 -0.87,0.91h-0.6l1.4,2.64a0.23,0.23 0,0 0,0.2 0.12h0.5Z"
android:fillColor="#fff" />
<path
android:pathData="M50,52.2v0.35A1.8,1.8 0,0 0,48.53 52,1.84 1.84,0 1,0 50,55.17v0.34a0.18,0.18 0,0 0,0.18 0.19h0.18a0.18,0.18 0,0 0,0.19 -0.19L50.55,52.2a0.18,0.18 0,0 0,-0.19 -0.18h-0.18A0.18,0.18 0,0 0,50 52.2ZM49,55.12a1.28,1.28 0,0 1,-1.51 -1.51,1.26 1.26,0 0,1 1,-1A1.28,1.28 0,0 1,50 54.11,1.26 1.26,0 0,1 49,55.12Z"
android:fillColor="#fff" />
<path
android:pathData="M55,50.73v1.82A1.8,1.8 0,0 0,53.51 52a1.84,1.84 0,0 0,0.18 3.67A1.82,1.82 0,0 0,55 55.17v0.34a0.18,0.18 0,0 0,0.18 0.19h0.19a0.18,0.18 0,0 0,0.18 -0.19L55.55,50.73a0.18,0.18 0,0 0,-0.18 -0.18h-0.19A0.18,0.18 0,0 0,55 50.73ZM54,55.12a1.28,1.28 0,0 1,-1.51 -1.51,1.26 1.26,0 0,1 1,-1A1.28,1.28 0,0 1,55 54.11,1.26 1.26,0 0,1 53.94,55.12Z"
android:fillColor="#fff" />
<path
android:pathData="M43.73,52a1.84,1.84 0,0 0,-1.84 1.9,1.86 1.86,0 0,0 1.84,1.78 1.83,1.83 0,0 0,1.64 -1h-0.56a0.2,0.2 0,0 0,-0.16 0.07,1.29 1.29,0 0,1 -2.18,-0.63h3.07a1.24,1.24 0,0 0,0 -0.27A1.84,1.84 0,0 0,43.73 52ZM43.73,52.55a1.31,1.31 0,0 1,1.26 1L42.47,53.55A1.3,1.3 0,0 1,43.73 52.57Z"
android:fillColor="#fff" />
<path
android:pathData="M60.12,49.98L70.5,49.98A1.5,1.5 0,0 1,72 51.48L72,54.66A1.5,1.5 0,0 1,70.5 56.16L60.12,56.16A1.5,1.5 0,0 1,58.62 54.66L58.62,51.48A1.5,1.5 0,0 1,60.12 49.98z"
android:fillColor="#ff6161" />
<path
android:pathData="M63.69,54.71a0.41,0.41 0,0 1,-0.41 0.41H60.36v-0.51H63.1V53.28H60.36v-0.5H63.1V51.53H60.36V51h2.92a0.41,0.41 0,0 1,0.41 0.41Z"
android:fillColor="#fff" />
<path
android:pathData="M65.55,55h-0.77v-0.74h0.77Z"
android:fillColor="#fff" />
<path
android:pathData="M69.54,55.12L67,55.12a0.41,0.41 0,0 1,-0.41 -0.42L66.59,51.43A0.41,0.41 0,0 1,67 51h2.55a0.41,0.41 0,0 1,0.42 0.41L69.97,54.7A0.42,0.42 0,0 1,69.54 55.12ZM69.39,54.61L69.39,51.53L67.15,51.53v3.08Z"
android:fillColor="#fff" />
</vector>

@ -0,0 +1,56 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:aapt="http://schemas.android.com/aapt"
android:width="108dp"
android:height="108dp"
android:viewportWidth="108"
android:viewportHeight="108">
<path
android:pathData="M0,0h108v108h-108z"
android:fillColor="#4d4d4d" />
<path android:pathData="M0,108H54V65c0,-12 -54,-5 -54,-5Z">
<aapt:attr name="android:fillColor">
<gradient
android:startY="79.9"
android:startX="0.62"
android:endY="88.57"
android:endX="53.06"
android:type="linear">
<item
android:offset="0"
android:color="#FFFFFFFF" />
<item
android:offset="1"
android:color="#FFCCCCCC" />
</gradient>
</aapt:attr>
</path>
<path
android:pathData="M108,108H54V65c0,-12 54,-5 54,-5Z"
android:fillColor="#fff" />
<path android:pathData="M71.5,69 L78,75V58a94.89,94.89 0,0 0,-13 0.75V75Z">
<aapt:attr name="android:fillColor">
<gradient
android:startY="58.1"
android:startX="71.5"
android:endY="75"
android:endX="71.5"
android:type="linear">
<item
android:offset="0"
android:color="#FFFFFFFF" />
<item
android:offset="0.24"
android:color="#FFFFE1DD" />
<item
android:offset="0.58"
android:color="#FFFFBEB6" />
<item
android:offset="0.84"
android:color="#FFFFA89D" />
<item
android:offset="1"
android:color="#FFFFA094" />
</gradient>
</aapt:attr>
</path>
</vector>

@ -0,0 +1,54 @@
<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="M46.12,61.71A1.72,1.72 0,0 0,44.4 60H42.26a0.21,0.21 0,0 0,-0.21 0.21v5.58a0.21,0.21 0,0 0,0.21 0.21h0.21a0.22,0.22 0,0 0,0.22 -0.21V60.64H44.4a1.07,1.07 0,0 1,0.06 2.14h-0.7l1.63,3.07a0.24,0.24 0,0 0,0.23 0.14h0.58l-1.41,-2.62A1.71,1.71 0,0 0,46.12 61.71Z"
android:fillColor="#EDEDED" />
<path
android:pathData="M59.5,61.71h-0.22a0.21,0.21 0,0 0,-0.21 0.22v0.4a2.13,2.13 0,0 0,-1.71 -0.61,2.15 2.15,0 1,0 1.71,3.67v0.4a0.21,0.21 0,0 0,0.21 0.21h0.22a0.22,0.22 0,0 0,0.21 -0.21V61.93A0.22,0.22 0,0 0,59.5 61.71ZM59,64.15a1.5,1.5 0,1 1,-2.94 -0.59,1.47 1.47,0 0,1 1.17,-1.17A1.5,1.5 0,0 1,59 64.15Z"
android:fillColor="#EDEDED" />
<path
android:pathData="M66.24,60L66,60a0.22,0.22 0,0 0,-0.22 0.21v2.12a2.13,2.13 0,0 0,-1.71 -0.61A2.15,2.15 0,0 0,64.31 66a2.12,2.12 0,0 0,1.5 -0.61v0.4A0.22,0.22 0,0 0,66 66h0.21a0.21,0.21 0,0 0,0.21 -0.21L66.42,60.21A0.21,0.21 0,0 0,66.24 60ZM65.78,64.15A1.5,1.5 0,1 1,64 62.39,1.49 1.49,0 0,1 65.78,64.15Z"
android:fillColor="#EDEDED" />
<path
android:pathData="M50.83,61.71a2.15,2.15 0,0 0,-2.15 2.21A2.18,2.18 0,0 0,50.83 66a2.15,2.15 0,0 0,1.91 -1.18h-0.65a0.23,0.23 0,0 0,-0.19 0.09,1.56 1.56,0 0,1 -1.07,0.45 1.51,1.51 0,0 1,-1.47 -1.18h3.58a1.73,1.73 0,0 0,0 -0.32A2.14,2.14 0,0 0,50.83 61.71ZM49.36,63.54a1.5,1.5 0,0 1,2.93 0Z"
android:fillColor="#EDEDED" />
<path
android:pathData="M30.79,56.55l2.2,-2.13l0.13,-18.37l-2.33,-0.85l0,21.35z"
android:fillColor="#EDEDED" />
<path
android:pathData="M36.88,33.67l-3.72,-1.91l2.08,3.9l1.64,-1.99z"
android:fillColor="#EDEDED" />
<path
android:pathData="M39.78,38.07l-2.85,-1.89l1.56,3.38l1.29,-1.49z"
android:fillColor="#EDEDED" />
<path
android:pathData="M50.23,35.61l0.87,-1.25l-2.08,-1.56l-1.14,1.28l-9.43,0l0.52,0.51l9.01,0l0,19.53l-3.12,-0.65l3.12,3.11l2.21,-2.2l0.04,-18.77z"
android:fillColor="#EDEDED" />
<path
android:pathData="M47.07,52.42l-1.56,-1.94 -1,1.3H43.17v-6.5l-1.28,-0.66h3.5V41l0.64,-0.82L44,38.89 43.06,40H41.42l3.31,-3.84 -2.39,-0.77L41,40H37.53l-1.84,-0.78V46l1.84,-1.41h0.69l-3.74,9.06 6,-8.4 -1.61,-0.66h2.44l0.07,7.15V53.2l1.82,-0.78ZM37.53,44V40.53h5.53V44Z"
android:fillColor="#EDEDED" />
<path
android:pathData="M57.43,52s-0.83,0.5 -1.79,1l2,2 5.46,-5.84 -3.23,1.82V40.73l0.63,-0.91 -2.17,-1.34 -1.13,1.33H53.79l0.53,0.62h3.11Z"
android:fillColor="#EDEDED" />
<path
android:pathData="M67.6,48.19l-5.07,8.36l7.35,-8.36l8.12,-0.05l-2.52,-2.39l-1.43,1.77l-4.2,0l0,-6.4l-2.28,-0.8l0,7.2l-6.52,0l0.61,0.67l5.94,0z"
android:fillColor="#EDEDED" />
<path
android:pathData="M61.35,39.09l0.56,0.62l12.06,-0.02l-0.91,2.6l4.11,-2.12l-2.41,-2.2l-0.53,1.07l-4.59,0.05l0,-3.04l5.89,0l-1.99,-1.87l-1.23,1.23l-2.67,0l0,-3l-2.25,-0.69l0,3.69l-5.01,0l0.56,0.64l4.45,0l0,3.04l-6.04,0z"
android:fillColor="#EDEDED" />
<path
android:pathData="M66.95,41.77l-3.14,-1.14l2.1,2.96l1.04,-1.82z"
android:fillColor="#EDEDED" />
<path
android:pathData="M64.64,46.84l1.27,-2.08l-3.8,-1.4l2.53,3.48z"
android:fillColor="#EDEDED" />
<path
android:pathData="M74.38,55.84l1.8,-2.5l-6.64,-3.19l4.84,5.69z"
android:fillColor="#EDEDED" />
<path
android:pathData="M59.67,34.49l-4.02,-2.08l2.07,4.29l1.95,-2.21z"
android:fillColor="#EDEDED" />
</vector>

@ -0,0 +1,12 @@
<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="M0,0h108v108h-108z"
android:fillColor="#495867" />
<path
android:pathData="M17.9,75v-3.3c11.5,-0.7 25,-8.2 36.5,7.3c11.6,-15.6 25,-8 36.5,-7.3V75l0,0v5.2c-10.2,-1.1 -24.3,-3.5 -32.9,-0.1l-0.8,0.4h0.1c-0.4,0.2 -0.7,0.6 -0.7,1l0,0c-0.1,0.7 -0.7,1.2 -1.5,1.2h-1.4c-0.7,0 -1.4,-0.6 -1.4,-1.3l0,0c-0.1,-0.3 -0.3,-0.6 -0.6,-0.8l-0.1,-0.1c-0.3,-0.2 -0.5,-0.3 -0.8,-0.5c-8.6,-3.4 -22.8,-1 -33,0.1v-3.7"
android:fillColor="#BDD5EA" />
</vector>

@ -0,0 +1,54 @@
<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="M46.12,61.71A1.72,1.72 0,0 0,44.4 60H42.26a0.21,0.21 0,0 0,-0.21 0.21v5.58a0.21,0.21 0,0 0,0.21 0.21h0.21a0.22,0.22 0,0 0,0.22 -0.21V60.64H44.4a1.07,1.07 0,0 1,0.06 2.14h-0.7l1.63,3.07a0.24,0.24 0,0 0,0.23 0.14h0.58l-1.41,-2.62A1.71,1.71 0,0 0,46.12 61.71Z"
android:fillColor="#2F45A6" />
<path
android:pathData="M59.5,61.71h-0.22a0.21,0.21 0,0 0,-0.21 0.22v0.4a2.13,2.13 0,0 0,-1.71 -0.61,2.15 2.15,0 1,0 1.71,3.67v0.4a0.21,0.21 0,0 0,0.21 0.21h0.22a0.22,0.22 0,0 0,0.21 -0.21V61.93A0.22,0.22 0,0 0,59.5 61.71ZM59,64.15a1.5,1.5 0,1 1,-2.94 -0.59,1.47 1.47,0 0,1 1.17,-1.17A1.5,1.5 0,0 1,59 64.15Z"
android:fillColor="#2F45A6" />
<path
android:pathData="M66.24,60L66,60a0.22,0.22 0,0 0,-0.22 0.21v2.12a2.13,2.13 0,0 0,-1.71 -0.61A2.15,2.15 0,0 0,64.31 66a2.12,2.12 0,0 0,1.5 -0.61v0.4A0.22,0.22 0,0 0,66 66h0.21a0.21,0.21 0,0 0,0.21 -0.21L66.42,60.21A0.21,0.21 0,0 0,66.24 60ZM65.78,64.15A1.5,1.5 0,1 1,64 62.39,1.49 1.49,0 0,1 65.78,64.15Z"
android:fillColor="#2F45A6" />
<path
android:pathData="M50.83,61.71a2.15,2.15 0,0 0,-2.15 2.21A2.18,2.18 0,0 0,50.83 66a2.15,2.15 0,0 0,1.91 -1.18h-0.65a0.23,0.23 0,0 0,-0.19 0.09,1.56 1.56,0 0,1 -1.07,0.45 1.51,1.51 0,0 1,-1.47 -1.18h3.58a1.73,1.73 0,0 0,0 -0.32A2.14,2.14 0,0 0,50.83 61.71ZM49.36,63.54a1.5,1.5 0,0 1,2.93 0Z"
android:fillColor="#2F45A6" />
<path
android:pathData="M30.79,56.55l2.2,-2.13l0.13,-18.37l-2.33,-0.85l0,21.35z"
android:fillColor="#2F45A6" />
<path
android:pathData="M36.88,33.67l-3.72,-1.91l2.08,3.9l1.64,-1.99z"
android:fillColor="#2F45A6" />
<path
android:pathData="M39.78,38.07l-2.85,-1.89l1.56,3.38l1.29,-1.49z"
android:fillColor="#2F45A6" />
<path
android:pathData="M50.23,35.61l0.87,-1.25l-2.08,-1.56l-1.14,1.28l-9.43,0l0.52,0.51l9.01,0l0,19.53l-3.12,-0.65l3.12,3.11l2.21,-2.2l0.04,-18.77z"
android:fillColor="#2F45A6" />
<path
android:pathData="M47.07,52.42l-1.56,-1.94 -1,1.3H43.17v-6.5l-1.28,-0.66h3.5V41l0.64,-0.82L44,38.89 43.06,40H41.42l3.31,-3.84 -2.39,-0.77L41,40H37.53l-1.84,-0.78V46l1.84,-1.41h0.69l-3.74,9.06 6,-8.4 -1.61,-0.66h2.44l0.07,7.15V53.2l1.82,-0.78ZM37.53,44V40.53h5.53V44Z"
android:fillColor="#2F45A6" />
<path
android:pathData="M57.43,52s-0.83,0.5 -1.79,1l2,2 5.46,-5.84 -3.23,1.82V40.73l0.63,-0.91 -2.17,-1.34 -1.13,1.33H53.79l0.53,0.62h3.11Z"
android:fillColor="#2F45A6" />
<path
android:pathData="M67.6,48.19l-5.07,8.36l7.35,-8.36l8.12,-0.05l-2.52,-2.39l-1.43,1.77l-4.2,0l0,-6.4l-2.28,-0.8l0,7.2l-6.52,0l0.61,0.67l5.94,0z"
android:fillColor="#2F45A6" />
<path
android:pathData="M61.35,39.09l0.56,0.62l12.06,-0.02l-0.91,2.6l4.11,-2.12l-2.41,-2.2l-0.53,1.07l-4.59,0.05l0,-3.04l5.89,0l-1.99,-1.87l-1.23,1.23l-2.67,0l0,-3l-2.25,-0.69l0,3.69l-5.01,0l0.56,0.64l4.45,0l0,3.04l-6.04,0z"
android:fillColor="#2F45A6" />
<path
android:pathData="M66.95,41.77l-3.14,-1.14l2.1,2.96l1.04,-1.82z"
android:fillColor="#2F45A6" />
<path
android:pathData="M64.64,46.84l1.27,-2.08l-3.8,-1.4l2.53,3.48z"
android:fillColor="#2F45A6" />
<path
android:pathData="M74.38,55.84l1.8,-2.5l-6.64,-3.19l4.84,5.69z"
android:fillColor="#2F45A6" />
<path
android:pathData="M59.67,34.49l-4.02,-2.08l2.07,4.29l1.95,-2.21z"
android:fillColor="#2F45A6" />
</vector>

@ -0,0 +1,12 @@
<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="M0,0h108v108h-108z"
android:fillColor="#EFEFEF" />
<path
android:pathData="M17.9,75v-3.3c11.5,-0.7 25,-8.2 36.5,7.3c11.6,-15.6 25,-8 36.5,-7.3V75l0,0v5.2c-10.2,-1.1 -24.3,-3.5 -32.9,-0.1l-0.8,0.4h0.1c-0.4,0.2 -0.7,0.6 -0.7,1l0,0c-0.1,0.7 -0.7,1.2 -1.5,1.2h-1.4c-0.7,0 -1.4,-0.6 -1.4,-1.3l0,0c-0.1,-0.3 -0.3,-0.6 -0.6,-0.8l-0.1,-0.1c-0.3,-0.2 -0.5,-0.3 -0.8,-0.5c-8.6,-3.4 -22.8,-1 -33,0.1v-3.7"
android:fillColor="#FFBF00" />
</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="M19,2L5,2c-1.11,0 -2,0.9 -2,2v14c0,1.1 0.89,2 2,2h4l3,3 3,-3h4c1.1,0 2,-0.9 2,-2L21,4c0,-1.1 -0.9,-2 -2,-2zM13,18h-2v-2h2v2zM15.07,10.25l-0.9,0.92C13.45,11.9 13,12.5 13,14h-2v-0.5c0,-1.1 0.45,-2.1 1.17,-2.83l1.24,-1.26c0.37,-0.36 0.59,-0.86 0.59,-1.41 0,-1.1 -0.9,-2 -2,-2s-2,0.9 -2,2L8,8c0,-2.21 1.79,-4 4,-4s4,1.79 4,4c0,0.88 -0.36,1.68 -0.93,2.25z" />
</vector>

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" <shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle"> android:shape="rectangle">
<corners android:radius="3dp" /> <corners android:radius="16dp" />
<solid android:color="@color/btn_bg_press" /> <solid android:color="@color/btn_bg_press" />
</shape> </shape>

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" <shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle"> android:shape="rectangle">
<corners android:radius="3dp" /> <corners android:radius="16dp" />
<solid android:color="@color/btn_bg_press_2" /> <solid android:color="@color/btn_bg_press_2" />
</shape> </shape>

@ -10,7 +10,7 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:elevation="10dp" android:elevation="10dp"
android:background="@color/background" android:background="@color/background"
app:labelVisibilityMode="labeled" app:labelVisibilityMode="unlabeled"
app:menu="@menu/main_bnv" app:menu="@menu/main_bnv"
app:layout_constraintBottom_toBottomOf="parent" /> app:layout_constraintBottom_toBottomOf="parent" />

@ -221,6 +221,7 @@
android:layout_gravity="center_horizontal" android:layout_gravity="center_horizontal"
android:layout_marginTop="3dp" android:layout_marginTop="3dp"
android:text="@string/chapter_list" android:text="@string/chapter_list"
android:maxLines="1"
android:textColor="@color/tv_text_default" android:textColor="@color/tv_text_default"
android:textSize="12sp" /> android:textSize="12sp" />
</LinearLayout> </LinearLayout>
@ -256,6 +257,7 @@
android:layout_gravity="center_horizontal" android:layout_gravity="center_horizontal"
android:layout_marginTop="3dp" android:layout_marginTop="3dp"
android:text="@string/main_menu" android:text="@string/main_menu"
android:maxLines="1"
android:textColor="@color/tv_text_default" android:textColor="@color/tv_text_default"
android:textSize="12sp" /> android:textSize="12sp" />
</LinearLayout> </LinearLayout>
@ -291,6 +293,7 @@
android:layout_gravity="center_horizontal" android:layout_gravity="center_horizontal"
android:layout_marginTop="3dp" android:layout_marginTop="3dp"
android:text="@string/to_backstage" android:text="@string/to_backstage"
android:maxLines="1"
android:textColor="@color/tv_text_default" android:textColor="@color/tv_text_default"
android:textSize="12sp" /> android:textSize="12sp" />
</LinearLayout> </LinearLayout>
@ -325,7 +328,8 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center_horizontal" android:layout_gravity="center_horizontal"
android:layout_marginTop="3dp" android:layout_marginTop="3dp"
android:text="@string/aloud_config" android:text="@string/setting"
android:maxLines="1"
android:textColor="@color/tv_text_default" android:textColor="@color/tv_text_default"
android:textSize="12sp" /> android:textSize="12sp" />
</LinearLayout> </LinearLayout>

@ -15,7 +15,7 @@
android:id="@+id/recycler_view" android:id="@+id/recycler_view"
android:background="@color/background_card" android:background="@color/background_card"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="0dp"
android:layout_weight="1" /> android:layout_weight="1" />
<LinearLayout <LinearLayout
@ -33,8 +33,8 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginRight="16dp" android:layout_marginRight="16dp"
android:padding="12dp" android:padding="12dp"
android:clickable="true"
android:text="@string/ok" android:text="@string/ok"
android:visibility="gone"
tools:ignore="RtlHardcoded" /> tools:ignore="RtlHardcoded" />
</LinearLayout> </LinearLayout>

@ -48,19 +48,6 @@
tools:ignore="RtlHardcoded" /> tools:ignore="RtlHardcoded" />
</FrameLayout> </FrameLayout>
<io.legado.app.ui.widget.text.BadgeView
android:id="@+id/bv_author"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:includeFontPadding="false"
android:singleLine="true"
app:radius="1dp"
app:up_flat_angle="true"
app:layout_constraintLeft_toLeftOf="@id/iv_cover"
app:layout_constraintBottom_toBottomOf="@id/iv_cover"
tools:ignore="RtlHardcoded" />
<TextView <TextView
android:id="@+id/tv_name" android:id="@+id/tv_name"
android:layout_width="0dp" android:layout_width="0dp"

@ -8,7 +8,10 @@
android:background="@drawable/selector_fillet_btn_bg" android:background="@drawable/selector_fillet_btn_bg"
android:ellipsize="end" android:ellipsize="end"
android:gravity="center" android:gravity="center"
android:padding="5dp" android:paddingTop="4dp"
android:paddingBottom="4dp"
android:paddingLeft="12dp"
android:paddingRight="12dp"
android:maxLines="1" android:maxLines="1"
android:textColor="@color/tv_text_default" android:textColor="@color/tv_text_default"
android:textSize="14sp" android:textSize="14sp"

@ -4,8 +4,6 @@
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:paddingLeft="10dp"
android:paddingRight="10dp"
android:gravity="center" android:gravity="center"
android:orientation="vertical"> android:orientation="vertical">
@ -17,8 +15,7 @@
android:paddingRight="10dp" android:paddingRight="10dp"
android:paddingTop="6dp" android:paddingTop="6dp"
android:paddingBottom="6dp" android:paddingBottom="6dp"
android:layout_margin="4dp" android:background="@drawable/bg_find_book_group"
android:background="@color/btn_bg_press"
android:orientation="horizontal" android:orientation="horizontal"
android:gravity="center_vertical"> android:gravity="center_vertical">
@ -28,11 +25,22 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_weight="1" /> android:layout_weight="1" />
<io.legado.app.ui.widget.anima.RotateLoading
android:id="@+id/rotate_loading"
android:layout_width="20dp"
android:layout_height="20dp"
android:visibility="gone"
android:layout_gravity="center"
android:layout_marginRight="4dp"
app:hide_mode="gone"
app:loading_width="1dp"
tools:ignore="RtlHardcoded" />
<ImageView <ImageView
android:id="@+id/iv_status" android:id="@+id/iv_status"
android:layout_width="20dp" android:layout_width="20dp"
android:layout_height="20dp" android:layout_height="20dp"
android:src="@drawable/ic_add" android:src="@drawable/ic_arrow_right"
app:tint="@color/tv_text_secondary" app:tint="@color/tv_text_secondary"
tools:ignore="ContentDescription" /> tools:ignore="ContentDescription" />
@ -41,6 +49,8 @@
<FrameLayout <FrameLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:paddingLeft="8dp"
android:paddingRight="8dp"
android:layout_gravity="center"> android:layout_gravity="center">
<com.google.android.flexbox.FlexboxLayout <com.google.android.flexbox.FlexboxLayout
@ -50,21 +60,13 @@
android:clipToPadding="false" android:clipToPadding="false"
android:overScrollMode="never" android:overScrollMode="never"
android:padding="3dp" android:padding="3dp"
android:layout_marginTop="8dp"
android:visibility="gone" android:visibility="gone"
app:dividerDrawable="@drawable/shape_space_divider" app:dividerDrawable="@drawable/shape_space_divider"
app:flexDirection="row" app:flexDirection="row"
app:flexWrap="wrap" app:flexWrap="wrap"
app:showDivider="middle" /> app:showDivider="middle" />
<io.legado.app.ui.widget.anima.RotateLoading
android:id="@+id/rotate_loading"
android:layout_width="36dp"
android:layout_height="36dp"
android:visibility="gone"
android:layout_gravity="center"
app:hide_mode="gone"
app:loading_width="2dp" />
</FrameLayout> </FrameLayout>
</LinearLayout> </LinearLayout>

@ -9,6 +9,7 @@
android:gravity="center" android:gravity="center"
android:padding="5dp" android:padding="5dp"
android:maxLines="1" android:maxLines="1"
android:scrollbars="none"
android:textColor="@color/tv_text_default" android:textColor="@color/tv_text_default"
android:textSize="14sp" android:textSize="14sp"
tools:ignore="UnusedAttribute" /> tools:ignore="UnusedAttribute" />

@ -1,27 +1,46 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<androidx.appcompat.widget.LinearLayoutCompat xmlns:android="http://schemas.android.com/apk/res/android" <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:background="@drawable/shape_card_view" android:background="@drawable/shape_card_view"
android:padding="5dp" android:padding="5dp"
android:orientation="horizontal"> android:orientation="vertical">
<androidx.recyclerview.widget.RecyclerView <LinearLayout
android:id="@+id/recycler_view"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center" /> android:orientation="horizontal"
android:gravity="center_vertical">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recycler_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:orientation="horizontal"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" />
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/iv_menu_more"
android:layout_width="24dp"
android:layout_height="24dp"
android:background="?attr/selectableItemBackgroundBorderless"
android:src="@drawable/ic_more_vert"
android:tint="@color/tv_text_default"
android:visibility="gone"
android:contentDescription="@string/more_menu" />
</LinearLayout>
<androidx.appcompat.widget.AppCompatImageView <androidx.recyclerview.widget.RecyclerView
android:id="@+id/iv_menu_more" android:id="@+id/recycler_view_more"
android:layout_width="24dp" android:layout_width="wrap_content"
android:layout_height="24dp" android:layout_height="wrap_content"
android:background="?attr/selectableItemBackgroundBorderless" android:layout_gravity="center"
android:src="@drawable/ic_more_vert"
android:tint="@color/tv_text_default"
android:visibility="gone" android:visibility="gone"
android:contentDescription="@string/more_menu" android:orientation="vertical"
android:layout_gravity="center_vertical" /> app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" />
</androidx.appcompat.widget.LinearLayoutCompat> </LinearLayout>

@ -3,8 +3,13 @@
xmlns:android="http://schemas.android.com/apk/res/android" xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/search_view" android:id="@+id/search_view"
android:layout_width="match_parent"
android:theme="?attr/actionBarStyle" android:theme="?attr/actionBarStyle"
android:layout_height="wrap_content" android:background="@drawable/bg_searchview"
android:layout_width="match_parent"
android:layout_height="34dp"
android:layout_marginTop="8dp"
android:layout_marginBottom="8dp"
android:imeOptions="actionSearch" android:imeOptions="actionSearch"
app:queryBackground="@null"
app:submitBackground="@null"
app:defaultQueryHint="搜索"/> app:defaultQueryHint="搜索"/>

@ -9,6 +9,10 @@
android:id="@+id/menu_copy" android:id="@+id/menu_copy"
android:title="@android:string/copy" /> android:title="@android:string/copy" />
<item
android:id="@+id/menu_aloud"
android:title="@string/read_aloud" />
<item <item
android:id="@+id/menu_browser" android:id="@+id/menu_browser"
android:title="@string/browser" /> android:title="@string/browser" />

@ -4,20 +4,20 @@
tools:showIn="bottom_navigation_view"> tools:showIn="bottom_navigation_view">
<item <item
android:id="@+id/menu_bookshelf" android:id="@+id/menu_bookshelf"
android:icon="@drawable/ic_bottom_books" 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_bottom_explore" 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_bottom_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_bottom_person" android:icon="@drawable/ic_bottom_person"
android:title="@string/my"/> android:title="@string/my" />
</menu> </menu>

@ -6,7 +6,7 @@
<item <item
android:id="@+id/menu_help" android:id="@+id/menu_help"
android:title="@string/help" android:title="@string/help"
android:icon="@drawable/ic_live_help_black_24dp" android:icon="@drawable/ic_help"
app:showAsAction="always" app:showAsAction="always"
tools:ignore="AlwaysShowAction" /> tools:ignore="AlwaysShowAction" />

@ -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="@drawable/ic_launcher1_b" />
<foreground android:drawable="@drawable/ic_launcher" /> <foreground android:drawable="@drawable/ic_launcher1" />
</adaptive-icon> </adaptive-icon>

@ -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_yellow_600" /> <background android:drawable="@color/md_yellow_600" />
<foreground android:drawable="@drawable/ic_launcher_1" /> <foreground android:drawable="@drawable/ic_launcher2" />
</adaptive-icon> </adaptive-icon>

@ -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="@drawable/ic_launcher_2b" /> <background android:drawable="@drawable/ic_launcher5_b" />
<foreground android:drawable="@drawable/ic_launcher_2" /> <foreground android:drawable="@drawable/ic_launcher5" />
</adaptive-icon> </adaptive-icon>

@ -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_3" /> <foreground android:drawable="@drawable/ic_launcher3" />
</adaptive-icon> </adaptive-icon>

@ -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_4" /> <foreground android:drawable="@drawable/ic_launcher4" />
</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_launcher6" />
</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="@drawable/ic_launcher7_b" />
<foreground android:drawable="@drawable/ic_launcher7" />
</adaptive-icon>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.9 KiB

After

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 KiB

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.3 KiB

After

Width:  |  Height:  |  Size: 6.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.7 KiB

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 17 KiB

@ -10,6 +10,7 @@
<color name="night_mask">#69000000</color> <color name="night_mask">#69000000</color>
<color name="transparent10">#10ffffff</color>
<color name="transparent30">#30ffffff</color> <color name="transparent30">#30ffffff</color>
<color name="bg_divider_line">#363636</color> <color name="bg_divider_line">#363636</color>

@ -7,6 +7,8 @@
<item>launcher2</item> <item>launcher2</item>
<item>launcher3</item> <item>launcher3</item>
<item>launcher4</item> <item>launcher4</item>
<item>launcher5</item>
<item>launcher6</item>
</string-array> </string-array>
<string-array name="screen_time_out_value"> <string-array name="screen_time_out_value">

@ -80,6 +80,8 @@
<item>icon2</item> <item>icon2</item>
<item>icon3</item> <item>icon3</item>
<item>icon4</item> <item>icon4</item>
<item>icon5</item>
<item>icon6</item>
</string-array> </string-array>
<string-array name="chinese_mode"> <string-array name="chinese_mode">

@ -18,6 +18,7 @@
<color name="background_menu">@color/md_grey_200</color> <color name="background_menu">@color/md_grey_200</color>
<color name="transparent">#00000000</color> <color name="transparent">#00000000</color>
<color name="transparent10">#10000000</color>
<color name="transparent30">#30000000</color> <color name="transparent30">#30000000</color>
<color name="highlight">#d3321b</color> <color name="highlight">#d3321b</color>

@ -6,7 +6,6 @@
<dimen name="nav_header_height">176dp</dimen> <dimen name="nav_header_height">176dp</dimen>
<dimen name="fab_margin">16dp</dimen> <dimen name="fab_margin">16dp</dimen>
<dimen name="font_size_normal">14sp</dimen> <dimen name="font_size_normal">14sp</dimen>
<dimen name="font_size_middle">16sp</dimen> <dimen name="font_size_middle">16sp</dimen>
<dimen name="font_size_large">18sp</dimen> <dimen name="font_size_large">18sp</dimen>

@ -225,7 +225,7 @@
<string name="book_intro">内容简介</string> <string name="book_intro">内容简介</string>
<string name="intro_show">简介:%s</string> <string name="intro_show">简介:%s</string>
<string name="open_from_other">打开外部书籍</string> <string name="open_from_other">打开外部书籍</string>
<string name="origin_show">来源:%s</string> <string name="origin_show">来源: %s</string>
<string name="import_replace_rule">本地导入</string> <string name="import_replace_rule">本地导入</string>
<string name="import_replace_rule_on_line">导入在线规则</string> <string name="import_replace_rule_on_line">导入在线规则</string>
<string name="check_update_interval">检查更新间隔</string> <string name="check_update_interval">检查更新间隔</string>
@ -581,7 +581,7 @@
<string name="book_type">类型:</string> <string name="book_type">类型:</string>
<string name="book_type_text">文本</string> <string name="book_type_text">文本</string>
<string name="book_type_audio">音频</string> <string name="book_type_audio">音频</string>
<string name="to_backstage">转到后台</string> <string name="to_backstage">后台</string>
<string name="importing">正在导入</string> <string name="importing">正在导入</string>
<string name="exporting">正在导出</string> <string name="exporting">正在导出</string>
<string name="custom_page_key">自定义翻页按键</string> <string name="custom_page_key">自定义翻页按键</string>
@ -648,4 +648,5 @@
<string name="main_menu">主菜单</string> <string name="main_menu">主菜单</string>
<string name="request_permission">点击授予权限</string> <string name="request_permission">点击授予权限</string>
<string name="tip_local_perm_request_storage">阅读需要访问存储卡权限,请点击下方的"授予权限"按钮,或前往“设置”—“应用权限”—打开所需权限。如果授予权限后仍然不正常,请点击右上角的“选择文件夹”,使用系统文件夹选择器。</string> <string name="tip_local_perm_request_storage">阅读需要访问存储卡权限,请点击下方的"授予权限"按钮,或前往“设置”—“应用权限”—打开所需权限。如果授予权限后仍然不正常,请点击右上角的“选择文件夹”,使用系统文件夹选择器。</string>
<string name="alouding_disable">全文朗读中不能朗读选中文字</string>
</resources> </resources>

Loading…
Cancel
Save