HapeLee 1 год назад
Родитель
Сommit
c35177715c
21 измененных файлов с 713 добавлено и 437 удалено
  1. 2 1
      app/src/main/java/io/legato/kazusa/model/BookCover.kt
  2. 71 68
      app/src/main/java/io/legato/kazusa/ui/book/manga/ReadMangaActivity.kt
  3. 2 1
      app/src/main/java/io/legato/kazusa/ui/book/manga/config/MangaColorFilterConfig.kt
  4. 55 6
      app/src/main/java/io/legato/kazusa/ui/book/manga/config/MangaColorFilterDialog.kt
  5. 0 49
      app/src/main/java/io/legato/kazusa/ui/book/manga/config/MangaEpaperDialog.kt
  6. 124 37
      app/src/main/java/io/legato/kazusa/ui/book/manga/config/MangaFooterSettingDialog.kt
  7. 2 3
      app/src/main/java/io/legato/kazusa/ui/book/manga/entities/EpaperTransformation.kt
  8. 1 9
      app/src/main/java/io/legato/kazusa/ui/book/manga/recyclerview/MangaAdapter.kt
  9. 39 15
      app/src/main/java/io/legato/kazusa/ui/book/read/MangaMenu.kt
  10. 8 2
      app/src/main/java/io/legato/kazusa/ui/widget/SimpleCounterView.kt
  11. 3 3
      app/src/main/res/anim/popup_enter.xml
  12. 1 5
      app/src/main/res/anim/popup_exit.xml
  13. 11 0
      app/src/main/res/drawable/ic_align_center.xml
  14. 11 0
      app/src/main/res/drawable/ic_align_left.xml
  15. 121 28
      app/src/main/res/layout/dialog_manga_color_filter.xml
  16. 140 106
      app/src/main/res/layout/dialog_manga_footer_setting.xml
  17. 1 1
      app/src/main/res/layout/item_text.xml
  18. 117 52
      app/src/main/res/layout/view_manga_menu.xml
  19. 0 3
      app/src/main/res/layout/view_read_menu.xml
  20. 0 44
      app/src/main/res/menu/book_manga.xml
  21. 4 4
      app/src/main/res/values-zh/strings.xml

+ 2 - 1
app/src/main/java/io/legato/kazusa/model/BookCover.kt

@@ -76,7 +76,7 @@ object BookCover {
             return
         }
         defaultDrawable = kotlin.runCatching {
-            BitmapUtils.decodeBitmap(path, 600, 900).toDrawable(appCtx.resources)
+            BitmapUtils.decodeBitmap(path, 600, 900)!!.toDrawable(appCtx.resources)
         }.getOrDefault(appCtx.resources.getDrawable(R.drawable.image_cover_default, null))
     }
 
@@ -158,6 +158,7 @@ object BookCover {
                 }
                 it
             }
+            .transition(DrawableTransitionOptions.withCrossFade())
     }
 
     fun preloadManga(

+ 71 - 68
app/src/main/java/io/legato/kazusa/ui/book/manga/ReadMangaActivity.kt

@@ -43,7 +43,6 @@ import io.legato.kazusa.ui.book.changesource.ChangeBookSourceDialog
 import io.legato.kazusa.ui.book.info.BookInfoActivity
 import io.legato.kazusa.ui.book.manga.config.MangaColorFilterConfig
 import io.legato.kazusa.ui.book.manga.config.MangaColorFilterDialog
-import io.legato.kazusa.ui.book.manga.config.MangaEpaperDialog
 import io.legato.kazusa.ui.book.manga.config.MangaFooterConfig
 import io.legato.kazusa.ui.book.manga.config.MangaFooterSettingDialog
 import io.legato.kazusa.ui.book.manga.entities.BaseMangaPage
@@ -78,7 +77,7 @@ import kotlin.math.ceil
 
 class ReadMangaActivity : VMBaseActivity<ActivityMangaBinding, ReadMangaViewModel>(),
     ReadManga.Callback, ChangeBookSourceDialog.CallBack, MangaMenu.CallBack,
-    MangaColorFilterDialog.Callback, ScrollTimer.ScrollCallback, MangaEpaperDialog.Callback {
+    MangaColorFilterDialog.Callback, ScrollTimer.ScrollCallback, MangaFooterSettingDialog.Callback {
 
     private val mLayoutManager by lazy {
         MangaLayoutManager(this)
@@ -253,7 +252,7 @@ class ReadMangaActivity : VMBaseActivity<ActivityMangaBinding, ReadMangaViewMode
 
     override fun upContent() {
         lifecycleScope.launch {
-            setTitle(ReadManga.book?.name)
+            binding.mangaMenu.upBookView()
             val data = withContext(IO) { ReadManga.mangaContents }
             val pos = data.pos
             val list = data.items
@@ -450,7 +449,11 @@ class ReadMangaActivity : VMBaseActivity<ActivityMangaBinding, ReadMangaViewMode
 
     override fun updateColorFilter(config: MangaColorFilterConfig) {
         mAdapter.setMangaImageColorFilter(config)
-        updateWindowBrightness(config.l)
+        if (config.autoBrightness) {
+            resetWindowToSystemBrightness()
+        } else {
+            updateWindowBrightness(config.l)
+        }
     }
 
     @SuppressLint("StringFormatMatches")
@@ -473,12 +476,6 @@ class ReadMangaActivity : VMBaseActivity<ActivityMangaBinding, ReadMangaViewMode
                 }
             }
 
-            R.id.menu_catalog -> {
-                ReadManga.book?.let {
-                    tocActivity.launch(it.bookUrl)
-                }
-            }
-
             R.id.menu_refresh -> {
                 binding.flLoading.isVisible = true
                 ReadManga.book?.let {
@@ -510,35 +507,6 @@ class ReadMangaActivity : VMBaseActivity<ActivityMangaBinding, ReadMangaViewMode
                 setDisableClickScroll(item.isChecked)
             }
 
-            R.id.menu_enable_auto_page -> {
-                item.isChecked = !item.isChecked
-                val menuMangaAutoPageSpeed = mMenu?.findItem(R.id.menu_manga_auto_page_speed)
-                mScrollTimer.isEnabledPage = item.isChecked
-                menuMangaAutoPageSpeed?.isVisible = item.isChecked
-                enableAutoScrollPage = item.isChecked
-                enableAutoScroll = false
-                mScrollTimer.isEnabled = false
-                mMenu?.findItem(R.id.menu_enable_auto_scroll)?.isChecked = false
-            }
-
-            R.id.menu_manga_auto_page_speed -> {
-                showNumberPickerDialog(
-                    1, getString(R.string.setting_manga_auto_page_speed),
-                    AppConfig.mangaAutoPageSpeed
-                ) {
-                    AppConfig.mangaAutoPageSpeed = it
-                    item.title = getString(R.string.manga_auto_page_speed, it)
-                    mScrollTimer.setSpeed(it)
-                    if (enableAutoScrollPage) {
-                        mScrollTimer.isEnabledPage = true
-                    }
-                }
-            }
-
-            R.id.menu_manga_footer_config -> {
-                showDialogFragment(MangaFooterSettingDialog())
-            }
-
             R.id.menu_enable_horizontal_scroll -> {
                 item.isChecked = !item.isChecked
                 AppConfig.enableMangaHorizontalScroll = item.isChecked
@@ -555,11 +523,11 @@ class ReadMangaActivity : VMBaseActivity<ActivityMangaBinding, ReadMangaViewMode
             R.id.menu_enable_auto_scroll -> {
                 item.isChecked = !item.isChecked
                 mScrollTimer.isEnabled = item.isChecked
-                mMenu?.findItem(R.id.menu_enable_auto_page)?.isChecked = false
+
                 enableAutoScroll = item.isChecked
                 enableAutoScrollPage = false
                 mScrollTimer.isEnabledPage = false
-                mMenu?.findItem(R.id.menu_manga_auto_page_speed)?.isVisible = item.isChecked
+
                 if (enableAutoScroll) {
                     mPagerSnapHelper.attachToRecyclerView(null)
                 } else if (AppConfig.enableMangaHorizontalScroll) {
@@ -573,18 +541,7 @@ class ReadMangaActivity : VMBaseActivity<ActivityMangaBinding, ReadMangaViewMode
                 ReadManga.loadContent()
             }
 
-            R.id.menu_epaper_manga -> {
-                item.isChecked = !item.isChecked
-                AppConfig.enableMangaEInk = item.isChecked
-                mMenu?.findItem(R.id.menu_gray_manga)?.isChecked = false
-                AppConfig.enableMangaGray = false
-                mMenu?.findItem(R.id.menu_epaper_manga_setting)?.isVisible = item.isChecked
-                mAdapter.enableMangaEInk(item.isChecked, AppConfig.mangaEInkThreshold)
-            }
 
-            R.id.menu_epaper_manga_setting -> {
-                showDialogFragment(MangaEpaperDialog())
-            }
 
             R.id.menu_disable_horizontal_animation -> {
                 item.isChecked = !item.isChecked
@@ -596,18 +553,44 @@ class ReadMangaActivity : VMBaseActivity<ActivityMangaBinding, ReadMangaViewMode
                 }
             }
 
-            R.id.menu_gray_manga -> {
-                item.isChecked = !item.isChecked
-                AppConfig.enableMangaGray = item.isChecked
-                mMenu?.findItem(R.id.menu_epaper_manga)?.isChecked = false
-                AppConfig.enableMangaEInk = false
-                mMenu?.findItem(R.id.menu_epaper_manga_setting)?.isVisible = false
-                mAdapter.enableGray(item.isChecked)
-            }
+
         }
         return super.onCompatOptionsItemSelected(item)
     }
 
+    override fun openCatalog() {
+        ReadManga.book?.let {
+            tocActivity.launch(it.bookUrl)
+        }
+    }
+
+    override fun showFooterConfig() {
+        showDialogFragment(MangaFooterSettingDialog().apply {
+            initialAutoPageEnabled = enableAutoScrollPage
+            initialAutoPageSpeed = AppConfig.mangaAutoPageSpeed
+            callback = this@ReadMangaActivity
+        })
+    }
+
+    override fun showColorFilterConfig() {
+        binding.mangaMenu.runMenuOut()
+        showDialogFragment(MangaColorFilterDialog())
+    }
+
+    override fun updateEpaperMode(enabled: Boolean, threshold: Int) {
+        AppConfig.enableMangaEInk = enabled
+        AppConfig.enableMangaGray = false
+        AppConfig.mangaEInkThreshold = threshold
+        mAdapter.enableMangaEInk(enabled, threshold)
+    }
+
+    override fun updateGrayMode(enabled: Boolean) {
+        AppConfig.enableMangaGray = enabled
+        AppConfig.enableMangaEInk = false
+        mAdapter.enableGray(enabled)
+    }
+
+
     override fun openBookInfoActivity() {
         ReadManga.book?.let {
             bookInfoActivity.launch {
@@ -617,6 +600,26 @@ class ReadMangaActivity : VMBaseActivity<ActivityMangaBinding, ReadMangaViewMode
         }
     }
 
+    override fun onAutoPageToggle(enabled: Boolean) {
+        mScrollTimer.isEnabledPage = enabled
+        mScrollTimer.isEnabled = false
+
+        enableAutoScrollPage = enabled
+        enableAutoScroll = false
+
+        mMenu?.findItem(R.id.menu_enable_auto_scroll)?.isChecked = false
+    }
+
+    override fun onAutoPageSpeedChanged(speed: Int) {
+        AppConfig.mangaAutoPageSpeed = speed
+        mScrollTimer.setSpeed(speed)
+
+        if (enableAutoScrollPage) {
+            mScrollTimer.isEnabledPage = true
+        }
+    }
+
+
     override fun upSystemUiVisibility(menuIsVisible: Boolean) {
         toggleSystemBar(menuIsVisible)
         if (enableAutoScroll) {
@@ -680,19 +683,16 @@ class ReadMangaActivity : VMBaseActivity<ActivityMangaBinding, ReadMangaViewMode
             getString(R.string.pre_download_m, AppConfig.mangaPreDownloadNum)
         menu.findItem(R.id.menu_disable_manga_scale).isChecked = AppConfig.disableMangaScale
         menu.findItem(R.id.menu_disable_click_scroll).isChecked = AppConfig.disableClickScroll
-        menu.findItem(R.id.menu_manga_auto_page_speed).title =
-            getString(R.string.manga_auto_page_speed, AppConfig.mangaAutoPageSpeed)
         menu.findItem(R.id.menu_enable_horizontal_scroll).isChecked =
             AppConfig.enableMangaHorizontalScroll
         menu.findItem(R.id.menu_hide_manga_title).isChecked = AppConfig.hideMangaTitle
-        menu.findItem(R.id.menu_epaper_manga).isChecked = AppConfig.enableMangaEInk
-        menu.findItem(R.id.menu_epaper_manga_setting).isVisible = AppConfig.enableMangaEInk
+
         menu.findItem(R.id.menu_disable_horizontal_animation).run {
             isVisible =
                 AppConfig.enableMangaHorizontalScroll
             isChecked = AppConfig.disableHorizontalAnimator
         }
-        menu.findItem(R.id.menu_gray_manga).isChecked = AppConfig.enableMangaGray
+
     }
 
     private fun setDisableMangaScale(disable: Boolean) {
@@ -782,6 +782,11 @@ class ReadMangaActivity : VMBaseActivity<ActivityMangaBinding, ReadMangaViewMode
             }
         }
     }
+    fun resetWindowToSystemBrightness() {
+        val layoutParams = window.attributes
+        layoutParams.screenBrightness = WindowManager.LayoutParams.BRIGHTNESS_OVERRIDE_NONE
+        window.attributes = layoutParams
+    }
 
     fun updateWindowBrightness(brightness: Int) {
         val layoutParams = window.attributes
@@ -832,7 +837,5 @@ class ReadMangaActivity : VMBaseActivity<ActivityMangaBinding, ReadMangaViewMode
         return super.onKeyDown(keyCode, event)
     }
 
-    override fun updateEepaper(value: Int) {
-        mAdapter.updateThreshold(value)
-    }
+
 }

+ 2 - 1
app/src/main/java/io/legato/kazusa/ui/book/manga/config/MangaColorFilterConfig.kt

@@ -7,7 +7,8 @@ data class MangaColorFilterConfig(
     var g: Int = 0,
     var b: Int = 0,
     var a: Int = 0,
-    var l: Int = 0
+    var l: Int = 0,
+    var autoBrightness: Boolean = true
 ) {
     fun toJson(): String {
         if (r == 0 && g == 0 && b == 0 && a == 0 && l == 0) {

+ 55 - 6
app/src/main/java/io/legato/kazusa/ui/book/manga/config/MangaColorFilterDialog.kt

@@ -3,28 +3,32 @@ package io.legato.kazusa.ui.book.manga.config
 import android.content.DialogInterface
 import android.os.Bundle
 import android.view.View
-import android.view.ViewGroup
 import android.view.WindowManager
+import androidx.core.view.isVisible
 import io.legato.kazusa.R
-import io.legato.kazusa.base.BaseDialogFragment
+import io.legato.kazusa.base.BaseBottomSheetDialogFragment
 import io.legato.kazusa.databinding.DialogMangaColorFilterBinding
 import io.legato.kazusa.help.config.AppConfig
 import io.legato.kazusa.utils.GSON
 import io.legato.kazusa.utils.fromJsonObject
-import io.legato.kazusa.utils.setLayout
+import io.legato.kazusa.utils.invisible
 import io.legato.kazusa.utils.viewbindingdelegate.viewBinding
+import io.legato.kazusa.utils.visible
 
-class MangaColorFilterDialog : BaseDialogFragment(R.layout.dialog_manga_color_filter) {
+class MangaColorFilterDialog : BaseBottomSheetDialogFragment(R.layout.dialog_manga_color_filter) {
     private val binding by viewBinding(DialogMangaColorFilterBinding::bind)
     private val mConfig =
         GSON.fromJsonObject<MangaColorFilterConfig>(AppConfig.mangaColorFilter).getOrNull()
             ?: MangaColorFilterConfig()
-    private val callback get() = activity as? Callback
+    private val callback: Callback? get() = activity as? Callback
+
+    private var mMangaEInkThreshold = AppConfig.mangaEInkThreshold
+
 
     override fun onStart() {
         super.onStart()
         dialog?.window?.clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND)
-        setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)
+//        setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)
     }
 
     override fun onFragmentCreated(view: View, savedInstanceState: Bundle?) {
@@ -34,6 +38,17 @@ class MangaColorFilterDialog : BaseDialogFragment(R.layout.dialog_manga_color_fi
 
     private fun initData() {
         binding.run {
+            chipAutoBrightness.isChecked = mConfig.autoBrightness
+
+            if (AppConfig.enableMangaEInk) dsbEpaper.visible()
+            else dsbEpaper.invisible()
+
+            dsbEpaper.progress = mMangaEInkThreshold
+
+            cpEpaper.isChecked = AppConfig.enableMangaEInk
+            cpEnableGray.isChecked = AppConfig.enableMangaGray
+
+            dsbBrightness.isEnabled = !mConfig.autoBrightness
             dsbBrightness.progress = mConfig.l
             dsbR.progress = mConfig.r
             dsbG.progress = mConfig.g
@@ -44,6 +59,37 @@ class MangaColorFilterDialog : BaseDialogFragment(R.layout.dialog_manga_color_fi
 
     private fun initView() {
         binding.run {
+            chipAutoBrightness.setOnCheckedChangeListener { _, isChecked ->
+                mConfig.autoBrightness = isChecked
+                dsbBrightness.isEnabled = !isChecked
+                callback?.updateColorFilter(mConfig)
+            }
+
+            cpEpaper.setOnCheckedChangeListener { _, isChecked ->
+                binding.dsbEpaper.isVisible = isChecked
+                if (isChecked) {
+                    cpEnableGray.isChecked = false
+                    callback?.updateGrayMode(false)
+                    dsbEpaper.visible()
+                } else dsbEpaper.invisible()
+                callback?.updateEpaperMode(isChecked, mMangaEInkThreshold)
+            }
+
+            cpEnableGray.setOnCheckedChangeListener { _, isChecked ->
+                if (isChecked) {
+                    binding.dsbEpaper.isVisible = false
+                    cpEpaper.isChecked = false
+                    callback?.updateEpaperMode(false, mMangaEInkThreshold)
+                }
+                dsbEpaper.invisible()
+                callback?.updateGrayMode(isChecked)
+            }
+
+            dsbEpaper.onChanged = {
+                mMangaEInkThreshold = it
+                callback?.updateEpaperMode(true, it)
+            }
+
             dsbBrightness.onChanged = {
                 mConfig.l = it
                 callback?.updateColorFilter(mConfig)
@@ -70,10 +116,13 @@ class MangaColorFilterDialog : BaseDialogFragment(R.layout.dialog_manga_color_fi
     override fun onDismiss(dialog: DialogInterface) {
         super.onDismiss(dialog)
         AppConfig.mangaColorFilter = mConfig.toJson()
+        AppConfig.mangaEInkThreshold = mMangaEInkThreshold
     }
 
     interface Callback {
         fun updateColorFilter(config: MangaColorFilterConfig)
+        fun updateEpaperMode(enabled: Boolean, threshold: Int)
+        fun updateGrayMode(enabled: Boolean)
     }
 
 }

+ 0 - 49
app/src/main/java/io/legato/kazusa/ui/book/manga/config/MangaEpaperDialog.kt

@@ -1,49 +0,0 @@
-package io.legato.kazusa.ui.book.manga.config
-
-import android.content.DialogInterface
-import android.os.Bundle
-import android.view.View
-import io.legato.kazusa.R
-import io.legato.kazusa.base.BaseBottomSheetDialogFragment
-import io.legato.kazusa.databinding.DialogMangaEpaperBinding
-import io.legato.kazusa.help.config.AppConfig
-import io.legato.kazusa.utils.viewbindingdelegate.viewBinding
-
-
-class MangaEpaperDialog : BaseBottomSheetDialogFragment(R.layout.dialog_manga_epaper) {
-    private val binding by viewBinding(DialogMangaEpaperBinding::bind)
-    private val callback get() = activity as? Callback
-    private var mMangaEInkThreshold = 150
-
-//    override fun onStart() {
-//        super.onStart()
-//        dialog?.window?.clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND)
-//        setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)
-//    }
-
-    override fun onFragmentCreated(view: View, savedInstanceState: Bundle?) {
-        initData()
-        initView()
-    }
-
-    private fun initData() {
-        binding.dsbEpaper.progress = AppConfig.mangaEInkThreshold
-    }
-
-    private fun initView() {
-        binding.dsbEpaper.onChanged = {
-            mMangaEInkThreshold = it
-            callback?.updateEepaper(it)
-        }
-    }
-
-    override fun onDismiss(dialog: DialogInterface) {
-        super.onDismiss(dialog)
-        AppConfig.mangaEInkThreshold = mMangaEInkThreshold
-    }
-
-    interface Callback {
-        fun updateEepaper(value: Int)
-    }
-
-}

+ 124 - 37
app/src/main/java/io/legato/kazusa/ui/book/manga/config/MangaFooterSettingDialog.kt

@@ -3,9 +3,9 @@ package io.legato.kazusa.ui.book.manga.config
 import android.content.DialogInterface
 import android.os.Bundle
 import android.view.View
-import android.view.ViewGroup
+import androidx.transition.TransitionManager
 import io.legato.kazusa.R
-import io.legato.kazusa.base.BaseDialogFragment
+import io.legato.kazusa.base.BaseBottomSheetDialogFragment
 import io.legato.kazusa.constant.EventBus
 import io.legato.kazusa.databinding.DialogMangaFooterSettingBinding
 import io.legato.kazusa.help.config.AppConfig
@@ -13,95 +13,151 @@ import io.legato.kazusa.ui.widget.ReaderInfoBarView
 import io.legato.kazusa.utils.GSON
 import io.legato.kazusa.utils.fromJsonObject
 import io.legato.kazusa.utils.postEvent
-import io.legato.kazusa.utils.setLayout
 import io.legato.kazusa.utils.viewbindingdelegate.viewBinding
 
-class MangaFooterSettingDialog : BaseDialogFragment(R.layout.dialog_manga_footer_setting) {
+class MangaFooterSettingDialog :
+    BaseBottomSheetDialogFragment(R.layout.dialog_manga_footer_setting) {
+
     val config = GSON.fromJsonObject<MangaFooterConfig>(AppConfig.mangaFooterConfig).getOrNull()
         ?: MangaFooterConfig()
+
+    var callback: Callback? = null
+
+    var initialAutoPageEnabled: Boolean = false
+    var initialAutoPageSpeed: Int = 3
+
     private val binding by viewBinding(DialogMangaFooterSettingBinding::bind)
 
     override fun onStart() {
         super.onStart()
-        setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)
+
     }
 
     override fun onFragmentCreated(view: View, savedInstanceState: Bundle?) {
+
         binding.cbChapterLabel.run {
-            isChecked = config.hideChapterLabel
+            isChecked = !config.hideChapterLabel
             setOnCheckedChangeListener { _, isChecked ->
-                config.hideChapterLabel = isChecked
+                config.hideChapterLabel = !isChecked
                 postEvent(EventBus.UP_MANGA_CONFIG, config)
+                updateChapterText()
+                if (isChecked) binding.cbChapter.isChecked = true
             }
         }
+
         binding.cbChapter.run {
-            isChecked = config.hideChapter
+            isChecked = !config.hideChapter
             setOnCheckedChangeListener { _, isChecked ->
-                config.hideChapter = isChecked
+                config.hideChapter = !isChecked
                 postEvent(EventBus.UP_MANGA_CONFIG, config)
+                updateChapterText()
+                if (!isChecked) binding.cbChapterLabel.isChecked = false
             }
         }
+
+        binding.cbChapterName.run {
+            isChecked = !config.hideChapterName
+            setOnCheckedChangeListener { _, isChecked ->
+                config.hideChapterName = !isChecked
+                postEvent(EventBus.UP_MANGA_CONFIG, config)
+                updateChapterText()
+            }
+        }
+
         binding.cbPageNumberLabel.run {
-            isChecked = config.hidePageNumberLabel
+            isChecked = !config.hidePageNumberLabel
             setOnCheckedChangeListener { _, isChecked ->
-                config.hidePageNumberLabel = isChecked
+                config.hidePageNumberLabel = !isChecked
                 postEvent(EventBus.UP_MANGA_CONFIG, config)
+                updateChapterText()
+                if (isChecked) binding.cbPageNumber.isChecked = true
             }
         }
+
         binding.cbPageNumber.run {
-            isChecked = config.hidePageNumber
+            isChecked = !config.hidePageNumber
             setOnCheckedChangeListener { _, isChecked ->
-                config.hidePageNumber = isChecked
+                config.hidePageNumber = !isChecked
                 postEvent(EventBus.UP_MANGA_CONFIG, config)
+                updateChapterText()
+                if (!isChecked) binding.cbPageNumberLabel.isChecked = false
             }
         }
+
         binding.cbProgressRatioLabel.run {
-            isChecked = config.hideProgressRatioLabel
+            isChecked = !config.hideProgressRatioLabel
             setOnCheckedChangeListener { _, isChecked ->
-                config.hideProgressRatioLabel = isChecked
+                config.hideProgressRatioLabel = !isChecked
                 postEvent(EventBus.UP_MANGA_CONFIG, config)
+                updateChapterText()
+                if (isChecked) binding.cbProgressRatio.isChecked = true
             }
         }
+
         binding.cbProgressRatio.run {
-            isChecked = config.hideProgressRatio
+            isChecked = !config.hideProgressRatio
             setOnCheckedChangeListener { _, isChecked ->
-                config.hideProgressRatio = isChecked
+                config.hideProgressRatio = !isChecked
                 postEvent(EventBus.UP_MANGA_CONFIG, config)
+                updateChapterText()
+                if (!isChecked) binding.cbProgressRatioLabel.isChecked = false
             }
         }
-        binding.cbChapterName.run {
-            isChecked = config.hideChapterName
-            setOnCheckedChangeListener { _, isChecked ->
-                config.hideChapterName = isChecked
-                postEvent(EventBus.UP_MANGA_CONFIG, config)
+
+        binding.rgFooterOrientation.check(
+            when {
+                config.hideFooter -> R.id.rb_hide
+                config.footerOrientation == ReaderInfoBarView.ALIGN_CENTER -> R.id.rb_center
+                else -> R.id.rb_left
             }
-        }
-        binding.rgFooterOrientation.check(if (config.footerOrientation == ReaderInfoBarView.ALIGN_CENTER) R.id.rb_center else R.id.rb_left)
-        binding.rgFooterOrientation.setOnCheckedChangeListener { _, checkedId ->
-            when (checkedId) {
+        )
+
+        binding.rgFooterOrientation.setOnCheckedStateChangeListener { _, checkedIds ->
+            when (checkedIds.firstOrNull()) {
                 R.id.rb_left -> {
+                    config.hideFooter = false
                     config.footerOrientation = ReaderInfoBarView.ALIGN_LEFT
                 }
-
                 R.id.rb_center -> {
+                    config.hideFooter = false
                     config.footerOrientation = ReaderInfoBarView.ALIGN_CENTER
                 }
+                R.id.rb_hide -> {
+                    config.hideFooter = true
+                }
             }
             postEvent(EventBus.UP_MANGA_CONFIG, config)
         }
 
-        binding.rgFooter.check(if (config.hideFooter) R.id.rb_hide else R.id.rb_show)
-        binding.rgFooter.setOnCheckedChangeListener { _, checkedId ->
-            when (checkedId) {
-                R.id.rb_show -> {
-                    config.hideFooter = false
-                }
 
-                R.id.rb_hide -> {
-                    config.hideFooter = true
-                }
+        binding.chipAutoPage.run {
+            isChecked = initialAutoPageEnabled
+            setOnCheckedChangeListener { _, isChecked ->
+                callback?.onAutoPageToggle(isChecked)
+                initAutoPageSpeed(isChecked)
+            }
+        }
+
+        binding.btnColorFilter.setOnClickListener {
+            callback?.showColorFilterConfig()
+            dismiss()
+        }
+
+        initAutoPageSpeed(initialAutoPageEnabled)
+
+        updateChapterText()
+    }
+
+    private fun initAutoPageSpeed(boolean: Boolean) {
+        TransitionManager.beginDelayedTransition(binding.rootView)
+        binding.scvAutoPageSpeed.run {
+            isEnabled = boolean
+            valueFormat = { "$it 秒" }
+            progress = initialAutoPageSpeed
+
+            onChanged = { newValue ->
+                callback?.onAutoPageSpeedChanged(newValue)
             }
-            postEvent(EventBus.UP_MANGA_CONFIG, config)
         }
     }
 
@@ -109,4 +165,35 @@ class MangaFooterSettingDialog : BaseDialogFragment(R.layout.dialog_manga_footer
         super.onDismiss(dialog)
         AppConfig.mangaFooterConfig = GSON.toJson(config)
     }
+
+    private fun updateChapterText() {
+        val label = if (!config.hideChapterLabel) "章节" else ""
+        val chapter = if (!config.hideChapter) "1/45 " else ""
+        val name = if (!config.hideChapterName) "第三话 " else ""
+
+        val progressLabel = if (!config.hideProgressRatioLabel) "总进度" else ""
+        val progress = if (!config.hideProgressRatio) "2.1%" else ""
+
+        val pageLabel = if (!config.hidePageNumberLabel) "页数" else ""
+        val page = if (!config.hidePageNumber) "4/30 " else ""
+
+        val parts = listOf(
+            name,
+            pageLabel,
+            page,
+            label,
+            chapter,
+            progressLabel,
+            progress
+        ).filter { it.isNotEmpty() }
+        TransitionManager.beginDelayedTransition(binding.rootView)
+        binding.tvChapter.text = parts.joinToString(" ")
+    }
+
+    interface Callback {
+        fun onAutoPageToggle(enable: Boolean)
+        fun onAutoPageSpeedChanged(speed: Int)
+        fun showColorFilterConfig()
+    }
+
 }

+ 2 - 3
app/src/main/java/io/legato/kazusa/ui/book/manga/entities/EpaperTransformation.kt

@@ -22,9 +22,8 @@ class EpaperTransformation(
     @IntRange(0, 255) private val threshold: Int = 128,
 ) : BitmapTransformation() {
 
-    private val ID =
-        "io.legado.app.model.EpaperTransformation.${threshold}"
-    private val ID_BYTES = ID.toByteArray(CHARSET)
+    private val ID get() = "io.legado.app.model.EpaperTransformation.$threshold"
+    private val ID_BYTES get() = ID.toByteArray(CHARSET)
 
     override fun transform(
         pool: BitmapPool,

+ 1 - 9
app/src/main/java/io/legato/kazusa/ui/book/manga/recyclerview/MangaAdapter.kt

@@ -253,21 +253,13 @@ class MangaAdapter(private val context: Context) :
     fun enableMangaEInk(enable: Boolean, value: Int) {
         if (enable) {
             currentMangaEInkThreshold = value
-            mTransformation = EpaperTransformation(currentMangaEInkThreshold)
+            mTransformation = EpaperTransformation(value)
         } else {
             mTransformation = null
         }
         notifyItemRangeChanged(0, itemCount)
     }
 
-    fun updateThreshold(mangaEInkThreshold: Int) {
-        if (currentMangaEInkThreshold != mangaEInkThreshold) {
-            currentMangaEInkThreshold = mangaEInkThreshold
-            mTransformation = EpaperTransformation(currentMangaEInkThreshold)
-            notifyItemRangeChanged(0, itemCount)
-        }
-    }
-
     //开启灰色图片
     fun enableGray(enable: Boolean) {
         mTransformation = if (enable) {

+ 39 - 15
app/src/main/java/io/legato/kazusa/ui/book/read/MangaMenu.kt

@@ -1,8 +1,8 @@
 package io.legato.kazusa.ui.book.read
 
+//import io.legado.app.lib.theme.bottomBackground
 import android.annotation.SuppressLint
 import android.content.Context
-import android.graphics.drawable.GradientDrawable
 import android.util.AttributeSet
 import android.view.LayoutInflater
 import android.view.animation.Animation
@@ -15,14 +15,12 @@ import io.legato.kazusa.databinding.ViewMangaMenuBinding
 import io.legato.kazusa.help.config.AppConfig
 import io.legato.kazusa.help.source.getSourceType
 import io.legato.kazusa.lib.dialogs.alert
-//import io.legado.app.lib.theme.bottomBackground
 import io.legato.kazusa.model.ReadBook
 import io.legato.kazusa.model.ReadManga
 import io.legato.kazusa.ui.browser.WebViewActivity
 import io.legato.kazusa.utils.ConstraintModify
 import io.legato.kazusa.utils.activity
 import io.legato.kazusa.utils.applyNavigationBarPadding
-import io.legato.kazusa.utils.dpToPx
 import io.legato.kazusa.utils.gone
 import io.legato.kazusa.utils.invisible
 import io.legato.kazusa.utils.loadAnimation
@@ -95,15 +93,15 @@ class MangaMenu @JvmOverloads constructor(
 
     private fun initView() = binding.run {
         initAnimation()
-        val brightnessBackground = GradientDrawable()
-        brightnessBackground.cornerRadius = 5F.dpToPx()
-        //brightnessBackground.setColor(ColorUtils.adjustAlpha(bgColor, 0.5f))
-        if (AppConfig.isEInkMode) {
-            titleBar.setBackgroundResource(R.drawable.bg_eink_border_bottom)
-            bottomMenu.setBackgroundResource(R.drawable.bg_eink_border_top)
-        } else {
-            //bottomMenu.setBackgroundColor(bgColor)
-        }
+//        val brightnessBackground = GradientDrawable()
+//        brightnessBackground.cornerRadius = 5F.dpToPx()
+//        //brightnessBackground.setColor(ColorUtils.adjustAlpha(bgColor, 0.5f))
+//        if (AppConfig.isEInkMode) {
+//            titleBar.setBackgroundResource(R.drawable.bg_eink_border_bottom)
+//            bottomMenu.setBackgroundResource(R.drawable.bg_eink_border_top)
+//        } else {
+//            //bottomMenu.setBackgroundColor(bgColor)
+//        }
         if (AppConfig.showReadTitleBarAddition) {
             titleBarAddition.visible()
         } else {
@@ -113,7 +111,7 @@ class MangaMenu @JvmOverloads constructor(
         /**
          * 确保视图不被导航栏遮挡
          */
-        bottomMenu.applyNavigationBarPadding()
+        bottomView.applyNavigationBarPadding()
     }
 
     private fun upBrightnessVwPos() {
@@ -163,6 +161,18 @@ class MangaMenu @JvmOverloads constructor(
         }
     }
 
+    fun upBookView() {
+        binding.titleBar.title = " "
+        binding.tvBookName.text = ReadManga.book?.name
+        ReadManga.curMangaChapter?.let {
+            binding.tvChapterName.text = ReadManga.book?.durChapterTitle
+            binding.tvPre.isEnabled = ReadManga.durChapterIndex != 0
+            binding.tvNext.isEnabled =
+                ReadManga.durChapterIndex != ReadManga.simulatedChapterSize - 1
+        } ?: let {
+            binding.tvChapterUrl.gone()
+        }
+    }
 
     private fun bindEvent() = binding.run {
         vwMenuBg.setOnClickListener { runMenuOut() }
@@ -224,14 +234,26 @@ class MangaMenu @JvmOverloads constructor(
             }
         })
 
+        ivCatalog.setOnClickListener {
+            callBack.openCatalog()
+        }
+
+        ivSetting.setOnClickListener {
+            callBack.showFooterConfig()
+        }
+
+        btnAutoPage.setOnClickListener {
+            callBack.showFooterConfig()
+        }
+
     }
 
     fun upSeekBar(value: Int, count: Int) {
         binding.seekReadPage.apply {
             valueFrom = 1f
-            valueTo = (count).toFloat()
-            this.value = value.toFloat().coerceIn(1f,valueFrom)
+            valueTo = count.toFloat()
             stepSize = 1f
+            this.value = value.toFloat().coerceIn(valueFrom, valueTo)
         }
     }
 
@@ -239,6 +261,8 @@ class MangaMenu @JvmOverloads constructor(
         fun openBookInfoActivity()
         fun upSystemUiVisibility(menuIsVisible: Boolean)
         fun skipToPage(index: Int)
+        fun openCatalog()
+        fun showFooterConfig()
     }
 
 }

+ 8 - 2
app/src/main/java/io/legato/kazusa/ui/widget/SimpleCounterView.kt

@@ -143,8 +143,6 @@ class SimpleCounterView @JvmOverloads constructor(
         }
     }
 
-
-
     private fun updateValue() {
         binding.tvSeekValue.text = valueFormat?.invoke(_progress) ?: _progress.toString()
     }
@@ -185,4 +183,12 @@ class SimpleCounterView @JvmOverloads constructor(
         super.onDetachedFromWindow()
     }
 
+    override fun setEnabled(enabled: Boolean) {
+        super.setEnabled(enabled)
+        binding.tvSeekTitle.isEnabled = enabled
+        binding.ivSeekPlus.isEnabled = enabled
+        binding.ivSeekReduce.isEnabled = enabled
+        binding.tvSeekValue.isEnabled = enabled
+    }
+
 }

+ 3 - 3
app/src/main/res/anim/popup_enter.xml

@@ -2,11 +2,11 @@
 <set xmlns:android="http://schemas.android.com/apk/res/android"
     android:interpolator="@android:interpolator/decelerate_cubic">
     <translate
-        android:fromYDelta="100%"
+        android:duration="240"
         android:toYDelta="0%"
-        android:duration="280"/>
+        android:fromYDelta="8%" />
     <alpha
         android:fromAlpha="0.0"
         android:toAlpha="1.0"
-        android:duration="280"/>
+        android:duration="240" />
 </set>

+ 1 - 5
app/src/main/res/anim/popup_exit.xml

@@ -1,12 +1,8 @@
 <?xml version="1.0" encoding="utf-8"?>
 <set xmlns:android="http://schemas.android.com/apk/res/android"
     android:interpolator="@android:interpolator/decelerate_cubic">
-    <translate
-        android:fromYDelta="0%"
-        android:toYDelta="100%"
-        android:duration="280"/>
     <alpha
         android:fromAlpha="1.0"
         android:toAlpha="0.0"
-        android:duration="280"/>
+        android:duration="240" />
 </set>

+ 11 - 0
app/src/main/res/drawable/ic_align_center.xml

@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="24dp"
+    android:height="24dp"
+    android:tint="?attr/colorControlNormal"
+    android:viewportWidth="960"
+    android:viewportHeight="960">
+    <path
+        android:fillColor="@android:color/white"
+        android:pathData="M80,520L80,440L880,440L880,520L80,520ZM280,400L280,280L680,280L680,400L280,400ZM280,680L280,560L680,560L680,680L280,680Z" />
+</vector>

+ 11 - 0
app/src/main/res/drawable/ic_align_left.xml

@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="24dp"
+    android:height="24dp"
+    android:tint="?attr/colorControlNormal"
+    android:viewportWidth="960"
+    android:viewportHeight="960">
+    <path
+        android:fillColor="@android:color/white"
+        android:pathData="M80,880L80,80L160,80L160,880L80,880ZM520,680L520,280L640,280L640,680L520,680ZM280,680L280,280L400,280L400,680L280,680Z" />
+</vector>

+ 121 - 28
app/src/main/res/layout/dialog_manga_color_filter.xml

@@ -3,54 +3,147 @@
     xmlns:app="http://schemas.android.com/apk/res-auto"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
-    android:padding="16dp">
+    android:paddingHorizontal="16dp"
+    android:paddingVertical="8dp">
 
     <LinearLayout
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
         android:orientation="vertical">
 
-        <io.legato.kazusa.ui.widget.text.AccentTextView
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:paddingBottom="8dp"
-            android:text="@string/manga_color_filter"
-            android:textSize="18sp" />
-
-        <io.legato.kazusa.ui.widget.DetailSeekBar
-            android:id="@+id/dsb_brightness"
+        <LinearLayout
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
-            app:max="255"
-            app:title="@string/brightness" />
+            android:gravity="center"
+            android:orientation="vertical"
+            android:paddingHorizontal="16dp"
+            android:paddingVertical="8dp">
+
+            <View
+                android:layout_width="36dp"
+                android:layout_height="4dp"
+                android:layout_gravity="center_horizontal"
+                android:layout_marginBottom="16dp"
+                android:background="@drawable/bg_bottom_sheet_handle" />
 
-        <io.legato.kazusa.ui.widget.DetailSeekBar
-            android:id="@+id/dsb_r"
+            <TextView
+                android:id="@+id/bottom_sheet_title"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:text="@string/manga_color_filter"
+                android:textSize="18sp"
+                android:textStyle="bold" />
+
+        </LinearLayout>
+
+        <LinearLayout
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
-            app:max="255"
-            app:title="R" />
+            android:gravity="center_vertical">
+
+            <io.legato.kazusa.ui.widget.SimpleCounterView
+                android:id="@+id/dsb_brightness"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                app:max="255"
+                app:title="@string/brightness" />
 
-        <io.legato.kazusa.ui.widget.DetailSeekBar
-            android:id="@+id/dsb_g"
+            <View
+                android:layout_width="0dp"
+                android:layout_height="match_parent"
+                android:layout_weight="1" />
+
+            <com.google.android.material.chip.Chip
+                android:id="@+id/chip_autoBrightness"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:text="跟随系统" />
+        </LinearLayout>
+
+        <LinearLayout
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
-            app:max="255"
-            app:title="G" />
+            android:gravity="center_vertical"
+            android:orientation="horizontal">
+
+
+            <com.google.android.material.chip.Chip
+                android:id="@+id/cp_epaper"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginEnd="8dp"
+                android:text="@string/manga_epaper" />
+
+            <com.google.android.material.chip.Chip
+                android:id="@+id/cp_enableGray"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:text="灰度" />
 
-        <io.legato.kazusa.ui.widget.DetailSeekBar
-            android:id="@+id/dsb_b"
+
+            <View
+                android:layout_width="0dp"
+                android:layout_height="match_parent"
+                android:layout_weight="1" />
+
+            <io.legato.kazusa.ui.widget.SimpleCounterView
+                android:id="@+id/dsbEpaper"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                app:max="255"
+                app:title="阈值" />
+        </LinearLayout>
+
+
+        <LinearLayout
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
-            app:max="255"
-            app:title="B" />
+            android:gravity="center_vertical">
+
+            <io.legato.kazusa.ui.widget.SimpleCounterView
+                android:id="@+id/dsb_r"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                app:max="255"
+                app:title="R" />
 
-        <io.legato.kazusa.ui.widget.DetailSeekBar
-            android:id="@+id/dsb_a"
+            <View
+                android:layout_width="0dp"
+                android:layout_height="match_parent"
+                android:layout_weight="1" />
+
+            <io.legato.kazusa.ui.widget.SimpleCounterView
+                android:id="@+id/dsb_g"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                app:max="255"
+                app:title="G" />
+        </LinearLayout>
+
+        <LinearLayout
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
-            app:max="255"
-            app:title="A" />
+            android:gravity="center_vertical">
+
+            <io.legato.kazusa.ui.widget.SimpleCounterView
+                android:id="@+id/dsb_b"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                app:max="255"
+                app:title="B" />
+
+            <View
+                android:layout_width="0dp"
+                android:layout_height="match_parent"
+                android:layout_weight="1" />
+
+            <io.legato.kazusa.ui.widget.SimpleCounterView
+                android:id="@+id/dsb_a"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                app:max="255"
+                app:title="A" />
+        </LinearLayout>
 
     </LinearLayout>
 

+ 140 - 106
app/src/main/res/layout/dialog_manga_footer_setting.xml

@@ -2,168 +2,202 @@
 <androidx.core.widget.NestedScrollView xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
-    android:padding="16dp">
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:paddingHorizontal="16dp"
+    android:paddingVertical="8dp">
 
     <LinearLayout
+        android:id="@+id/root_view"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
         android:orientation="vertical">
 
-        <io.legato.kazusa.ui.widget.text.AccentTextView
-            android:layout_width="wrap_content"
+        <LinearLayout
+            android:layout_width="match_parent"
             android:layout_height="wrap_content"
-            android:text="@string/manga_footer_config"
-            android:textSize="18sp" />
+            android:gravity="center"
+            android:orientation="vertical"
+            android:paddingHorizontal="16dp"
+            android:paddingVertical="8dp">
+
+            <View
+                android:layout_width="36dp"
+                android:layout_height="4dp"
+                android:layout_gravity="center_horizontal"
+                android:layout_marginBottom="16dp"
+                android:background="@drawable/bg_bottom_sheet_handle" />
+
+            <TextView
+                android:id="@+id/bottom_sheet_title"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:text="漫画设置"
+                android:textSize="18sp"
+                android:textStyle="bold" />
 
-        <TextView
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_marginTop="16dp"
-            android:text="@string/manga_header_chapter"
-            android:textSize="14sp" />
+        </LinearLayout>
 
         <LinearLayout
-            android:layout_width="wrap_content"
+            android:layout_width="match_parent"
             android:layout_height="wrap_content"
-            android:layout_marginStart="16dp"
-            android:layout_marginTop="8dp">
+            android:gravity="center_vertical"
+            android:orientation="horizontal">
 
-            <io.legato.kazusa.lib.theme.view.ThemeCheckBox
-                android:id="@+id/cb_chapter_label"
+            <TextView
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
-                android:gravity="center"
-                android:text="@string/manga_check_chapter_label" />
+                android:layout_marginEnd="8dp"
+                android:text="@string/footer"
+                android:textSize="14sp" />
 
-            <io.legato.kazusa.lib.theme.view.ThemeCheckBox
-                android:id="@+id/cb_chapter"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:layout_marginStart="10dp"
-                android:gravity="center"
-                android:text="@string/manga_check_chapter" />
+            <View
+                android:layout_width="0dp"
+                android:layout_height="match_parent"
+                android:layout_weight="1" />
 
-            <io.legato.kazusa.lib.theme.view.ThemeCheckBox
-                android:id="@+id/cb_chapter_name"
+            <com.google.android.material.chip.ChipGroup
+                android:id="@+id/rg_footer_orientation"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
-                android:layout_marginStart="10dp"
-                android:gravity="center"
-                android:text="@string/manga_check_chapter_name" />
+                app:selectionRequired="true"
+                app:singleSelection="true">
+
+                <com.google.android.material.chip.Chip
+                    android:id="@+id/rb_left"
+                    style="@style/Widget.Material3.Chip.Suggestion"
+                    android:layout_width="34dp"
+                    android:layout_height="wrap_content"
+                    app:chipIcon="@drawable/ic_align_left"
+                    app:chipIconEnabled="true" />
+
+                <com.google.android.material.chip.Chip
+                    android:id="@+id/rb_center"
+                    style="@style/Widget.Material3.Chip.Suggestion"
+                    android:layout_width="34dp"
+                    android:layout_height="wrap_content"
+                    app:chipIcon="@drawable/ic_align_center"
+                    app:chipIconEnabled="true" />
+
+                <com.google.android.material.chip.Chip
+                    android:id="@+id/rb_hide"
+                    style="@style/Widget.Material3.Chip.Suggestion"
+                    android:layout_width="34dp"
+                    android:layout_height="wrap_content"
+                    app:chipIcon="@drawable/ic_visibility_off"
+                    app:chipIconEnabled="true" />
+            </com.google.android.material.chip.ChipGroup>
+
         </LinearLayout>
 
-        <TextView
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_marginTop="16dp"
-            android:text="@string/manga_header_page"
-            android:textSize="14sp" />
 
-        <LinearLayout
-            android:layout_width="wrap_content"
+        <com.google.android.material.card.MaterialCardView
+            android:layout_width="match_parent"
             android:layout_height="wrap_content"
-            android:layout_marginStart="16dp"
-            android:layout_marginTop="8dp">
+            android:layout_marginVertical="8dp"
+            app:cardBackgroundColor="?attr/colorSurfaceVariant"
+            app:cardCornerRadius="8dp"
+            app:strokeWidth="0dp">
+
+            <TextView
+                android:id="@+id/tv_chapter"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:padding="8dp" />
+        </com.google.android.material.card.MaterialCardView>
 
-            <io.legato.kazusa.lib.theme.view.ThemeCheckBox
+        <com.google.android.material.chip.ChipGroup
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content">
+
+            <com.google.android.material.chip.Chip
+                android:id="@+id/cb_chapter_name"
+                style="@style/Widget.Material3.Chip.Suggestion"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:text="第三话" />
+
+            <com.google.android.material.chip.Chip
                 android:id="@+id/cb_page_number_label"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
-                android:gravity="center"
+                style="@style/Widget.Material3.Chip.Suggestion"
                 android:text="@string/manga_check_page_label" />
 
-            <io.legato.kazusa.lib.theme.view.ThemeCheckBox
+            <com.google.android.material.chip.Chip
                 android:id="@+id/cb_page_number"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
-                android:layout_marginStart="10dp"
-                android:gravity="center"
-                android:text="@string/manga_check_page_number" />
-        </LinearLayout>
+                style="@style/Widget.Material3.Chip.Suggestion"
+                android:text="4/30" />
 
-        <TextView
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_marginTop="16dp"
-            android:text="@string/manga_header_progress"
-            android:textSize="14sp" />
+        </com.google.android.material.chip.ChipGroup>
 
-        <LinearLayout
+        <com.google.android.material.chip.ChipGroup
             android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_marginStart="16dp"
-            android:layout_marginTop="8dp">
+            android:layout_height="wrap_content">
+
+            <com.google.android.material.chip.Chip
+                android:id="@+id/cb_chapter_label"
+                style="@style/Widget.Material3.Chip.Suggestion"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:text="@string/manga_check_chapter_label" />
 
-            <io.legato.kazusa.lib.theme.view.ThemeCheckBox
+            <com.google.android.material.chip.Chip
+                android:id="@+id/cb_chapter"
+                style="@style/Widget.Material3.Chip.Suggestion"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:text="1 / 45" />
+
+            <com.google.android.material.chip.Chip
                 android:id="@+id/cb_progress_ratio_label"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
-                android:gravity="center"
+                style="@style/Widget.Material3.Chip.Suggestion"
                 android:text="@string/manga_check_progress_label" />
 
-            <io.legato.kazusa.lib.theme.view.ThemeCheckBox
+            <com.google.android.material.chip.Chip
                 android:id="@+id/cb_progress_ratio"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
-                android:layout_marginStart="10dp"
-                android:gravity="center"
-                android:text="@string/manga_check_progress" />
-        </LinearLayout>
+                style="@style/Widget.Material3.Chip.Suggestion"
+                android:text="2.1%" />
+        </com.google.android.material.chip.ChipGroup>
 
-        <TextView
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_marginTop="16dp"
-            android:text="@string/manga_header_footer"
-            android:textSize="14sp" />
-
-        <RadioGroup
-            android:id="@+id/rg_footer"
-            android:layout_width="wrap_content"
+        <LinearLayout
+            android:layout_width="match_parent"
             android:layout_height="wrap_content"
-            android:layout_marginStart="16dp"
-            android:layout_marginTop="8dp"
+            android:gravity="center_vertical"
             android:orientation="horizontal">
 
-            <io.legato.kazusa.lib.theme.view.ThemeRadioButton
-                android:id="@+id/rb_show"
+            <com.google.android.material.chip.Chip
+                android:id="@+id/chip_autoPage"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
-                android:gravity="center"
-                android:text="@string/show" />
+                android:text="@string/enable_auto_page_scroll" />
 
-            <io.legato.kazusa.lib.theme.view.ThemeRadioButton
-                android:id="@+id/rb_hide"
+            <View
+                android:layout_width="0dp"
+                android:layout_height="match_parent"
+                android:layout_weight="1" />
+
+            <io.legato.kazusa.ui.widget.SimpleCounterView
+                android:id="@+id/scv_autoPageSpeed"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
-                android:layout_marginStart="10dp"
-                android:gravity="center"
-                android:text="@string/hide" />
-        </RadioGroup>
+                app:max="100"
+                app:title="翻页速度" />
+
+        </LinearLayout>
 
-        <RadioGroup
-            android:id="@+id/rg_footer_orientation"
+        <com.google.android.material.button.MaterialButton
+            android:id="@+id/btn_color_filter"
+            style="@style/Widget.Material3.Button.IconButton.Filled.Tonal"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
-            android:layout_marginStart="16dp"
-            android:layout_marginTop="8dp"
-            android:orientation="horizontal">
-
-            <io.legato.kazusa.lib.theme.view.ThemeRadioButton
-                android:id="@+id/rb_left"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:gravity="center"
-                android:text="@string/manga_radio_left" />
+            android:text="@string/manga_color_filter" />
 
-            <io.legato.kazusa.lib.theme.view.ThemeRadioButton
-                android:id="@+id/rb_center"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:layout_marginStart="10dp"
-                android:gravity="center"
-                android:text="@string/manga_radio_center" />
-        </RadioGroup>
 
     </LinearLayout>
 

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

@@ -7,7 +7,7 @@
     android:background="?attr/selectableItemBackground"
     android:ellipsize="end"
     android:gravity="center"
-    android:padding="5dp"
+    android:padding="8dp"
     android:maxLines="1"
     android:scrollbars="none"
     android:textSize="14sp"

+ 117 - 52
app/src/main/res/layout/view_manga_menu.xml

@@ -19,64 +19,60 @@
         android:id="@+id/title_bar"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
-        android:theme="?attr/actionBarStyle"
+        android:alpha="0.92"
+        android:background="?attr/colorSurfaceContainer"
         app:layout_constraintTop_toTopOf="parent">
 
-        <androidx.constraintlayout.widget.ConstraintLayout
-            android:id="@+id/title_bar_addition"
+        <LinearLayout
             android:layout_width="match_parent"
-            android:layout_height="wrap_content">
+            android:layout_height="wrap_content"
+            android:orientation="vertical"
+            android:paddingHorizontal="16dp">
 
             <TextView
-                android:id="@+id/tv_chapter_name"
-                android:layout_width="0dp"
+                android:id="@+id/tv_book_name"
+                style="@style/TextAppearance.Material3.TitleLarge"
+                android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
-                android:paddingLeft="10dp"
-                android:paddingRight="10dp"
-                android:singleLine="true"
-                android:visibility="gone"
-                app:layout_constraintLeft_toLeftOf="parent"
-                app:layout_constraintRight_toLeftOf="@+id/tv_source_action"
-                app:layout_constraintTop_toTopOf="parent"
-                tools:visibility="visible" />
+                android:singleLine="true" />
 
-            <TextView
-                android:id="@+id/tv_chapter_url"
-                android:layout_width="0dp"
+            <LinearLayout
+                android:id="@+id/title_bar_addition"
+                android:layout_width="match_parent"
                 android:layout_height="wrap_content"
-                android:paddingLeft="10dp"
-                android:paddingRight="10dp"
-                android:singleLine="true"
-                android:visibility="gone"
-                app:layout_constraintLeft_toLeftOf="parent"
-                app:layout_constraintRight_toLeftOf="@+id/tv_source_action"
-                app:layout_constraintTop_toBottomOf="@+id/tv_chapter_name"
-                tools:visibility="visible" />
-
-            <io.legato.kazusa.ui.widget.text.AccentBgTextView
-                android:id="@+id/tv_source_action"
-                android:layout_width="wrap_content"
-                android:layout_height="0dp"
-                android:layout_margin="1dp"
-                android:gravity="center"
-                android:maxWidth="120dp"
-                android:paddingLeft="6dp"
-                android:paddingRight="6dp"
-                android:text="@string/book_source"
-                app:layout_constraintBottom_toBottomOf="@+id/tv_chapter_url"
-                app:layout_constraintRight_toRightOf="parent"
-                app:layout_constraintTop_toTopOf="parent"
-                app:radius="2dp"
-                tools:visibility="visible" />
-
-        </androidx.constraintlayout.widget.ConstraintLayout>
+                android:orientation="horizontal">
+
+                <TextView
+                    android:id="@+id/tv_chapter_name"
+                    style="@style/TextAppearance.Material3.BodyMedium"
+                    android:layout_width="0dp"
+                    android:layout_height="wrap_content"
+                    android:layout_weight="1"
+                    android:singleLine="true" />
+
+                <TextView
+                    android:id="@+id/tv_chapter_url"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:singleLine="true"
+                    android:visibility="gone" />
+
+                <TextView
+                    android:id="@+id/tv_source_action"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:paddingVertical="8dp"
+                    android:text="@string/book_source" />
 
+            </LinearLayout>
+        </LinearLayout>
     </io.legato.kazusa.ui.widget.TitleBar>
 
     <LinearLayout
         android:id="@+id/bottom_menu"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
+        android:alpha="0.92"
         android:importantForAccessibility="no"
         android:orientation="vertical"
         app:layout_constraintBottom_toBottomOf="parent">
@@ -84,10 +80,8 @@
         <LinearLayout
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
-            android:layout_marginLeft="20dp"
-            android:layout_marginTop="10dp"
-            android:layout_marginRight="20dp"
-            android:layout_marginBottom="10dp"
+            android:layout_marginHorizontal="16dp"
+            android:layout_marginVertical="8dp"
             android:importantForAccessibility="no"
             android:orientation="horizontal">
 
@@ -99,12 +93,20 @@
                 app:icon="@drawable/ic_previous"
                 tools:ignore="TouchTargetSizeCheck" />
 
-            <com.google.android.material.slider.Slider
-                android:id="@+id/seek_read_page"
+            <com.google.android.material.card.MaterialCardView
                 android:layout_width="0dp"
-                android:layout_height="25dp"
-                android:layout_gravity="center_vertical"
-                android:layout_weight="1" />
+                android:layout_height="wrap_content"
+                android:layout_weight="1"
+                app:cardBackgroundColor="?attr/colorSurfaceContainer"
+                app:cardCornerRadius="32dp"
+                app:strokeWidth="0dp">
+
+                <com.google.android.material.slider.Slider
+                    android:id="@+id/seek_read_page"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:layout_gravity="center_vertical" />
+            </com.google.android.material.card.MaterialCardView>
 
             <com.google.android.material.button.MaterialButton
                 android:id="@+id/tv_next"
@@ -114,6 +116,69 @@
                 app:icon="@drawable/ic_next"
                 tools:ignore="TouchTargetSizeCheck" />
         </LinearLayout>
+
+        <LinearLayout
+            android:id="@+id/bottom_view"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:background="?attr/colorSurfaceContainer"
+            android:importantForAccessibility="no"
+            android:orientation="horizontal"
+            android:paddingHorizontal="16dp"
+            android:paddingVertical="8dp">
+
+            <com.google.android.material.button.MaterialButton
+                android:id="@+id/iv_catalog"
+                style="@style/Widget.Material3.Button.IconButton.Filled.Tonal"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:backgroundTint="@android:color/transparent"
+                android:contentDescription="@string/chapter_list"
+                android:maxHeight="24dp"
+                android:tooltipText="@string/chapter_list"
+                app:icon="@drawable/ic_toc"
+                app:iconGravity="textStart"
+                tools:ignore="NestedWeights" />
+
+            <View
+                android:layout_width="0dp"
+                android:layout_height="match_parent"
+                android:layout_weight="1"
+                android:importantForAccessibility="no" />
+
+            <com.google.android.material.button.MaterialButton
+                android:id="@+id/btn_autoPage"
+                style="@style/Widget.Material3.Button.IconButton.Filled.Tonal"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:backgroundTint="@android:color/transparent"
+                android:contentDescription="@string/auto_next_page"
+                android:tooltipText="@string/auto_next_page"
+                app:icon="@drawable/ic_auto_page"
+                app:iconGravity="textStart"
+                tools:ignore="UnusedAttribute" />
+
+            <View
+                android:layout_width="0dp"
+                android:layout_height="match_parent"
+                android:layout_weight="1"
+                android:importantForAccessibility="no" />
+
+            <com.google.android.material.button.MaterialButton
+                android:id="@+id/iv_setting"
+                style="@style/Widget.Material3.Button.IconButton.Filled.Tonal"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:backgroundTint="@android:color/transparent"
+                android:contentDescription="@string/setting"
+                android:maxHeight="24dp"
+                android:tooltipText="@string/setting"
+                app:icon="@drawable/ic_settings"
+                app:iconGravity="textStart"
+                tools:ignore="NestedWeights" />
+
+        </LinearLayout>
+
     </LinearLayout>
 
 </androidx.constraintlayout.widget.ConstraintLayout>

+ 0 - 3
app/src/main/res/layout/view_read_menu.xml

@@ -66,9 +66,6 @@
 
             </LinearLayout>
         </LinearLayout>
-
-
-
     </io.legato.kazusa.ui.widget.TitleBar>
 
     <LinearLayout

+ 0 - 44
app/src/main/res/menu/book_manga.xml

@@ -17,12 +17,6 @@
             android:title="@string/refresh"
             app:showAsAction="always" />
 
-        <item
-            android:id="@+id/menu_catalog"
-            android:icon="@drawable/ic_toc"
-            android:title="@string/chapter_list"
-            app:showAsAction="always" />
-
     </group>
 
     <item
@@ -44,13 +38,6 @@
         android:title="@string/disable_manga_click_scroll"
         app:showAsAction="never" />
 
-    <item
-        android:id="@+id/menu_enable_auto_page"
-        android:checkable="true"
-        android:checked="false"
-        android:title="@string/enable_auto_page_scroll"
-        app:showAsAction="never" />
-
     <item
         android:id="@+id/menu_enable_auto_scroll"
         android:checkable="true"
@@ -58,12 +45,6 @@
         android:title="@string/enable_auto_scroll"
         app:showAsAction="never" />
 
-    <item
-        android:id="@+id/menu_manga_auto_page_speed"
-        android:title="@string/manga_auto_page_speed"
-        android:visible="false"
-        app:showAsAction="never" />
-
     <item
         android:id="@+id/menu_enable_horizontal_scroll"
         android:checkable="true"
@@ -79,11 +60,6 @@
         android:visible="false"
         app:showAsAction="never" />
 
-    <item
-        android:id="@+id/menu_manga_footer_config"
-        android:title="@string/manga_footer_config"
-        app:showAsAction="never" />
-
     <item
         android:id="@+id/menu_manga_color_filter"
         android:title="@string/manga_color_filter"
@@ -96,24 +72,4 @@
         android:title="@string/hide_manga_title"
         app:showAsAction="never" />
 
-    <item
-        android:id="@+id/menu_epaper_manga"
-        android:checkable="true"
-        android:checked="false"
-        android:title="@string/manga_epaper"
-        app:showAsAction="never" />
-
-    <item
-        android:id="@+id/menu_epaper_manga_setting"
-        android:title="@string/manga_epaper_stting"
-        android:visible="false"
-        app:showAsAction="never" />
-
-    <item
-        android:id="@+id/menu_gray_manga"
-        android:checkable="true"
-        android:checked="false"
-        android:title="@string/enable_manga_gray"
-        app:showAsAction="never" />
-
 </menu>

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

@@ -1200,15 +1200,15 @@
     <string name="book_reader_info_bar">页数. %1$d/%2$d 章节. %3$d/%4$d -> %5$s%%</string>
     <string name="menu_download_after">下载之后章节</string>
     <string name="menu_download_all">下载全部章节</string>
-    <string name="manga_header_chapter">《章节和文案》隐藏</string>
-    <string name="manga_check_chapter_label">《章节.》文案</string>
+    <string name="manga_header_chapter">章节显示设置</string>
+    <string name="manga_check_chapter_label">章节</string>
     <string name="manga_check_chapter">章节</string>
     <string name="manga_check_chapter_name">章节名称</string>
     <string name="manga_header_page">《页数和文案》隐藏</string>
-    <string name="manga_check_page_label">《页数.》文案</string>
+    <string name="manga_check_page_label">页数</string>
     <string name="manga_check_page_number">页数</string>
     <string name="manga_header_progress">《总进度和文案》隐藏</string>
-    <string name="manga_check_progress_label">《总进度.》文案</string>
+    <string name="manga_check_progress_label">总进度</string>
     <string name="manga_check_progress">总进度</string>
     <string name="manga_header_footer">页脚</string>
     <string name="manga_radio_left">靠左</string>