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. 2
      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:launchMode="singleTask" />
</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
android:name=".ui.main.MainActivity"

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

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

@ -50,9 +50,12 @@ interface BookSourceDao {
@get:Query("select * from book_sources order by customOrder asc")
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>
@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")
fun getBookSource(key: String): BookSource?

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

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

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

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

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

@ -33,6 +33,7 @@ import io.legado.app.ui.widget.recycler.VerticalDivider
import io.legado.app.utils.applyTint
import io.legado.app.utils.getViewModel
import io.legado.app.utils.requestInputMethod
import io.legado.app.utils.visible
import kotlinx.android.synthetic.main.dialog_edit_text.view.*
import kotlinx.android.synthetic.main.dialog_recycler_view.*
import kotlinx.android.synthetic.main.item_group_manage.view.*
@ -74,6 +75,7 @@ class GroupManageDialog : DialogFragment(), Toolbar.OnMenuItemClickListener {
recycler_view.addItemDecoration(VerticalDivider(requireContext()))
recycler_view.adapter = adapter
tv_ok.setTextColor(requireContext().accentColor)
tv_ok.visible()
tv_ok.onClick { dismiss() }
App.db.bookGroupDao().liveDataAll().observe(viewLifecycleOwner, Observer {
val diffResult =

@ -25,6 +25,7 @@ import io.legado.app.data.entities.BookChapter
import io.legado.app.help.BookHelp
import io.legado.app.help.ReadBookConfig
import io.legado.app.help.coroutine.Coroutine
import io.legado.app.help.storage.Backup
import io.legado.app.help.storage.SyncBookProgress
import io.legado.app.lib.dialogs.alert
import io.legado.app.lib.dialogs.noButton
@ -115,7 +116,7 @@ class ReadBookActivity : VMBaseActivity<ReadBookViewModel>(R.layout.activity_boo
override fun onConfigurationChanged(newConfig: Configuration) {
super.onConfigurationChanged(newConfig)
ReadBook.loadContent()
ReadBook.loadContent(resetPageOffset = false)
}
override fun onResume() {
@ -402,11 +403,10 @@ class ReadBookActivity : VMBaseActivity<ReadBookViewModel>(R.layout.activity_boo
*/
override fun showTextActionMenu() {
textActionMenu ?: let {
textActionMenu = TextActionMenu(this, this).apply {
contentView.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED)
}
textActionMenu = TextActionMenu(this, this)
}
textActionMenu?.let { popup ->
popup.contentView.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED)
val popupHeight = popup.contentView.measuredHeight
val x = text_menu_position.x.toInt()
var y = text_menu_position.y.toInt() - popupHeight
@ -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 {
page_view.upContent(relativePosition)
page_view.upContent(relativePosition, resetPageOffset)
}
}
@ -579,7 +579,7 @@ class ReadBookActivity : VMBaseActivity<ReadBookViewModel>(R.layout.activity_boo
override fun onReplaceRuleSave() {
Coroutine.async {
BookHelp.upReplaceRules()
ReadBook.loadContent()
ReadBook.loadContent(resetPageOffset = false)
}
}
@ -684,6 +684,7 @@ class ReadBookActivity : VMBaseActivity<ReadBookViewModel>(R.layout.activity_boo
page_view.onDestroy()
if (!BuildConfig.DEBUG) {
SyncBookProgress.uploadBookProgress()
Backup.autoBack(this)
}
}
@ -707,9 +708,9 @@ class ReadBookActivity : VMBaseActivity<ReadBookViewModel>(R.layout.activity_boo
page_view.upBg()
page_view.upStyle()
if (it) {
ReadBook.loadContent()
ReadBook.loadContent(resetPageOffset = false)
} else {
page_view.upContent()
page_view.upContent(resetPageOffset = false)
}
}
observeEvent<Int>(EventBus.ALOUD_STATE) {
@ -718,7 +719,7 @@ class ReadBookActivity : VMBaseActivity<ReadBookViewModel>(R.layout.activity_boo
val page = textChapter.page(ReadBook.durPageIndex)
if (page != null) {
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) {
if (ReadBook.book?.bookUrl != book.bookUrl) {
ReadBook.resetData(book)
ReadBook.resetData(book) { name, author ->
autoChangeSource(name, author)
}
isInitFinish = true
ReadBook.chapterSize = App.db.bookChapterDao().getChapterCount(book.bookUrl)
if (ReadBook.chapterSize == 0) {
@ -52,7 +54,7 @@ class ReadBookViewModel(application: Application) : BaseViewModel(application) {
if (ReadBook.durChapterIndex > ReadBook.chapterSize - 1) {
ReadBook.durChapterIndex = ReadBook.chapterSize - 1
}
ReadBook.loadContent()
ReadBook.loadContent(resetPageOffset = true)
}
if (ReadBook.inBookshelf) {
ReadBook.saveRead()
@ -60,7 +62,9 @@ class ReadBookViewModel(application: Application) : BaseViewModel(application) {
} else {
isInitFinish = true
ReadBook.titleDate.postValue(book.name)
ReadBook.upWebBook(book.origin)
ReadBook.upWebBook(book) { name, author ->
autoChangeSource(name, author)
}
ReadBook.chapterSize = App.db.bookChapterDao().getChapterCount(book.bookUrl)
if (ReadBook.chapterSize == 0) {
if (book.tocUrl.isEmpty()) {
@ -70,7 +74,7 @@ class ReadBookViewModel(application: Application) : BaseViewModel(application) {
}
} else {
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.bookDao().update(book)
ReadBook.chapterSize = it.size
ReadBook.loadContent()
ReadBook.loadContent(resetPageOffset = true)
}
} else {
ReadBook.webBook?.getChapterList(book, this)
@ -113,7 +117,7 @@ class ReadBookViewModel(application: Application) : BaseViewModel(application) {
App.db.bookChapterDao().insert(*cList.toTypedArray())
App.db.bookDao().update(book)
ReadBook.chapterSize = cList.size
ReadBook.loadContent()
ReadBook.loadContent(resetPageOffset = true)
} else {
changeDruChapterIndex(cList)
}
@ -122,7 +126,7 @@ class ReadBookViewModel(application: Application) : BaseViewModel(application) {
}
}?.onError {
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>) {
@ -167,7 +191,7 @@ class ReadBookViewModel(application: Application) : BaseViewModel(application) {
App.db.bookDao().update(book)
App.db.bookChapterDao().insert(*chapters.toTypedArray())
ReadBook.chapterSize = chapters.size
ReadBook.loadContent()
ReadBook.loadContent(resetPageOffset = true)
}
}
@ -181,7 +205,7 @@ class ReadBookViewModel(application: Application) : BaseViewModel(application) {
ReadBook.durPageIndex = pageIndex
}
ReadBook.saveRead()
ReadBook.loadContent()
ReadBook.loadContent(resetPageOffset = true)
}
fun removeFromBookshelf(success: (() -> Unit)?) {
@ -208,9 +232,9 @@ class ReadBookViewModel(application: Application) : BaseViewModel(application) {
execute {
App.db.bookChapterDao().getChapter(book.bookUrl, ReadBook.durChapterIndex)
?.let { chapter ->
BookHelp.delContent(book, chapter)
ReadBook.loadContent(ReadBook.durChapterIndex)
}
BookHelp.delContent(book, chapter)
ReadBook.loadContent(ReadBook.durChapterIndex, resetPageOffset = false)
}
}
}

@ -7,6 +7,7 @@ import android.content.Intent
import android.content.pm.ResolveInfo
import android.net.Uri
import android.os.Build
import android.speech.tts.TextToSpeech
import android.view.LayoutInflater
import android.view.Menu
import android.view.ViewGroup
@ -15,13 +16,12 @@ import androidx.annotation.RequiresApi
import androidx.appcompat.view.SupportMenuInflater
import androidx.appcompat.view.menu.MenuBuilder
import androidx.appcompat.view.menu.MenuItemImpl
import androidx.appcompat.widget.PopupMenu
import androidx.core.view.size
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import androidx.core.view.isVisible
import io.legado.app.R
import io.legado.app.base.adapter.ItemViewHolder
import io.legado.app.base.adapter.SimpleRecyclerAdapter
import io.legado.app.service.BaseReadAloudService
import io.legado.app.utils.gone
import io.legado.app.utils.isAbsUrl
import io.legado.app.utils.sendToClip
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.share
import org.jetbrains.anko.toast
import java.util.*
@SuppressLint("RestrictedApi")
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 {
@SuppressLint("InflateParams")
@ -44,33 +50,38 @@ class TextActionMenu(private val context: Context, private val callBack: CallBac
isFocusable = false
initRecyclerView()
setOnDismissListener {
contentView.apply {
iv_menu_more.setImageResource(R.drawable.ic_more_vert)
recycler_view_more.gone()
adapter.setItems(menu.visibleItems)
recycler_view.visible()
}
}
}
private fun initRecyclerView() = with(contentView) {
val adapter = Adapter(context)
recycler_view.layoutManager = LinearLayoutManager(context, RecyclerView.HORIZONTAL, false)
recycler_view.adapter = adapter
val menu = MenuBuilder(context)
recycler_view_more.adapter = adapter
SupportMenuInflater(context).inflate(R.menu.content_select_action, menu)
adapter.setItems(menu.visibleItems)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
val popupMenu = PopupMenu(context, iv_menu_more)
onInitializeMenu(popupMenu.menu)
if (popupMenu.menu.size > 0) {
iv_menu_more.visible()
popupMenu.setOnMenuItemClickListener { item ->
item.intent?.let {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
it.putExtra(Intent.EXTRA_PROCESS_TEXT, callBack.selectedText)
context.startActivity(it)
}
}
this@TextActionMenu.dismiss()
true
}
}
iv_menu_more.onClick {
popupMenu.show()
onInitializeMenu(moreMenu)
}
if (moreMenu.size() > 0) {
iv_menu_more.visible()
}
iv_menu_more.onClick {
if (recycler_view.isVisible) {
iv_menu_more.setImageResource(R.drawable.ic_arrow_back)
adapter.setItems(moreMenu.visibleItems)
recycler_view.gone()
recycler_view_more.visible()
} else {
iv_menu_more.setImageResource(R.drawable.ic_more_vert)
recycler_view_more.gone()
adapter.setItems(menu.visibleItems)
recycler_view.visible()
}
}
}
@ -104,6 +115,13 @@ class TextActionMenu(private val context: Context, private val callBack: CallBac
when (item.itemId) {
R.id.menu_copy -> context.sendToClip(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 -> {
try {
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")
}
}
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)
private fun createProcessTextIntent(): 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)
if (resetPageOffset)
resetPageOffset()
content_text_view.setContent(textPage)
}

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

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

@ -283,10 +283,12 @@ class SearchActivity : VMBaseActivity<SearchViewModel>(R.layout.activity_book_se
*/
@Synchronized
private fun upSearchItems(items: List<SearchBook>, isMandatoryUpdate: Boolean) {
val searchItems = ArrayList(items)
if (isMandatoryUpdate || System.currentTimeMillis() - refreshTime > 500) {
refreshTime = System.currentTimeMillis()
val diffResult = DiffUtil.calculateDiff(DiffCallBack(adapter.getItems(), items))
adapter.setItems(items, diffResult)
val 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.PreferKey
import io.legado.app.help.AppConfig
import io.legado.app.help.storage.Backup
import io.legado.app.lib.theme.ATH
import io.legado.app.service.BaseReadAloudService
import io.legado.app.service.help.ReadAloud
@ -114,13 +113,6 @@ class MainActivity : VMBaseActivity<MainViewModel>(R.layout.activity_main),
return super.onKeyUp(keyCode, event)
}
override fun finish() {
if (!BuildConfig.DEBUG) {
Backup.autoBack(this)
}
super.finish()
}
override fun onDestroy() {
super.onDestroy()
ReadAloud.stop(this)

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

@ -7,6 +7,7 @@ import androidx.lifecycle.Observer
import androidx.recyclerview.widget.DiffUtil
import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import io.legado.app.App
import io.legado.app.R
import io.legado.app.base.BaseFragment
@ -26,6 +27,7 @@ import io.legado.app.utils.getViewModelOfActivity
import io.legado.app.utils.observeEvent
import kotlinx.android.synthetic.main.fragment_books.*
import org.jetbrains.anko.startActivity
import kotlin.math.max
class BooksFragment : BaseFragment(R.layout.fragment_books),
@ -71,9 +73,26 @@ class BooksFragment : BaseFragment(R.layout.fragment_books),
booksAdapter = BooksAdapterList(requireContext(), this)
} else {
rv_bookshelf.layoutManager = GridLayoutManager(context, bookshelfLayout + 2)
booksAdapter = BooksAdapterGrid(requireContext(),this)
booksAdapter = BooksAdapterGrid(requireContext(), this)
}
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() {

@ -12,6 +12,7 @@ import io.legado.app.data.entities.BookSource
import io.legado.app.help.coroutine.Coroutine
import io.legado.app.lib.theme.accentColor
import io.legado.app.utils.ACache
import io.legado.app.utils.dp
import io.legado.app.utils.gone
import io.legado.app.utils.visible
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>) {
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()) {
tv_name.text = item.bookSourceName
}
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.show()
if (scrollTo >= 0) {
@ -68,7 +74,7 @@ class ExploreAdapter(context: Context, private val scope: CoroutineScope, val ca
}
}
} else {
iv_status.setImageResource(R.drawable.ic_add)
iv_status.setImageResource(R.drawable.ic_arrow_right)
rotate_loading.hide()
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.theme.accentColor
import io.legado.app.ui.widget.recycler.VerticalDivider
import io.legado.app.utils.applyTint
import io.legado.app.utils.getViewModelOfActivity
import io.legado.app.utils.requestInputMethod
import io.legado.app.utils.splitNotBlank
import io.legado.app.utils.*
import kotlinx.android.synthetic.main.dialog_edit_text.view.*
import kotlinx.android.synthetic.main.dialog_recycler_view.*
import kotlinx.android.synthetic.main.item_group_manage.view.*
@ -68,6 +65,7 @@ class GroupManageDialog : DialogFragment(), Toolbar.OnMenuItemClickListener {
recycler_view.addItemDecoration(VerticalDivider(requireContext()))
recycler_view.adapter = adapter
tv_ok.setTextColor(requireContext().accentColor)
tv_ok.visible()
tv_ok.onClick { dismiss() }
App.db.rssSourceDao().liveGroup().observe(viewLifecycleOwner, Observer {
val groups = linkedSetOf<String>()

@ -60,3 +60,5 @@ class Launcher1 : WelcomeActivity()
class Launcher2 : WelcomeActivity()
class Launcher3 : WelcomeActivity()
class Launcher4 : WelcomeActivity()
class Launcher5 : WelcomeActivity()
class Launcher6 : WelcomeActivity()

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

@ -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:viewportHeight="24">
<path
android:pathData="M18.8,21h-0.5c-1.2,0 -2.2,-1 -2.2,-2.2v-8.5c0,-1.2 1,-2.2 2.2,-2.2h0.5c1.2,0 2.2,1 2.2,2.2v8.5C21,20 20,21 18.8,21zM18.2,9.5c-0.4,0 -0.8,0.3 -0.8,0.8v8.5c0,0.4 0.3,0.8 0.8,0.8h0.5c0.4,0 0.8,-0.3 0.8,-0.8v-8.5c0,-0.4 -0.3,-0.8 -0.8,-0.8L18.2,9.5z"
android:fillColor="#2F45A6" />
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" />
<path
android:pathData="M12.2,21h-0.5c-1.2,0 -2.2,-1 -2.2,-2.2v-13.5c0,-1.2 1,-2.2 2.2,-2.2h0.5c1.2,0 2.2,1 2.2,2.2v13.5C14.5,20 13.5,21 12.2,21zM11.8,4.5c-0.4,0 -0.8,0.3 -0.8,0.8v13.5c0,0.4 0.3,0.8 0.8,0.8h0.5c0.4,0 0.8,-0.3 0.8,-0.8v-13.5c0,-0.4 -0.3,-0.8 -0.8,-0.8L11.8,4.5z"
android:fillColor="#2F45A6" />
<path
android:pathData="M5.8,21h-0.5c-1.2,0 -2.2,-1 -2.2,-2.2v-10.5c0,-1.2 1,-2.2 2.2,-2.2h0.5c1.2,0 2.2,1 2.2,2.2v10.5C8,20 7,21 5.8,21zM5.2,7.5c-0.4,0 -0.8,0.3 -0.8,0.8v10.5c0,0.4 0.3,0.8 0.8,0.8h0.5c0.4,0 0.8,-0.3 0.8,-0.8v-10.5c0,-0.4 -0.3,-0.8 -0.8,-0.8L5.2,7.5z"
android:fillColor="#2F45A6" />
<path
android:pathData="M11.5,16h1c0.3,0 0.5,0.2 0.5,0.5v0.5c0,0.3 -0.2,0.5 -0.5,0.5h-1c-0.3,0 -0.5,-0.2 -0.5,-0.5v-0.5C11,16.2 11.2,16 11.5,16z"
android:fillColor="#2F45A6" />
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" />
</vector>

@ -4,15 +4,9 @@
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:pathData="M17.5,8h2C20.3,8 21,8.7 21,9.5v10c0,0.8 -0.7,1.5 -1.5,1.5h-2c-0.8,0 -1.5,-0.7 -1.5,-1.5v-10C16,8.7 16.7,8 17.5,8z"
android:fillColor="#C8D0D9"
android:fillType="evenOdd" />
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="#2f45a6" />
<path
android:pathData="M4.5,6h2C7.3,6 8,6.7 8,7.5v12C8,20.3 7.3,21 6.5,21h-2C3.7,21 3,20.3 3,19.5v-12C3,6.7 3.7,6 4.5,6z"
android:fillColor="#C8D0D9"
android:fillType="evenOdd" />
<path
android:pathData="M13,3h-2c-0.8,0 -1.5,0.7 -1.5,1.5v15c0,0.8 0.7,1.5 1.5,1.5h2c0.8,0 1.5,-0.7 1.5,-1.5v-15C14.5,3.7 13.8,3 13,3zM13,17c0,0.3 -0.2,0.5 -0.5,0.5h-1c-0.3,0 -0.5,-0.2 -0.5,-0.5v-0.5c0,-0.3 0.2,-0.5 0.5,-0.5h1c0.3,0 0.5,0.2 0.5,0.5V17z"
android:fillColor="#C8D0D9"
android:fillType="evenOdd" />
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="#2f45a6" />
</vector>

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

@ -4,7 +4,6 @@
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:pathData="M12,3c5,0 9,4 9,9s-4,9 -9,9s-9,-4 -9,-9S7,3 12,3zM13.5,13c0.3,-0.5 0.7,-2.1 1.4,-4.8l0,0c0,-0.1 0,-0.2 -0.1,-0.2s-0.1,0 -0.2,0c-2.3,1.8 -3.5,3 -3.8,3.4c-0.4,0.7 -0.2,1.7 0.6,2.1C12.1,14 13,13.8 13.5,13z"
android:fillColor="#C8D0D9"
android:fillType="evenOdd" />
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="#2f45a6" />
</vector>

@ -4,9 +4,9 @@
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:pathData="M12,11c-2.2,0 -4,-1.8 -4,-4s1.8,-4 4,-4s4,1.8 4,4S14.2,11 12,11zM12,4.5c-1.4,0 -2.5,1.1 -2.5,2.5s1.1,2.5 2.5,2.5s2.5,-1.1 2.5,-2.5S13.4,4.5 12,4.5z"
android:fillColor="#959ECA" />
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="#2f45a6" />
<path
android:pathData="M18.5,21h-13c-0.4,0 -0.8,-0.2 -1.1,-0.4C4.1,20.4 4,19.9 4,19.5V17c0,-1.1 0.4,-2.1 1.2,-2.8C5.9,13.4 6.9,13 8,13h8c1.1,0 2.1,0.4 2.8,1.2C19.6,15 20,16 20,17v2.5c0,0.4 -0.2,0.8 -0.4,1.1S18.9,21 18.5,21zM8,14.5c-0.7,0 -1.3,0.3 -1.8,0.7c-0.5,0.5 -0.7,1.1 -0.7,1.8v2.5h13V17c0,-0.7 -0.3,-1.3 -0.7,-1.8c-0.5,-0.5 -1.1,-0.7 -1.8,-0.7H8z"
android:fillColor="#959ECA" />
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="#2f45a6" />
</vector>

@ -4,11 +4,9 @@
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:pathData="M12,7m-4,0a4,4 0,1 1,8 0a4,4 0,1 1,-8 0"
android:fillColor="#C8D0D9"
android:fillType="evenOdd" />
android:pathData="M12,7m-6,0a6,6 0,1 1,12 0a6,6 0,1 1,-12 0"
android:fillColor="#2f45a6" />
<path
android:pathData="M8,13h8c2.2,0 4,1.8 4,4v2.5c0,0.8 -0.7,1.5 -1.5,1.5h-13C4.7,21 4,20.3 4,19.5V17C4,14.8 5.8,13 8,13z"
android:fillColor="#C8D0D9"
android:fillType="evenOdd" />
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="#2f45a6" />
</vector>

@ -3,10 +3,10 @@
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:pathData="M18,3H6C4.9,3 4,3.9 4,5v15.1C4,20.6 4.4,21 4.9,21c0.1,0 0.2,0 0.3,0l5.7,-2.3c0.4,-0.1 0.7,-0.2 1.1,-0.2s0.8,0.1 1.1,0.2l5.7,2.3c0.1,0 0.2,0 0.3,0c0.5,0 0.9,-0.4 0.9,-0.9V5C20,3.9 19.1,3 18,3zM18.2,19.1l-4.7,-1.9l0,0l0,0c-0.5,-0.2 -1.1,-0.3 -1.6,-0.3s-1.1,0.1 -1.6,0.3l0,0l0,0l-4.7,1.9V5c0,-0.2 0.2,-0.4 0.4,-0.4H18c0.2,0 0.4,0.2 0.4,0.4v14.1H18.2z"
android:fillColor="#5A5F64" />
<path
android:pathData="M14.9,9.5h-2.2V7.2c0,-0.4 -0.4,-0.8 -0.8,-0.8c-0.4,0 -0.8,0.4 -0.8,0.8v2.3h-2c-0.4,0 -0.8,0.4 -0.8,0.8c0,0.4 0.4,0.8 0.8,0.8h2.2v2.3c0,0.4 0.4,0.8 0.8,0.8c0.4,0 0.8,-0.4 0.8,-0.8v-2.3h2.2c0.4,0 0.8,-0.4 0.8,-0.8C15.7,9.9 15.4,9.5 14.9,9.5L14.9,9.5z"
android:fillColor="#5A5F64" />
<path
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="#2f45a6" />
<path
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="#2f45a6" />
</vector>

@ -3,7 +3,7 @@
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:pathData="M18,3H6C4.9,3 4,3.9 4,5v15.1C4,20.6 4.4,21 4.9,21c0.1,0 0.2,0 0.3,0l5.7,-2.3c0.4,-0.1 0.7,-0.2 1.1,-0.2s0.8,0.1 1.1,0.2l5.7,2.3c0.1,0 0.2,0 0.3,0c0.5,0 0.9,-0.4 0.9,-0.9V5C20,3.9 19.1,3 18,3zM15.8,11c0,0.4 -0.3,0.8 -0.8,0.8h-2.3V14c0,0.4 -0.3,0.8 -0.8,0.8s-0.8,-0.3 -0.8,-0.8v-2.3H9c-0.4,0 -0.8,-0.3 -0.8,-0.8s0.3,-0.8 0.8,-0.8h2.3V8c0,-0.4 0.3,-0.8 0.8,-0.8s0.8,0.3 0.8,0.8v2.3H15C15.4,10.3 15.8,10.6 15.8,11z"
android:fillColor="#C8D0D9" />
<path
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="#2f45a6" />
</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"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<corners android:radius="3dp" />
<corners android:radius="16dp" />
<solid android:color="@color/btn_bg_press" />
</shape>

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

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

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

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

@ -48,19 +48,6 @@
tools:ignore="RtlHardcoded" />
</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
android:id="@+id/tv_name"
android:layout_width="0dp"

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

@ -4,8 +4,6 @@
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingLeft="10dp"
android:paddingRight="10dp"
android:gravity="center"
android:orientation="vertical">
@ -17,8 +15,7 @@
android:paddingRight="10dp"
android:paddingTop="6dp"
android:paddingBottom="6dp"
android:layout_margin="4dp"
android:background="@color/btn_bg_press"
android:background="@drawable/bg_find_book_group"
android:orientation="horizontal"
android:gravity="center_vertical">
@ -28,11 +25,22 @@
android:layout_height="wrap_content"
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
android:id="@+id/iv_status"
android:layout_width="20dp"
android:layout_height="20dp"
android:src="@drawable/ic_add"
android:src="@drawable/ic_arrow_right"
app:tint="@color/tv_text_secondary"
tools:ignore="ContentDescription" />
@ -41,6 +49,8 @@
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingLeft="8dp"
android:paddingRight="8dp"
android:layout_gravity="center">
<com.google.android.flexbox.FlexboxLayout
@ -50,21 +60,13 @@
android:clipToPadding="false"
android:overScrollMode="never"
android:padding="3dp"
android:layout_marginTop="8dp"
android:visibility="gone"
app:dividerDrawable="@drawable/shape_space_divider"
app:flexDirection="row"
app:flexWrap="wrap"
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>
</LinearLayout>

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

@ -1,27 +1,46 @@
<?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_height="wrap_content"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:background="@drawable/shape_card_view"
android:padding="5dp"
android:orientation="horizontal">
android:orientation="vertical">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recycler_view"
<LinearLayout
android:layout_width="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
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"
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recycler_view_more"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:visibility="gone"
android:contentDescription="@string/more_menu"
android:layout_gravity="center_vertical" />
android:orientation="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:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/search_view"
android:layout_width="match_parent"
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"
app:queryBackground="@null"
app:submitBackground="@null"
app:defaultQueryHint="搜索"/>

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

@ -4,20 +4,20 @@
tools:showIn="bottom_navigation_view">
<item
android:id="@+id/menu_bookshelf"
android:icon="@drawable/ic_bottom_books"
android:title="@string/bookshelf"/>
android:id="@+id/menu_bookshelf"
android:icon="@drawable/ic_bottom_books"
android:title="@string/bookshelf" />
<item
android:id="@+id/menu_find_book"
android:id="@+id/menu_find_book"
android:icon="@drawable/ic_bottom_explore"
android:title="@string/find"/>
android:title="@string/find" />
<item
android:id="@+id/menu_rss"
android:icon="@drawable/ic_bottom_rss_feed"
android:title="@string/rss" />
android:id="@+id/menu_rss"
android:icon="@drawable/ic_bottom_rss_feed"
android:title="@string/rss" />
<item
android:id="@+id/menu_my_config"
android:icon="@drawable/ic_bottom_person"
android:title="@string/my"/>
android:id="@+id/menu_my_config"
android:icon="@drawable/ic_bottom_person"
android:title="@string/my" />
</menu>

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

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

@ -1,5 +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_yellow_600" />
<foreground android:drawable="@drawable/ic_launcher_1" />
<foreground android:drawable="@drawable/ic_launcher2" />
</adaptive-icon>

@ -1,5 +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_launcher_2b" />
<foreground android:drawable="@drawable/ic_launcher_2" />
<background android:drawable="@drawable/ic_launcher5_b" />
<foreground android:drawable="@drawable/ic_launcher5" />
</adaptive-icon>

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

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@color/md_grey_100" />
<foreground android:drawable="@drawable/ic_launcher_4" />
<foreground android:drawable="@drawable/ic_launcher4" />
</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="transparent10">#10ffffff</color>
<color name="transparent30">#30ffffff</color>
<color name="bg_divider_line">#363636</color>

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

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

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

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

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

Loading…
Cancel
Save