Преглед изворни кода

更新与修复界面
修复一些设备的导航栏着色
增加删除单个书籍缓存功能
增加阅读记录封面显示
恢复一些默认动效

HapeLee пре 1 година
родитељ
комит
1607984faa
63 измењених фајлова са 591 додато и 453 уклоњено
  1. 5 9
      app/src/main/java/io/legato/kazusa/base/BaseActivity.kt
  2. 3 1
      app/src/main/java/io/legato/kazusa/base/BaseBottomSheetDialogFragment.kt
  3. 7 1
      app/src/main/java/io/legato/kazusa/data/dao/ReadRecordDao.kt
  4. 13 2
      app/src/main/java/io/legato/kazusa/ui/about/ReadRecordActivity.kt
  5. 5 2
      app/src/main/java/io/legato/kazusa/ui/book/cache/CacheActivity.kt
  6. 37 0
      app/src/main/java/io/legato/kazusa/ui/book/cache/CacheAdapter.kt
  7. 6 1
      app/src/main/java/io/legato/kazusa/ui/book/cache/CacheViewModel.kt
  8. 18 11
      app/src/main/java/io/legato/kazusa/ui/book/group/GroupEditDialog.kt
  9. 2 18
      app/src/main/java/io/legato/kazusa/ui/book/info/BookInfoActivity.kt
  10. 6 5
      app/src/main/java/io/legato/kazusa/ui/book/read/BaseReadBookActivity.kt
  11. 12 29
      app/src/main/java/io/legato/kazusa/ui/book/read/config/MoreConfigDialog.kt
  12. 0 11
      app/src/main/java/io/legato/kazusa/ui/book/read/config/PaddingConfigDialog.kt
  13. 8 15
      app/src/main/java/io/legato/kazusa/ui/book/read/config/ReadStyleDialog.kt
  14. 7 1
      app/src/main/java/io/legato/kazusa/ui/book/search/HistoryKeyAdapter.kt
  15. 31 6
      app/src/main/java/io/legato/kazusa/ui/book/search/SearchActivity.kt
  16. 14 15
      app/src/main/java/io/legato/kazusa/ui/book/search/SearchScopeDialog.kt
  17. 4 13
      app/src/main/java/io/legato/kazusa/ui/login/SourceLoginDialog.kt
  18. 3 8
      app/src/main/java/io/legato/kazusa/ui/main/MainActivity.kt
  19. 3 3
      app/src/main/java/io/legato/kazusa/ui/widget/text/AutoCompleteTextView.kt
  20. 8 5
      app/src/main/java/io/legato/kazusa/utils/ActivityExtensions.kt
  21. 1 1
      app/src/main/java/io/legato/kazusa/utils/ViewExtensions.kt
  22. 2 1
      app/src/main/res/layout-land/activity_book_info.xml
  23. 7 7
      app/src/main/res/layout-land/view_read_menu.xml
  24. 21 13
      app/src/main/res/layout/activity_book_info.xml
  25. 87 63
      app/src/main/res/layout/activity_book_search.xml
  26. 1 0
      app/src/main/res/layout/activity_book_source_edit.xml
  27. 1 1
      app/src/main/res/layout/activity_manga.xml
  28. 7 5
      app/src/main/res/layout/activity_read_record.xml
  29. 2 2
      app/src/main/res/layout/activity_search_content.xml
  30. 4 4
      app/src/main/res/layout/dialog_auto_read.xml
  31. 2 2
      app/src/main/res/layout/dialog_book_change_source.xml
  32. 8 2
      app/src/main/res/layout/dialog_book_group_edit.xml
  33. 4 8
      app/src/main/res/layout/dialog_login.xml
  34. 35 0
      app/src/main/res/layout/dialog_more_config.xml
  35. 2 2
      app/src/main/res/layout/dialog_read_aloud.xml
  36. 29 32
      app/src/main/res/layout/dialog_search_scope.xml
  37. 2 8
      app/src/main/res/layout/dialog_update.xml
  38. 2 3
      app/src/main/res/layout/fragment_chapter_list.xml
  39. 1 1
      app/src/main/res/layout/fragment_explore.xml
  40. 14 9
      app/src/main/res/layout/item_1line_text_and_del.xml
  41. 10 6
      app/src/main/res/layout/item_arrange_book.xml
  42. 1 3
      app/src/main/res/layout/item_book_source.xml
  43. 1 0
      app/src/main/res/layout/item_dict_rule.xml
  44. 60 21
      app/src/main/res/layout/item_download.xml
  45. 6 3
      app/src/main/res/layout/item_fillet_text.xml
  46. 1 1
      app/src/main/res/layout/item_find_book.xml
  47. 1 1
      app/src/main/res/layout/item_group_manage.xml
  48. 1 1
      app/src/main/res/layout/item_group_select.xml
  49. 2 2
      app/src/main/res/layout/item_http_tts.xml
  50. 35 26
      app/src/main/res/layout/item_read_record.xml
  51. 28 39
      app/src/main/res/layout/item_read_style.xml
  52. 1 0
      app/src/main/res/layout/item_replace_rule.xml
  53. 0 1
      app/src/main/res/layout/item_source_edit.xml
  54. 2 2
      app/src/main/res/layout/item_txt_toc_rule.xml
  55. 2 1
      app/src/main/res/layout/popup_keyboard_tool.xml
  56. 5 5
      app/src/main/res/layout/view_search_menu.xml
  57. 1 0
      app/src/main/res/layout/view_select_action_bar.xml
  58. 2 2
      app/src/main/res/layout/view_simple_counter.xml
  59. 0 14
      app/src/main/res/layout/view_theme_mode.xml
  60. 1 1
      app/src/main/res/values-ja-rJP/strings.xml
  61. 0 1
      app/src/main/res/values-night/themes.xml
  62. 2 2
      app/src/main/res/values-zh/strings.xml
  63. 5 1
      app/src/main/res/values/styles.xml

+ 5 - 9
app/src/main/java/io/legato/kazusa/base/BaseActivity.kt

@@ -13,6 +13,7 @@ import android.view.View
 import androidx.activity.enableEdgeToEdge
 import androidx.appcompat.app.AppCompatActivity
 import androidx.core.graphics.drawable.toDrawable
+import androidx.core.view.WindowCompat
 import androidx.viewbinding.ViewBinding
 import com.google.android.material.appbar.AppBarLayout
 import com.google.android.material.color.DynamicColors
@@ -27,6 +28,8 @@ import io.legato.kazusa.utils.disableAutoFill
 import io.legato.kazusa.utils.getPrefString
 import io.legato.kazusa.utils.hideSoftInput
 import io.legato.kazusa.utils.observeEvent
+import io.legato.kazusa.utils.setNavigationBarColorAuto
+import io.legato.kazusa.utils.themeColor
 import io.legato.kazusa.utils.toastOnUi
 import io.legato.kazusa.utils.windowSize
 
@@ -69,7 +72,9 @@ abstract class BaseActivity<VB : ViewBinding>(
         window.decorView.disableAutoFill()
         AppContextWrapper.applyLocaleAndFont(this)
         super.onCreate(savedInstanceState)
+        WindowCompat.setDecorFitsSystemWindows(window, false)
         enableEdgeToEdge()
+        window.setNavigationBarColorAuto(themeColor(com.google.android.material.R.attr.colorSurface))
         //setupSystemBar()
         setContentView(binding.root)
         upBackgroundImage()
@@ -152,15 +157,6 @@ abstract class BaseActivity<VB : ViewBinding>(
         }
     }
 
-    open fun upNavigationBarColor() {
-//        if (AppConfig.immNavigationBar) {
-//            setNavigationBarColorAuto(ThemeStore.navigationBarColor(this))
-//        } else {
-//            val nbColor = ColorUtils.darkenColor(ThemeStore.navigationBarColor(this))
-//            setNavigationBarColorAuto(nbColor)
-//        }
-    }
-
     open fun observeLiveBus() {
         observeEvent<String>(EventBus.RECREATE) {
             recreate()

+ 3 - 1
app/src/main/java/io/legato/kazusa/base/BaseBottomSheetDialogFragment.kt

@@ -12,6 +12,8 @@ import com.google.android.material.bottomsheet.BottomSheetDialog
 import com.google.android.material.bottomsheet.BottomSheetDialogFragment
 import io.legato.kazusa.constant.AppLog
 import io.legato.kazusa.help.coroutine.Coroutine
+import io.legato.kazusa.utils.setNavigationBarColorAuto
+import io.legato.kazusa.utils.themeColor
 import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.Dispatchers
 import kotlin.coroutines.CoroutineContext
@@ -28,6 +30,7 @@ abstract class BaseBottomSheetDialogFragment(
 
     override fun onStart() {
         super.onStart()
+        dialog?.window?.setNavigationBarColorAuto(requireContext().themeColor(com.google.android.material.R.attr.colorSurfaceContainer))
         if (resources.configuration.orientation == Configuration.ORIENTATION_LANDSCAPE) {
             val screenHeight = resources.displayMetrics.heightPixels
             (dialog as? BottomSheetDialog)?.behavior?.apply {
@@ -38,7 +41,6 @@ abstract class BaseBottomSheetDialogFragment(
 
     override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
         super.onViewCreated(view, savedInstanceState)
-
         onFragmentCreated(view, savedInstanceState)
         observeLiveBus()
     }

+ 7 - 1
app/src/main/java/io/legato/kazusa/data/dao/ReadRecordDao.kt

@@ -1,6 +1,11 @@
 package io.legato.kazusa.data.dao
 
-import androidx.room.*
+import androidx.room.Dao
+import androidx.room.Delete
+import androidx.room.Insert
+import androidx.room.OnConflictStrategy
+import androidx.room.Query
+import androidx.room.Update
 import io.legato.kazusa.data.entities.ReadRecord
 import io.legato.kazusa.data.entities.ReadRecordShow
 
@@ -38,6 +43,7 @@ interface ReadRecordDao {
     @Query("select readTime from readRecord where deviceId = :androidId and bookName = :bookName")
     fun getReadTime(androidId: String, bookName: String): Long?
 
+
     @Insert(onConflict = OnConflictStrategy.REPLACE)
     fun insert(vararg readRecord: ReadRecord)
 

+ 13 - 2
app/src/main/java/io/legato/kazusa/ui/about/ReadRecordActivity.kt

@@ -18,6 +18,7 @@ import io.legato.kazusa.databinding.ItemReadRecordBinding
 import io.legato.kazusa.help.config.AppConfig
 import io.legato.kazusa.help.config.LocalConfig
 import io.legato.kazusa.lib.dialogs.alert
+import io.legato.kazusa.model.BookCover
 //import io.legado.app.lib.theme.primaryTextColor
 import io.legato.kazusa.ui.book.search.SearchActivity
 import io.legato.kazusa.utils.applyNavigationBarPadding
@@ -157,7 +158,7 @@ class ReadRecordActivity : BaseActivity<ActivityReadRecordBinding>() {
     inner class RecordAdapter(context: Context) :
         RecyclerAdapter<ReadRecordShow, ItemReadRecordBinding>(context) {
 
-        private val dateFormat = SimpleDateFormat("yyyy-MM-dd", Locale.getDefault())
+        private val dateFormat = SimpleDateFormat("yyyy年MM月dd日", Locale.getDefault())
 
         override fun getViewBinding(parent: ViewGroup): ItemReadRecordBinding {
             return ItemReadRecordBinding.inflate(inflater, parent, false)
@@ -175,7 +176,17 @@ class ReadRecordActivity : BaseActivity<ActivityReadRecordBinding>() {
                 if (item.lastRead > 0) {
                     tvLastReadTime.text = dateFormat.format(item.lastRead)
                 } else {
-                    tvLastReadTime.text = ""
+                    tvLastReadTime.text = "时间未知"
+                }
+
+                lifecycleScope.launch {
+                    val book = withContext(IO) {
+                        appDb.bookDao.findByName(item.bookName).firstOrNull()
+                    }
+                    if (book != null) {
+                        BookCover.load(root.context, book.getDisplayCover(), false, book.origin)
+                            .into(ivCover)
+                    }
                 }
             }
         }

+ 5 - 2
app/src/main/java/io/legato/kazusa/ui/book/cache/CacheActivity.kt

@@ -38,7 +38,6 @@ import io.legato.kazusa.ui.about.AppLogDialog
 import io.legato.kazusa.ui.file.HandleFileContract
 import io.legato.kazusa.utils.ACache
 import io.legato.kazusa.utils.FileDoc
-import io.legato.kazusa.utils.applyNavigationBarPadding
 import io.legato.kazusa.utils.applyOpenTint
 import io.legato.kazusa.utils.applyTint
 import io.legato.kazusa.utils.checkWrite
@@ -233,7 +232,6 @@ class CacheActivity : VMBaseActivity<ActivityCacheBookBinding, CacheViewModel>()
     private fun initRecyclerView() {
         binding.recyclerView.layoutManager = layoutManager
         binding.recyclerView.adapter = adapter
-        binding.recyclerView.applyNavigationBarPadding()
     }
 
     private fun initBookData() {
@@ -345,6 +343,11 @@ class CacheActivity : VMBaseActivity<ActivityCacheBookBinding, CacheViewModel>()
         }
     }
 
+    override fun deleteDownload(book: Book) {
+        viewModel.clearCacheForBook(book)
+        notifyItemChanged(book.bookUrl)
+    }
+
     /**
      * 配置自定义导出对话框
      *

+ 37 - 0
app/src/main/java/io/legato/kazusa/ui/book/cache/CacheAdapter.kt

@@ -1,6 +1,8 @@
 package io.legato.kazusa.ui.book.cache
 
 import android.content.Context
+import android.os.Handler
+import android.os.Looper
 import android.view.ViewGroup
 import android.widget.ProgressBar
 import android.widget.TextView
@@ -47,8 +49,10 @@ class CacheAdapter(context: Context, private val callBack: CallBack) :
             if (payloads.isEmpty()) {
                 tvName.text = item.name
                 tvAuthor.text = context.getString(R.string.author_show, item.getRealAuthor())
+
                 if (item.isLocal) {
                     tvDownload.setText(R.string.local_book)
+                    progressDownload.gone()
                 } else {
                     val cs = callBack.cacheChapters[item.bookUrl]
                     if (cs == null) {
@@ -67,8 +71,22 @@ class CacheAdapter(context: Context, private val callBack: CallBack) :
                     tvDownload.setText(R.string.local_book)
                 } else {
                     val cacheSize = callBack.cacheChapters[item.bookUrl]?.size ?: 0
+                    val cacheTask = CacheBook.cacheBookMap[item.bookUrl]
                     tvDownload.text =
                         context.getString(R.string.download_count, cacheSize, item.totalChapterNum)
+
+                    if (cacheTask != null && !cacheTask.isStop()) {
+                        val progress = if (item.totalChapterNum > 0) {
+                            (cacheSize * 100 / item.totalChapterNum)
+                        } else {
+                            0
+                        }
+                        tvMsg.gone()
+                        progressDownload.progress = progress
+                        progressDownload.visible()
+                    } else {
+                        progressDownload.gone()
+                    }
                 }
             }
             upDownloadIv(ivDownload, item)
@@ -94,6 +112,23 @@ class CacheAdapter(context: Context, private val callBack: CallBack) :
             tvExport.setOnClickListener {
                 callBack.export(holder.layoutPosition)
             }
+            ivDelete.setOnClickListener {
+                getItem(holder.layoutPosition)?.let { book ->
+                    CacheBook.cacheBookMap[book.bookUrl]?.let {
+                        if (!it.isStop()) {
+                            CacheBook.remove(context, book.bookUrl)
+                            Handler(Looper.getMainLooper()).postDelayed({
+                                callBack.deleteDownload(book)
+                            }, 500)
+                        } else {
+                            callBack.deleteDownload(book)
+                        }
+                    } ?: run {
+                        callBack.deleteDownload(book)
+                    }
+                }
+            }
+
         }
     }
 
@@ -138,5 +173,7 @@ class CacheAdapter(context: Context, private val callBack: CallBack) :
         fun export(position: Int)
         fun exportProgress(bookUrl: String): Int?
         fun exportMsg(bookUrl: String): String?
+        fun deleteDownload(book: Book)
     }
+
 }

+ 6 - 1
app/src/main/java/io/legato/kazusa/ui/book/cache/CacheViewModel.kt

@@ -10,7 +10,6 @@ import io.legato.kazusa.help.book.isLocal
 import io.legato.kazusa.help.coroutine.Coroutine
 import io.legato.kazusa.utils.sendValue
 import kotlinx.coroutines.ensureActive
-import kotlin.collections.set
 
 
 class CacheViewModel(application: Application) : BaseViewModel(application) {
@@ -43,4 +42,10 @@ class CacheViewModel(application: Application) : BaseViewModel(application) {
         }
     }
 
+    fun clearCacheForBook(book: Book) {
+        BookHelp.clearCache(book)
+        cacheChapters[book.bookUrl] = hashSetOf()
+        upAdapterLiveData.sendValue(book.bookUrl)
+    }
+
 }

+ 18 - 11
app/src/main/java/io/legato/kazusa/ui/book/group/GroupEditDialog.kt

@@ -64,26 +64,33 @@ class GroupEditDialog() : BaseBottomSheetDialogFragment(R.layout.dialog_book_gro
     }
 
     override fun onFragmentCreated(view: View, savedInstanceState: Bundle?) {
-        //binding.toolBar.setBackgroundColor(primaryColor)
         sortOptions = resources.getStringArray(R.array.book_sort).toList()
 
         @Suppress("DEPRECATION")
         bookGroup = arguments?.getParcelable("group")
-        bookGroup?.let {
-            binding.btnDelete.isEnabled = (it.groupId > 0 || it.groupId == Long.MIN_VALUE)
-            binding.tieGroupName.setText(it.groupName)
-            if (bookGroup?.cover != null)
-                binding.ivCover.load(it.cover)
-            binding.cbEnableRefresh.isChecked = it.enableRefresh
-            if (it.bookSort in sortOptions.indices) {
-                selectedSortIndex = it.bookSort
-                binding.chipSortMenu.text = sortOptions[selectedSortIndex]
+
+        bookGroup?.let { group ->
+            binding.btnDelete.isEnabled = (group.groupId > 0 || group.groupId == Long.MIN_VALUE)
+            binding.tieGroupName.setText(group.groupName)
+            if (group.cover != null) {
+                binding.ivCover.load(group.cover)
+            }
+            binding.cbEnableRefresh.isChecked = group.enableRefresh
+
+            selectedSortIndex = if (group.bookSort in sortOptions.indices) {
+                group.bookSort
+            } else {
+                0
             }
-        } ?: let {
+            binding.chipSortMenu.text = sortOptions[selectedSortIndex]
+        } ?: run {
             binding.btnDelete.gone()
             binding.ivCover.load()
+            selectedSortIndex = 0
+            binding.chipSortMenu.text = sortOptions[selectedSortIndex]
         }
 
+
         binding.run {
             chipSortMenu.setOnClickListener { chip ->
                 PopupMenu(requireContext(), chip).apply {

+ 2 - 18
app/src/main/java/io/legato/kazusa/ui/book/info/BookInfoActivity.kt

@@ -2,11 +2,8 @@ package io.legato.kazusa.ui.book.info
 
 import android.annotation.SuppressLint
 import android.content.Intent
-import android.graphics.Color
 import android.graphics.RenderEffect
 import android.graphics.Shader
-import android.graphics.drawable.BitmapDrawable
-import android.graphics.drawable.Drawable
 import android.net.Uri
 import android.os.Build
 import android.os.Bundle
@@ -18,7 +15,6 @@ import androidx.activity.result.contract.ActivityResultContracts
 import androidx.activity.viewModels
 import androidx.core.content.ContextCompat
 import androidx.lifecycle.lifecycleScope
-import androidx.palette.graphics.Palette
 import io.legato.kazusa.R
 import io.legato.kazusa.base.VMBaseActivity
 import io.legato.kazusa.constant.BookType
@@ -64,6 +60,7 @@ import io.legato.kazusa.utils.ConvertUtils
 import io.legato.kazusa.utils.FileDoc
 import io.legato.kazusa.utils.GSON
 import io.legato.kazusa.utils.StartActivityContract
+import io.legato.kazusa.utils.applyNavigationBarMargin
 import io.legato.kazusa.utils.dpToPx
 import io.legato.kazusa.utils.gone
 import io.legato.kazusa.utils.longToastOnUi
@@ -75,7 +72,6 @@ import io.legato.kazusa.utils.startActivity
 import io.legato.kazusa.utils.toastOnUi
 import io.legato.kazusa.utils.viewbindingdelegate.viewBinding
 import io.legato.kazusa.utils.visible
-import kotlinx.coroutines.Dispatchers
 import kotlinx.coroutines.Dispatchers.IO
 import kotlinx.coroutines.launch
 import kotlinx.coroutines.withContext
@@ -158,7 +154,7 @@ class BookInfoActivity :
         super.onCreate(savedInstanceState)
 
         setSupportActionBar(binding.topBar)
-
+        binding.llRead?.applyNavigationBarMargin()
 //        binding.refreshLayout?.setColorSchemeColors(accentColor)
 //        binding.llInfo.setBackgroundColor(backgroundColor)
 //        binding.flAction.setBackgroundColor(bottomBackground)
@@ -786,16 +782,4 @@ class BookInfoActivity :
         }
     }
 
-    // 扩展函数:从Drawable中提取主色调
-    suspend fun Drawable.extractDominantColor(): Int = withContext(Dispatchers.Default) {
-        // 将Drawable转换为Bitmap
-        val bitmap = (this@extractDominantColor as? BitmapDrawable)?.bitmap ?: return@withContext Color.TRANSPARENT
-
-        // 生成Palette
-        val palette = Palette.from(bitmap).generate()
-
-        // 返回主色调,若未找到则使用默认值
-        palette.getDominantColor(Color.WHITE)
-    }
-
 }

+ 6 - 5
app/src/main/java/io/legato/kazusa/ui/book/read/BaseReadBookActivity.kt

@@ -44,6 +44,7 @@ import io.legato.kazusa.utils.setLightStatusBar
 import io.legato.kazusa.utils.setNavigationBarColorAuto
 import io.legato.kazusa.utils.setOnApplyWindowInsetsListenerCompat
 import io.legato.kazusa.utils.showDialogFragment
+import io.legato.kazusa.utils.themeColor
 import io.legato.kazusa.utils.viewbindingdelegate.viewBinding
 import java.time.LocalDate
 import java.time.format.DateTimeFormatter
@@ -211,14 +212,14 @@ abstract class BaseReadBookActivity :
         window.decorView.systemUiVisibility = flag
     }
 
-    override fun upNavigationBarColor() {
+    fun upNavigationBarColor() {
         upNavigationBar()
         when {
-            binding.readMenu.isVisible -> super.upNavigationBarColor()
-            binding.searchMenu.bottomMenuVisible -> super.upNavigationBarColor()
-            bottomDialog > 0 -> super.upNavigationBarColor()
+            binding.readMenu.isVisible -> window.setNavigationBarColorAuto(themeColor(com.google.android.material.R.attr.colorSurfaceContainer))
+            binding.searchMenu.bottomMenuVisible -> window.setNavigationBarColorAuto(themeColor(com.google.android.material.R.attr.colorSurface))
+            bottomDialog > 0 -> window.setNavigationBarColorAuto(themeColor(com.google.android.material.R.attr.colorSurface))
             //!AppConfig.immNavigationBar -> super.upNavigationBarColor()
-            else -> setNavigationBarColorAuto(ReadBookConfig.bgMeanColor)
+            else -> window.setNavigationBarColorAuto(ReadBookConfig.bgMeanColor)
         }
     }
 

+ 12 - 29
app/src/main/java/io/legato/kazusa/ui/book/read/config/MoreConfigDialog.kt

@@ -1,25 +1,21 @@
 package io.legato.kazusa.ui.book.read.config
 
+//import io.legado.app.lib.theme.bottomBackground
+//import io.legado.app.lib.theme.primaryColor
 import android.annotation.SuppressLint
 import android.content.DialogInterface
 import android.content.SharedPreferences
 import android.os.Bundle
-import android.view.LayoutInflater
 import android.view.View
 import android.view.ViewConfiguration
-import android.view.ViewGroup
-import android.widget.LinearLayout
 import androidx.preference.Preference
 import androidx.preference.PreferenceFragmentCompat
 import io.legato.kazusa.R
-import io.legato.kazusa.base.BasePrefDialogFragment
+import io.legato.kazusa.base.BaseBottomSheetDialogFragment
 import io.legato.kazusa.constant.EventBus
 import io.legato.kazusa.constant.PreferKey
 import io.legato.kazusa.help.config.AppConfig
 import io.legato.kazusa.help.config.ReadBookConfig
-import io.legato.kazusa.lib.prefs.fragment.PreferenceFragment
-//import io.legado.app.lib.theme.bottomBackground
-//import io.legado.app.lib.theme.primaryColor
 import io.legato.kazusa.model.ReadBook
 import io.legato.kazusa.ui.book.read.ReadBookActivity
 import io.legato.kazusa.ui.book.read.page.provider.ChapterProvider
@@ -29,31 +25,23 @@ import io.legato.kazusa.utils.getPrefBoolean
 import io.legato.kazusa.utils.postEvent
 import io.legato.kazusa.utils.removePref
 
-class MoreConfigDialog : BasePrefDialogFragment() {
+class MoreConfigDialog : BaseBottomSheetDialogFragment(R.layout.dialog_more_config) {
     private val readPreferTag = "readPreferenceFragment"
 
-    override fun onCreateView(
-        inflater: LayoutInflater,
-        container: ViewGroup?,
-        savedInstanceState: Bundle?
-    ): View {
-        (activity as ReadBookActivity).bottomDialog++
-        val view = LinearLayout(context)
-        //view.setBackgroundColor(requireContext().bottomBackground)
-        view.id = R.id.tag1
-        container?.addView(view)
-        return view
-    }
-
-    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
-        super.onViewCreated(view, savedInstanceState)
+    override fun onFragmentCreated(view: View, savedInstanceState: Bundle?) {
+        (activity as? ReadBookActivity)?.bottomDialog++
         var preferenceFragment = childFragmentManager.findFragmentByTag(readPreferTag)
         if (preferenceFragment == null) preferenceFragment = ReadPreferenceFragment()
         childFragmentManager.beginTransaction()
-            .replace(view.id, preferenceFragment, readPreferTag)
+            .replace(R.id.containerPreferences, preferenceFragment, readPreferTag)
             .commit()
     }
 
+    override fun onDismiss(dialog: DialogInterface) {
+        super.onDismiss(dialog)
+        (activity as ReadBookActivity).bottomDialog--
+    }
+
     class ReadPreferenceFragment : PreferenceFragmentCompat(),
         SharedPreferences.OnSharedPreferenceChangeListener {
 
@@ -69,11 +57,6 @@ class MoreConfigDialog : BasePrefDialogFragment() {
             }
         }
 
-        override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
-            super.onViewCreated(view, savedInstanceState)
-            //listView.setEdgeEffectColor(primaryColor)
-        }
-
         override fun onResume() {
             super.onResume()
             preferenceManager

+ 0 - 11
app/src/main/java/io/legato/kazusa/ui/book/read/config/PaddingConfigDialog.kt

@@ -15,17 +15,6 @@ class PaddingConfigDialog : BaseBottomSheetDialogFragment(R.layout.dialog_read_p
 
     private val binding by viewBinding(DialogReadPaddingBinding::bind)
 
-    override fun onStart() {
-        super.onStart()
-//        dialog?.window?.let {
-//            it.clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND)
-//            val attr = it.attributes
-//            attr.dimAmount = 0.0f
-//            it.attributes = attr
-//        }
-//        setLayout(0.9f, ViewGroup.LayoutParams.WRAP_CONTENT)
-    }
-
     override fun onFragmentCreated(view: View, savedInstanceState: Bundle?) {
         initData()
         initView()

+ 8 - 15
app/src/main/java/io/legato/kazusa/ui/book/read/config/ReadStyleDialog.kt

@@ -22,9 +22,9 @@ import io.legato.kazusa.model.ReadBook
 import io.legato.kazusa.ui.book.read.ReadBookActivity
 import io.legato.kazusa.ui.font.FontSelectDialog
 import io.legato.kazusa.utils.ChineseUtils
+import io.legato.kazusa.utils.dpToPx
 import io.legato.kazusa.utils.postEvent
 import io.legato.kazusa.utils.showDialogFragment
-import io.legato.kazusa.utils.themeColor
 import io.legato.kazusa.utils.viewbindingdelegate.viewBinding
 
 class ReadStyleDialog : BaseBottomSheetDialogFragment(R.layout.dialog_read_book_style),
@@ -48,13 +48,6 @@ class ReadStyleDialog : BaseBottomSheetDialogFragment(R.layout.dialog_read_book_
     }
 
     private fun initView() = binding.run {
-        //val bg = requireContext().bottomBackground
-        //val isLight = ColorUtils.isColorLight(bg)
-        //val textColor = requireContext().getPrimaryTextColor(isLight)
-//        rootView.setBackgroundColor(bg)
-//        tvPageAnim.setTextColor(textColor)
-//        tvBgTs.setTextColor(textColor)
-//        tvShareLayout.setTextColor(textColor)
         if (AppConfig.isNightTheme) {
             tvDayNight.setIconResource(R.drawable.ic_daytime)
         } else {
@@ -72,10 +65,6 @@ class ReadStyleDialog : BaseBottomSheetDialogFragment(R.layout.dialog_read_book_
         rvStyle.adapter = styleAdapter
         styleAdapter.addFooterView {
             ItemReadStyleBinding.inflate(layoutInflater, it, false).apply {
-//                ivStyle.setPadding(6.dpToPx(), 6.dpToPx(), 6.dpToPx(), 6.dpToPx())
-//                ivStyle.setText(null)
-//                ivStyle.setColorFilter(textColor)
-//                ivStyle.borderColor = textColor
                 ivStyle.setImageResource(R.drawable.ic_add)
                 root.setOnClickListener {
                     ReadBookConfig.configList.add(ReadBookConfig.Config())
@@ -235,11 +224,15 @@ class ReadStyleDialog : BaseBottomSheetDialogFragment(R.layout.dialog_read_book_
                 ivStyle.setImageDrawable(item.curBgDrawable(100, 150))
                 if (ReadBookConfig.styleSelect == holder.layoutPosition) {
                     llStyle.gravity = Gravity.TOP
-                    cdStyle.strokeColor =
-                        context.themeColor(com.google.android.material.R.attr.colorTertiary)
-                    rvStyle.setCardBackgroundColor(context.themeColor(com.google.android.material.R.attr.colorTertiary))
+                    cdStyle.cardElevation = 1f.dpToPx()
+                    cdStyle.radius = 16f.dpToPx()
+                    cdStyle.strokeWidth = 2
+                    cdStyle.strokeColor = item.curTextColor()
                     //tvStyle.setTextBold(true)
                 } else {
+                    cdStyle.cardElevation = 2f.dpToPx()
+                    cdStyle.radius = 32f.dpToPx()
+                    cdStyle.strokeWidth = 0
                     cdStyle.strokeColor = item.curTextColor()
                     //tvStyle.setTextBold(false)
                 }

+ 7 - 1
app/src/main/java/io/legato/kazusa/ui/book/search/HistoryKeyAdapter.kt

@@ -13,8 +13,13 @@ class HistoryKeyAdapter(activity: SearchActivity, val callBack: CallBack) :
 
     private val explosionField = ExplosionField.attach2Window(activity)
 
+    init {
+        setHasStableIds(true)
+    }
+
+
     override fun getItemId(position: Int): Long {
-        return position.toLong()
+        return getItem(position)!!.lastUseTime
     }
 
     override fun getViewBinding(parent: ViewGroup): ItemSearchHistoryBinding {
@@ -33,6 +38,7 @@ class HistoryKeyAdapter(activity: SearchActivity, val callBack: CallBack) :
     }
 
     override fun registerListener(holder: ItemViewHolder, binding: ItemSearchHistoryBinding) {
+
         holder.itemView.apply {
             setOnClickListener {
                 getItemByLayoutPosition(holder.layoutPosition)?.let {

+ 31 - 6
app/src/main/java/io/legato/kazusa/ui/book/search/SearchActivity.kt

@@ -12,9 +12,11 @@ import androidx.core.os.bundleOf
 import androidx.core.view.isVisible
 import androidx.core.widget.doAfterTextChanged
 import androidx.lifecycle.lifecycleScope
+import androidx.recyclerview.widget.DefaultItemAnimator
 import androidx.recyclerview.widget.LinearLayoutManager
 import androidx.recyclerview.widget.RecyclerView
 import com.google.android.flexbox.FlexboxLayoutManager
+import com.google.android.material.appbar.AppBarLayout
 import com.google.android.material.search.SearchBar
 import com.google.android.material.search.SearchView
 import io.legato.kazusa.R
@@ -30,7 +32,6 @@ import io.legato.kazusa.ui.about.AppLogDialog
 import io.legato.kazusa.ui.book.info.BookInfoActivity
 import io.legato.kazusa.ui.book.source.manage.BookSourceActivity
 import io.legato.kazusa.utils.applyNavigationBarMargin
-import io.legato.kazusa.utils.applyNavigationBarPadding
 import io.legato.kazusa.utils.applyStatusBarPadding
 import io.legato.kazusa.utils.getPrefBoolean
 import io.legato.kazusa.utils.gone
@@ -84,6 +85,8 @@ class SearchActivity : VMBaseActivity<ActivityBookSearchBinding, SearchViewModel
 
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
+
+
         setSupportActionBar(binding.searchBar)
         initRecyclerView()
         initMaterialSearch()
@@ -177,6 +180,26 @@ class SearchActivity : VMBaseActivity<ActivityBookSearchBinding, SearchViewModel
 
         binding.appBar.applyStatusBarPadding()
 
+        binding.appBar.post {
+            val maxPaddingTop = binding.appBar.paddingTop
+            binding.appBar.addOnOffsetChangedListener(
+                AppBarLayout.OnOffsetChangedListener { appBarLayout, verticalOffset ->
+                    val totalScrollRange = appBarLayout.totalScrollRange
+                    val scrollRatio =
+                        (1f - (abs(verticalOffset).toFloat() / totalScrollRange)).coerceIn(0f, 1f)
+
+                    appBarLayout.alpha = scrollRatio
+                    appBarLayout.setPadding(
+                        appBarLayout.paddingLeft,
+                        (maxPaddingTop * scrollRatio).toInt(),
+                        appBarLayout.paddingRight,
+                        appBarLayout.paddingBottom
+                    )
+                }
+            )
+        }
+
+
         searchBar.setOnMenuItemClickListener { item ->
             onCompatOptionsItemSelected(item)
         }
@@ -215,7 +238,6 @@ class SearchActivity : VMBaseActivity<ActivityBookSearchBinding, SearchViewModel
 
         searchView.addTransitionListener { _, _, newState ->
             if (newState == SearchView.TransitionState.HIDDEN) {
-                // 当 SearchView 关闭时,将搜索文本设置回 SearchBar
                 searchBar.setText(searchView.text)
             }
         }
@@ -232,14 +254,16 @@ class SearchActivity : VMBaseActivity<ActivityBookSearchBinding, SearchViewModel
     private fun initRecyclerView() {
         binding.rvBookshelfSearch.layoutManager = FlexboxLayoutManager(this)
         binding.rvBookshelfSearch.adapter = bookAdapter
-        binding.rvBookshelfSearch.applyNavigationBarMargin()
+        binding.rvBookshelfSearch.itemAnimator = DefaultItemAnimator()
+
         binding.rvHistoryKey.layoutManager = FlexboxLayoutManager(this)
         binding.rvHistoryKey.adapter = historyKeyAdapter
-        binding.rvHistoryKey.applyNavigationBarMargin()
+        binding.rvHistoryKey.itemAnimator = DefaultItemAnimator()
+
         binding.recyclerView.layoutManager = LinearLayoutManager(this)
         binding.recyclerView.adapter = adapter
-        binding.recyclerView.itemAnimator = null
-        binding.recyclerView.applyNavigationBarPadding()
+        binding.recyclerView.itemAnimator = DefaultItemAnimator()
+
         adapter.registerAdapterDataObserver(object : RecyclerView.AdapterDataObserver() {
             override fun onItemRangeInserted(positionStart: Int, itemCount: Int) {
                 super.onItemRangeInserted(positionStart, itemCount)
@@ -279,6 +303,7 @@ class SearchActivity : VMBaseActivity<ActivityBookSearchBinding, SearchViewModel
     }
 
     private fun initOtherView() {
+        binding.llStop.applyNavigationBarMargin()
         binding.fbStartStop.setOnClickListener {
             if (viewModel.isSearchLiveData.value == true) {
                 isManualStopSearch = true

+ 14 - 15
app/src/main/java/io/legato/kazusa/ui/book/search/SearchScopeDialog.kt

@@ -1,5 +1,6 @@
 package io.legato.kazusa.ui.book.search
 
+//import io.legado.app.lib.theme.primaryColor
 import android.annotation.SuppressLint
 import android.os.Bundle
 import android.view.View
@@ -8,7 +9,7 @@ import androidx.appcompat.widget.SearchView
 import androidx.lifecycle.lifecycleScope
 import androidx.recyclerview.widget.RecyclerView
 import io.legato.kazusa.R
-import io.legato.kazusa.base.BaseDialogFragment
+import io.legato.kazusa.base.BaseBottomSheetDialogFragment
 import io.legato.kazusa.base.adapter.ItemViewHolder
 import io.legato.kazusa.constant.AppLog
 import io.legato.kazusa.data.AppDatabase
@@ -17,10 +18,7 @@ import io.legato.kazusa.data.entities.BookSourcePart
 import io.legato.kazusa.databinding.DialogSearchScopeBinding
 import io.legato.kazusa.databinding.ItemCheckBoxBinding
 import io.legato.kazusa.databinding.ItemRadioButtonBinding
-//import io.legado.app.lib.theme.primaryColor
-import io.legato.kazusa.utils.applyTint
 import io.legato.kazusa.utils.flowWithLifecycleAndDatabaseChange
-import io.legato.kazusa.utils.setLayout
 import io.legato.kazusa.utils.viewbindingdelegate.viewBinding
 import kotlinx.coroutines.Dispatchers.IO
 import kotlinx.coroutines.Job
@@ -31,7 +29,7 @@ import kotlinx.coroutines.flow.flowOn
 import kotlinx.coroutines.launch
 import kotlinx.coroutines.withContext
 
-class SearchScopeDialog : BaseDialogFragment(R.layout.dialog_search_scope) {
+class SearchScopeDialog : BaseBottomSheetDialogFragment(R.layout.dialog_search_scope) {
 
     private val binding by viewBinding(DialogSearchScopeBinding::bind)
     private var sourceFlowJob: Job? = null
@@ -44,13 +42,7 @@ class SearchScopeDialog : BaseDialogFragment(R.layout.dialog_search_scope) {
         RecyclerAdapter()
     }
 
-    override fun onStart() {
-        super.onStart()
-        setLayout(0.9f, 0.8f)
-    }
-
     override fun onFragmentCreated(view: View, savedInstanceState: Bundle?) {
-        //binding.toolBar.setBackgroundColor(primaryColor)
         binding.recyclerView.adapter = adapter
         initMenu()
         initSearchView()
@@ -60,7 +52,6 @@ class SearchScopeDialog : BaseDialogFragment(R.layout.dialog_search_scope) {
 
     private fun initMenu() {
         binding.toolBar.inflateMenu(R.menu.book_search_scope)
-        //binding.toolBar.menu.applyTint(requireContext())
     }
 
     private fun initSearchView() {
@@ -80,17 +71,24 @@ class SearchScopeDialog : BaseDialogFragment(R.layout.dialog_search_scope) {
     }
 
     private fun initOtherView() {
-        binding.rgScope.setOnCheckedChangeListener { _, checkedId ->
-            binding.toolBar.menu.findItem(R.id.menu_screen)?.isVisible = checkedId == R.id.rb_source
-            upData()
+
+        binding.rgScope.addOnButtonCheckedListener { group, checkedId, isChecked ->
+            if (isChecked) {
+                binding.toolBar.menu.findItem(R.id.menu_screen)?.isVisible =
+                    checkedId == R.id.rb_source
+                upData()
+            }
         }
+
         binding.tvCancel.setOnClickListener {
             dismiss()
         }
+
         binding.tvAllSource.setOnClickListener {
             callback.onSearchScopeOk(SearchScope(""))
             dismiss()
         }
+
         binding.tvOk.setOnClickListener {
             if (binding.rbGroup.isChecked) {
                 callback.onSearchScopeOk(SearchScope(adapter.selectGroups))
@@ -104,6 +102,7 @@ class SearchScopeDialog : BaseDialogFragment(R.layout.dialog_search_scope) {
             }
             dismiss()
         }
+
     }
 
     private fun initData() {

+ 4 - 13
app/src/main/java/io/legato/kazusa/ui/login/SourceLoginDialog.kt

@@ -1,16 +1,15 @@
 package io.legato.kazusa.ui.login
 
+//import io.legado.app.lib.theme.primaryColor
 import android.content.DialogInterface
 import android.os.Bundle
 import android.text.InputType
 import android.view.View
-import android.view.ViewGroup
-import androidx.core.view.setPadding
 import androidx.fragment.app.activityViewModels
 import androidx.lifecycle.lifecycleScope
 import com.script.rhino.runScriptWithContext
 import io.legato.kazusa.R
-import io.legato.kazusa.base.BaseDialogFragment
+import io.legato.kazusa.base.BaseBottomSheetDialogFragment
 import io.legato.kazusa.constant.AppLog
 import io.legato.kazusa.data.entities.BaseSource
 import io.legato.kazusa.data.entities.rule.RowUi
@@ -18,16 +17,13 @@ import io.legato.kazusa.databinding.DialogLoginBinding
 import io.legato.kazusa.databinding.ItemFilletTextBinding
 import io.legato.kazusa.databinding.ItemSourceEditBinding
 import io.legato.kazusa.lib.dialogs.alert
-//import io.legado.app.lib.theme.primaryColor
 import io.legato.kazusa.ui.about.AppLogDialog
 import io.legato.kazusa.utils.GSON
 import io.legato.kazusa.utils.applyTint
-import io.legato.kazusa.utils.dpToPx
 import io.legato.kazusa.utils.isAbsUrl
 import io.legato.kazusa.utils.openUrl
 import io.legato.kazusa.utils.printOnDebug
 import io.legato.kazusa.utils.sendToClip
-import io.legato.kazusa.utils.setLayout
 import io.legato.kazusa.utils.showDialogFragment
 import io.legato.kazusa.utils.toastOnUi
 import io.legato.kazusa.utils.viewbindingdelegate.viewBinding
@@ -40,16 +36,11 @@ import splitties.init.appCtx
 import splitties.views.onClick
 
 
-class SourceLoginDialog : BaseDialogFragment(R.layout.dialog_login, true) {
+class SourceLoginDialog : BaseBottomSheetDialogFragment(R.layout.dialog_login) {
 
     private val binding by viewBinding(DialogLoginBinding::bind)
     private val viewModel by activityViewModels<SourceLoginViewModel>()
 
-    override fun onStart() {
-        super.onStart()
-        setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)
-    }
-
     override fun onFragmentCreated(view: View, savedInstanceState: Bundle?) {
         val source = viewModel.source ?: return
         //binding.toolBar.setBackgroundColor(primaryColor)
@@ -91,7 +82,7 @@ class SourceLoginDialog : BaseDialogFragment(R.layout.dialog_login, true) {
                     rowUi.style().apply(it.root)
                     it.root.id = index + 1000
                     it.textView.text = rowUi.name
-                    it.textView.setPadding(16.dpToPx())
+
                     it.root.onClick {
                         handleButtonClick(source, rowUi, loginUi)
                     }

+ 3 - 8
app/src/main/java/io/legato/kazusa/ui/main/MainActivity.kt

@@ -48,8 +48,10 @@ import io.legato.kazusa.utils.gone
 import io.legato.kazusa.utils.hideSoftInput
 import io.legato.kazusa.utils.isCreated
 import io.legato.kazusa.utils.observeEvent
+import io.legato.kazusa.utils.setNavigationBarColorAuto
 import io.legato.kazusa.utils.shouldHideSoftInput
 import io.legato.kazusa.utils.showDialogFragment
+import io.legato.kazusa.utils.themeColor
 import io.legato.kazusa.utils.toastOnUi
 import io.legato.kazusa.utils.viewbindingdelegate.viewBinding
 import io.legato.kazusa.utils.visible
@@ -203,23 +205,16 @@ class MainActivity : VMBaseActivity<ActivityMainBinding, MainViewModel>(),
     }
 
     private fun initView() = binding.run {
-        //viewPagerMain.setEdgeEffectColor(primaryColor)
         viewPagerMain.offscreenPageLimit = 3
         viewPagerMain.adapter = adapter
         viewPagerMain.addOnPageChangeListener(PageChangeCallback())
-        //bottomNavigationView.elevation = elevation
         getNavigationBarView().apply {
             setOnItemSelectedListener { onNavigationItemSelected(it) }
             setOnItemReselectedListener { onNavigationItemReselected(it) }
         }
 
-        //getNavigationBarView().applyNavigationBarPadding()
 
-//        bottomNavigationView.setOnApplyWindowInsetsListenerCompat { view, windowInsets ->
-//            val height = windowInsets.navigationBarHeight
-//            view.bottomPadding = height
-//            windowInsets.inset(0, 0, 0, height)
-//        }
+        window.setNavigationBarColorAuto(themeColor(com.google.android.material.R.attr.colorSurfaceContainer))
     }
 
     /**

+ 3 - 3
app/src/main/java/io/legato/kazusa/ui/widget/text/AutoCompleteTextView.kt

@@ -1,5 +1,6 @@
 package io.legato.kazusa.ui.widget.text
 
+//import io.legado.app.lib.theme.accentColor
 import android.annotation.SuppressLint
 import android.content.Context
 import android.os.Build
@@ -9,11 +10,10 @@ import android.view.MotionEvent
 import android.view.View
 import android.view.ViewGroup
 import android.widget.ArrayAdapter
-import android.widget.ImageView
 import android.widget.TextView
+import com.google.android.material.button.MaterialButton
 import com.google.android.material.textfield.MaterialAutoCompleteTextView
 import io.legato.kazusa.R
-//import io.legado.app.lib.theme.accentColor
 import io.legato.kazusa.utils.gone
 import io.legato.kazusa.utils.visible
 
@@ -63,7 +63,7 @@ class AutoCompleteTextView @JvmOverloads constructor(
                 .inflate(R.layout.item_1line_text_and_del, parent, false)
             val textView = view.findViewById<TextView>(R.id.text_view)
             textView.text = getItem(position)
-            val ivDelete = view.findViewById<ImageView>(R.id.iv_delete)
+            val ivDelete = view.findViewById<MaterialButton>(R.id.iv_delete)
             if (delCallBack != null) ivDelete.visible() else ivDelete.gone()
             ivDelete.setOnClickListener {
                 getItem(position)?.let {

+ 8 - 5
app/src/main/java/io/legato/kazusa/utils/ActivityExtensions.kt

@@ -9,6 +9,7 @@ import android.util.DisplayMetrics
 import android.view.Gravity
 import android.view.View
 import android.view.ViewGroup
+import android.view.Window
 import android.view.WindowInsets
 import android.view.WindowInsetsController
 import android.view.WindowManager
@@ -144,11 +145,12 @@ fun Activity.setLightStatusBar(isLightBar: Boolean) {
  * 设置导航栏颜色
  */
 @Suppress("DEPRECATION")
-fun Activity.setNavigationBarColorAuto(@ColorInt color: Int) {
+fun Window.setNavigationBarColorAuto(@ColorInt color: Int) {
     val isLightBor = ColorUtils.isColorLight(color)
-    window.navigationBarColor = color
+    navigationBarColor = color
+
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
-        window.insetsController?.let {
+        insetsController?.let {
             if (isLightBor) {
                 it.setSystemBarsAppearance(
                     WindowInsetsController.APPEARANCE_LIGHT_NAVIGATION_BARS,
@@ -162,9 +164,9 @@ fun Activity.setNavigationBarColorAuto(@ColorInt color: Int) {
             }
         }
     }
+
     @Suppress("DEPRECATION")
-    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
-        val decorView = window.decorView
+    if (Build.VERSION.SDK_INT in Build.VERSION_CODES.O..Build.VERSION_CODES.Q) {
         var systemUiVisibility = decorView.systemUiVisibility
         systemUiVisibility = if (isLightBor) {
             systemUiVisibility or View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR
@@ -175,6 +177,7 @@ fun Activity.setNavigationBarColorAuto(@ColorInt color: Int) {
     }
 }
 
+
 fun Activity.keepScreenOn(on: Boolean) {
     val isScreenOn =
         (window.attributes.flags and WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) != 0

+ 1 - 1
app/src/main/java/io/legato/kazusa/utils/ViewExtensions.kt

@@ -302,7 +302,7 @@ fun View.canScroll(direction: Int): Boolean {
     return canScrollVertically(direction) || canScrollHorizontally(direction)
 }
 
-private val requestLayoutBroken = Build.VERSION.SDK_INT <= Build.VERSION_CODES.M
+private val requestLayoutBroken = false
         || Build.VERSION.SDK_INT in Build.VERSION_CODES.O..Build.VERSION_CODES.Q
 
 fun View.setOnApplyWindowInsetsListenerCompat(listener: (View, WindowInsetsCompat) -> WindowInsetsCompat) {

+ 2 - 1
app/src/main/res/layout-land/activity_book_info.xml

@@ -363,7 +363,8 @@
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:layout_gravity="bottom|end"
-        android:layout_marginEnd="16dp"
+        android:layout_marginEnd="40dp"
+        android:minWidth="0dp"
         android:layout_marginBottom="24dp"
         android:text="@string/reading"
         android:textColor="?attr/colorOnPrimary"

+ 7 - 7
app/src/main/res/layout-land/view_read_menu.xml

@@ -150,7 +150,7 @@
 
                     <com.google.android.material.button.MaterialButton
                         android:id="@+id/tv_pre"
-                        style="@style/Widget.Material3.Button.IconButton.Filled.Tonal"
+                        style="@style/Widget.Material3Expressive.Button.IconButton.Tonal"
                         android:layout_width="wrap_content"
                         android:layout_height="wrap_content"
                         android:clickable="true"
@@ -178,7 +178,7 @@
 
                     <com.google.android.material.button.MaterialButton
                         android:id="@+id/tv_next"
-                        style="@style/Widget.Material3.Button.IconButton.Filled.Tonal"
+                        style="@style/Widget.Material3Expressive.Button.IconButton.Tonal"
                         android:layout_width="wrap_content"
                         android:layout_height="wrap_content"
                         android:clickable="true"
@@ -204,7 +204,7 @@
                         android:id="@+id/fabSearch"
                         android:layout_width="wrap_content"
                         android:layout_height="wrap_content"
-                        style="@style/Widget.Material3.Button.IconButton.Filled.Tonal"
+                        style="@style/Widget.Material3Expressive.Button.IconButton.Tonal"
                         android:contentDescription="@string/search_content"
                         android:tooltipText="@string/search_content"
                         app:icon="@drawable/ic_search"
@@ -214,7 +214,7 @@
                         android:id="@+id/iv_read_aloud"
                         android:layout_width="wrap_content"
                         android:layout_height="wrap_content"
-                        style="@style/Widget.Material3.Button.IconButton.Filled.Tonal"
+                        style="@style/Widget.Material3Expressive.Button.IconButton.Tonal"
                         android:contentDescription="@string/read_aloud"
                         android:maxHeight="24dp"
                         app:icon="@drawable/ic_read_aloud"
@@ -225,7 +225,7 @@
                         android:id="@+id/iv_catalog"
                         android:layout_width="wrap_content"
                         android:layout_height="wrap_content"
-                        style="@style/Widget.Material3.Button.IconButton.Filled.Tonal"
+                        style="@style/Widget.Material3Expressive.Button.IconButton.Tonal"
                         android:contentDescription="@string/chapter_list"
                         android:tooltipText="@string/chapter_list"
                         android:maxHeight="24dp"
@@ -237,7 +237,7 @@
                         android:id="@+id/fabAutoPage"
                         android:layout_width="wrap_content"
                         android:layout_height="wrap_content"
-                        style="@style/Widget.Material3.Button.IconButton.Filled.Tonal"
+                        style="@style/Widget.Material3Expressive.Button.IconButton.Tonal"
                         android:contentDescription="@string/auto_next_page"
                         android:tooltipText="@string/auto_next_page"
                         app:icon="@drawable/ic_auto_page"
@@ -248,7 +248,7 @@
                         android:id="@+id/iv_setting"
                         android:layout_width="wrap_content"
                         android:layout_height="wrap_content"
-                        style="@style/Widget.Material3.Button.IconButton.Filled.Tonal"
+                        style="@style/Widget.Material3Expressive.Button.IconButton.Tonal"
                         android:contentDescription="@string/setting"
                         android:tooltipText="@string/setting"
                         android:maxHeight="24dp"

+ 21 - 13
app/src/main/res/layout/activity_book_info.xml

@@ -338,19 +338,27 @@
         </androidx.core.widget.NestedScrollView>
     </androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
 
-    <com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton
-        android:id="@+id/btn_read"
-        android:layout_width="wrap_content"
+    <LinearLayout
+        android:id="@+id/ll_read"
+        android:layout_width="match_parent"
         android:layout_height="wrap_content"
-        android:minWidth="56dp"
-        android:layout_gravity="bottom|end"
-        android:layout_marginEnd="16dp"
-        android:layout_marginBottom="24dp"
-        android:text="@string/reading"
-        android:textColor="?attr/colorOnPrimary"
-        android:contentDescription="@string/reading"
-        app:icon="@drawable/ic_bottom_books"
-        app:backgroundTint="?attr/colorTertiary"
-        app:iconTint="?attr/colorOnPrimary" />
+        android:layout_gravity="bottom"
+        android:gravity="end"
+        android:orientation="horizontal">
+
+        <com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton
+            android:id="@+id/btn_read"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_margin="16dp"
+            android:contentDescription="@string/reading"
+            android:minWidth="56dp"
+            android:text="@string/reading"
+            android:textColor="?attr/colorOnPrimary"
+            app:backgroundTint="?attr/colorTertiary"
+            app:icon="@drawable/ic_bottom_books"
+            app:iconTint="?attr/colorOnPrimary" />
+    </LinearLayout>
+
 
 </androidx.coordinatorlayout.widget.CoordinatorLayout>

+ 87 - 63
app/src/main/res/layout/activity_book_search.xml

@@ -1,80 +1,110 @@
 <?xml version="1.0" encoding="utf-8"?>
-<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto"
     xmlns:tools="http://schemas.android.com/tools"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     tools:context=".ui.book.search.SearchActivity">
 
-    <com.google.android.material.appbar.AppBarLayout
-        android:id="@+id/app_bar"
+    <androidx.coordinatorlayout.widget.CoordinatorLayout
         android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:backgroundTint="?attr/colorSurface"
-        app:layout_constraintTop_toTopOf="parent">
-
-        <com.google.android.material.search.SearchBar
-            android:id="@+id/search_bar"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:hint="@string/search_book_key"
-            app:menu="@menu/book_search"
-            app:navigationIconTint="?attr/colorOnSurface" />
+        android:layout_height="match_parent">
 
-        <com.google.android.material.progressindicator.LinearProgressIndicator
-            android:id="@+id/refresh_progress_bar"
+        <com.google.android.material.appbar.AppBarLayout
+            android:id="@+id/app_bar"
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
-            android:indeterminate="true"
-            android:visibility="gone"
-            app:layout_constraintTop_toBottomOf="@id/app_bar">
+            android:backgroundTint="?attr/colorSurface"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toTopOf="parent">
 
-        </com.google.android.material.progressindicator.LinearProgressIndicator>
+            <com.google.android.material.search.SearchBar
+                android:id="@+id/search_bar"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:hint="@string/search_book_key"
+                app:layout_scrollFlags="scroll|enterAlways"
+                app:menu="@menu/book_search"
+                app:navigationIcon="@drawable/ic_arrow_back"
+                app:navigationIconTint="?attr/colorOnSurface" />
+
+            <com.google.android.material.progressindicator.LinearProgressIndicator
+                android:id="@+id/refresh_progress_bar"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:indeterminate="true"
+                android:visibility="gone">
 
-    </com.google.android.material.appbar.AppBarLayout>
+            </com.google.android.material.progressindicator.LinearProgressIndicator>
 
-    <LinearLayout
-        android:id="@+id/tv_empty_msg"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_gravity="center"
-        android:layout_margin="16dp"
-        android:gravity="center"
-        android:orientation="vertical"
-        android:visibility="visible">
+        </com.google.android.material.appbar.AppBarLayout>
 
-        <TextView
+        <LinearLayout
+            android:id="@+id/tv_empty_msg"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
-            android:text="(๑`^´๑)"
-            android:textSize="30sp" />
+            android:layout_gravity="center"
+            android:gravity="center"
+            android:orientation="vertical"
+            android:visibility="visible">
 
-        <TextView
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_margin="8dp"
-            android:text="@string/search_empty" />
-    </LinearLayout>
+            <TextView
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:text="(๑`^´๑)"
+                android:textSize="32sp" />
 
-    <io.legato.kazusa.ui.widget.dynamiclayout.DynamicFrameLayout
-        android:id="@+id/content_view"
-        android:layout_width="match_parent"
-        android:layout_height="match_parent"
-        app:layout_behavior="@string/appbar_scrolling_view_behavior">
+            <TextView
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_margin="8dp"
+                android:text="@string/search_empty" />
+        </LinearLayout>
 
-        <androidx.recyclerview.widget.RecyclerView
-            android:id="@+id/recycler_view"
+        <io.legato.kazusa.ui.widget.dynamiclayout.DynamicFrameLayout
+            android:id="@+id/content_view"
             android:layout_width="match_parent"
             android:layout_height="match_parent"
-            android:clipToPadding="false"
-            tools:listitem="@layout/item_search" />
+            app:layout_behavior="com.google.android.material.appbar.AppBarLayout$ScrollingViewBehavior">
 
-    </io.legato.kazusa.ui.widget.dynamiclayout.DynamicFrameLayout>
+            <androidx.recyclerview.widget.RecyclerView
+                android:id="@+id/recycler_view"
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                android:clipToPadding="false"
+                tools:listitem="@layout/item_search" />
+
+        </io.legato.kazusa.ui.widget.dynamiclayout.DynamicFrameLayout>
+
+        <LinearLayout
+            android:id="@+id/ll_stop"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_gravity="bottom"
+            android:gravity="end"
+            android:orientation="horizontal">
+
+            <com.google.android.material.floatingactionbutton.FloatingActionButton
+                android:id="@+id/fb_start_stop"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_margin="16dp"
+                android:contentDescription="@string/stop"
+                android:src="@drawable/ic_stop_black_24dp"
+                android:visibility="invisible" />
+        </LinearLayout>
+
+    </androidx.coordinatorlayout.widget.CoordinatorLayout>
 
     <com.google.android.material.search.SearchView
         android:id="@+id/search_view"
         android:layout_width="match_parent"
-        android:layout_height="match_parent">
+        android:layout_height="match_parent"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toTopOf="parent">
 
         <LinearLayout
             android:id="@+id/ll_input_help"
@@ -107,7 +137,7 @@
                 android:layout_height="wrap_content"
                 android:orientation="horizontal"
                 android:paddingHorizontal="16dp"
-                android:paddingVertical="4dp">
+                android:paddingTop="4dp">
 
                 <TextView
                     android:id="@+id/tv_history"
@@ -125,10 +155,14 @@
 
                 <com.google.android.material.button.MaterialButton
                     android:id="@+id/tv_clear_history"
-                    style="@style/Widget.Material3Expressive.Button.IconButton.Outlined"
+                    style="@style/Widget.Material3Expressive.Button"
+                    android:text="@string/delete_all"
+                    app:backgroundTint="?attr/colorTertiary"
+                    app:iconTint="?attr/colorSurface"
                     android:layout_width="wrap_content"
                     android:layout_height="wrap_content"
                     app:icon="@drawable/ic_clear_all"
+                    app:strokeColor="?attr/colorTertiary"
                     app:iconGravity="textStart" />
 
             </LinearLayout>
@@ -141,15 +175,5 @@
         </LinearLayout>
     </com.google.android.material.search.SearchView>
 
-    <com.google.android.material.floatingactionbutton.FloatingActionButton
-        android:id="@+id/fb_start_stop"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_margin="16dp"
-        android:contentDescription="@string/stop"
-        android:src="@drawable/ic_stop_black_24dp"
-        android:visibility="invisible"
-        android:layout_gravity="bottom|end" />
-
-</androidx.coordinatorlayout.widget.CoordinatorLayout>
+</androidx.constraintlayout.widget.ConstraintLayout>
 

+ 1 - 0
app/src/main/res/layout/activity_book_source_edit.xml

@@ -84,6 +84,7 @@
         android:id="@+id/recycler_view"
         android:layout_width="match_parent"
         android:layout_height="match_parent"
+        android:paddingHorizontal="16dp"
         android:clipToPadding="false"
         tools:listitem="@layout/item_source_edit" />
 

+ 1 - 1
app/src/main/res/layout/activity_manga.xml

@@ -90,7 +90,7 @@
                 android:id="@+id/tv_retry"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
-                style="@style/Widget.Material3.Button.IconButton.Filled.Tonal"
+                style="@style/Widget.Material3Expressive.Button.IconButton.Tonal"
                 app:icon="@drawable/ic_refresh"
                 android:layout_margin="16dp"
                 app:iconPadding="4dp"

+ 7 - 5
app/src/main/res/layout/activity_read_record.xml

@@ -16,7 +16,7 @@
     <androidx.constraintlayout.widget.ConstraintLayout
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
-        android:paddingVertical="8dp"
+        android:paddingTop="8dp"
         android:paddingHorizontal="16dp">
 
         <TextView
@@ -35,10 +35,12 @@
             android:id="@+id/tv_reading_time"
             android:layout_width="0dp"
             android:layout_height="wrap_content"
-            style="@style/ChapterNameText"
+            android:textColor="?attr/colorSecondary"
+            android:textSize="22sp"
+            android:textStyle="bold"
             android:singleLine="true"
             app:layout_constraintLeft_toLeftOf="parent"
-            app:layout_constraintRight_toLeftOf="@+id/tv_remove"
+            app:layout_constraintRight_toRightOf="parent"
             app:layout_constraintTop_toBottomOf="@id/tv_book_name"
             tools:text="readingTime" />
 
@@ -46,12 +48,12 @@
             android:id="@+id/tv_remove"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
-            style="@style/Widget.Material3.Button.IconButton.Filled.Tonal"
+            style="@style/Widget.Material3Expressive.Button.TonalButton"
             app:icon="@drawable/ic_clear_all"
             android:text="清除所有"
             app:layout_constraintBottom_toBottomOf="parent"
             app:layout_constraintRight_toRightOf="parent"
-            app:layout_constraintTop_toTopOf="parent" />
+            app:layout_constraintTop_toBottomOf="@id/tv_reading_time" />
 
     </androidx.constraintlayout.widget.ConstraintLayout>
 

+ 2 - 2
app/src/main/res/layout/activity_search_content.xml

@@ -56,7 +56,7 @@
             android:id="@+id/iv_search_content_top"
             android:layout_width="36dp"
             android:layout_height="36dp"
-            style="@style/Widget.Material3.Button.IconButton.Filled.Tonal"
+            style="@style/Widget.Material3Expressive.Button.IconButton.Tonal"
             android:contentDescription="@string/go_to_top"
             app:icon="@drawable/ic_arrow_drop_up"
             app:iconGravity="textStart"
@@ -67,7 +67,7 @@
             android:id="@+id/iv_search_content_bottom"
             android:layout_width="36dp"
             android:layout_height="36dp"
-            style="@style/Widget.Material3.Button.IconButton.Filled.Tonal"
+            style="@style/Widget.Material3Expressive.Button.IconButton.Tonal"
             android:contentDescription="@string/go_to_bottom"
             app:icon="@drawable/ic_arrow_drop_down"
             app:iconGravity="textStart"

+ 4 - 4
app/src/main/res/layout/dialog_auto_read.xml

@@ -62,7 +62,7 @@
 
             <com.google.android.material.button.MaterialButton
                 android:id="@+id/btn_catalog"
-                style="@style/Widget.Material3.Button.IconButton.Filled.Tonal"
+                style="@style/Widget.Material3Expressive.Button.IconButton.Tonal"
                 android:layout_width="64dp"
                 android:layout_height="48dp"
                 app:icon="@drawable/ic_toc"
@@ -86,7 +86,7 @@
 
             <com.google.android.material.button.MaterialButton
                 android:id="@+id/btn_main_menu"
-                style="@style/Widget.Material3.Button.IconButton.Filled.Tonal"
+                style="@style/Widget.Material3Expressive.Button.IconButton.Tonal"
                 android:layout_width="64dp"
                 android:layout_height="48dp"
                 app:icon="@drawable/ic_menu"
@@ -112,7 +112,7 @@
 
             <com.google.android.material.button.MaterialButton
                 android:id="@+id/btn_auto_page_stop"
-                style="@style/Widget.Material3.Button.IconButton.Filled.Tonal"
+                style="@style/Widget.Material3Expressive.Button.IconButton.Tonal"
                 android:layout_width="64dp"
                 android:layout_height="48dp"
                 app:icon="@drawable/ic_auto_page_stop"
@@ -137,7 +137,7 @@
 
             <com.google.android.material.button.MaterialButton
                 android:id="@+id/btn_setting"
-                style="@style/Widget.Material3.Button.IconButton.Filled.Tonal"
+                style="@style/Widget.Material3Expressive.Button.IconButton.Tonal"
                 android:layout_width="64dp"
                 android:layout_height="48dp"
                 app:icon="@drawable/ic_settings"

+ 2 - 2
app/src/main/res/layout/dialog_book_change_source.xml

@@ -62,7 +62,7 @@
             android:id="@+id/iv_top"
             android:layout_width="36dp"
             android:layout_height="match_parent"
-            style="@style/Widget.Material3.Button.IconButton.Filled.Tonal"
+            style="@style/Widget.Material3Expressive.Button.IconButton.Tonal"
             android:contentDescription="@string/go_to_top"
             app:icon="@drawable/ic_arrow_drop_up"
             app:iconGravity="textStart"
@@ -73,7 +73,7 @@
             android:id="@+id/iv_bottom"
             android:layout_width="36dp"
             android:layout_height="match_parent"
-            style="@style/Widget.Material3.Button.IconButton.Filled.Tonal"
+            style="@style/Widget.Material3Expressive.Button.IconButton.Tonal"
             android:contentDescription="@string/go_to_bottom"
             app:icon="@drawable/ic_arrow_drop_down"
             app:iconGravity="textStart"

+ 8 - 2
app/src/main/res/layout/dialog_book_group_edit.xml

@@ -69,18 +69,24 @@
             </com.google.android.material.textfield.TextInputLayout>
 
             <LinearLayout
-                android:layout_width="wrap_content"
+                android:layout_width="match_parent"
                 android:layout_height="wrap_content"
                 android:orientation="horizontal"
                 android:layout_marginTop="8dp"
                 android:layout_marginBottom="8dp">
 
+                <TextView
+                    android:layout_width="0dp"
+                    android:layout_height="wrap_content"
+                    android:layout_weight="1"
+                    android:text="@string/sort" />
+
                 <com.google.android.material.chip.Chip
                     android:id="@+id/chip_sort_menu"
                     android:layout_width="wrap_content"
                     android:layout_height="wrap_content"
                     android:clickable="true"
-                    android:text="排序方式"
+                    android:text="@string/sort_default"
                     app:chipIcon="@drawable/ic_arrow_drop_down"
                     app:chipIconVisible="true" />
 

+ 4 - 8
app/src/main/res/layout/dialog_login.xml

@@ -4,14 +4,14 @@
     xmlns:tools="http://schemas.android.com/tools"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
-    android:padding="16dp">
+    android:paddingHorizontal="16dp"
+    android:paddingVertical="8dp">
 
     <LinearLayout
         android:id="@+id/vw_bg"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
         android:layout_gravity="center"
-        android:background="@drawable/shape_card_view"
         android:orientation="vertical"
         tools:ignore="UselessParent">
 
@@ -19,8 +19,6 @@
             android:id="@+id/tool_bar"
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
-            android:elevation="5dp"
-            android:theme="?attr/actionBarStyle"
             app:title="@string/login"
             app:displayHomeAsUp="false"
             app:fitStatusBar="false"
@@ -35,13 +33,11 @@
                 android:id="@+id/flexbox"
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content"
+                android:paddingVertical="8dp"
                 android:layout_marginTop="8dp"
                 android:clipToPadding="false"
-                android:padding="3dp"
-                app:dividerDrawable="@drawable/shape_space_divider"
                 app:flexDirection="row"
-                app:flexWrap="wrap"
-                app:showDivider="middle" />
+                app:flexWrap="wrap" />
 
         </androidx.core.widget.NestedScrollView>
 

+ 35 - 0
app/src/main/res/layout/dialog_more_config.xml

@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:orientation="vertical">
+
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:gravity="center"
+        android:orientation="vertical"
+        android:paddingHorizontal="16dp"
+        android:paddingBottom="8dp">
+
+        <com.google.android.material.bottomsheet.BottomSheetDragHandleView
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_gravity="center_horizontal" />
+
+        <TextView
+            android:id="@+id/bottom_sheet_title"
+            android:layout_width="wrap_content"
+            android:layout_height="match_parent"
+            android:text="@string/more_setting"
+            android:textSize="18sp"
+            android:textStyle="bold" />
+
+    </LinearLayout>
+
+    <FrameLayout
+        android:id="@+id/containerPreferences"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content" />
+
+</LinearLayout>

+ 2 - 2
app/src/main/res/layout/dialog_read_aloud.xml

@@ -215,7 +215,7 @@
 
             <com.google.android.material.button.MaterialButton
                 android:id="@+id/iv_tts_speech_reduce"
-                style="@style/Widget.Material3.Button.IconButton.Filled.Tonal"
+                style="@style/Widget.Material3Expressive.Button.IconButton.Tonal"
                 android:layout_width="48dp"
                 android:layout_height="48dp"
                 android:contentDescription="@string/tts_speech_reduce"
@@ -235,7 +235,7 @@
 
             <com.google.android.material.button.MaterialButton
                 android:id="@+id/iv_tts_speech_add"
-                style="@style/Widget.Material3.Button.IconButton.Filled.Tonal"
+                style="@style/Widget.Material3Expressive.Button.IconButton.Tonal"
                 android:layout_width="48dp"
                 android:layout_height="48dp"
                 android:contentDescription="@string/tts_speech_add"

+ 29 - 32
app/src/main/res/layout/dialog_search_scope.xml

@@ -3,55 +3,52 @@
     xmlns:app="http://schemas.android.com/apk/res-auto"
     xmlns:tools="http://schemas.android.com/tools"
     android:layout_width="match_parent"
-    android:layout_height="match_parent">
+    android:layout_height="match_parent"
+    android:minHeight="560dp">
 
     <androidx.appcompat.widget.Toolbar
         android:id="@+id/tool_bar"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
-        android:elevation="5dp"
-        android:theme="?attr/actionBarStyle"
         app:displayHomeAsUp="false"
         app:fitStatusBar="false"
         app:layout_constraintTop_toTopOf="parent"
         app:title="@string/search_scope"
         app:titleTextAppearance="@style/ToolbarTitle" />
 
-    <RadioGroup
+    <com.google.android.material.button.MaterialButtonToggleGroup
         android:id="@+id/rg_scope"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
-        android:layout_marginHorizontal="11dp"
+        android:layout_marginHorizontal="16dp"
+        android:clickable="true"
+        android:focusable="true"
+        app:checkedButton="@id/rb_group"
+        app:selectionRequired="true"
+        app:singleSelection="true"
         android:gravity="center"
         android:orientation="horizontal"
         app:layout_constraintTop_toBottomOf="@+id/tool_bar">
 
-        <io.legato.kazusa.lib.theme.view.ThemeRadioNoButton
+        <com.google.android.material.button.MaterialButton
             android:id="@+id/rb_group"
             android:layout_width="0dp"
             android:layout_height="wrap_content"
-            android:layout_margin="4dp"
+            style="@style/Widget.Material3Expressive.Button"
             android:layout_weight="1"
-            android:button="@null"
-            android:gravity="center"
-            android:padding="5dp"
-            android:singleLine="true"
             android:checked="true"
             android:text="@string/group" />
 
-        <io.legato.kazusa.lib.theme.view.ThemeRadioNoButton
+        <com.google.android.material.button.MaterialButton
             android:id="@+id/rb_source"
             android:layout_width="0dp"
             android:layout_height="wrap_content"
-            android:layout_margin="4dp"
+            style="@style/Widget.Material3Expressive.Button"
             android:layout_weight="1"
-            android:button="@null"
-            android:gravity="center"
-            android:padding="5dp"
             android:singleLine="true"
             android:text="@string/book_source" />
 
-    </RadioGroup>
+    </com.google.android.material.button.MaterialButtonToggleGroup>
 
     <io.legato.kazusa.ui.widget.recycler.scroller.FastScrollRecyclerView
         android:id="@+id/recycler_view"
@@ -67,16 +64,17 @@
         android:layout_height="wrap_content"
         android:gravity="center_vertical"
         android:orientation="horizontal"
-        android:paddingLeft="10dp"
-        android:paddingRight="10dp"
+        android:paddingHorizontal="16dp"
+        android:paddingVertical="8dp"
         app:layout_constraintBottom_toBottomOf="parent">
 
-        <io.legato.kazusa.ui.widget.text.AccentTextView
+        <com.google.android.material.button.MaterialButton
             android:id="@+id/tv_all_source"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
+            style="@style/Widget.Material3Expressive.Button.OutlinedButton"
             android:layout_marginRight="16dp"
-            android:padding="12dp"
+            android:minWidth="0dp"
             android:text="@string/all_source"
             tools:ignore="RtlHardcoded" />
 
@@ -85,24 +83,23 @@
             android:layout_height="wrap_content"
             android:layout_weight="1" />
 
-        <TextView
+        <com.google.android.material.button.MaterialButton
             android:id="@+id/tv_cancel"
+            style="@style/Widget.Material3Expressive.Button.TonalButton"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
-            android:layout_marginRight="16dp"
-            android:padding="12dp"
-            android:text="@string/cancel"
-            android:textColor="@color/secondaryText"
-            tools:ignore="RtlHardcoded" />
+            android:layout_marginEnd="8dp"
+            android:minWidth="0dp"
+            android:text="@string/cancel" />
 
-        <io.legato.kazusa.ui.widget.text.AccentTextView
+        <com.google.android.material.button.MaterialButton
             android:id="@+id/tv_ok"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
-            android:layout_marginRight="16dp"
-            android:padding="12dp"
-            android:text="@string/ok"
-            tools:ignore="RtlHardcoded" />
+            style="@style/Widget.Material3Expressive.Button"
+            android:layout_marginEnd="8dp"
+            android:minWidth="0dp"
+            android:text="@string/ok" />
 
     </LinearLayout>
 

+ 2 - 8
app/src/main/res/layout/dialog_update.xml

@@ -26,18 +26,12 @@
             android:gravity="center"
             android:orientation="horizontal">
 
-            <View
-                android:layout_width="0dp"
-                android:layout_height="match_parent"
-                android:layout_weight="2"/>
-
             <TextView
                 android:id="@+id/bottom_sheet_title"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
-                android:layout_marginHorizontal="32dp"
                 android:text="检测到更新!"
-                android:textSize="18sp"
+                android:textSize="20sp"
                 android:textStyle="bold" />
 
             <View
@@ -50,7 +44,7 @@
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
                 app:icon="@drawable/ic_download"
-                style="@style/Widget.Material3.Button.IconButton.Filled.Tonal"/>
+                style="@style/Widget.Material3Expressive.Button.IconButton.Tonal" />
         </LinearLayout>
 
     </LinearLayout>

+ 2 - 3
app/src/main/res/layout/fragment_chapter_list.xml

@@ -1,7 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto"
-    xmlns:tools="http://schemas.android.com/tools"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:descendantFocusability="blocksDescendants">
@@ -36,7 +35,7 @@
 
         <com.google.android.material.button.MaterialButton
             android:id="@+id/btn_chapter_top"
-            style="@style/Widget.Material3.Button.IconButton.Filled.Tonal"
+            style="@style/Widget.Material3Expressive.Button.IconButton.Tonal"
             android:layout_width="36dp"
             android:layout_height="36dp"
             app:icon="@drawable/ic_arrow_drop_up"
@@ -46,7 +45,7 @@
 
         <com.google.android.material.button.MaterialButton
             android:id="@+id/btn_chapter_bottom"
-            style="@style/Widget.Material3.Button.IconButton.Filled.Tonal"
+            style="@style/Widget.Material3Expressive.Button.IconButton.Tonal"
             android:layout_width="36dp"
             android:layout_height="36dp"
             app:icon="@drawable/ic_arrow_drop_down"

+ 1 - 1
app/src/main/res/layout/fragment_explore.xml

@@ -70,7 +70,7 @@
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:text="(っ˘ω˘ς )"
-            android:textSize="30sp"/>
+            android:textSize="32sp" />
         <TextView
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"

+ 14 - 9
app/src/main/res/layout/item_1line_text_and_del.xml

@@ -2,11 +2,13 @@
 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto"
     xmlns:tools="http://schemas.android.com/tools"
+    android:background="?attr/selectableItemBackground"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
     android:gravity="center_vertical"
     android:orientation="horizontal"
-    android:padding="6dp"
+    android:paddingHorizontal="16dp"
+    android:paddingVertical="8dp"
     tools:ignore="UseCompoundDrawables">
 
     <TextView
@@ -14,16 +16,19 @@
         android:layout_width="0dp"
         android:layout_height="wrap_content"
         android:layout_weight="1"
-        android:singleLine="true"
-        />
+        android:maxLines="2" />
 
-    <ImageView
+    <com.google.android.material.button.MaterialButton
         android:id="@+id/iv_delete"
-        android:layout_width="24dp"
-        android:layout_height="24dp"
+        style="@style/Widget.Material3Expressive.Button.IconButton"
+        android:layout_width="32dp"
+        android:layout_height="32dp"
+        android:background="?attr/selectableItemBackgroundBorderless"
+        android:visibility="visible"
+        app:icon="@drawable/ic_clear_all"
+        app:iconGravity="textStart"
+        app:iconSize="20dp"
         android:contentDescription="@string/delete"
-        android:src="@drawable/ic_clear_all"
-        android:visibility="gone"
-        />
+        app:iconTint="?attr/colorOnSurface" />
 
 </LinearLayout>

+ 10 - 6
app/src/main/res/layout/item_arrange_book.xml

@@ -3,9 +3,11 @@
     xmlns:tools="http://schemas.android.com/tools"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
-    android:paddingStart="8dp"
+    android:background="?attr/selectableItemBackground"
+    android:paddingStart="4dp"
     android:paddingEnd="16dp"
-    android:paddingVertical="8dp">
+    android:paddingTop="2dp"
+    android:paddingBottom="8dp">
 
     <com.google.android.material.checkbox.MaterialCheckBox
         android:id="@+id/checkbox"
@@ -22,7 +24,7 @@
         android:paddingBottom="2dp"
         android:singleLine="true"
         android:text="@string/book_name"
-        android:textSize="20sp"
+        style="@style/ChapterNameText"
         app:layout_constraintStart_toEndOf="@id/checkbox"
         app:layout_constraintEnd_toEndOf="parent"
         app:layout_constraintTop_toTopOf="@id/checkbox"
@@ -38,7 +40,7 @@
         android:textSize="12sp"
         tools:ignore="RtlHardcoded"
         app:layout_constraintStart_toStartOf="@id/tv_name"
-        app:layout_constraintEnd_toEndOf="@id/tv_name"
+        app:layout_constraintEnd_toStartOf="@id/tv_group"
         app:layout_constraintTop_toBottomOf="@id/tv_name" />
 
     <TextView
@@ -53,22 +55,24 @@
 
     <TextView
         android:id="@+id/tv_group_s"
-        android:layout_width="wrap_content"
+        android:layout_width="0dp"
         android:layout_height="wrap_content"
         android:text="@string/ungroup"
         android:layout_marginStart="8dp"
         android:singleLine="true"
         android:textSize="12sp"
         app:layout_constraintStart_toEndOf="@id/tv_origin"
+        app:layout_constraintEnd_toStartOf="@id/tv_group"
         app:layout_constraintBaseline_toBaselineOf="@id/tv_origin" />
 
     <com.google.android.material.button.MaterialButton
         android:id="@+id/tv_group"
-        android:layout_width="48dp"
+        android:layout_width="wrap_content"
         android:layout_height="40dp"
         style="@style/Widget.Material3Expressive.Button.TonalButton"
         android:textSize="12sp"
         android:layout_marginEnd="8dp"
+        android:minWidth="0dp"
         android:padding="0dp"
         android:text="@string/group"
         app:layout_constraintTop_toTopOf="@id/tv_group_s"

+ 1 - 3
app/src/main/res/layout/item_book_source.xml

@@ -14,8 +14,6 @@
         android:id="@+id/tv_host_text"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
-        android:layout_marginTop="-12dp"
-        android:layout_marginBottom="16dp"
         android:scrollbars="none"
         android:singleLine="true"
         android:textSize="16sp"
@@ -37,7 +35,7 @@
         android:id="@+id/cb_book_source"
         android:layout_width="0dp"
         android:layout_height="wrap_content"
-        android:layout_gravity="center"
+        android:layout_marginStart="4dp"
         android:scrollbars="none"
         android:singleLine="true"
         app:layout_constraintBottom_toTopOf="@id/iv_debug_text"

+ 1 - 0
app/src/main/res/layout/item_dict_rule.xml

@@ -15,6 +15,7 @@
         android:layout_height="wrap_content"
         android:layout_weight="1"
         android:layout_marginEnd="8dp"
+        android:layout_marginStart="4dp"
         tools:ignore="RtlSymmetry" />
 
     <io.legato.kazusa.lib.theme.view.ThemeSwitch

+ 60 - 21
app/src/main/res/layout/item_download.xml

@@ -4,6 +4,7 @@
     xmlns:tools="http://schemas.android.com/tools"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
+    android:background="?attr/selectableItemBackground"
     android:padding="16dp">
 
     <TextView
@@ -11,9 +12,11 @@
         android:layout_width="0dp"
         android:layout_height="wrap_content"
         android:singleLine="true"
-        android:textSize="18sp"
+        style="@style/ChapterNameText"
+        android:layout_marginEnd="8dp"
+        app:layout_constraintEnd_toStartOf="@id/cd_download"
+        app:layout_constraintStart_toStartOf="parent"
         app:layout_constraintLeft_toLeftOf="parent"
-        app:layout_constraintRight_toLeftOf="@+id/iv_download"
         app:layout_constraintTop_toTopOf="parent"
         tools:text="@string/name" />
 
@@ -21,59 +24,95 @@
         android:id="@+id/tv_author"
         android:layout_width="0dp"
         android:layout_height="wrap_content"
+        android:paddingBottom="2dp"
         android:singleLine="true"
         app:layout_constraintLeft_toLeftOf="parent"
         app:layout_constraintRight_toLeftOf="@+id/iv_download"
         app:layout_constraintTop_toBottomOf="@+id/tv_name"
         tools:text="@string/author" />
 
-    <TextView
-        android:id="@+id/tv_download"
-        android:layout_width="0dp"
+    <com.google.android.material.card.MaterialCardView
+        android:id="@+id/cd_download"
+        android:layout_width="wrap_content"
         android:layout_height="wrap_content"
-        android:singleLine="true"
-        app:layout_constraintLeft_toLeftOf="parent"
+        android:layout_marginEnd="2dp"
+        app:cardBackgroundColor="?attr/colorSecondaryContainer"
+        app:layout_constraintBottom_toBottomOf="@id/tv_name"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintTop_toTopOf="@id/tv_name"
+        app:strokeWidth="0dp">
+
+        <TextView
+            android:id="@+id/tv_download"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginHorizontal="6dp"
+            android:layout_marginVertical="2dp"
+            android:singleLine="true"
+            android:textColor="?attr/colorPrimaryVariant"
+            android:textSize="10sp"
+            android:textStyle="bold"
+            tools:ignore="SmallSp"
+            tools:text="@string/action_download" />
+    </com.google.android.material.card.MaterialCardView>
+
+    <com.google.android.material.button.MaterialButton
+        android:id="@+id/iv_delete"
+        style="@style/Widget.Material3Expressive.Button.IconButton.Tonal"
+        android:layout_width="40dp"
+        android:layout_height="40dp"
+        android:contentDescription="@string/start"
+        app:icon="@drawable/ic_clear_all"
+        app:iconGravity="textStart"
+        app:iconSize="20dp"
         app:layout_constraintRight_toLeftOf="@+id/iv_download"
-        app:layout_constraintTop_toBottomOf="@id/tv_author"
-        tools:text="@string/action_download" />
+        app:layout_constraintTop_toTopOf="@id/tv_author" />
 
     <com.google.android.material.button.MaterialButton
         android:id="@+id/iv_download"
-        style="@style/Widget.Material3.Button.IconButton.Filled.Tonal"
+        style="@style/Widget.Material3Expressive.Button.IconButton.Tonal"
         android:layout_width="40dp"
         android:layout_height="40dp"
         android:contentDescription="@string/start"
+        android:layout_marginEnd="4dp"
         app:icon="@drawable/ic_play_24dp"
         app:iconGravity="textStart"
-        app:layout_constraintBottom_toBottomOf="@+id/tv_download"
         app:layout_constraintRight_toLeftOf="@+id/tv_export"
-        app:layout_constraintTop_toTopOf="@id/tv_name" />
+        app:layout_constraintTop_toTopOf="@id/tv_author" />
 
     <com.google.android.material.button.MaterialButton
         android:id="@+id/tv_export"
-        android:layout_width="48dp"
+        style="@style/Widget.Material3Expressive.Button.OutlinedButton"
         android:layout_height="40dp"
-        style="@style/Widget.Material3Expressive.Button.TonalButton"
+        android:layout_width="wrap_content"
+        android:minWidth="0dp"
         android:textSize="12sp"
         android:padding="0dp"
         android:text="@string/export"
-        app:layout_constraintBottom_toBottomOf="@+id/tv_download"
-        app:layout_constraintRight_toRightOf="parent"
-        app:layout_constraintTop_toTopOf="@id/tv_name" />
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintTop_toTopOf="@id/tv_author" />
 
     <TextView
         android:id="@+id/tv_msg"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
         android:visibility="gone"
-        app:layout_constraintTop_toBottomOf="@id/tv_download" />
+        app:layout_constraintTop_toBottomOf="@id/tv_author" />
+
+    <com.google.android.material.progressindicator.LinearProgressIndicator
+        android:id="@+id/progress_download"
+        style="@style/Widget.Material3.LinearProgressIndicator"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_marginTop="2dp"
+        android:visibility="gone"
+        app:layout_constraintTop_toBottomOf="@id/iv_download" />
 
-    <io.legato.kazusa.lib.theme.view.ThemeProgressBar
+    <com.google.android.material.progressindicator.LinearProgressIndicator
         android:id="@+id/progress_export"
-        style="?android:attr/progressBarStyleHorizontal"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
         android:visibility="gone"
-        app:layout_constraintTop_toBottomOf="@id/tv_download" />
+        app:layout_constraintTop_toBottomOf="@id/iv_download" />
 
 </androidx.constraintlayout.widget.ConstraintLayout>

+ 6 - 3
app/src/main/res/layout/item_fillet_text.xml

@@ -1,8 +1,11 @@
 <?xml version="1.0" encoding="utf-8"?>
-<com.google.android.material.card.MaterialCardView
-    xmlns:android="http://schemas.android.com/apk/res/android"
+<com.google.android.material.card.MaterialCardView 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:layout_margin="2dp"
+    app:cardBackgroundColor="?attr/colorSecondary"
+    app:strokeColor="?attr/colorSecondary"
     android:clickable="true"
     android:focusable="true">
     <TextView
@@ -18,7 +21,7 @@
         android:paddingEnd="16dp"
         android:maxLines="1"
         android:textSize="14sp"
-        android:textColor="?attr/colorPrimary"
+        android:textColor="?attr/colorSurface"
         tools:ignore="UnusedAttribute" />
 </com.google.android.material.card.MaterialCardView>
 

+ 1 - 1
app/src/main/res/layout/item_find_book.xml

@@ -32,7 +32,7 @@
 
         <com.google.android.material.button.MaterialButton
             android:id="@+id/iv_status"
-            style="@style/Widget.Material3.Button.IconButton.Filled.Tonal"
+            style="@style/Widget.Material3Expressive.Button.IconButton.Tonal"
             android:layout_width="48dp"
             android:layout_height="48dp"
             app:icon="@drawable/ic_arrow_right"/>

+ 1 - 1
app/src/main/res/layout/item_group_manage.xml

@@ -27,7 +27,7 @@
         android:id="@+id/tv_edit"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
-        style="@style/Widget.Material3.Button.IconButton.Filled.Tonal"
+        style="@style/Widget.Material3Expressive.Button.IconButton.Tonal"
         app:icon="@drawable/ic_edit" />
 
 </LinearLayout>

+ 1 - 1
app/src/main/res/layout/item_group_select.xml

@@ -21,7 +21,7 @@
         android:id="@+id/tv_edit"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
-        style="@style/Widget.Material3.Button.IconButton.Filled.Tonal"
+        style="@style/Widget.Material3Expressive.Button.IconButton.Tonal"
         app:icon="@drawable/ic_edit" />
 
 </LinearLayout>

+ 2 - 2
app/src/main/res/layout/item_http_tts.xml

@@ -38,7 +38,7 @@
         android:id="@+id/iv_edit"
         android:layout_width="36dp"
         android:layout_height="36dp"
-        style="@style/Widget.Material3.Button.IconButton.Filled.Tonal"
+        style="@style/Widget.Material3Expressive.Button.IconButton.Tonal"
         android:layout_gravity="center"
         android:contentDescription="@string/edit"
         app:icon="@drawable/ic_edit"
@@ -51,7 +51,7 @@
         android:id="@+id/iv_menu_delete"
         android:layout_width="36dp"
         android:layout_height="36dp"
-        style="@style/Widget.Material3.Button.IconButton.Filled.Tonal"
+        style="@style/Widget.Material3Expressive.Button.IconButton.Tonal"
         app:icon="@drawable/ic_clear_all"
         app:iconGravity="textStart"
         app:layout_constraintBottom_toBottomOf="parent"

+ 35 - 26
app/src/main/res/layout/item_read_record.xml

@@ -5,19 +5,37 @@
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
     android:background="?attr/selectableItemBackground"
-    android:paddingHorizontal="16dp"
+    android:paddingStart="16dp"
+    android:paddingEnd="10dp"
     android:paddingVertical="8dp">
 
+    <com.google.android.material.card.MaterialCardView
+        android:id="@+id/cd_cover"
+        android:layout_width="0dp"
+        android:layout_height="match_parent"
+        app:cardBackgroundColor="?attr/colorSurfaceContainer"
+        app:cardCornerRadius="6dp"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toTopOf="parent"
+        app:strokeWidth="0dp">
+
+        <ImageView
+            android:id="@+id/iv_cover"
+            android:layout_width="60dp"
+            android:layout_height="80dp" />
+    </com.google.android.material.card.MaterialCardView>
+
     <TextView
         android:id="@+id/tv_book_name"
         android:layout_width="0dp"
         android:layout_height="wrap_content"
-        android:paddingVertical="4dp"
-        style="@style/TextAppearance.Material3.BodyLarge"
+        style="@style/ChapterNameText"
+        android:layout_marginStart="8dp"
         android:singleLine="true"
-        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintEnd_toEndOf="@+id/tv_remove"
         app:layout_constraintTop_toTopOf="parent"
-        app:layout_constraintRight_toLeftOf="@+id/tv_remove"
+        app:layout_constraintStart_toEndOf="@id/cd_cover"
         tools:text="name"
         tools:ignore="RtlHardcoded" />
 
@@ -25,40 +43,32 @@
         android:id="@+id/tv_reading_time_tag"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
-        android:paddingVertical="4dp"
+        android:layout_marginStart="8dp"
+        android:layout_marginTop="2dp"
         android:singleLine="true"
         android:text="@string/reading_time_tag"
-        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintStart_toEndOf="@id/cd_cover"
         app:layout_constraintTop_toBottomOf="@id/tv_book_name" />
 
     <TextView
         android:id="@+id/tv_reading_time"
         android:layout_width="0dp"
         android:layout_height="wrap_content"
-        android:paddingVertical="4dp"
         android:singleLine="true"
-        app:layout_constraintLeft_toRightOf="@+id/tv_reading_time_tag"
-        app:layout_constraintTop_toBottomOf="@id/tv_book_name"
-        app:layout_constraintRight_toLeftOf="@+id/tv_remove"
+        app:layout_constraintBottom_toTopOf="@id/tv_reading_time_tag"
+        app:layout_constraintEnd_toStartOf="@+id/tv_remove"
+        app:layout_constraintStart_toEndOf="@+id/tv_reading_time_tag"
+        app:layout_constraintTop_toBottomOf="@id/tv_reading_time_tag"
         tools:text="readingTime" />
 
-    <TextView
-        android:id="@+id/tv_last_read_time_tag"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:paddingVertical="4dp"
-        android:singleLine="true"
-        android:text="@string/last_read_time_tag"
-        app:layout_constraintLeft_toLeftOf="parent"
-        app:layout_constraintTop_toBottomOf="@id/tv_reading_time_tag" />
-
     <TextView
         android:id="@+id/tv_last_read_time"
         android:layout_width="0dp"
         android:layout_height="wrap_content"
-        android:paddingVertical="4dp"
+        android:layout_marginStart="8dp"
+        android:layout_marginTop="2dp"
         android:singleLine="true"
-        app:layout_constraintLeft_toRightOf="@+id/tv_last_read_time_tag"
+        app:layout_constraintLeft_toRightOf="@+id/cd_cover"
         app:layout_constraintTop_toBottomOf="@id/tv_reading_time_tag"
         app:layout_constraintRight_toLeftOf="@+id/tv_remove"
         tools:text="readingTime" />
@@ -67,10 +77,9 @@
         android:id="@+id/tv_remove"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
-        style="@style/Widget.Material3.Button.IconButton.Filled.Tonal"
+        style="@style/Widget.Material3Expressive.Button.IconButton.Tonal"
         app:icon="@drawable/ic_clear_all"
         app:layout_constraintRight_toRightOf="parent"
-        app:layout_constraintTop_toTopOf="parent"
-        app:layout_constraintBottom_toBottomOf="parent" />
+        app:layout_constraintTop_toBottomOf="@id/tv_book_name" />
 
 </androidx.constraintlayout.widget.ConstraintLayout>

+ 28 - 39
app/src/main/res/layout/item_read_style.xml

@@ -1,43 +1,32 @@
 <?xml version="1.0" encoding="utf-8"?>
-<com.google.android.material.card.MaterialCardView xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:app="http://schemas.android.com/apk/res-auto"
-    android:id="@+id/rv_style"
-    android:layout_width="48dp"
-    android:layout_height="54dp"
-    android:layout_marginLeft="4dp"
-    android:layout_marginRight="4dp"
-    app:cardBackgroundColor="@android:color/transparent"
-    app:strokeWidth="0dp">
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/ll_style"
+    android:layout_width="wrap_content"
+    android:layout_height="wrap_content"
+    android:gravity="center">
 
-    <LinearLayout
-        android:id="@+id/ll_style"
-        android:layout_width="match_parent"
-        android:layout_height="match_parent"
-        android:gravity="center">
+    <com.google.android.material.card.MaterialCardView
+        android:id="@+id/cd_style"
+        android:layout_width="48dp"
+        android:layout_height="48dp"
+        android:layout_margin="4dp"
+        android:foreground="?android:attr/selectableItemBackground">
 
-        <com.google.android.material.card.MaterialCardView
-            android:id="@+id/cd_style"
-            android:layout_width="48dp"
-            android:layout_height="48dp"
-            android:foreground="?android:attr/selectableItemBackground">
+        <ImageView
+            android:id="@+id/iv_style"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent" />
 
-            <ImageView
-                android:id="@+id/iv_style"
-                android:layout_width="match_parent"
-                android:layout_height="match_parent" />
-
-            <TextView
-                android:id="@+id/tv_style"
-                android:layout_width="match_parent"
-                android:layout_height="match_parent"
-                android:autoSizeMaxTextSize="12sp"
-                android:autoSizeMinTextSize="6sp"
-                android:autoSizeStepGranularity="1sp"
-                android:autoSizeTextType="uniform"
-                android:gravity="center"
-                android:singleLine="true"
-                android:text="@string/text" />
-        </com.google.android.material.card.MaterialCardView>
-    </LinearLayout>
-
-</com.google.android.material.card.MaterialCardView>
+        <TextView
+            android:id="@+id/tv_style"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:autoSizeMaxTextSize="12sp"
+            android:autoSizeMinTextSize="6sp"
+            android:autoSizeStepGranularity="1sp"
+            android:autoSizeTextType="uniform"
+            android:gravity="center"
+            android:singleLine="true"
+            android:text="@string/text" />
+    </com.google.android.material.card.MaterialCardView>
+</LinearLayout>

+ 1 - 0
app/src/main/res/layout/item_replace_rule.xml

@@ -14,6 +14,7 @@
         android:id="@+id/cb_name"
         android:layout_width="0dp"
         android:layout_height="wrap_content"
+        android:layout_marginStart="4dp"
         android:layout_marginEnd="8dp"
         android:scrollbars="none"
         android:maxLines="2"

+ 0 - 1
app/src/main/res/layout/item_source_edit.xml

@@ -5,7 +5,6 @@
     android:id="@+id/textInputLayout"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
-    android:paddingHorizontal="16dp"
     android:paddingVertical="8dp">
 
     <io.legato.kazusa.ui.widget.code.CodeView

+ 2 - 2
app/src/main/res/layout/item_txt_toc_rule.xml

@@ -14,7 +14,7 @@
         android:id="@+id/cb_source"
         android:layout_width="0dp"
         android:layout_height="wrap_content"
-        android:layout_gravity="start"
+        android:layout_marginStart="4dp"
         android:singleLine="true"
         app:layout_constraintBottom_toTopOf="@id/title_example"
         app:layout_constraintLeft_toLeftOf="parent"
@@ -65,7 +65,7 @@
         android:id="@+id/title_example"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
-        android:layout_marginStart="6dp"
+        android:layout_marginStart="10dp"
         android:layout_marginBottom="8dp"
         android:textSize="12sp"
         app:layout_constraintBottom_toBottomOf="parent"

+ 2 - 1
app/src/main/res/layout/popup_keyboard_tool.xml

@@ -6,5 +6,6 @@
     android:layout_height="wrap_content"
     android:layout_gravity="center"
     android:orientation="horizontal"
-    android:padding="5dp"
+    android:paddingHorizontal="12dp"
+    android:paddingVertical="8dp"
     app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" />

+ 5 - 5
app/src/main/res/layout/view_search_menu.xml

@@ -81,7 +81,7 @@
                 android:id="@+id/iv_search_content_up"
                 android:layout_width="36dp"
                 android:layout_height="match_parent"
-                style="@style/Widget.Material3.Button.IconButton.Filled.Tonal"
+                style="@style/Widget.Material3Expressive.Button.IconButton.Tonal"
                 app:iconGravity="textStart"
                 android:contentDescription="@string/go_to_top"
                 app:icon="@drawable/ic_arrow_drop_up"
@@ -93,7 +93,7 @@
                 android:id="@+id/iv_search_content_down"
                 android:layout_width="36dp"
                 android:layout_height="match_parent"
-                style="@style/Widget.Material3.Button.IconButton.Filled.Tonal"
+                style="@style/Widget.Material3Expressive.Button.IconButton.Tonal"
                 app:iconGravity="textStart"
                 android:contentDescription="@string/go_to_bottom"
                 app:icon="@drawable/ic_arrow_drop_down"
@@ -201,7 +201,7 @@
                 android:layout_height="wrap_content"
                 android:background="?attr/selectableItemBackgroundBorderless"
                 android:clickable="true"
-                android:contentDescription="退出"
+                android:contentDescription="@string/exit"
                 android:focusable="true"
                 android:orientation="vertical"
                 android:paddingBottom="7dp">
@@ -212,7 +212,7 @@
                     android:layout_height="0dp"
                     android:layout_weight="1"
                     android:adjustViewBounds="true"
-                    android:contentDescription="退出"
+                    android:contentDescription="@string/exit"
                     android:maxHeight="20dp"
                     android:src="@drawable/ic_auto_page_stop"
                     tools:ignore="NestedWeights" />
@@ -224,7 +224,7 @@
                     android:layout_gravity="center_horizontal"
                     android:layout_marginTop="3dp"
                     android:maxLines="1"
-                    android:text="退出"
+                    android:text="@string/exit"
                     android:textSize="12sp" />
             </LinearLayout>
 

+ 1 - 0
app/src/main/res/layout/view_select_action_bar.xml

@@ -14,6 +14,7 @@
         android:layout_width="0dp"
         android:layout_height="wrap_content"
         android:layout_weight="1"
+        android:layout_marginStart="4dp"
         android:text="@string/select_all" />
 
     <com.google.android.material.button.MaterialButton

+ 2 - 2
app/src/main/res/layout/view_simple_counter.xml

@@ -38,7 +38,7 @@
                     android:id="@+id/iv_seek_reduce"
                     android:layout_width="40dp"
                     android:layout_height="40dp"
-                    style="@style/Widget.Material3.Button.IconButton.Filled.Tonal"
+                    style="@style/Widget.Material3Expressive.Button.IconButton.Tonal"
                     android:elevation="2dp"
                     app:backgroundTint="?attr/colorSurfaceContainer"
                     android:contentDescription="@string/reduce"
@@ -58,7 +58,7 @@
                     android:id="@+id/iv_seek_plus"
                     android:layout_width="40dp"
                     android:layout_height="40dp"
-                    style="@style/Widget.Material3.Button.IconButton.Filled.Tonal"
+                    style="@style/Widget.Material3Expressive.Button.IconButton.Tonal"
                     android:elevation="2dp"
                     app:backgroundTint="?attr/colorSurfaceContainer"
                     android:contentDescription="@string/plus"

+ 0 - 14
app/src/main/res/layout/view_theme_mode.xml

@@ -11,20 +11,6 @@
     app:singleSelection="true"
     app:selectionRequired="true">
 
-    <TextView
-        android:id="@android:id/title"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:text="标题"
-        android:visibility="gone" />
-
-    <TextView
-        android:id="@android:id/summary"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:text="摘要"
-        android:visibility="gone" />
-
     <com.google.android.material.button.MaterialButton
         android:id="@+id/btn_system"
         style="@style/Widget.Material3Expressive.Button"

+ 1 - 1
app/src/main/res/values-ja-rJP/strings.xml

@@ -979,7 +979,7 @@
     <string name="custom_welcome_summary">是否使用自定义欢迎页</string>
     <string name="show_icon">显示图标</string>
     <string name="show_default_book_icon">显示默认书籍图标</string>
-    <string name="cache_export">缓存/导出</string>
+    <string name="cache_export">已缓存书籍</string>
     <string name="assists_key_config">辅助按键配置</string>
     <string name="url_option">Url参数</string>
     <string name="only_wifi">仅WIFI</string>

+ 0 - 1
app/src/main/res/values-night/themes.xml

@@ -7,7 +7,6 @@
         <item name="tabStyle">@style/Widget.App.TabLayout</item>
         <item name="popupMenuBackground">@drawable/popup_background</item>
         <item name="alertDialogTheme">@style/AppTheme.AlertDialog</item>
-        <item name="chipStyle">@style/Widget.Material3.Chip.Filter</item>
     </style>
 
 </resources>

+ 2 - 2
app/src/main/res/values-zh/strings.xml

@@ -225,7 +225,7 @@
     <string name="download_start">开始下载</string>
     <string name="download_cancel">取消下载</string>
     <string name="no_download">暂无任务</string>
-    <string name="download_count">已下载 %1$d/%2$d</string>
+    <string name="download_count">%1$d/%2$d</string>
     <string name="import_select_book">导入选择书籍</string>
     <string name="threads_num_title">更新和搜索线程数(太多会卡顿)</string>
     <string name="change_icon">切换图标</string>
@@ -979,7 +979,7 @@
     <string name="custom_welcome_summary">是否使用自定义欢迎页</string>
     <string name="show_icon">显示图标</string>
     <string name="show_default_book_icon">显示默认书籍图标</string>
-    <string name="cache_export">缓存/导出</string>
+    <string name="cache_export">书籍缓存</string>
     <string name="assists_key_config">辅助按键配置</string>
     <string name="url_option">URL 参数</string>
     <string name="only_wifi">仅 WiFi</string>

+ 5 - 1
app/src/main/res/values/styles.xml

@@ -40,12 +40,16 @@
     <style name="ChapterNameText">
         <item name="android:textSize">16sp</item>
         <item name="android:textStyle">bold</item>
-        <item name="android:paddingBottom">4dp</item>
         <item name="android:maxLines">2</item>
     </style>
 
     //**********System Style******************//
 
+    <style name="ShapeAppearanceOverlay.Circle" parent="">
+        <item name="cornerFamily">rounded</item>
+        <item name="cornerSize">50%</item>
+    </style>
+
     <style name="Style.NavigationView" parent="android:Widget">
 
     </style>