HapeLee 1 год назад
Родитель
Сommit
0bb2528fab
56 измененных файлов с 531 добавлено и 665 удалено
  1. 31 23
      app/src/main/AndroidManifest.xml
  2. 1 1
      app/src/main/java/io/legato/kazusa/App.kt
  3. 10 21
      app/src/main/java/io/legato/kazusa/base/BaseActivity.kt
  4. 3 0
      app/src/main/java/io/legato/kazusa/constant/PreferKey.kt
  5. 1 1
      app/src/main/java/io/legato/kazusa/constant/Theme.kt
  6. 0 1
      app/src/main/java/io/legato/kazusa/help/config/AppConfig.kt
  7. 0 52
      app/src/main/java/io/legato/kazusa/help/config/ThemeConfig.kt
  8. 6 4
      app/src/main/java/io/legato/kazusa/lib/prefs/NameListPreference.kt
  9. 1 1
      app/src/main/java/io/legato/kazusa/lib/prefs/Preference.kt
  10. 8 8
      app/src/main/java/io/legato/kazusa/lib/prefs/SwitchPreference.kt
  11. 1 0
      app/src/main/java/io/legato/kazusa/ui/book/bookmark/AllBookmarkActivity.kt
  12. 1 1
      app/src/main/java/io/legato/kazusa/ui/config/ConfigActivity.kt
  13. 3 2
      app/src/main/java/io/legato/kazusa/ui/config/CoverRuleConfigDialog.kt
  14. 19 1
      app/src/main/java/io/legato/kazusa/ui/config/ThemeConfigFragment.kt
  15. 1 1
      app/src/main/java/io/legato/kazusa/ui/welcome/WelcomeActivity.kt
  16. 27 8
      app/src/main/res/layout/activity_all_bookmark.xml
  17. 1 1
      app/src/main/res/layout/activity_book_info.xml
  18. 37 9
      app/src/main/res/layout/activity_config.xml
  19. 4 5
      app/src/main/res/layout/activity_read_record.xml
  20. 7 7
      app/src/main/res/layout/activity_replace_edit.xml
  21. 42 27
      app/src/main/res/layout/dialog_check_source_config.xml
  22. 36 19
      app/src/main/res/layout/dialog_cover_rule_config.xml
  23. 21 21
      app/src/main/res/layout/dialog_direct_link_upload_config.xml
  24. 0 1
      app/src/main/res/layout/dialog_login.xml
  25. 0 1
      app/src/main/res/layout/dialog_open_url_confirm.xml
  26. 0 1
      app/src/main/res/layout/dialog_rss_favorite_config.xml
  27. 0 1
      app/src/main/res/layout/dialog_search_scope.xml
  28. 0 1
      app/src/main/res/layout/dialog_source_picker.xml
  29. 0 1
      app/src/main/res/layout/dialog_text_view.xml
  30. 1 2
      app/src/main/res/layout/dialog_toc_regex.xml
  31. 1 2
      app/src/main/res/layout/dialog_toc_regex_edit.xml
  32. 0 1
      app/src/main/res/layout/dialog_update.xml
  33. 0 1
      app/src/main/res/layout/dialog_variable.xml
  34. 0 1
      app/src/main/res/layout/dialog_verification_code_view.xml
  35. 0 1
      app/src/main/res/layout/dialog_webdav_server.xml
  36. 3 3
      app/src/main/res/layout/item_replace_rule.xml
  37. 3 2
      app/src/main/res/layout/view_error.xml
  38. 3 3
      app/src/main/res/layout/view_loading.xml
  39. 1 1
      app/src/main/res/layout/view_preference.xml
  40. 1 3
      app/src/main/res/layout/view_title_bar_dark.xml
  41. 0 1
      app/src/main/res/values-es-rES/arrays.xml
  42. 48 94
      app/src/main/res/values-night/colors.xml
  43. 0 24
      app/src/main/res/values-night/styles.xml
  44. 0 1
      app/src/main/res/values-pt-rBR/arrays.xml
  45. 0 1
      app/src/main/res/values-vi/arrays.xml
  46. 0 1
      app/src/main/res/values-zh-rHK/arrays.xml
  47. 0 1
      app/src/main/res/values-zh-rTW/arrays.xml
  48. 0 1
      app/src/main/res/values-zh/arrays.xml
  49. 1 1
      app/src/main/res/values-zh/strings.xml
  50. 6 1
      app/src/main/res/values/array_values.xml
  51. 7 1
      app/src/main/res/values/arrays.xml
  52. 51 94
      app/src/main/res/values/colors.xml
  53. 1 0
      app/src/main/res/values/strings.xml
  54. 0 200
      app/src/main/res/values/styles.xml
  55. 132 0
      app/src/main/res/values/themes.xml
  56. 11 4
      app/src/main/res/xml/pref_config_theme.xml

+ 31 - 23
app/src/main/AndroidManifest.xml

@@ -35,91 +35,99 @@
         <activity
             android:name=".ui.welcome.WelcomeActivity"
             android:exported="true">
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN" />
 
-                <category android:name="android.intent.category.LAUNCHER" />
-            </intent-filter>
         </activity>
         <!-- 图标1 -->
-        <activity
+        <activity-alias
             android:name=".ui.welcome.Launcher1"
             android:enabled="false"
             android:exported="true"
-            android:icon="@mipmap/launcher1">
+            android:icon="@mipmap/launcher1"
+            android:targetActivity=".ui.main.MainActivity">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
 
                 <category android:name="android.intent.category.LAUNCHER" />
             </intent-filter>
-        </activity>
+        </activity-alias>
         <!-- 图标2 -->
-        <activity
+        <activity-alias
             android:name=".ui.welcome.Launcher2"
             android:enabled="false"
             android:exported="true"
-            android:icon="@mipmap/launcher2">
+            android:icon="@mipmap/launcher2"
+            android:targetActivity=".ui.main.MainActivity">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
 
                 <category android:name="android.intent.category.LAUNCHER" />
             </intent-filter>
-        </activity>
+        </activity-alias>
         <!-- 图标3 -->
-        <activity
+        <activity-alias
             android:name=".ui.welcome.Launcher3"
             android:enabled="false"
             android:exported="true"
-            android:icon="@mipmap/launcher3">
+            android:icon="@mipmap/launcher3"
+            android:targetActivity=".ui.main.MainActivity">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
 
                 <category android:name="android.intent.category.LAUNCHER" />
             </intent-filter>
-        </activity>
+        </activity-alias>
         <!-- 图标4 -->
-        <activity
+        <activity-alias
             android:name=".ui.welcome.Launcher4"
             android:enabled="false"
             android:exported="true"
-            android:icon="@mipmap/launcher4">
+            android:icon="@mipmap/launcher4"
+            android:targetActivity=".ui.main.MainActivity">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
 
                 <category android:name="android.intent.category.LAUNCHER" />
             </intent-filter>
-        </activity>
+        </activity-alias>
         <!-- 图标5 -->
-        <activity
+        <activity-alias
             android:name=".ui.welcome.Launcher5"
             android:enabled="false"
             android:exported="true"
-            android:icon="@mipmap/launcher5">
+            android:icon="@mipmap/launcher5"
+            android:targetActivity=".ui.main.MainActivity">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
 
                 <category android:name="android.intent.category.LAUNCHER" />
             </intent-filter>
-        </activity>
+        </activity-alias>
         <!-- 图标6 -->
-        <activity
+        <activity-alias
             android:name=".ui.welcome.Launcher6"
             android:enabled="false"
             android:exported="true"
-            android:icon="@mipmap/launcher6">
+            android:icon="@mipmap/launcher6"
+            android:targetActivity=".ui.main.MainActivity">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
 
                 <category android:name="android.intent.category.LAUNCHER" />
             </intent-filter>
-        </activity>
+        </activity-alias>
         <!-- 主界面 -->
         <activity
             android:name=".ui.main.MainActivity"
             android:alwaysRetainTaskState="true"
             android:configChanges="locale|keyboardHidden|orientation|screenSize|smallestScreenSize|screenLayout|uiMode"
             android:exported="true"
-            android:launchMode="singleTask" />
+            android:launchMode="singleTask">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+
+                <category android:name="android.intent.category.LAUNCHER" />
+            </intent-filter>
+        </activity>
         <!-- 阅读界面 -->
         <activity
             android:name=".ui.book.read.ReadBookActivity"

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

@@ -5,6 +5,7 @@ import android.app.Notification
 import android.app.NotificationChannel
 import android.app.NotificationManager
 import android.content.Context
+import android.content.SharedPreferences
 import android.content.pm.ActivityInfo
 import android.content.pm.ApplicationInfo
 import android.content.res.Configuration
@@ -68,7 +69,6 @@ class App : Application() {
 
     override fun onCreate() {
         super.onCreate()
-        DynamicColors.applyToActivitiesIfAvailable(this)
         CrashHandler(this)
         if (isDebuggable) {
             ThreadUtils.setThreadAssertsDisabledForTesting(true)

+ 10 - 21
app/src/main/java/io/legato/kazusa/base/BaseActivity.kt

@@ -17,9 +17,11 @@ import androidx.annotation.RequiresApi
 import androidx.appcompat.app.AppCompatActivity
 import androidx.viewbinding.ViewBinding
 import com.google.android.material.appbar.AppBarLayout
+import com.google.android.material.color.DynamicColors
 import io.legato.kazusa.R
 import io.legato.kazusa.constant.AppConst
 import io.legato.kazusa.constant.AppLog
+import io.legato.kazusa.constant.PreferKey
 import io.legato.kazusa.constant.Theme
 import io.legato.kazusa.help.config.ThemeConfig
 //import io.legado.app.lib.theme.backgroundColor
@@ -27,6 +29,8 @@ import io.legato.kazusa.help.config.ThemeConfig
 import io.legato.kazusa.utils.applyOpenTint
 import io.legato.kazusa.utils.applyTint
 import io.legato.kazusa.utils.disableAutoFill
+import io.legato.kazusa.utils.getPrefBoolean
+import io.legato.kazusa.utils.getPrefString
 import io.legato.kazusa.utils.hideSoftInput
 import io.legato.kazusa.utils.toastOnUi
 import io.legato.kazusa.utils.windowSize
@@ -70,8 +74,9 @@ abstract class BaseActivity<VB : ViewBinding>(
 
     @SuppressLint("ObsoleteSdkInt")
     override fun onCreate(savedInstanceState: Bundle?) {
+        initTheme()
         window.decorView.disableAutoFill()
-        //initTheme()
+
         super.onCreate(savedInstanceState)
         //setupSystemBar()
         setContentView(binding.root)
@@ -128,26 +133,10 @@ abstract class BaseActivity<VB : ViewBinding>(
     open fun onCompatOptionsItemSelected(item: MenuItem) = super.onOptionsItemSelected(item)
 
     open fun initTheme() {
-        when (theme) {
-            Theme.Transparent -> setTheme(R.style.AppTheme_Transparent)
-            Theme.Dark -> {
-                setTheme(R.style.AppTheme_Dark)
-                //window.decorView.applyBackgroundTint(backgroundColor)
-            }
-
-            Theme.Light -> {
-                setTheme(R.style.AppTheme_Light)
-                //window.decorView.applyBackgroundTint(backgroundColor)
-            }
-
-            else -> {
-//                if (ColorUtils.isColorLight(primaryColor)) {
-//                    setTheme(R.style.AppTheme_Light)
-//                } else {
-//                    setTheme(R.style.AppTheme_Dark)
-//                }
-                //window.decorView.applyBackgroundTint(backgroundColor)
-            }
+        when (getPrefString("app_theme", "0")) {
+            "0" -> DynamicColors.applyToActivitiesIfAvailable(application)
+            "1" -> setTheme(R.style.Theme_Base_GR)
+            "2" -> setTheme(R.style.Theme_Base_WH)
         }
     }
 

+ 3 - 0
app/src/main/java/io/legato/kazusa/constant/PreferKey.kt

@@ -179,4 +179,7 @@ object PreferKey {
     const val showReadTitleAddition = "showReadTitleAddition"
     const val readBarStyleFollowPage = "readBarStyleFollowPage"
     const val contentSelectSpeakMod = "contentReadAloudMod"
+
+    const val dynamicColors = "dynamicColors"
+    const val themePref = "themePref"
 }

+ 1 - 1
app/src/main/java/io/legato/kazusa/constant/Theme.kt

@@ -1,5 +1,5 @@
 package io.legato.kazusa.constant
 
 enum class Theme {
-    Dark, Light, Auto, Transparent, EInk;
+    Dark, Light, Auto, Transparent, EInk, GR;
 }

+ 0 - 1
app/src/main/java/io/legato/kazusa/help/config/AppConfig.kt

@@ -100,7 +100,6 @@ object AppConfig : SharedPreferences.OnSharedPreferenceChangeListener {
         get() = when (themeMode) {
             "1" -> false
             "2" -> true
-            "3" -> false
             else -> sysConfiguration.isNightMode
         }
         set(value) {

+ 0 - 52
app/src/main/java/io/legato/kazusa/help/config/ThemeConfig.kt

@@ -42,7 +42,6 @@ object ThemeConfig {
     }
 
     fun getTheme() = when {
-        AppConfig.isEInkMode -> Theme.EInk
         AppConfig.isNightTheme -> Theme.Dark
         else -> Theme.Light
     }
@@ -216,58 +215,7 @@ object ThemeConfig {
      * 更新主题
      */
     fun applyTheme(context: Context) = with(context) {
-        when {
-            AppConfig.isEInkMode -> {
-                ThemeStore.editTheme(this)
-                    .primaryColor(Color.WHITE)
-                    .accentColor(Color.BLACK)
-                    .backgroundColor(Color.WHITE)
-                    .bottomBackground(Color.WHITE)
-                    .apply()
-            }
-
-            AppConfig.isNightTheme -> {
-                val primary =
-                    getPrefInt(PreferKey.cNPrimary, getCompatColor(R.color.md_blue_grey_600))
-                val accent =
-                    getPrefInt(PreferKey.cNAccent, getCompatColor(R.color.md_deep_orange_800))
-                var background =
-                    getPrefInt(PreferKey.cNBackground, getCompatColor(R.color.md_grey_900))
-                if (ColorUtils.isColorLight(background)) {
-                    background = getCompatColor(R.color.md_grey_900)
-                    putPrefInt(PreferKey.cNBackground, background)
-                }
-                val bBackground =
-                    getPrefInt(PreferKey.cNBBackground, getCompatColor(R.color.md_grey_850))
-                ThemeStore.editTheme(this)
-                    .primaryColor(ColorUtils.withAlpha(primary, 1f))
-                    .accentColor(ColorUtils.withAlpha(accent, 1f))
-                    .backgroundColor(ColorUtils.withAlpha(background, 1f))
-                    .bottomBackground(ColorUtils.withAlpha(bBackground, 1f))
-                    .apply()
-            }
 
-            else -> {
-                val primary =
-                    getPrefInt(PreferKey.cPrimary, getCompatColor(R.color.md_brown_500))
-                val accent =
-                    getPrefInt(PreferKey.cAccent, getCompatColor(R.color.md_red_600))
-                var background =
-                    getPrefInt(PreferKey.cBackground, getCompatColor(R.color.md_grey_100))
-                if (!ColorUtils.isColorLight(background)) {
-                    background = getCompatColor(R.color.md_grey_100)
-                    putPrefInt(PreferKey.cBackground, background)
-                }
-                val bBackground =
-                    getPrefInt(PreferKey.cBBackground, getCompatColor(R.color.md_grey_200))
-                ThemeStore.editTheme(this)
-                    .primaryColor(ColorUtils.withAlpha(primary, 1f))
-                    .accentColor(ColorUtils.withAlpha(accent, 1f))
-                    .backgroundColor(ColorUtils.withAlpha(background, 1f))
-                    .bottomBackground(ColorUtils.withAlpha(bBackground, 1f))
-                    .apply()
-            }
-        }
     }
 
     @Keep

+ 6 - 4
app/src/main/java/io/legato/kazusa/lib/prefs/NameListPreference.kt

@@ -6,20 +6,22 @@ import android.widget.TextView
 import androidx.preference.ListPreference
 import androidx.preference.PreferenceViewHolder
 import io.legato.kazusa.R
+import androidx.core.content.withStyledAttributes
+
 //import io.legado.app.lib.theme.bottomBackground
 //import io.legado.app.lib.theme.getPrimaryTextColor
 
 
 class NameListPreference(context: Context, attrs: AttributeSet) : ListPreference(context, attrs) {
 
-    private val isBottomBackground: Boolean
+    private var isBottomBackground: Boolean = false
 
     init {
         layoutResource = R.layout.view_preference
         widgetLayoutResource = R.layout.item_fillet_text
-        val typedArray = context.obtainStyledAttributes(attrs, R.styleable.Preference)
-        isBottomBackground = typedArray.getBoolean(R.styleable.Preference_isBottomBackground, false)
-        typedArray.recycle()
+        context.withStyledAttributes(attrs, R.styleable.Preference) {
+            isBottomBackground = getBoolean(R.styleable.Preference_isBottomBackground, false)
+        }
     }
 
     override fun onBindViewHolder(holder: PreferenceViewHolder) {

+ 1 - 1
app/src/main/java/io/legato/kazusa/lib/prefs/Preference.kt

@@ -107,7 +107,7 @@ open class Preference(context: Context, attrs: AttributeSet) :
 
     }
 
-    final override fun onBindViewHolder(holder: PreferenceViewHolder) {
+    override fun onBindViewHolder(holder: PreferenceViewHolder) {
         super.onBindViewHolder(holder)
         onBindView(holder)
         onLongClick?.let { listener ->

+ 8 - 8
app/src/main/java/io/legato/kazusa/lib/prefs/SwitchPreference.kt

@@ -6,32 +6,32 @@ import androidx.appcompat.widget.SwitchCompat
 import androidx.preference.PreferenceViewHolder
 import androidx.preference.SwitchPreferenceCompat
 import io.legato.kazusa.R
+import androidx.core.content.withStyledAttributes
+
 //import io.legado.app.lib.theme.accentColor
 
 class SwitchPreference(context: Context, attrs: AttributeSet) :
     SwitchPreferenceCompat(context, attrs) {
 
-    private val isBottomBackground: Boolean
+    private var isBottomBackground: Boolean = false
     private var onLongClick: ((preference: SwitchPreference) -> Boolean)? = null
 
     init {
         layoutResource = R.layout.view_preference
         widgetLayoutResource = R.layout.preference_widget_material_switch
-        val typedArray = context.obtainStyledAttributes(attrs, R.styleable.Preference)
-        isBottomBackground = typedArray.getBoolean(R.styleable.Preference_isBottomBackground, false)
-        typedArray.recycle()
+        context.withStyledAttributes(attrs, R.styleable.Preference) {
+            isBottomBackground = getBoolean(R.styleable.Preference_isBottomBackground, false)
+        }
     }
 
     override fun onBindViewHolder(holder: PreferenceViewHolder) {
-        val v = Preference.bindView<SwitchCompat>(
+        Preference.bindView<SwitchCompat>(
             context, holder, icon, title, summary,
             widgetLayoutResource,
             androidx.preference.R.id.switchWidget,
             isBottomBackground = isBottomBackground
         )
-        if (v is SwitchCompat && !v.isInEditMode) {
-            //v.applyTint(context.accentColor)
-        }
+
         super.onBindViewHolder(holder)
         onLongClick?.let { listener ->
             holder.itemView.setOnLongClickListener {

+ 1 - 0
app/src/main/java/io/legato/kazusa/ui/book/bookmark/AllBookmarkActivity.kt

@@ -52,6 +52,7 @@ class AllBookmarkActivity : VMBaseActivity<ActivityAllBookmarkBinding, AllBookma
     }
 
     private fun initView() {
+        setSupportActionBar(binding.topBar)
         binding.recyclerView.addItemDecoration(BookmarkDecoration(this,adapter))
         binding.recyclerView.adapter = adapter
         binding.recyclerView.applyNavigationBarPadding()

+ 1 - 1
app/src/main/java/io/legato/kazusa/ui/config/ConfigActivity.kt

@@ -28,7 +28,7 @@ class ConfigActivity : VMBaseActivity<ActivityConfigBinding, ConfigViewModel>()
 
     override fun setTitle(resId: Int) {
         super.setTitle(resId)
-        binding.titleBar.setTitle(resId)
+        binding.topBar.setTitle(resId)
     }
 
     inline fun <reified T : Fragment> replaceFragment(configTag: String) {

+ 3 - 2
app/src/main/java/io/legato/kazusa/ui/config/CoverRuleConfigDialog.kt

@@ -6,6 +6,7 @@ import android.view.View
 import android.view.ViewGroup
 import androidx.lifecycle.lifecycleScope
 import io.legato.kazusa.R
+import io.legato.kazusa.base.BaseBottomSheetDialogFragment
 import io.legato.kazusa.base.BaseDialogFragment
 import io.legato.kazusa.databinding.DialogCoverRuleConfigBinding
 //import io.legado.app.lib.theme.primaryColor
@@ -19,13 +20,13 @@ import kotlinx.coroutines.launch
 import kotlinx.coroutines.withContext
 import splitties.views.onClick
 
-class CoverRuleConfigDialog : BaseDialogFragment(R.layout.dialog_cover_rule_config) {
+class CoverRuleConfigDialog : BaseBottomSheetDialogFragment(R.layout.dialog_cover_rule_config) {
 
     val binding by viewBinding(DialogCoverRuleConfigBinding::bind)
 
     override fun onStart() {
         super.onStart()
-        setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)
+
     }
 
     override fun onFragmentCreated(view: View, savedInstanceState: Bundle?) {

+ 19 - 1
app/src/main/java/io/legato/kazusa/ui/config/ThemeConfigFragment.kt

@@ -7,6 +7,7 @@ import android.os.Build
 import android.os.Bundle
 import android.view.View
 import android.widget.SeekBar
+import androidx.preference.ListPreference
 import androidx.preference.Preference
 import androidx.preference.PreferenceFragmentCompat
 import io.legato.kazusa.R
@@ -22,6 +23,7 @@ import io.legato.kazusa.lib.dialogs.alert
 import io.legato.kazusa.lib.dialogs.selector
 import io.legato.kazusa.lib.prefs.ColorPreference
 import io.legato.kazusa.lib.prefs.NameListPreference
+import io.legato.kazusa.lib.prefs.ThemeModePreference
 //import io.legado.app.lib.theme.primaryColor
 import io.legato.kazusa.ui.widget.number.NumberPickerDialog
 import io.legato.kazusa.ui.widget.seekbar.SeekBarChangeListener
@@ -71,6 +73,7 @@ class ThemeConfigFragment : PreferenceFragmentCompat(),
         if (Build.VERSION.SDK_INT < 26) {
             preferenceScreen.removePreferenceRecursively(PreferKey.launcherIcon)
         }
+        upPreferenceSummary(PreferKey.themePref)
         upPreferenceSummary(PreferKey.bgImage, getPrefString(PreferKey.bgImage))
         upPreferenceSummary(PreferKey.bgImageN, getPrefString(PreferKey.bgImageN))
         //upPreferenceSummary(PreferKey.barElevation, AppConfig.elevation.toString())
@@ -95,12 +98,20 @@ class ThemeConfigFragment : PreferenceFragmentCompat(),
                 }
             }
         }
-        findPreference<NameListPreference>(PreferKey.themeMode)?.let {
+        findPreference<ThemeModePreference>(PreferKey.themeMode)?.let {
             it.setOnPreferenceChangeListener { _, _ ->
                 ThemeConfig.applyDayNight(requireContext())
                 true
             }
         }
+        findPreference<ListPreference>(PreferKey.themePref)?.let {
+            it.setOnPreferenceChangeListener { _, _ ->
+                val intent = requireActivity().intent
+                requireActivity().finish()
+                startActivity(intent)
+                true
+            }
+        }
     }
 
     override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
@@ -126,6 +137,11 @@ class ThemeConfigFragment : PreferenceFragmentCompat(),
             PreferKey.launcherIcon -> LauncherIconHelp.changeIcon(getPrefString(key))
             //PreferKey.transparentStatusBar -> recreateActivities()
             //PreferKey.immNavigationBar -> recreateActivities()
+            PreferKey.themePref -> {
+                val intent = requireActivity().intent
+                requireActivity().finish()
+                startActivity(intent)
+            }
             PreferKey.cPrimary,
             PreferKey.cAccent,
             PreferKey.cBackground,
@@ -139,9 +155,11 @@ class ThemeConfigFragment : PreferenceFragmentCompat(),
             PreferKey.cNBBackground -> {
                 upTheme(true)
             }
+
             PreferKey.themeMode -> {
                 ThemeConfig.applyDayNight(requireContext())
             }
+
             PreferKey.bgImage,
             PreferKey.bgImageN -> {
                 upPreferenceSummary(key, getPrefString(key))

+ 1 - 1
app/src/main/java/io/legato/kazusa/ui/welcome/WelcomeActivity.kt

@@ -27,7 +27,7 @@ open class WelcomeActivity : BaseActivity<ActivityWelcomeBinding>() {
         if (intent.flags and Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT != 0) {
             finish()
         } else {
-            binding.root.postDelayed(600) { startMainActivity() }
+            binding.root.postDelayed(100) { startMainActivity() }
         }
     }
 

+ 27 - 8
app/src/main/res/layout/activity_all_bookmark.xml

@@ -1,23 +1,42 @@
 <?xml version="1.0" encoding="utf-8"?>
-<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto"
     android:layout_width="match_parent"
     android:layout_height="match_parent">
 
-    <io.legato.kazusa.ui.widget.TitleBar
+    <com.google.android.material.appbar.AppBarLayout
         android:id="@+id/title_bar"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
-        app:layout_constraintTop_toTopOf="parent"
-        app:title="@string/all_bookmark" />
+        android:background="@color/transparent"
+        android:fitsSystemWindows="true">
+
+        <com.google.android.material.appbar.CollapsingToolbarLayout
+            android:layout_width="match_parent"
+            android:layout_height="?attr/collapsingToolbarLayoutLargeSize"
+            style="?attr/collapsingToolbarLayoutLargeSize"
+            app:titleCollapseMode="scale"
+            app:collapsedTitleTextAppearance="?attr/textAppearanceTitleLarge"
+            app:expandedTitleTextAppearance="?attr/textAppearanceHeadlineLarge"
+            app:layout_scrollFlags="scroll|exitUntilCollapsed|snap">
+
+            <com.google.android.material.appbar.MaterialToolbar
+                android:id="@+id/top_bar"
+                android:layout_width="match_parent"
+                android:layout_height="?attr/actionBarSize"
+                app:navigationIcon="@drawable/ic_arrow_back"
+                app:title="@string/all_bookmark"
+                app:layout_collapseMode="pin" />
+
+        </com.google.android.material.appbar.CollapsingToolbarLayout>
+    </com.google.android.material.appbar.AppBarLayout>
 
     <androidx.recyclerview.widget.RecyclerView
         android:id="@+id/recycler_view"
         android:layout_width="match_parent"
-        android:layout_height="0dp"
+        android:layout_height="match_parent"
         android:clipToPadding="false"
         app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
-        app:layout_constraintBottom_toBottomOf="parent"
-        app:layout_constraintTop_toBottomOf="@+id/title_bar" />
+        app:layout_behavior="@string/appbar_scrolling_view_behavior" />
 
-</androidx.constraintlayout.widget.ConstraintLayout>
+</androidx.coordinatorlayout.widget.CoordinatorLayout>

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

@@ -17,7 +17,7 @@
         android:id="@+id/app_bar"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
-        android:background="@color/transparent"
+        android:background="@android:color/transparent"
         android:fitsSystemWindows="true">
 
         <com.google.android.material.appbar.CollapsingToolbarLayout

+ 37 - 9
app/src/main/res/layout/activity_config.xml

@@ -1,21 +1,49 @@
 <?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<androidx.coordinatorlayout.widget.CoordinatorLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto"
-    android:orientation="vertical"
     android:layout_width="match_parent"
     android:layout_height="match_parent">
 
-    <io.legato.kazusa.ui.widget.TitleBar
+    <com.google.android.material.appbar.AppBarLayout
         android:id="@+id/title_bar"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
-        app:layout_constraintTop_toTopOf="parent"
-        app:title="设置" />
+        android:fitsSystemWindows="true"
+        app:liftOnScroll="false"
+        android:stateListAnimator="@null">
 
-    <LinearLayout
-        android:id="@+id/configFrameLayout"
+        <com.google.android.material.appbar.CollapsingToolbarLayout
+            android:layout_width="match_parent"
+            android:layout_height="?attr/collapsingToolbarLayoutLargeSize"
+            style="?attr/collapsingToolbarLayoutLargeSize"
+            app:collapsedTitleTextAppearance="?attr/textAppearanceTitleLarge"
+            app:expandedTitleTextAppearance="?attr/textAppearanceHeadlineLarge"
+            app:titleCollapseMode="scale"
+            app:layout_scrollFlags="scroll|exitUntilCollapsed|snap">
+
+            <com.google.android.material.appbar.MaterialToolbar
+                android:id="@+id/top_bar"
+                android:layout_width="match_parent"
+                android:layout_height="?attr/actionBarSize"
+                app:navigationIcon="@drawable/ic_arrow_back"
+                app:layout_collapseMode="pin" />
+
+        </com.google.android.material.appbar.CollapsingToolbarLayout>
+    </com.google.android.material.appbar.AppBarLayout>
+
+    <androidx.core.widget.NestedScrollView
+        android:id="@+id/configScrollView"
         android:layout_width="match_parent"
         android:layout_height="match_parent"
-        android:orientation="vertical" />
+        app:layout_behavior="@string/appbar_scrolling_view_behavior"
+        android:fillViewport="true">
+
+        <LinearLayout
+            android:id="@+id/configFrameLayout"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:orientation="vertical" />
+    </androidx.core.widget.NestedScrollView>
 
-</LinearLayout>
+</androidx.coordinatorlayout.widget.CoordinatorLayout>

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

@@ -16,14 +16,15 @@
     <androidx.constraintlayout.widget.ConstraintLayout
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
+        android:paddingVertical="8dp"
         android:paddingHorizontal="16dp">
 
         <TextView
             android:id="@+id/tv_book_name"
             android:layout_width="0dp"
             android:layout_height="wrap_content"
-            android:padding="6dp"
             android:singleLine="true"
+            android:layout_marginBottom="4dp"
             app:layout_constraintLeft_toLeftOf="parent"
             app:layout_constraintRight_toLeftOf="@+id/tv_remove"
             app:layout_constraintTop_toTopOf="parent"
@@ -34,7 +35,7 @@
             android:id="@+id/tv_reading_time"
             android:layout_width="0dp"
             android:layout_height="wrap_content"
-            android:padding="6dp"
+            style="@style/ChapterNameText"
             android:singleLine="true"
             app:layout_constraintLeft_toLeftOf="parent"
             app:layout_constraintRight_toLeftOf="@+id/tv_remove"
@@ -46,9 +47,8 @@
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             style="@style/Widget.Material3.Button.IconButton.Filled.Tonal"
-            android:padding="6dp"
             app:icon="@drawable/ic_clear_all"
-            android:text="@string/clear"
+            android:text="清除所有"
             app:layout_constraintBottom_toBottomOf="parent"
             app:layout_constraintRight_toRightOf="parent"
             app:layout_constraintTop_toTopOf="parent" />
@@ -59,7 +59,6 @@
         android:id="@+id/recycler_view"
         android:layout_width="match_parent"
         android:layout_height="match_parent"
-        android:paddingHorizontal="16dp"
         android:clipToPadding="false"
         app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" />
 

+ 7 - 7
app/src/main/res/layout/activity_replace_edit.xml

@@ -32,7 +32,7 @@
                 android:layout_height="wrap_content"
                 android:hint="@string/replace_rule_summary">
 
-                <io.legato.kazusa.lib.theme.view.ThemeEditText
+                <com.google.android.material.textfield.TextInputEditText
                     android:id="@+id/et_name"
                     android:layout_width="match_parent"
                     android:layout_height="wrap_content"
@@ -45,7 +45,7 @@
                 android:layout_height="wrap_content"
                 android:hint="@string/group">
 
-                <io.legato.kazusa.lib.theme.view.ThemeEditText
+                <com.google.android.material.textfield.TextInputEditText
                     android:id="@+id/et_group"
                     android:layout_width="match_parent"
                     android:layout_height="wrap_content"
@@ -58,7 +58,7 @@
                 android:layout_height="wrap_content"
                 android:hint="@string/replace_rule">
 
-                <io.legato.kazusa.lib.theme.view.ThemeEditText
+                <com.google.android.material.textfield.TextInputEditText
                     android:id="@+id/et_replace_rule"
                     android:layout_width="match_parent"
                     android:layout_height="wrap_content"
@@ -94,7 +94,7 @@
                 android:layout_height="wrap_content"
                 android:hint="@string/replace_to">
 
-                <io.legato.kazusa.lib.theme.view.ThemeEditText
+                <com.google.android.material.textfield.TextInputEditText
                     android:id="@+id/et_replace_to"
                     android:layout_width="match_parent"
                     android:layout_height="wrap_content"
@@ -130,7 +130,7 @@
                 android:layout_height="wrap_content"
                 android:hint="@string/replace_scope">
 
-                <io.legato.kazusa.lib.theme.view.ThemeEditText
+                <com.google.android.material.textfield.TextInputEditText
                     android:id="@+id/et_scope"
                     android:layout_width="match_parent"
                     android:layout_height="wrap_content"
@@ -143,7 +143,7 @@
                 android:layout_height="wrap_content"
                 android:hint="@string/replace_exclude_scope">
 
-                <io.legato.kazusa.lib.theme.view.ThemeEditText
+                <com.google.android.material.textfield.TextInputEditText
                     android:id="@+id/et_exclude_scope"
                     android:layout_width="match_parent"
                     android:layout_height="wrap_content"
@@ -156,7 +156,7 @@
                 android:layout_height="wrap_content"
                 android:hint="@string/timeout_millisecond">
 
-                <io.legato.kazusa.lib.theme.view.ThemeEditText
+                <com.google.android.material.textfield.TextInputEditText
                     android:id="@+id/et_timeout"
                     android:layout_width="match_parent"
                     android:layout_height="wrap_content"

+ 42 - 27
app/src/main/res/layout/dialog_check_source_config.xml

@@ -4,24 +4,41 @@
     xmlns:tools="http://schemas.android.com/tools"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
-    android:orientation="vertical">
+    android:orientation="vertical"
+    android:paddingHorizontal="16dp"
+    android:paddingVertical="8dp">
 
-    <androidx.appcompat.widget.Toolbar
-        android:id="@+id/tool_bar"
+    <LinearLayout
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
-        android:theme="?attr/actionBarStyle"
-        app:title="@string/check_source_config"
-        app:titleTextAppearance="@style/ToolbarTitle" />
+        android:orientation="vertical"
+        android:gravity="center"
+        android:paddingVertical="8dp"
+        android:paddingHorizontal="16dp">
 
-    <io.legato.kazusa.ui.widget.text.TextInputLayout
+        <View
+            android:layout_width="36dp"
+            android:layout_height="4dp"
+            android:layout_gravity="center_horizontal"
+            android:background="@drawable/bg_bottom_sheet_handle"
+            android:layout_marginBottom="16dp" />
+
+        <TextView
+            android:id="@+id/bottom_sheet_title"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:text="@string/check_source_config"
+            android:textSize="18sp"
+            android:textStyle="bold" />
+
+    </LinearLayout>
+
+    <com.google.android.material.textfield.TextInputLayout
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
-        android:paddingLeft="12dp"
-        android:paddingRight="12dp"
-        android:paddingTop="3dp">
+        android:paddingTop="8dp">
 
-        <io.legato.kazusa.lib.theme.view.ThemeEditText
+        <com.google.android.material.textfield.TextInputEditText
             android:id="@+id/check_source_timeout"
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
@@ -29,43 +46,42 @@
             android:digits="1234567890"
             tools:ignore="SpeakableTextPresentCheck,TouchTargetSizeCheck" />
 
-    </io.legato.kazusa.ui.widget.text.TextInputLayout>
+    </com.google.android.material.textfield.TextInputLayout>
 
-    <io.legato.kazusa.ui.widget.text.AccentTextView
-        android:paddingLeft="12dp"
+    <TextView
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
+        android:paddingVertical="8dp"
         android:text="@string/check_source_item" />
 
     <com.google.android.flexbox.FlexboxLayout
         android:layout_width="match_parent"
-        android:paddingLeft="12dp"
-        android:paddingRight="12dp"
+
         android:layout_height="wrap_content"
         app:flexWrap="wrap"
         app:justifyContent="space_between">
 
-        <io.legato.kazusa.lib.theme.view.ThemeCheckBox
+        <com.google.android.material.checkbox.MaterialCheckBox
             android:id="@+id/check_search"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:text="@string/search" />
-        <io.legato.kazusa.lib.theme.view.ThemeCheckBox
+        <com.google.android.material.checkbox.MaterialCheckBox
             android:id="@+id/check_discovery"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:text="@string/discovery" />
-        <io.legato.kazusa.lib.theme.view.ThemeCheckBox
+        <com.google.android.material.checkbox.MaterialCheckBox
             android:id="@+id/check_info"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:text="@string/source_tab_info" />
-        <io.legato.kazusa.lib.theme.view.ThemeCheckBox
+        <com.google.android.material.checkbox.MaterialCheckBox
             android:id="@+id/check_category"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:text="@string/chapter_list" />
-        <io.legato.kazusa.lib.theme.view.ThemeCheckBox
+        <com.google.android.material.checkbox.MaterialCheckBox
             android:id="@+id/check_content"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
@@ -76,23 +92,22 @@
     <com.google.android.flexbox.FlexboxLayout
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
-        android:paddingLeft="12dp"
-        android:paddingRight="12dp"
         app:justifyContent="flex_end">
 
-        <io.legato.kazusa.ui.widget.text.AccentTextView
+        <com.google.android.material.button.MaterialButton
             android:id="@+id/tv_cancel"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
-            android:padding="12dp"
+            style="@style/Widget.Material3.Button.TonalButton"
+            android:layout_marginEnd="8dp"
             android:text="@string/cancel"
             tools:ignore="RtlHardcoded" />
 
-        <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:padding="12dp"
+            style="@style/Widget.Material3.Button.TonalButton"
             android:text="@string/ok"
             tools:ignore="RtlHardcoded" />
 

+ 36 - 19
app/src/main/res/layout/dialog_cover_rule_config.xml

@@ -6,13 +6,30 @@
     xmlns:tools="http://schemas.android.com/tools"
     android:orientation="vertical">
 
-    <androidx.appcompat.widget.Toolbar
-        android:id="@+id/tool_bar"
+    <LinearLayout
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
-        android:theme="?attr/actionBarStyle"
-        app:title="@string/cover_config"
-        app:titleTextAppearance="@style/ToolbarTitle" />
+        android:orientation="vertical"
+        android:gravity="center"
+        android:paddingVertical="16dp"
+        android:paddingHorizontal="16dp">
+
+        <View
+            android:layout_width="36dp"
+            android:layout_height="4dp"
+            android:layout_gravity="center_horizontal"
+            android:background="@drawable/bg_bottom_sheet_handle"
+            android:layout_marginBottom="16dp" />
+
+        <TextView
+            android:id="@+id/bottom_sheet_title"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:text="@string/cover_config"
+            android:textSize="18sp"
+            android:textStyle="bold" />
+
+    </LinearLayout>
 
     <androidx.core.widget.NestedScrollView
         android:layout_width="match_parent"
@@ -25,39 +42,39 @@
             android:orientation="vertical"
             android:padding="16dp">
 
-            <io.legato.kazusa.lib.theme.view.ThemeCheckBox
+            <com.google.android.material.checkbox.MaterialCheckBox
                 android:id="@+id/cb_enable"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
                 android:text="@string/enable" />
 
-            <io.legato.kazusa.ui.widget.text.TextInputLayout
+            <com.google.android.material.textfield.TextInputLayout
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content"
                 android:paddingTop="3dp">
 
-                <io.legato.kazusa.lib.theme.view.ThemeEditText
+                <com.google.android.material.textfield.TextInputEditText
                     android:id="@+id/edit_search_url"
                     android:layout_width="match_parent"
                     android:layout_height="wrap_content"
                     android:hint="@string/r_search_url"
                     tools:ignore="SpeakableTextPresentCheck,TouchTargetSizeCheck" />
 
-            </io.legato.kazusa.ui.widget.text.TextInputLayout>
+            </com.google.android.material.textfield.TextInputLayout>
 
-            <io.legato.kazusa.ui.widget.text.TextInputLayout
+            <com.google.android.material.textfield.TextInputLayout
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content"
                 android:paddingTop="3dp">
 
-                <io.legato.kazusa.lib.theme.view.ThemeEditText
+                <com.google.android.material.textfield.TextInputEditText
                     android:id="@+id/edit_cover_url_rule"
                     android:layout_width="match_parent"
                     android:layout_height="wrap_content"
                     android:hint="@string/rule_cover_url"
                     tools:ignore="SpeakableTextPresentCheck,TouchTargetSizeCheck" />
 
-            </io.legato.kazusa.ui.widget.text.TextInputLayout>
+            </com.google.android.material.textfield.TextInputLayout>
 
         </LinearLayout>
 
@@ -71,11 +88,11 @@
         app:flexWrap="wrap"
         app:justifyContent="space_between">
 
-        <io.legato.kazusa.ui.widget.text.AccentTextView
+        <com.google.android.material.button.MaterialButton
             android:id="@+id/tv_footer_left"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
-            android:padding="12dp"
+            style="@style/Widget.Material3.Button.TonalButton"
             android:text="@string/btn_default_s"
             tools:ignore="RtlHardcoded" />
 
@@ -84,20 +101,20 @@
             android:layout_height="wrap_content"
             android:orientation="horizontal">
 
-            <TextView
+            <com.google.android.material.button.MaterialButton
                 android:id="@+id/tv_cancel"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
-                android:padding="12dp"
+                style="@style/Widget.Material3.Button.TonalButton"
+                android:layout_marginEnd="8dp"
                 android:text="@string/cancel"
-                android:textColor="@color/secondaryText"
                 tools:ignore="RtlHardcoded" />
 
-            <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:padding="12dp"
+                style="@style/Widget.Material3.Button.TonalButton"
                 android:text="@string/ok"
                 tools:ignore="RtlHardcoded" />
 

+ 21 - 21
app/src/main/res/layout/dialog_direct_link_upload_config.xml

@@ -24,49 +24,49 @@
             android:orientation="vertical"
             android:padding="16dp">
 
-            <io.legato.kazusa.ui.widget.text.TextInputLayout
+            <com.google.android.material.textfield.TextInputLayout
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content"
-                android:paddingTop="3dp">
+                android:paddingTop="8dp">
 
-                <io.legato.kazusa.lib.theme.view.ThemeEditText
+                <com.google.android.material.textfield.TextInputEditText
                     android:id="@+id/edit_upload_url"
                     android:layout_width="match_parent"
                     android:layout_height="wrap_content"
                     android:hint="@string/upload_url"
                     tools:ignore="SpeakableTextPresentCheck,TouchTargetSizeCheck" />
 
-            </io.legato.kazusa.ui.widget.text.TextInputLayout>
+            </com.google.android.material.textfield.TextInputLayout>
 
-            <io.legato.kazusa.ui.widget.text.TextInputLayout
+            <com.google.android.material.textfield.TextInputLayout
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content"
-                android:paddingTop="3dp">
+                android:paddingTop="8dp">
 
-                <io.legato.kazusa.lib.theme.view.ThemeEditText
+                <com.google.android.material.textfield.TextInputEditText
                     android:id="@+id/edit_download_url_rule"
                     android:layout_width="match_parent"
                     android:layout_height="wrap_content"
                     android:hint="@string/download_url_rule"
                     tools:ignore="SpeakableTextPresentCheck,TouchTargetSizeCheck" />
 
-            </io.legato.kazusa.ui.widget.text.TextInputLayout>
+            </com.google.android.material.textfield.TextInputLayout>
 
-            <io.legato.kazusa.ui.widget.text.TextInputLayout
+            <com.google.android.material.textfield.TextInputLayout
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content"
-                android:paddingTop="3dp">
+                android:paddingTop="8dp">
 
-                <io.legato.kazusa.lib.theme.view.ThemeEditText
+                <com.google.android.material.textfield.TextInputEditText
                     android:id="@+id/edit_summary"
                     android:layout_width="match_parent"
                     android:layout_height="wrap_content"
                     android:hint="@string/summary"
                     tools:ignore="SpeakableTextPresentCheck,TouchTargetSizeCheck" />
 
-            </io.legato.kazusa.ui.widget.text.TextInputLayout>
+            </com.google.android.material.textfield.TextInputLayout>
 
-            <io.legato.kazusa.lib.theme.view.ThemeCheckBox
+            <com.google.android.material.checkbox.MaterialCheckBox
                 android:id="@+id/cb_compress"
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content"
@@ -80,16 +80,15 @@
     <com.google.android.flexbox.FlexboxLayout
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
-        android:paddingLeft="12dp"
-        android:paddingRight="12dp"
+        android:paddingHorizontal="16dp"
         app:flexWrap="wrap"
         app:justifyContent="space_between">
 
-        <io.legato.kazusa.ui.widget.text.AccentTextView
+        <com.google.android.material.button.MaterialButton
             android:id="@+id/tv_footer_left"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
-            android:padding="12dp"
+            style="@style/Widget.Material3.Button.TonalButton"
             android:text="@string/test"
             tools:ignore="RtlHardcoded" />
 
@@ -98,19 +97,20 @@
             android:layout_height="wrap_content"
             android:orientation="horizontal">
 
-            <io.legato.kazusa.ui.widget.text.AccentTextView
+            <com.google.android.material.button.MaterialButton
                 android:id="@+id/tv_cancel"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
-                android:padding="12dp"
+                style="@style/Widget.Material3.Button.TonalButton"
+                android:layout_marginEnd="8dp"
                 android:text="@string/cancel"
                 tools:ignore="RtlHardcoded" />
 
-            <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:padding="12dp"
+                style="@style/Widget.Material3.Button.TonalButton"
                 android:text="@string/ok"
                 tools:ignore="RtlHardcoded" />
 

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

@@ -24,7 +24,6 @@
             app:title="@string/login"
             app:displayHomeAsUp="false"
             app:fitStatusBar="false"
-            app:popupTheme="@style/AppTheme.PopupOverlay"
             app:titleTextAppearance="@style/ToolbarTitle" />
 
         <androidx.core.widget.NestedScrollView

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

@@ -11,7 +11,6 @@
         android:layout_height="wrap_content"
         android:elevation="5dp"
         android:theme="?attr/actionBarStyle"
-        app:popupTheme="@style/AppTheme.PopupOverlay"
         app:title="跳转确认"
         app:titleTextAppearance="@style/ToolbarTitle" />
 

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

@@ -20,7 +20,6 @@
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
             android:theme="?attr/actionBarStyle"
-            app:popupTheme="@style/AppTheme.PopupOverlay"
             app:title="@string/favorite"
             app:titleTextAppearance="@style/ToolbarTitle" />
 

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

@@ -14,7 +14,6 @@
         app:displayHomeAsUp="false"
         app:fitStatusBar="false"
         app:layout_constraintTop_toTopOf="parent"
-        app:popupTheme="@style/AppTheme.PopupOverlay"
         app:title="@string/search_scope"
         app:titleTextAppearance="@style/ToolbarTitle" />
 

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

@@ -14,7 +14,6 @@
         app:attachToActivity="false"
         app:contentLayout="@layout/view_search"
         app:fitStatusBar="false"
-        app:popupTheme="@style/AppTheme.PopupOverlay"
         app:titleTextAppearance="@style/ToolbarTitle"
         tools:ignore="RtlHardcoded,RtlSymmetry" />
 

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

@@ -10,7 +10,6 @@
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
         android:theme="?attr/actionBarStyle"
-        app:popupTheme="@style/AppTheme.PopupOverlay"
         app:titleTextAppearance="@style/ToolbarTitle"
         app:layout_constraintTop_toTopOf="parent" />
 

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

@@ -11,8 +11,7 @@
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
         android:theme="?attr/actionBarStyle"
-        app:titleTextAppearance="@style/ToolbarTitle"
-        app:popupTheme="@style/AppTheme.PopupOverlay" />
+        app:titleTextAppearance="@style/ToolbarTitle" />
 
     <androidx.recyclerview.widget.RecyclerView
         android:id="@+id/recycler_view"

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

@@ -2,7 +2,7 @@
 <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:layout_width="wrap_content"
+    android:layout_width="match_parent"
     android:layout_height="wrap_content"
     android:padding="16dp">
 
@@ -20,7 +20,6 @@
             android:theme="?attr/actionBarStyle"
             app:displayHomeAsUp="false"
             app:fitStatusBar="false"
-            app:popupTheme="@style/AppTheme.PopupOverlay"
             app:title="@string/txt_toc_rule"
             app:titleTextAppearance="@style/ToolbarTitle" />
 

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

@@ -10,7 +10,6 @@
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
         android:theme="?attr/actionBarStyle"
-        app:popupTheme="@style/AppTheme.PopupOverlay"
         app:titleTextAppearance="@style/ToolbarTitle" />
 
     <io.legato.kazusa.ui.widget.text.ScrollTextView

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

@@ -23,7 +23,6 @@
             app:displayHomeAsUp="false"
             app:fitStatusBar="false"
             app:title="Set variable"
-            app:popupTheme="@style/AppTheme.PopupOverlay"
             app:titleTextAppearance="@style/ToolbarTitle" />
 
         <io.legato.kazusa.ui.widget.text.AccentTextView

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

@@ -12,7 +12,6 @@
         android:layout_height="wrap_content"
         android:elevation="5dp"
         android:theme="?attr/actionBarStyle"
-        app:popupTheme="@style/AppTheme.PopupOverlay"
         app:title="@string/input_verification_code"
         app:titleTextAppearance="@style/ToolbarTitle" />
 

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

@@ -25,7 +25,6 @@
             app:title="@string/server_config"
             app:displayHomeAsUp="false"
             app:fitStatusBar="false"
-            app:popupTheme="@style/AppTheme.PopupOverlay"
             app:titleTextAppearance="@style/ToolbarTitle" />
 
         <io.legato.kazusa.ui.widget.text.TextInputLayout

+ 3 - 3
app/src/main/res/layout/item_replace_rule.xml

@@ -11,19 +11,19 @@
     android:paddingEnd="16dp"
     android:background="?attr/selectableItemBackground">
 
-    <io.legato.kazusa.lib.theme.view.ThemeCheckBox
+    <com.google.android.material.checkbox.MaterialCheckBox
         android:id="@+id/cb_name"
         android:layout_width="0dp"
         android:layout_height="wrap_content"
         android:scrollbars="none"
-        android:singleLine="true"
+        android:maxLines="2"
         app:layout_constraintBottom_toBottomOf="parent"
         app:layout_constraintLeft_toLeftOf="parent"
         app:layout_constraintRight_toLeftOf="@+id/swt_enabled"
         app:layout_constraintTop_toTopOf="parent"
         tools:ignore="RtlSymmetry" />
 
-    <io.legato.kazusa.lib.theme.view.ThemeSwitch
+    <com.google.android.material.materialswitch.MaterialSwitch
         android:id="@+id/swt_enabled"
         android:name="@string/enable"
         android:layout_width="wrap_content"

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

@@ -12,11 +12,12 @@
 
     <androidx.appcompat.widget.AppCompatTextView
         android:id="@+id/tv_error_message"
-        style="@style/Style.Text.Primary.Normal"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
         android:paddingTop="16dp"
         android:paddingBottom="16dp" />
 
-    <androidx.appcompat.widget.AppCompatButton
+    <com.google.android.material.button.MaterialButton
         android:id="@+id/btn_error_retry"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"

+ 3 - 3
app/src/main/res/layout/view_loading.xml

@@ -8,12 +8,12 @@
     <androidx.core.widget.ContentLoadingProgressBar
         android:id="@+id/loading_progress"
         android:layout_width="48dp"
-        android:layout_height="48dp"
-        style="@style/Widget.AppCompat.ProgressBar" />
+        android:layout_height="48dp" />
 
     <androidx.appcompat.widget.AppCompatTextView
         android:id="@+id/tv_loading_message"
-        style="@style/Style.Text.Second.Normal.Wrap"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
         android:paddingTop="16dp"
         android:text="@string/dynamic_loading" />
 </LinearLayout>

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

@@ -35,7 +35,7 @@
         <TextView
             android:id="@+id/preference_title"
             android:singleLine="true"
-            android:textSize="16sp"
+            android:textSize="18sp"
             android:text="@string/title"
             android:layout_width="match_parent"
             android:layout_height="wrap_content" />

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

@@ -4,6 +4,4 @@
     android:id="@+id/toolbar"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
-    android:theme="@style/AppTheme.AppBarOverlay.Dark"
-    app:titleTextAppearance="@style/ToolbarTitle"
-    app:popupTheme="@style/AppTheme.PopupOverlay" />
+    app:titleTextAppearance="@style/ToolbarTitle" />

+ 0 - 1
app/src/main/res/values-es-rES/arrays.xml

@@ -36,7 +36,6 @@
 		<item>Adaptar do sistema</item>
 		<item>Tema Claro</item>
 		<item>Tema Oscuro</item>
-		<item>Tema E-Ink</item>
 	</string-array>
 
 	<string-array name="NavBarColors">

+ 48 - 94
app/src/main/res/values-night/colors.xml

@@ -47,100 +47,54 @@
     <color name="md_theme_surfaceContainer">#1E201A</color>
     <color name="md_theme_surfaceContainerHigh">#282B24</color>
     <color name="md_theme_surfaceContainerHighest">#33362E</color>
-    <color name="md_theme_primary_mediumContrast">#C7E79E</color>
-    <color name="md_theme_onPrimary_mediumContrast">#172B00</color>
-    <color name="md_theme_primaryContainer_mediumContrast">#7D9A59</color>
-    <color name="md_theme_onPrimaryContainer_mediumContrast">#000000</color>
-    <color name="md_theme_secondary_mediumContrast">#D5E1C2</color>
-    <color name="md_theme_onSecondary_mediumContrast">#1F2814</color>
-    <color name="md_theme_secondaryContainer_mediumContrast">#8A9579</color>
-    <color name="md_theme_onSecondaryContainer_mediumContrast">#000000</color>
-    <color name="md_theme_tertiary_mediumContrast">#B5E6E1</color>
-    <color name="md_theme_onTertiary_mediumContrast">#002B29</color>
-    <color name="md_theme_tertiaryContainer_mediumContrast">#6B9995</color>
-    <color name="md_theme_onTertiaryContainer_mediumContrast">#000000</color>
-    <color name="md_theme_error_mediumContrast">#FFD2CC</color>
-    <color name="md_theme_onError_mediumContrast">#540003</color>
-    <color name="md_theme_errorContainer_mediumContrast">#FF5449</color>
-    <color name="md_theme_onErrorContainer_mediumContrast">#000000</color>
-    <color name="md_theme_background_mediumContrast">#12140E</color>
-    <color name="md_theme_onBackground_mediumContrast">#E2E3D8</color>
-    <color name="md_theme_surface_mediumContrast">#12140E</color>
-    <color name="md_theme_onSurface_mediumContrast">#FFFFFF</color>
-    <color name="md_theme_surfaceVariant_mediumContrast">#44483D</color>
-    <color name="md_theme_onSurfaceVariant_mediumContrast">#DBDECF</color>
-    <color name="md_theme_outline_mediumContrast">#B0B3A6</color>
-    <color name="md_theme_outlineVariant_mediumContrast">#8E9285</color>
-    <color name="md_theme_scrim_mediumContrast">#000000</color>
-    <color name="md_theme_inverseSurface_mediumContrast">#E2E3D8</color>
-    <color name="md_theme_inverseOnSurface_mediumContrast">#282B24</color>
-    <color name="md_theme_inversePrimary_mediumContrast">#364F17</color>
-    <color name="md_theme_primaryFixed_mediumContrast">#CDEDA3</color>
-    <color name="md_theme_onPrimaryFixed_mediumContrast">#081400</color>
-    <color name="md_theme_primaryFixedDim_mediumContrast">#B1D18A</color>
-    <color name="md_theme_onPrimaryFixedVariant_mediumContrast">#253D05</color>
-    <color name="md_theme_secondaryFixed_mediumContrast">#DCE7C8</color>
-    <color name="md_theme_onSecondaryFixed_mediumContrast">#0B1403</color>
-    <color name="md_theme_secondaryFixedDim_mediumContrast">#BFCBAD</color>
-    <color name="md_theme_onSecondaryFixedVariant_mediumContrast">#303924</color>
-    <color name="md_theme_tertiaryFixed_mediumContrast">#BCECE7</color>
-    <color name="md_theme_onTertiaryFixed_mediumContrast">#001413</color>
-    <color name="md_theme_tertiaryFixedDim_mediumContrast">#A0D0CB</color>
-    <color name="md_theme_onTertiaryFixedVariant_mediumContrast">#083D3A</color>
-    <color name="md_theme_surfaceDim_mediumContrast">#12140E</color>
-    <color name="md_theme_surfaceBright_mediumContrast">#43453D</color>
-    <color name="md_theme_surfaceContainerLowest_mediumContrast">#060804</color>
-    <color name="md_theme_surfaceContainerLow_mediumContrast">#1C1E18</color>
-    <color name="md_theme_surfaceContainer_mediumContrast">#262922</color>
-    <color name="md_theme_surfaceContainerHigh_mediumContrast">#31342C</color>
-    <color name="md_theme_surfaceContainerHighest_mediumContrast">#3C3F37</color>
-    <color name="md_theme_primary_highContrast">#DAFBB0</color>
-    <color name="md_theme_onPrimary_highContrast">#000000</color>
-    <color name="md_theme_primaryContainer_highContrast">#ADCD86</color>
-    <color name="md_theme_onPrimaryContainer_highContrast">#050E00</color>
-    <color name="md_theme_secondary_highContrast">#E9F4D5</color>
-    <color name="md_theme_onSecondary_highContrast">#000000</color>
-    <color name="md_theme_secondaryContainer_highContrast">#BCC7A9</color>
-    <color name="md_theme_onSecondaryContainer_highContrast">#060D01</color>
-    <color name="md_theme_tertiary_highContrast">#C9F9F5</color>
-    <color name="md_theme_onTertiary_highContrast">#000000</color>
-    <color name="md_theme_tertiaryContainer_highContrast">#9CCCC7</color>
-    <color name="md_theme_onTertiaryContainer_highContrast">#000E0D</color>
-    <color name="md_theme_error_highContrast">#FFECE9</color>
-    <color name="md_theme_onError_highContrast">#000000</color>
-    <color name="md_theme_errorContainer_highContrast">#FFAEA4</color>
-    <color name="md_theme_onErrorContainer_highContrast">#220001</color>
-    <color name="md_theme_background_highContrast">#12140E</color>
-    <color name="md_theme_onBackground_highContrast">#E2E3D8</color>
-    <color name="md_theme_surface_highContrast">#12140E</color>
-    <color name="md_theme_onSurface_highContrast">#FFFFFF</color>
-    <color name="md_theme_surfaceVariant_highContrast">#44483D</color>
-    <color name="md_theme_onSurfaceVariant_highContrast">#FFFFFF</color>
-    <color name="md_theme_outline_highContrast">#EEF2E2</color>
-    <color name="md_theme_outlineVariant_highContrast">#C1C4B6</color>
-    <color name="md_theme_scrim_highContrast">#000000</color>
-    <color name="md_theme_inverseSurface_highContrast">#E2E3D8</color>
-    <color name="md_theme_inverseOnSurface_highContrast">#000000</color>
-    <color name="md_theme_inversePrimary_highContrast">#364F17</color>
-    <color name="md_theme_primaryFixed_highContrast">#CDEDA3</color>
-    <color name="md_theme_onPrimaryFixed_highContrast">#000000</color>
-    <color name="md_theme_primaryFixedDim_highContrast">#B1D18A</color>
-    <color name="md_theme_onPrimaryFixedVariant_highContrast">#081400</color>
-    <color name="md_theme_secondaryFixed_highContrast">#DCE7C8</color>
-    <color name="md_theme_onSecondaryFixed_highContrast">#000000</color>
-    <color name="md_theme_secondaryFixedDim_highContrast">#BFCBAD</color>
-    <color name="md_theme_onSecondaryFixedVariant_highContrast">#0B1403</color>
-    <color name="md_theme_tertiaryFixed_highContrast">#BCECE7</color>
-    <color name="md_theme_onTertiaryFixed_highContrast">#000000</color>
-    <color name="md_theme_tertiaryFixedDim_highContrast">#A0D0CB</color>
-    <color name="md_theme_onTertiaryFixedVariant_highContrast">#001413</color>
-    <color name="md_theme_surfaceDim_highContrast">#12140E</color>
-    <color name="md_theme_surfaceBright_highContrast">#4F5149</color>
-    <color name="md_theme_surfaceContainerLowest_highContrast">#000000</color>
-    <color name="md_theme_surfaceContainerLow_highContrast">#1E201A</color>
-    <color name="md_theme_surfaceContainer_highContrast">#2F312A</color>
-    <color name="md_theme_surfaceContainerHigh_highContrast">#3A3C35</color>
-    <color name="md_theme_surfaceContainerHighest_highContrast">#454840</color>
+
+    <color name="wh_theme_primary">#C7C6C6</color>
+    <color name="wh_theme_onPrimary">#303031</color>
+    <color name="wh_theme_primaryContainer">#919090</color>
+    <color name="wh_theme_onPrimaryContainer">#050606</color>
+    <color name="wh_theme_secondary">#C8C6C5</color>
+    <color name="wh_theme_onSecondary">#303030</color>
+    <color name="wh_theme_secondaryContainer">#474746</color>
+    <color name="wh_theme_onSecondaryContainer">#B7B5B4</color>
+    <color name="wh_theme_tertiary">#CBC5C7</color>
+    <color name="wh_theme_onTertiary">#323031</color>
+    <color name="wh_theme_tertiaryContainer">#948F91</color>
+    <color name="wh_theme_onTertiaryContainer">#060506</color>
+    <color name="wh_theme_error">#FFB4AB</color>
+    <color name="wh_theme_onError">#690005</color>
+    <color name="wh_theme_errorContainer">#93000A</color>
+    <color name="wh_theme_onErrorContainer">#FFDAD6</color>
+    <color name="wh_theme_background">#141313</color>
+    <color name="wh_theme_onBackground">#E5E2E1</color>
+    <color name="wh_theme_surface">#141313</color>
+    <color name="wh_theme_onSurface">#E5E2E1</color>
+    <color name="wh_theme_surfaceVariant">#444748</color>
+    <color name="wh_theme_onSurfaceVariant">#C4C7C7</color>
+    <color name="wh_theme_outline">#8E9192</color>
+    <color name="wh_theme_outlineVariant">#444748</color>
+    <color name="wh_theme_scrim">#000000</color>
+    <color name="wh_theme_inverseSurface">#E5E2E1</color>
+    <color name="wh_theme_inverseOnSurface">#313030</color>
+    <color name="wh_theme_inversePrimary">#5E5E5E</color>
+    <color name="wh_theme_primaryFixed">#E3E2E2</color>
+    <color name="wh_theme_onPrimaryFixed">#1B1C1C</color>
+    <color name="wh_theme_primaryFixedDim">#C7C6C6</color>
+    <color name="wh_theme_onPrimaryFixedVariant">#464747</color>
+    <color name="wh_theme_secondaryFixed">#E5E2E1</color>
+    <color name="wh_theme_onSecondaryFixed">#1B1C1C</color>
+    <color name="wh_theme_secondaryFixedDim">#C8C6C5</color>
+    <color name="wh_theme_onSecondaryFixedVariant">#474746</color>
+    <color name="wh_theme_tertiaryFixed">#E7E1E3</color>
+    <color name="wh_theme_onTertiaryFixed">#1D1B1D</color>
+    <color name="wh_theme_tertiaryFixedDim">#CBC5C7</color>
+    <color name="wh_theme_onTertiaryFixedVariant">#494648</color>
+    <color name="wh_theme_surfaceDim">#141313</color>
+    <color name="wh_theme_surfaceBright">#3A3939</color>
+    <color name="wh_theme_surfaceContainerLowest">#0E0E0E</color>
+    <color name="wh_theme_surfaceContainerLow">#1C1B1B</color>
+    <color name="wh_theme_surfaceContainer">#201F1F</color>
+    <color name="wh_theme_surfaceContainerHigh">#2A2A2A</color>
+    <color name="wh_theme_surfaceContainerHighest">#353434</color>
 
     <color name="disabled">@color/md_dark_disabled</color>
 

+ 0 - 24
app/src/main/res/values-night/styles.xml

@@ -1,24 +0,0 @@
-<resources>
-
-    <style name="Base.AppTheme" parent="Theme.Material3.DayNight.NoActionBar">
-        <item name="android:windowDrawsSystemBarBackgrounds">true</item>
-        <item name="android:windowLightStatusBar">false</item>
-        <item name="tabStyle">@style/Widget.App.TabLayout</item>
-    </style>
-
-    <style name="AppTheme.PopupOverlay" parent="ThemeOverlay.AppCompat.Dark">
-
-    </style>
-
-    <style name="Style.Shadow.Top" parent="android:Widget">
-        <item name="android:layout_width">match_parent</item>
-        <item name="android:layout_height">@dimen/shadow_height</item>
-        <item name="android:background">@drawable/bg_shadow_top_night</item>
-    </style>
-
-    <style name="Style.Shadow.Bottom" parent="android:Widget">
-        <item name="android:layout_width">match_parent</item>
-        <item name="android:layout_height">@dimen/shadow_height</item>
-        <item name="android:background">@drawable/bg_shadow_bottom_night</item>
-    </style>
-</resources>

+ 0 - 1
app/src/main/res/values-pt-rBR/arrays.xml

@@ -36,7 +36,6 @@
 		<item>Adaptar do sistema</item>
 		<item>Tema Claro</item>
 		<item>Tema Escuro</item>
-		<item>Tema E-Ink</item>
 	</string-array>
 
 	<string-array name="NavBarColors">

+ 0 - 1
app/src/main/res/values-vi/arrays.xml

@@ -23,7 +23,6 @@
         <item>Làm theo hệ thống</item>
         <item>Chủ đề màu sáng</item>
         <item>Chủ đề tối</item>
-        <item>E-Ink (màn hình mực).</item>
     </string-array>
 
     <string-array name="NavBarColors">

+ 0 - 1
app/src/main/res/values-zh-rHK/arrays.xml

@@ -17,7 +17,6 @@
         <item>跟隨系統</item>
         <item>亮色主題</item>
         <item>暗色主題</item>
-        <item>E-Ink(墨水螢幕)</item>
     </string-array>
 
     <string-array name="NavBarColors">

+ 0 - 1
app/src/main/res/values-zh-rTW/arrays.xml

@@ -22,7 +22,6 @@
         <item>跟隨系統</item>
         <item>亮色主題</item>
         <item>暗色主題</item>
-        <item>E-Ink(墨水屏)</item>
     </string-array>
 
     <string-array name="NavBarColors">

+ 0 - 1
app/src/main/res/values-zh/arrays.xml

@@ -22,7 +22,6 @@
         <item>跟随系统</item>
         <item>亮色主题</item>
         <item>暗色主题</item>
-        <item>E-Ink(墨水屏)</item>
     </string-array>
 
     <string-array name="double_page_title">

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

@@ -478,7 +478,7 @@
     <string name="scan_qr_code">扫描二维码</string>
     <string name="click_on_selected_show_menu">选中时点击可弹出菜单</string>
     <string name="theme">主题</string>
-    <string name="theme_mode">主题模式</string>
+    <string name="theme_mode">深色模式</string>
     <string name="theme_mode_desc">选择主题模式</string>
     <string name="join_qq_group">加入 QQ 群</string>
     <string name="bg_image_per">获取背景图片需存储权限</string>

+ 6 - 1
app/src/main/res/values/array_values.xml

@@ -23,7 +23,12 @@
         <item>0</item>
         <item>1</item>
         <item>2</item>
-        <item>3</item>
+    </string-array>
+
+    <string-array name="themes_value">
+        <item>0</item>
+        <item>1</item>
+        <item>2</item>
     </string-array>
 
     <string-array name="screen_direction_value">

+ 7 - 1
app/src/main/res/values/arrays.xml

@@ -51,9 +51,15 @@
 		<item>Follow system</item>
 		<item>Bright mode</item>
 		<item>Dark mode</item>
-		<item>E-Ink mode</item>
 	</string-array>
 
+	<string-array name="themes_item">
+		<item>动态取色</item>
+		<item>草野</item>
+		<item>黑白</item>
+	</string-array>
+
+
 	<string-array name="NavBarColors">
 		<item>Auto</item>
 		<item>Black</item>

+ 51 - 94
app/src/main/res/values/colors.xml

@@ -1,6 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
 <resources>
 
+    <!--    GR Theme-->
     <color name="md_theme_primary">#4C662B</color>
     <color name="md_theme_onPrimary">#FFFFFF</color>
     <color name="md_theme_primaryContainer">#CDEDA3</color>
@@ -48,100 +49,56 @@
     <color name="md_theme_surfaceContainer">#EEEFE3</color>
     <color name="md_theme_surfaceContainerHigh">#E8E9DE</color>
     <color name="md_theme_surfaceContainerHighest">#E2E3D8</color>
-    <color name="md_theme_primary_mediumContrast">#253D05</color>
-    <color name="md_theme_onPrimary_mediumContrast">#FFFFFF</color>
-    <color name="md_theme_primaryContainer_mediumContrast">#5A7539</color>
-    <color name="md_theme_onPrimaryContainer_mediumContrast">#FFFFFF</color>
-    <color name="md_theme_secondary_mediumContrast">#303924</color>
-    <color name="md_theme_onSecondary_mediumContrast">#FFFFFF</color>
-    <color name="md_theme_secondaryContainer_mediumContrast">#667157</color>
-    <color name="md_theme_onSecondaryContainer_mediumContrast">#FFFFFF</color>
-    <color name="md_theme_tertiary_mediumContrast">#083D3A</color>
-    <color name="md_theme_onTertiary_mediumContrast">#FFFFFF</color>
-    <color name="md_theme_tertiaryContainer_mediumContrast">#477572</color>
-    <color name="md_theme_onTertiaryContainer_mediumContrast">#FFFFFF</color>
-    <color name="md_theme_error_mediumContrast">#740006</color>
-    <color name="md_theme_onError_mediumContrast">#FFFFFF</color>
-    <color name="md_theme_errorContainer_mediumContrast">#CF2C27</color>
-    <color name="md_theme_onErrorContainer_mediumContrast">#FFFFFF</color>
-    <color name="md_theme_background_mediumContrast">#F9FAEF</color>
-    <color name="md_theme_onBackground_mediumContrast">#1A1C16</color>
-    <color name="md_theme_surface_mediumContrast">#F9FAEF</color>
-    <color name="md_theme_onSurface_mediumContrast">#0F120C</color>
-    <color name="md_theme_surfaceVariant_mediumContrast">#E1E4D5</color>
-    <color name="md_theme_onSurfaceVariant_mediumContrast">#34382D</color>
-    <color name="md_theme_outline_mediumContrast">#505449</color>
-    <color name="md_theme_outlineVariant_mediumContrast">#6B6F62</color>
-    <color name="md_theme_scrim_mediumContrast">#000000</color>
-    <color name="md_theme_inverseSurface_mediumContrast">#2F312A</color>
-    <color name="md_theme_inverseOnSurface_mediumContrast">#F1F2E6</color>
-    <color name="md_theme_inversePrimary_mediumContrast">#B1D18A</color>
-    <color name="md_theme_primaryFixed_mediumContrast">#5A7539</color>
-    <color name="md_theme_onPrimaryFixed_mediumContrast">#FFFFFF</color>
-    <color name="md_theme_primaryFixedDim_mediumContrast">#425C23</color>
-    <color name="md_theme_onPrimaryFixedVariant_mediumContrast">#FFFFFF</color>
-    <color name="md_theme_secondaryFixed_mediumContrast">#667157</color>
-    <color name="md_theme_onSecondaryFixed_mediumContrast">#FFFFFF</color>
-    <color name="md_theme_secondaryFixedDim_mediumContrast">#4E5840</color>
-    <color name="md_theme_onSecondaryFixedVariant_mediumContrast">#FFFFFF</color>
-    <color name="md_theme_tertiaryFixed_mediumContrast">#477572</color>
-    <color name="md_theme_onTertiaryFixed_mediumContrast">#FFFFFF</color>
-    <color name="md_theme_tertiaryFixedDim_mediumContrast">#2E5C59</color>
-    <color name="md_theme_onTertiaryFixedVariant_mediumContrast">#FFFFFF</color>
-    <color name="md_theme_surfaceDim_mediumContrast">#C6C7BD</color>
-    <color name="md_theme_surfaceBright_mediumContrast">#F9FAEF</color>
-    <color name="md_theme_surfaceContainerLowest_mediumContrast">#FFFFFF</color>
-    <color name="md_theme_surfaceContainerLow_mediumContrast">#F3F4E9</color>
-    <color name="md_theme_surfaceContainer_mediumContrast">#E8E9DE</color>
-    <color name="md_theme_surfaceContainerHigh_mediumContrast">#DCDED3</color>
-    <color name="md_theme_surfaceContainerHighest_mediumContrast">#D1D3C8</color>
-    <color name="md_theme_primary_highContrast">#1C3200</color>
-    <color name="md_theme_onPrimary_highContrast">#FFFFFF</color>
-    <color name="md_theme_primaryContainer_highContrast">#375018</color>
-    <color name="md_theme_onPrimaryContainer_highContrast">#FFFFFF</color>
-    <color name="md_theme_secondary_highContrast">#262F1A</color>
-    <color name="md_theme_onSecondary_highContrast">#FFFFFF</color>
-    <color name="md_theme_secondaryContainer_highContrast">#434C35</color>
-    <color name="md_theme_onSecondaryContainer_highContrast">#FFFFFF</color>
-    <color name="md_theme_tertiary_highContrast">#003230</color>
-    <color name="md_theme_onTertiary_highContrast">#FFFFFF</color>
-    <color name="md_theme_tertiaryContainer_highContrast">#21504E</color>
-    <color name="md_theme_onTertiaryContainer_highContrast">#FFFFFF</color>
-    <color name="md_theme_error_highContrast">#600004</color>
-    <color name="md_theme_onError_highContrast">#FFFFFF</color>
-    <color name="md_theme_errorContainer_highContrast">#98000A</color>
-    <color name="md_theme_onErrorContainer_highContrast">#FFFFFF</color>
-    <color name="md_theme_background_highContrast">#F9FAEF</color>
-    <color name="md_theme_onBackground_highContrast">#1A1C16</color>
-    <color name="md_theme_surface_highContrast">#F9FAEF</color>
-    <color name="md_theme_onSurface_highContrast">#000000</color>
-    <color name="md_theme_surfaceVariant_highContrast">#E1E4D5</color>
-    <color name="md_theme_onSurfaceVariant_highContrast">#000000</color>
-    <color name="md_theme_outline_highContrast">#2A2D24</color>
-    <color name="md_theme_outlineVariant_highContrast">#474B40</color>
-    <color name="md_theme_scrim_highContrast">#000000</color>
-    <color name="md_theme_inverseSurface_highContrast">#2F312A</color>
-    <color name="md_theme_inverseOnSurface_highContrast">#FFFFFF</color>
-    <color name="md_theme_inversePrimary_highContrast">#B1D18A</color>
-    <color name="md_theme_primaryFixed_highContrast">#375018</color>
-    <color name="md_theme_onPrimaryFixed_highContrast">#FFFFFF</color>
-    <color name="md_theme_primaryFixedDim_highContrast">#213903</color>
-    <color name="md_theme_onPrimaryFixedVariant_highContrast">#FFFFFF</color>
-    <color name="md_theme_secondaryFixed_highContrast">#434C35</color>
-    <color name="md_theme_onSecondaryFixed_highContrast">#FFFFFF</color>
-    <color name="md_theme_secondaryFixedDim_highContrast">#2C3620</color>
-    <color name="md_theme_onSecondaryFixedVariant_highContrast">#FFFFFF</color>
-    <color name="md_theme_tertiaryFixed_highContrast">#21504E</color>
-    <color name="md_theme_onTertiaryFixed_highContrast">#FFFFFF</color>
-    <color name="md_theme_tertiaryFixedDim_highContrast">#033937</color>
-    <color name="md_theme_onTertiaryFixedVariant_highContrast">#FFFFFF</color>
-    <color name="md_theme_surfaceDim_highContrast">#B8BAAF</color>
-    <color name="md_theme_surfaceBright_highContrast">#F9FAEF</color>
-    <color name="md_theme_surfaceContainerLowest_highContrast">#FFFFFF</color>
-    <color name="md_theme_surfaceContainerLow_highContrast">#F1F2E6</color>
-    <color name="md_theme_surfaceContainer_highContrast">#E2E3D8</color>
-    <color name="md_theme_surfaceContainerHigh_highContrast">#D4D5CA</color>
-    <color name="md_theme_surfaceContainerHighest_highContrast">#C6C7BD</color>
+
+    <!--    While Theme-->
+    <color name="wh_theme_primary">#5C5C5C</color>
+    <color name="wh_theme_onPrimary">#FFFFFF</color>
+    <color name="wh_theme_primaryContainer">#747474</color>
+    <color name="wh_theme_onPrimaryContainer">#FEFCFC</color>
+    <color name="wh_theme_secondary">#5F5E5E</color>
+    <color name="wh_theme_onSecondary">#FFFFFF</color>
+    <color name="wh_theme_secondaryContainer">#E2DFDE</color>
+    <color name="wh_theme_onSecondaryContainer">#636262</color>
+    <color name="wh_theme_tertiary">#5E5B5D</color>
+    <color name="wh_theme_onTertiary">#FFFFFF</color>
+    <color name="wh_theme_tertiaryContainer">#777375</color>
+    <color name="wh_theme_onTertiaryContainer">#FFFBFF</color>
+    <color name="wh_theme_error">#BA1A1A</color>
+    <color name="wh_theme_onError">#FFFFFF</color>
+    <color name="wh_theme_errorContainer">#FFDAD6</color>
+    <color name="wh_theme_onErrorContainer">#93000A</color>
+    <color name="wh_theme_background">#FCF8F8</color>
+    <color name="wh_theme_onBackground">#1C1B1B</color>
+    <color name="wh_theme_surface">#FCF8F8</color>
+    <color name="wh_theme_onSurface">#1C1B1B</color>
+    <color name="wh_theme_surfaceVariant">#E0E3E3</color>
+    <color name="wh_theme_onSurfaceVariant">#444748</color>
+    <color name="wh_theme_outline">#747878</color>
+    <color name="wh_theme_outlineVariant">#C4C7C7</color>
+    <color name="wh_theme_scrim">#000000</color>
+    <color name="wh_theme_inverseSurface">#313030</color>
+    <color name="wh_theme_inverseOnSurface">#F4F0EF</color>
+    <color name="wh_theme_inversePrimary">#C7C6C6</color>
+    <color name="wh_theme_primaryFixed">#E3E2E2</color>
+    <color name="wh_theme_onPrimaryFixed">#1B1C1C</color>
+    <color name="wh_theme_primaryFixedDim">#C7C6C6</color>
+    <color name="wh_theme_onPrimaryFixedVariant">#464747</color>
+    <color name="wh_theme_secondaryFixed">#E5E2E1</color>
+    <color name="wh_theme_onSecondaryFixed">#1B1C1C</color>
+    <color name="wh_theme_secondaryFixedDim">#C8C6C5</color>
+    <color name="wh_theme_onSecondaryFixedVariant">#474746</color>
+    <color name="wh_theme_tertiaryFixed">#E7E1E3</color>
+    <color name="wh_theme_onTertiaryFixed">#1D1B1D</color>
+    <color name="wh_theme_tertiaryFixedDim">#CBC5C7</color>
+    <color name="wh_theme_onTertiaryFixedVariant">#494648</color>
+    <color name="wh_theme_surfaceDim">#DDD9D8</color>
+    <color name="wh_theme_surfaceBright">#FCF8F8</color>
+    <color name="wh_theme_surfaceContainerLowest">#FFFFFF</color>
+    <color name="wh_theme_surfaceContainerLow">#F7F3F2</color>
+    <color name="wh_theme_surfaceContainer">#F1EDEC</color>
+    <color name="wh_theme_surfaceContainerHigh">#EBE7E7</color>
+    <color name="wh_theme_surfaceContainerHighest">#E5E2E1</color>
+
 
     <color name="disabled">@color/md_light_disabled</color>
 

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

@@ -1219,4 +1219,5 @@
     <string name="hide_manga_title">隐藏漫画列表标题</string>
     <string name="refresh_explore">刷新发现</string>
     <string name="ungroup">未分组</string>
+    <string name="dynamic_colors">动态取色</string>
 </resources>

+ 0 - 200
app/src/main/res/values/styles.xml

@@ -1,200 +0,0 @@
-<resources xmlns:tools="http://schemas.android.com/tools">
-
-    //**************************************************************Theme******************************************************************************//
-
-    <!-- 亮色主题 -->
-    <style name="AppTheme.Light" parent="Base.AppTheme">
-        <item name="actionBarStyle">@style/AppTheme.AppBarOverlay.Light</item>
-    </style>
-
-    <!-- 暗色主题 -->
-    <style name="AppTheme.Dark" parent="Base.AppTheme">
-        <item name="actionBarStyle">@style/AppTheme.AppBarOverlay.Dark</item>
-    </style>
-
-    <!-- 透明主题 -->
-    <style name="AppTheme.Transparent" parent="Base.AppTheme">
-        <item name="android:windowIsTranslucent">true</item>
-        <item name="android:windowBackground">@android:color/transparent</item>
-    </style>
-
-    <!-- Welcome主题 -->
-    <style name="AppTheme.Welcome" parent="Base.AppTheme">
-        <item name="android:windowNoTitle">true</item>
-    </style>
-
-    <!-- Base application theme. -->
-    <style name="Base.AppTheme" parent="Theme.Material3.DayNight.NoActionBar">
-        <item name="colorPrimary">@color/md_theme_primary</item>
-        <item name="colorOnPrimary">@color/md_theme_onPrimary</item>
-        <item name="colorPrimaryContainer">@color/md_theme_primaryContainer</item>
-        <item name="colorOnPrimaryContainer">@color/md_theme_onPrimaryContainer</item>
-        <item name="colorSecondary">@color/md_theme_secondary</item>
-        <item name="colorOnSecondary">@color/md_theme_onSecondary</item>
-        <item name="colorSecondaryContainer">@color/md_theme_secondaryContainer</item>
-        <item name="colorOnSecondaryContainer">@color/md_theme_onSecondaryContainer</item>
-        <item name="colorTertiary">@color/md_theme_tertiary</item>
-        <item name="colorOnTertiary">@color/md_theme_onTertiary</item>
-        <item name="colorTertiaryContainer">@color/md_theme_tertiaryContainer</item>
-        <item name="colorOnTertiaryContainer">@color/md_theme_onTertiaryContainer</item>
-        <item name="colorError">@color/md_theme_error</item>
-        <item name="colorOnError">@color/md_theme_onError</item>
-        <item name="colorErrorContainer">@color/md_theme_errorContainer</item>
-        <item name="colorOnErrorContainer">@color/md_theme_onErrorContainer</item>
-        <item name="android:colorBackground">@color/md_theme_background</item>
-        <item name="colorOnBackground">@color/md_theme_onBackground</item>
-        <item name="colorSurface">@color/md_theme_surface</item>
-        <item name="colorOnSurface">@color/md_theme_onSurface</item>
-        <item name="colorSurfaceVariant">@color/md_theme_surfaceVariant</item>
-        <item name="colorOnSurfaceVariant">@color/md_theme_onSurfaceVariant</item>
-        <item name="colorOutline">@color/md_theme_outline</item>
-        <item name="colorOutlineVariant">@color/md_theme_outlineVariant</item>
-        <item name="colorSurfaceInverse">@color/md_theme_inverseSurface</item>
-        <item name="colorOnSurfaceInverse">@color/md_theme_inverseOnSurface</item>
-        <item name="colorPrimaryInverse">@color/md_theme_inversePrimary</item>
-        <item name="colorPrimaryFixed">@color/md_theme_primaryFixed</item>
-        <item name="colorOnPrimaryFixed">@color/md_theme_onPrimaryFixed</item>
-        <item name="colorPrimaryFixedDim">@color/md_theme_primaryFixedDim</item>
-        <item name="colorOnPrimaryFixedVariant">@color/md_theme_onPrimaryFixedVariant</item>
-        <item name="colorSecondaryFixed">@color/md_theme_secondaryFixed</item>
-        <item name="colorOnSecondaryFixed">@color/md_theme_onSecondaryFixed</item>
-        <item name="colorSecondaryFixedDim">@color/md_theme_secondaryFixedDim</item>
-        <item name="colorOnSecondaryFixedVariant">@color/md_theme_onSecondaryFixedVariant</item>
-        <item name="colorTertiaryFixed">@color/md_theme_tertiaryFixed</item>
-        <item name="colorOnTertiaryFixed">@color/md_theme_onTertiaryFixed</item>
-        <item name="colorTertiaryFixedDim">@color/md_theme_tertiaryFixedDim</item>
-        <item name="colorOnTertiaryFixedVariant">@color/md_theme_onTertiaryFixedVariant</item>
-        <item name="colorSurfaceDim">@color/md_theme_surfaceDim</item>
-        <item name="colorSurfaceBright">@color/md_theme_surfaceBright</item>
-        <item name="colorSurfaceContainerLowest">@color/md_theme_surfaceContainerLowest</item>
-        <item name="colorSurfaceContainerLow">@color/md_theme_surfaceContainerLow</item>
-        <item name="colorSurfaceContainer">@color/md_theme_surfaceContainer</item>
-        <item name="colorSurfaceContainerHigh">@color/md_theme_surfaceContainerHigh</item>
-        <item name="colorSurfaceContainerHighest">@color/md_theme_surfaceContainerHighest</item>
-        <item name="android:windowDrawsSystemBarBackgrounds">true</item>
-        <item name="android:windowLightStatusBar">true</item>
-        <item name="tabStyle">@style/Widget.App.TabLayout</item>
-    </style>
-
-    <style name="Widget.App.TabLayout" parent="Widget.Material3.TabLayout">
-        <item name="tabBackground">@android:color/transparent</item>
-        <item name="tabIndicator">@drawable/selected_chip_background</item>
-        <item name="tabIndicatorColor">?attr/colorSecondaryContainer</item>
-        <item name="tabIndicatorFullWidth">true</item>
-        <item name="tabIndicatorGravity">stretch</item>
-        <item name="tabMinWidth">0dp</item>
-        <item name="tabMode">scrollable</item>
-        <item name="tabGravity">start</item>
-        <item name="tabPaddingEnd">12dp</item>
-        <item name="tabPaddingStart">12dp</item>
-        <item name="tabRippleColor">@android:color/transparent</item>
-        <item name="tabSelectedTextColor">?attr/colorOnSecondaryContainer</item>
-        <item name="tabTextColor">?attr/colorOnSurfaceVariant</item>
-        <item name="tabTextAppearance">@style/TabTextAppearance</item>
-    </style>
-
-    <style name="TabTextAppearance" parent="TextAppearance.Design.Tab">
-        <item name="textAllCaps">false</item>
-        <item name="android:textAllCaps">false</item>
-        <item name="android:textSize">15sp</item>
-        <item name="android:textFontWeight" tools:targetApi="p">500</item>
-    </style>
-
-    <style name="PreferenceDialogTheme" parent="Theme.Material3.DayNight">
-
-    </style>
-
-    <style name="AppTheme.AppBarOverlay.Light" parent="ThemeOverlay.Material3.Light">
-        <item name="android:windowLightStatusBar">true</item>
-    </style>
-
-    <style name="AppTheme.AppBarOverlay.Dark" parent="ThemeOverlay.Material3.Dark">
-        <item name="android:windowLightStatusBar">false</item>
-    </style>
-
-    <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="Style.NavigationView" parent="android:Widget">
-
-    </style>
-
-    <style name="Style.Toolbar.NoPadding" parent="Base.Widget.AppCompat.Toolbar">
-
-    </style>
-
-    <style name="Style.MenuItemText" parent="TextAppearance.Material3.BodyLarge">
-
-    </style>
-
-<!--    <style name="Style.PopupMenu" parent="Widget.Material3.PopupMenu.ListPopupWindow">-->
-<!--&lt;!&ndash;        <item name="android:popupBackground">@drawable/bg_popup_menu</item>&ndash;&gt;-->
-<!--        <item name="android:radius">30dp</item>-->
-<!--    </style>-->
-
-
-    <style name="Activity.Permission" parent="Theme.Material3.DayNight.NoActionBar">
-        <item name="android:windowBackground">@android:color/transparent</item>
-        <item name="android:windowDisablePreview">true</item>
-        <item name="android:windowIsTranslucent">true</item>
-        <item name="android:windowTranslucentStatus">true</item>
-        <item name="android:windowAnimationStyle">@null</item>
-    </style>
-
-    <style name="ToolbarTitle" parent="@style/TextAppearance.Material3.ActionBar.Title">
-
-    </style>
-
-    //*******************Widget Style**********************************//
-
-    <style name="Style.Shadow.Top" parent="android:Widget">
-        <item name="android:layout_width">match_parent</item>
-        <item name="android:layout_height">@dimen/shadow_height</item>
-        <item name="android:background">@drawable/bg_shadow_top</item>
-    </style>
-
-    <style name="Style.Shadow.Bottom" parent="android:Widget">
-        <item name="android:layout_width">match_parent</item>
-        <item name="android:layout_height">@dimen/shadow_height</item>
-        <item name="android:background">@drawable/bg_shadow_bottom</item>
-    </style>
-
-
-    <style name="Style.Line" parent="android:Widget">
-        <item name="android:layout_width">match_parent</item>
-        <item name="android:layout_height">0.5dp</item>
-        <item name="android:background">@color/divider</item>
-    </style>
-
-    <style name="Style.Text.Primary.Normal" parent="android:Widget">
-        <item name="android:layout_width">match_parent</item>
-        <item name="android:layout_height">wrap_content</item>
-        <item name="android:textSize">@dimen/font_size_normal</item>
-        <item name="android:textColor">#000</item>
-        <item name="android:includeFontPadding">false</item>
-    </style>
-
-    <style name="Style.Text.Primary.Normal.Wrap">
-        <item name="android:layout_width">wrap_content</item>
-    </style>
-
-    <style name="Style.Text.Second.Normal" parent="android:Widget">
-        <item name="android:layout_width">match_parent</item>
-        <item name="android:layout_height">wrap_content</item>
-        <item name="android:textSize">@dimen/font_size_normal</item>
-        <item name="android:textColor">#676767</item>
-        <item name="android:includeFontPadding">false</item>
-    </style>
-
-    <style name="Style.Text.Second.Normal.Wrap">
-        <item name="android:layout_width">wrap_content</item>
-    </style>
-
-</resources>

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

@@ -0,0 +1,132 @@
+<resources xmlns:tools="http://schemas.android.com/tools">
+
+    //**************************************************************Theme******************************************************************************//
+
+    <!-- 亮色主题 -->
+    <style name="AppTheme.Light" parent="Base.AppTheme">
+        <item name="android:windowLightStatusBar">true</item>
+    </style>
+
+    <!-- 暗色主题 -->
+    <style name="AppTheme.Dark" parent="Base.AppTheme">
+        <item name="android:windowLightStatusBar">false</item>
+    </style>
+
+    <!-- 透明主题 -->
+    <style name="AppTheme.Transparent" parent="Base.AppTheme">
+        <item name="android:windowIsTranslucent">true</item>
+        <item name="android:windowBackground">@android:color/transparent</item>
+    </style>
+
+    <!-- Welcome主题 -->
+    <style name="AppTheme.Welcome" parent="Base.AppTheme">
+        <item name="android:windowNoTitle">true</item>
+    </style>
+
+    <style name="Base.AppTheme" parent="Theme.Material3.DynamicColors.DayNight.NoActionBar">
+        <item name="android:windowDrawsSystemBarBackgrounds">true</item>
+        <item name="android:windowLightStatusBar">true</item>
+        <item name="tabStyle">@style/Widget.App.TabLayout</item>
+        <item name="popupMenuBackground">@drawable/popup_background</item>
+        <item name="alertDialogTheme">@style/AppTheme.AlertDialog</item>
+    </style>
+    
+    <style name="Theme.Base.GR" parent="Base.AppTheme">
+        <item name="colorPrimary">@color/md_theme_primary</item>
+        <item name="colorOnPrimary">@color/md_theme_onPrimary</item>
+        <item name="colorPrimaryContainer">@color/md_theme_primaryContainer</item>
+        <item name="colorOnPrimaryContainer">@color/md_theme_onPrimaryContainer</item>
+        <item name="colorSecondary">@color/md_theme_secondary</item>
+        <item name="colorOnSecondary">@color/md_theme_onSecondary</item>
+        <item name="colorSecondaryContainer">@color/md_theme_secondaryContainer</item>
+        <item name="colorOnSecondaryContainer">@color/md_theme_onSecondaryContainer</item>
+        <item name="colorTertiary">@color/md_theme_tertiary</item>
+        <item name="colorOnTertiary">@color/md_theme_onTertiary</item>
+        <item name="colorTertiaryContainer">@color/md_theme_tertiaryContainer</item>
+        <item name="colorOnTertiaryContainer">@color/md_theme_onTertiaryContainer</item>
+        <item name="colorError">@color/md_theme_error</item>
+        <item name="colorOnError">@color/md_theme_onError</item>
+        <item name="colorErrorContainer">@color/md_theme_errorContainer</item>
+        <item name="colorOnErrorContainer">@color/md_theme_onErrorContainer</item>
+        <item name="android:colorBackground">@color/md_theme_background</item>
+        <item name="colorOnBackground">@color/md_theme_onBackground</item>
+        <item name="colorSurface">@color/md_theme_surface</item>
+        <item name="colorOnSurface">@color/md_theme_onSurface</item>
+        <item name="colorSurfaceVariant">@color/md_theme_surfaceVariant</item>
+        <item name="colorOnSurfaceVariant">@color/md_theme_onSurfaceVariant</item>
+        <item name="colorOutline">@color/md_theme_outline</item>
+        <item name="colorOutlineVariant">@color/md_theme_outlineVariant</item>
+        <item name="colorSurfaceInverse">@color/md_theme_inverseSurface</item>
+        <item name="colorOnSurfaceInverse">@color/md_theme_inverseOnSurface</item>
+        <item name="colorPrimaryInverse">@color/md_theme_inversePrimary</item>
+        <item name="colorPrimaryFixed">@color/md_theme_primaryFixed</item>
+        <item name="colorOnPrimaryFixed">@color/md_theme_onPrimaryFixed</item>
+        <item name="colorPrimaryFixedDim">@color/md_theme_primaryFixedDim</item>
+        <item name="colorOnPrimaryFixedVariant">@color/md_theme_onPrimaryFixedVariant</item>
+        <item name="colorSecondaryFixed">@color/md_theme_secondaryFixed</item>
+        <item name="colorOnSecondaryFixed">@color/md_theme_onSecondaryFixed</item>
+        <item name="colorSecondaryFixedDim">@color/md_theme_secondaryFixedDim</item>
+        <item name="colorOnSecondaryFixedVariant">@color/md_theme_onSecondaryFixedVariant</item>
+        <item name="colorTertiaryFixed">@color/md_theme_tertiaryFixed</item>
+        <item name="colorOnTertiaryFixed">@color/md_theme_onTertiaryFixed</item>
+        <item name="colorTertiaryFixedDim">@color/md_theme_tertiaryFixedDim</item>
+        <item name="colorOnTertiaryFixedVariant">@color/md_theme_onTertiaryFixedVariant</item>
+        <item name="colorSurfaceDim">@color/md_theme_surfaceDim</item>
+        <item name="colorSurfaceBright">@color/md_theme_surfaceBright</item>
+        <item name="colorSurfaceContainerLowest">@color/md_theme_surfaceContainerLowest</item>
+        <item name="colorSurfaceContainerLow">@color/md_theme_surfaceContainerLow</item>
+        <item name="colorSurfaceContainer">@color/md_theme_surfaceContainer</item>
+        <item name="colorSurfaceContainerHigh">@color/md_theme_surfaceContainerHigh</item>
+        <item name="colorSurfaceContainerHighest">@color/md_theme_surfaceContainerHighest</item>
+    </style>
+
+    <style name="Theme.Base.WH" parent="Base.AppTheme">
+        <item name="colorPrimary">@color/wh_theme_primary</item>
+        <item name="colorOnPrimary">@color/wh_theme_onPrimary</item>
+        <item name="colorPrimaryContainer">@color/wh_theme_primaryContainer</item>
+        <item name="colorOnPrimaryContainer">@color/wh_theme_onPrimaryContainer</item>
+        <item name="colorSecondary">@color/wh_theme_secondary</item>
+        <item name="colorOnSecondary">@color/wh_theme_onSecondary</item>
+        <item name="colorSecondaryContainer">@color/wh_theme_secondaryContainer</item>
+        <item name="colorOnSecondaryContainer">@color/wh_theme_onSecondaryContainer</item>
+        <item name="colorTertiary">@color/wh_theme_tertiary</item>
+        <item name="colorOnTertiary">@color/wh_theme_onTertiary</item>
+        <item name="colorTertiaryContainer">@color/wh_theme_tertiaryContainer</item>
+        <item name="colorOnTertiaryContainer">@color/wh_theme_onTertiaryContainer</item>
+        <item name="colorError">@color/wh_theme_error</item>
+        <item name="colorOnError">@color/wh_theme_onError</item>
+        <item name="colorErrorContainer">@color/wh_theme_errorContainer</item>
+        <item name="colorOnErrorContainer">@color/wh_theme_onErrorContainer</item>
+        <item name="android:colorBackground">@color/wh_theme_background</item>
+        <item name="colorOnBackground">@color/wh_theme_onBackground</item>
+        <item name="colorSurface">@color/wh_theme_surface</item>
+        <item name="colorOnSurface">@color/wh_theme_onSurface</item>
+        <item name="colorSurfaceVariant">@color/wh_theme_surfaceVariant</item>
+        <item name="colorOnSurfaceVariant">@color/wh_theme_onSurfaceVariant</item>
+        <item name="colorOutline">@color/wh_theme_outline</item>
+        <item name="colorOutlineVariant">@color/wh_theme_outlineVariant</item>
+        <item name="colorSurfaceInverse">@color/wh_theme_inverseSurface</item>
+        <item name="colorOnSurfaceInverse">@color/wh_theme_inverseOnSurface</item>
+        <item name="colorPrimaryInverse">@color/wh_theme_inversePrimary</item>
+        <item name="colorPrimaryFixed">@color/wh_theme_primaryFixed</item>
+        <item name="colorOnPrimaryFixed">@color/wh_theme_onPrimaryFixed</item>
+        <item name="colorPrimaryFixedDim">@color/wh_theme_primaryFixedDim</item>
+        <item name="colorOnPrimaryFixedVariant">@color/wh_theme_onPrimaryFixedVariant</item>
+        <item name="colorSecondaryFixed">@color/wh_theme_secondaryFixed</item>
+        <item name="colorOnSecondaryFixed">@color/wh_theme_onSecondaryFixed</item>
+        <item name="colorSecondaryFixedDim">@color/wh_theme_secondaryFixedDim</item>
+        <item name="colorOnSecondaryFixedVariant">@color/wh_theme_onSecondaryFixedVariant</item>
+        <item name="colorTertiaryFixed">@color/wh_theme_tertiaryFixed</item>
+        <item name="colorOnTertiaryFixed">@color/wh_theme_onTertiaryFixed</item>
+        <item name="colorTertiaryFixedDim">@color/wh_theme_tertiaryFixedDim</item>
+        <item name="colorOnTertiaryFixedVariant">@color/wh_theme_onTertiaryFixedVariant</item>
+        <item name="colorSurfaceDim">@color/wh_theme_surfaceDim</item>
+        <item name="colorSurfaceBright">@color/wh_theme_surfaceBright</item>
+        <item name="colorSurfaceContainerLowest">@color/wh_theme_surfaceContainerLowest</item>
+        <item name="colorSurfaceContainerLow">@color/wh_theme_surfaceContainerLow</item>
+        <item name="colorSurfaceContainer">@color/wh_theme_surfaceContainer</item>
+        <item name="colorSurfaceContainerHigh">@color/wh_theme_surfaceContainerHigh</item>
+        <item name="colorSurfaceContainerHighest">@color/wh_theme_surfaceContainerHighest</item>
+    </style>
+
+</resources>

+ 11 - 4
app/src/main/res/xml/pref_config_theme.xml

@@ -2,14 +2,22 @@
 <androidx.preference.PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto">
 
-    <io.legato.kazusa.lib.prefs.NameListPreference
+
+    <io.legato.kazusa.lib.prefs.ThemeModePreference
         android:defaultValue="0"
         android:entries="@array/theme_mode"
         android:entryValues="@array/theme_mode_v"
         android:key="themeMode"
-        android:summary="@string/theme_mode_desc"
         android:title="@string/theme_mode"
-        app:iconSpaceReserved="false" />
+        android:summary="切换浅色/深色/跟随系统" />
+
+    <ListPreference
+        android:key="app_theme"
+        android:title="应用主题"
+        android:summary="喵喵喵"
+        android:entries="@array/themes_item"
+        android:entryValues="@array/themes_value"
+        android:defaultValue="0" />
 
     <io.legato.kazusa.lib.prefs.IconListPreference
         android:defaultValue="ic_launcher"
@@ -26,7 +34,6 @@
         android:title="@string/welcome_style"
         android:summary="@string/welcome_style_summary" />
 
-
     <io.legato.kazusa.lib.prefs.Preference
         android:key="fontScale"
         android:summary="@string/font_scale_summary"