HapeLee 1 год назад
Родитель
Сommit
6b1d11489f

+ 5 - 12
app/src/main/java/io/legato/kazusa/ui/book/changecover/ChangeCoverDialog.kt

@@ -1,21 +1,19 @@
 package io.legato.kazusa.ui.book.changecover
 
+//import io.legado.app.lib.theme.primaryColor
 import android.os.Bundle
 import android.view.MenuItem
 import android.view.View
-import android.view.ViewGroup
 import androidx.appcompat.widget.Toolbar
+import androidx.core.view.isVisible
 import androidx.fragment.app.viewModels
 import androidx.lifecycle.Lifecycle.State.STARTED
 import androidx.lifecycle.lifecycleScope
 import androidx.lifecycle.repeatOnLifecycle
 import androidx.recyclerview.widget.GridLayoutManager
 import io.legato.kazusa.R
-import io.legato.kazusa.base.BaseDialogFragment
+import io.legato.kazusa.base.BaseBottomSheetDialogFragment
 import io.legato.kazusa.databinding.DialogChangeCoverBinding
-//import io.legado.app.lib.theme.primaryColor
-import io.legato.kazusa.utils.applyTint
-import io.legato.kazusa.utils.setLayout
 import io.legato.kazusa.utils.viewbindingdelegate.viewBinding
 import kotlinx.coroutines.delay
 import kotlinx.coroutines.flow.conflate
@@ -24,7 +22,7 @@ import kotlinx.coroutines.launch
 /**
  * 换封面
  */
-class ChangeCoverDialog() : BaseDialogFragment(R.layout.dialog_change_cover),
+class ChangeCoverDialog() : BaseBottomSheetDialogFragment(R.layout.dialog_change_cover),
     Toolbar.OnMenuItemClickListener,
     CoverAdapter.CallBack {
 
@@ -43,11 +41,6 @@ class ChangeCoverDialog() : BaseDialogFragment(R.layout.dialog_change_cover),
     private val startStopMenuItem: MenuItem?
         get() = binding.toolBar.menu.findItem(R.id.menu_start_stop)
 
-    override fun onStart() {
-        super.onStart()
-        setLayout(1f, ViewGroup.LayoutParams.MATCH_PARENT)
-    }
-
     override fun onFragmentCreated(view: View, savedInstanceState: Bundle?) {
         //binding.toolBar.setBackgroundColor(primaryColor)
         binding.toolBar.setTitle(R.string.change_cover_source)
@@ -82,7 +75,7 @@ class ChangeCoverDialog() : BaseDialogFragment(R.layout.dialog_change_cover),
     override fun observeLiveBus() {
         super.observeLiveBus()
         viewModel.searchStateData.observe(viewLifecycleOwner) {
-            binding.refreshProgressBar.isAutoLoading = it
+            binding.refreshProgressBar.isVisible = it
             if (it) {
                 startStopMenuItem?.let { item ->
                     item.setIcon(R.drawable.ic_stop_black_24dp)

+ 13 - 73
app/src/main/java/io/legato/kazusa/ui/book/changesource/ChangeBookSourceAdapter.kt

@@ -5,8 +5,6 @@ import android.os.Bundle
 import android.view.View
 import android.view.ViewGroup
 import androidx.appcompat.widget.PopupMenu
-import androidx.core.graphics.drawable.DrawableCompat
-import androidx.core.view.isVisible
 import androidx.recyclerview.widget.DiffUtil
 import io.legato.kazusa.R
 import io.legato.kazusa.base.adapter.DiffRecyclerAdapter
@@ -15,12 +13,10 @@ import io.legato.kazusa.data.entities.SearchBook
 import io.legato.kazusa.databinding.ItemChangeSourceBinding
 import io.legato.kazusa.help.config.AppConfig
 import io.legato.kazusa.lib.dialogs.alert
-import io.legato.kazusa.utils.getCompatColor
 import io.legato.kazusa.utils.gone
 import io.legato.kazusa.utils.invisible
 import io.legato.kazusa.utils.themeColor
 import io.legato.kazusa.utils.visible
-import splitties.init.appCtx
 import splitties.views.onLongClick
 
 
@@ -88,38 +84,11 @@ class ChangeBookSourceAdapter(
             }
             val score = callBack.getBookScore(item)
             if (score > 0) {
-                binding.ivBad.gone()
-                binding.ivGood.visible()
-                DrawableCompat.setTint(
-                    binding.ivGood.drawable,
-                    appCtx.getCompatColor(R.color.md_red_A200)
-                )
-                DrawableCompat.setTint(
-                    binding.ivBad.drawable,
-                    appCtx.getCompatColor(R.color.md_blue_100)
-                )
-            } else if (score < 0) {
-                binding.ivGood.gone()
-                binding.ivBad.visible()
-                DrawableCompat.setTint(
-                    binding.ivGood.drawable,
-                    appCtx.getCompatColor(R.color.md_red_100)
-                )
-                DrawableCompat.setTint(
-                    binding.ivBad.drawable,
-                    appCtx.getCompatColor(R.color.md_blue_A200)
-                )
+                // 已置顶
+                binding.ivGood.setImageResource(R.drawable.ic_praise_filled)
             } else {
-                binding.ivGood.visible()
-                binding.ivBad.visible()
-                DrawableCompat.setTint(
-                    binding.ivGood.drawable,
-                    appCtx.getCompatColor(R.color.md_red_100)
-                )
-                DrawableCompat.setTint(
-                    binding.ivBad.drawable,
-                    appCtx.getCompatColor(R.color.md_blue_100)
-                )
+                // 未置顶
+                binding.ivGood.setImageResource(R.drawable.ic_praise)
             }
 
             if (AppConfig.changeSourceLoadWordCount && !item.chapterWordCountText.isNullOrBlank()) {
@@ -138,45 +107,16 @@ class ChangeBookSourceAdapter(
 
     override fun registerListener(holder: ItemViewHolder, binding: ItemChangeSourceBinding) {
         binding.ivGood.setOnClickListener {
-            if (binding.ivBad.isVisible) {
-                DrawableCompat.setTint(
-                    binding.ivGood.drawable,
-                    appCtx.getCompatColor(R.color.md_red_A200)
-                )
-                binding.ivBad.gone()
-                getItem(holder.layoutPosition)?.let {
-                    callBack.setBookScore(it, 1)
-                }
-            } else {
-                DrawableCompat.setTint(
-                    binding.ivGood.drawable,
-                    appCtx.getCompatColor(R.color.md_red_100)
-                )
-                binding.ivBad.visible()
-                getItem(holder.layoutPosition)?.let {
-                    callBack.setBookScore(it, 0)
-                }
-            }
-        }
-        binding.ivBad.setOnClickListener {
-            if (binding.ivGood.isVisible) {
-                DrawableCompat.setTint(
-                    binding.ivBad.drawable,
-                    appCtx.getCompatColor(R.color.md_blue_A200)
-                )
-                binding.ivGood.gone()
-                getItem(holder.layoutPosition)?.let {
-                    callBack.setBookScore(it, -1)
-                }
+            val item = getItem(holder.layoutPosition) ?: return@setOnClickListener
+            val score = callBack.getBookScore(item)
+            if (score > 0) {
+                // 已置顶 -> 取消置顶
+                binding.ivGood.setImageResource(R.drawable.ic_praise)
+                callBack.setBookScore(item, 0)
             } else {
-                DrawableCompat.setTint(
-                    binding.ivBad.drawable,
-                    appCtx.getCompatColor(R.color.md_blue_100)
-                )
-                binding.ivGood.visible()
-                getItem(holder.layoutPosition)?.let {
-                    callBack.setBookScore(it, 0)
-                }
+                // 未置顶 -> 设置置顶
+                binding.ivGood.setImageResource(R.drawable.ic_praise_filled)
+                callBack.setBookScore(item, 1)
             }
         }
         holder.itemView.setOnClickListener {

+ 14 - 55
app/src/main/java/io/legato/kazusa/ui/book/changesource/ChangeChapterSourceAdapter.kt

@@ -5,8 +5,6 @@ import android.os.Bundle
 import android.view.View
 import android.view.ViewGroup
 import androidx.appcompat.widget.PopupMenu
-import androidx.core.graphics.drawable.DrawableCompat
-import androidx.core.view.isVisible
 import androidx.recyclerview.widget.DiffUtil
 import io.legato.kazusa.R
 import io.legato.kazusa.base.adapter.DiffRecyclerAdapter
@@ -14,11 +12,9 @@ import io.legato.kazusa.base.adapter.ItemViewHolder
 import io.legato.kazusa.data.entities.SearchBook
 import io.legato.kazusa.databinding.ItemChangeSourceBinding
 import io.legato.kazusa.help.config.AppConfig
-import io.legato.kazusa.utils.getCompatColor
 import io.legato.kazusa.utils.gone
 import io.legato.kazusa.utils.invisible
 import io.legato.kazusa.utils.visible
-import splitties.init.appCtx
 import splitties.views.onLongClick
 
 
@@ -80,34 +76,14 @@ class ChangeChapterSourceAdapter(
             }
             val score = callBack.getBookScore(item)
             if (score > 0) {
-                binding.ivBad.gone()
-                binding.ivGood.visible()
-                DrawableCompat.setTint(binding.ivGood.drawable, appCtx.getCompatColor(R.color.md_red_A200))
-                DrawableCompat.setTint(binding.ivBad.drawable, appCtx.getCompatColor(R.color.md_blue_100))
-            } else if (score < 0) {
-                binding.ivGood.gone()
-                binding.ivBad.visible()
-                DrawableCompat.setTint(
-                    binding.ivGood.drawable,
-                    appCtx.getCompatColor(R.color.md_red_100)
-                )
-                DrawableCompat.setTint(
-                    binding.ivBad.drawable,
-                    appCtx.getCompatColor(R.color.md_blue_A200)
-                )
+                // 已置顶
+                binding.ivGood.setImageResource(R.drawable.ic_praise_filled)
             } else {
-                binding.ivGood.visible()
-                binding.ivBad.visible()
-                DrawableCompat.setTint(
-                    binding.ivGood.drawable,
-                    appCtx.getCompatColor(R.color.md_red_100)
-                )
-                DrawableCompat.setTint(
-                    binding.ivBad.drawable,
-                    appCtx.getCompatColor(R.color.md_blue_100)
-                )
+                // 未置顶
+                binding.ivGood.setImageResource(R.drawable.ic_praise)
             }
 
+
             if (AppConfig.changeSourceLoadWordCount && !item.chapterWordCountText.isNullOrBlank()) {
                 tvCurrentChapterWordCount.visible()
             } else {
@@ -124,33 +100,16 @@ class ChangeChapterSourceAdapter(
 
     override fun registerListener(holder: ItemViewHolder, binding: ItemChangeSourceBinding) {
         binding.ivGood.setOnClickListener {
-            if (binding.ivBad.isVisible) {
-                DrawableCompat.setTint(binding.ivGood.drawable, appCtx.getCompatColor(R.color.md_red_A200))
-                binding.ivBad.gone()
-                getItem(holder.layoutPosition)?.let {
-                    callBack.setBookScore(it, 1)
-                }
-            } else {
-                DrawableCompat.setTint(binding.ivGood.drawable, appCtx.getCompatColor(R.color.md_red_100))
-                binding.ivBad.visible()
-                getItem(holder.layoutPosition)?.let {
-                    callBack.setBookScore(it, 0)
-                }
-            }
-        }
-        binding.ivBad.setOnClickListener {
-            if (binding.ivGood.isVisible) {
-                DrawableCompat.setTint(binding.ivBad.drawable, appCtx.getCompatColor(R.color.md_blue_A200))
-                binding.ivGood.gone()
-                getItem(holder.layoutPosition)?.let {
-                    callBack.setBookScore(it, -1)
-                }
+            val item = getItem(holder.layoutPosition) ?: return@setOnClickListener
+            val score = callBack.getBookScore(item)
+            if (score > 0) {
+                // 已置顶 -> 取消置顶
+                binding.ivGood.setImageResource(R.drawable.ic_praise)
+                callBack.setBookScore(item, 0)
             } else {
-                DrawableCompat.setTint(binding.ivBad.drawable, appCtx.getCompatColor(R.color.md_blue_100))
-                binding.ivGood.visible()
-                getItem(holder.layoutPosition)?.let {
-                    callBack.setBookScore(it, 0)
-                }
+                // 未置顶 -> 设置置顶
+                binding.ivGood.setImageResource(R.drawable.ic_praise_filled)
+                callBack.setBookScore(item, 1)
             }
         }
         holder.itemView.setOnClickListener {

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

@@ -1,9 +1,8 @@
 package io.legato.kazusa.ui.book.group
 
-//import io.legado.app.lib.theme.primaryColor
 import android.os.Bundle
 import android.view.View
-import androidx.appcompat.widget.PopupMenu
+import android.widget.ArrayAdapter
 import androidx.fragment.app.viewModels
 import io.legato.kazusa.R
 import io.legato.kazusa.base.BaseBottomSheetDialogFragment
@@ -69,6 +68,13 @@ class GroupEditDialog() : BaseBottomSheetDialogFragment(R.layout.dialog_book_gro
         @Suppress("DEPRECATION")
         bookGroup = arguments?.getParcelable("group")
 
+        val sortAdapter = ArrayAdapter(
+            requireContext(),
+            android.R.layout.simple_list_item_1,
+            sortOptions
+        )
+        binding.actvSortMenu.setAdapter(sortAdapter)
+
         bookGroup?.let { group ->
             binding.btnDelete.isEnabled = (group.groupId > 0 || group.groupId == Long.MIN_VALUE)
             binding.tieGroupName.setText(group.groupName)
@@ -82,30 +88,20 @@ class GroupEditDialog() : BaseBottomSheetDialogFragment(R.layout.dialog_book_gro
             } else {
                 0
             }
-            binding.chipSortMenu.text = sortOptions[selectedSortIndex]
+            binding.actvSortMenu.setText(sortOptions[selectedSortIndex], false)
+
         } ?: run {
             binding.btnDelete.gone()
             binding.ivCover.load()
             selectedSortIndex = 0
-            binding.chipSortMenu.text = sortOptions[selectedSortIndex]
+            binding.actvSortMenu.setText(sortOptions[selectedSortIndex], false)
         }
 
+        binding.actvSortMenu.setOnItemClickListener { _, _, position, _ ->
+            selectedSortIndex = position
+        }
 
         binding.run {
-            chipSortMenu.setOnClickListener { chip ->
-                PopupMenu(requireContext(), chip).apply {
-                    sortOptions.forEachIndexed { index, title ->
-                        menu.add(0, index, index, title)
-                    }
-                    setOnMenuItemClickListener { item ->
-                        selectedSortIndex = item.itemId
-                        chipSortMenu.text = sortOptions[selectedSortIndex]
-                        true
-                    }
-                    show()
-                }
-            }
-
             ivCover.onClick {
                 selectImage.launch()
             }
@@ -149,8 +145,8 @@ class GroupEditDialog() : BaseBottomSheetDialogFragment(R.layout.dialog_book_gro
                         }
                     }
                 }
-
             }
+
             btnDelete.onClick {
                 deleteGroup {
                     bookGroup?.let {
@@ -163,6 +159,7 @@ class GroupEditDialog() : BaseBottomSheetDialogFragment(R.layout.dialog_book_gro
         }
     }
 
+
     private fun deleteGroup(ok: () -> Unit) {
         alert(R.string.delete, R.string.sure_del) {
             yesButton {

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

@@ -584,23 +584,23 @@ class ReadMangaActivity : VMBaseActivity<ActivityMangaBinding, ReadMangaViewMode
     }
 
     //点击滑动
-    override fun onClickScrollDisabledChanged(enabled: Boolean) {
-        AppConfig.disableClickScroll = enabled
-        setDisableClickScroll(enabled)
+    override fun onClickScrollDisabledChanged(disabled: Boolean) {
+        AppConfig.disableClickScroll = disabled
+        setDisableClickScroll(disabled)
     }
 
     //双击缩放
-    override fun onMangaScaleDisabledChanged(enabled: Boolean) {
-        AppConfig.disableMangaScale = enabled
-        setDisableMangaScale(enabled)
+    override fun onMangaScaleDisabledChanged(disabled: Boolean) {
+        AppConfig.disableMangaScale = disabled
+        setDisableMangaScale(disabled)
     }
 
     //侧边留白
-    override fun upSidePadding(paddingDp: Int) {
+    override fun upSidePadding(padding: Int) {
         viewModel.updateReadConfig {
-            webtoonSidePaddingDp = paddingDp
+            webtoonSidePaddingDp = padding
         }
-        updateWebtoonSidePadding(paddingDp)
+        updateWebtoonSidePadding(padding)
     }
 
     //墨水屏

+ 51 - 35
app/src/main/java/io/legato/kazusa/ui/widget/image/CoverImageView.kt

@@ -24,7 +24,9 @@ import io.legato.kazusa.help.glide.ImageLoader
 import io.legato.kazusa.help.glide.OkHttpModelLoader
 //import io.legado.app.lib.theme.accentColor
 import io.legato.kazusa.model.BookCover
+import io.legato.kazusa.utils.spToPx
 import io.legato.kazusa.utils.textHeight
+import io.legato.kazusa.utils.themeColor
 import io.legato.kazusa.utils.toStringArray
 
 /**
@@ -117,49 +119,63 @@ class CoverImageView @JvmOverloads constructor(
     }
 
     private fun drawNameAuthor(canvas: Canvas) {
-        if (!BookCover.drawBookName) return
-        var startX = width * 0.2f
-        var startY = viewHeight * 0.2f
-        name?.toStringArray()?.let { name ->
-            namePaint.textSize = viewWidth / 6
-            namePaint.strokeWidth = namePaint.textSize / 5
-            name.forEachIndexed { index, char ->
-                namePaint.color = Color.WHITE
-                namePaint.style = Paint.Style.STROKE
-                canvas.drawText(char, startX, startY, namePaint)
-                //namePaint.color = context.accentColor
-                namePaint.style = Paint.Style.FILL
-                canvas.drawText(char, startX, startY, namePaint)
-                startY += namePaint.textHeight
-                if (startY > viewHeight * 0.8) {
-                    startX += namePaint.textSize
-                    namePaint.textSize = viewWidth / 10
-                    startY = (viewHeight - (name.size - index - 1) * namePaint.textHeight) / 2
+        if (BookCover.drawBookName) {
+            var startX = width * 0.2f
+            var startY = viewHeight * 0.2f
+
+            name?.toStringArray()?.let { nameChars ->
+                val textSize = viewWidth / 8
+                namePaint.textSize = textSize
+                namePaint.strokeWidth = textSize / 8
+
+                nameChars.forEach { char ->
+                    namePaint.color = Color.WHITE
+                    namePaint.style = Paint.Style.STROKE
+                    canvas.drawText(char, startX, startY, namePaint)
+
+                    namePaint.color = context.themeColor(androidx.appcompat.R.attr.colorPrimary)
+                    namePaint.style = Paint.Style.FILL
+                    canvas.drawText(char, startX, startY, namePaint)
+
+                    startY += namePaint.textHeight
+
+                    if (startY > viewHeight * 0.8f) {
+                        startX += textSize + 4.spToPx()
+                        startY = viewHeight * 0.2f
+                    }
                 }
             }
         }
-        if (!BookCover.drawBookAuthor) return
-        author?.toStringArray()?.let { author ->
-            authorPaint.textSize = viewWidth / 10
-            authorPaint.strokeWidth = authorPaint.textSize / 5
-            startX = width * 0.8f
-            startY = viewHeight * 0.95f - author.size * authorPaint.textHeight
-            startY = maxOf(startY, viewHeight * 0.3f)
-            author.forEach {
-                authorPaint.color = Color.WHITE
-                authorPaint.style = Paint.Style.STROKE
-                canvas.drawText(it, startX, startY, authorPaint)
-                //authorPaint.color = context.accentColor
-                authorPaint.style = Paint.Style.FILL
-                canvas.drawText(it, startX, startY, authorPaint)
-                startY += authorPaint.textHeight
-                if (startY > viewHeight * 0.95) {
-                    return@let
+
+        if (BookCover.drawBookAuthor) {
+            author?.toStringArray()?.let { authorChars ->
+                val textSize = viewWidth / 10
+                authorPaint.textSize = textSize
+                authorPaint.strokeWidth = textSize / 5
+
+                var startX = width * 0.8f
+                var startY = viewHeight * 0.8f
+
+                authorChars.forEach { char ->
+
+                    authorPaint.color = Color.WHITE
+                    authorPaint.style = Paint.Style.STROKE
+                    canvas.drawText(char, startX, startY, authorPaint)
+
+                    authorPaint.color =
+                        context.themeColor(com.google.android.material.R.attr.colorSecondary)
+                    authorPaint.style = Paint.Style.FILL
+                    canvas.drawText(char, startX, startY, authorPaint)
+
+                    startY += authorPaint.textHeight
+
+                    if (startY > viewHeight * 0.95f) return@let
                 }
             }
         }
     }
 
+
     fun setHeight(height: Int) {
         val width = height * 5 / 7
         minimumWidth = width

+ 3 - 1
app/src/main/res/drawable/ic_praise.xml

@@ -1,3 +1,5 @@
 <vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="960" android:viewportHeight="960" android:tint="?attr/colorControlNormal">
-    <path android:fillColor="@android:color/white" android:pathData="M720,840L280,840L280,320L560,40L610,90Q617,97 621.5,109Q626,121 626,132L626,146L582,320L840,320Q872,320 896,344Q920,368 920,400L920,480Q920,487 918,495Q916,503 914,510L794,792Q785,812 764,826Q743,840 720,840ZM360,760L720,760Q720,760 720,760Q720,760 720,760L840,480L840,400Q840,400 840,400Q840,400 840,400L480,400L534,180L360,354L360,760ZM360,354L360,354L360,400L360,400Q360,400 360,400Q360,400 360,400L360,480L360,760Q360,760 360,760Q360,760 360,760L360,760L360,354ZM280,320L280,400L160,400L160,760L280,760L280,840L80,840L80,320L280,320Z"/>
+    <path
+        android:fillColor="@android:color/white"
+        android:pathData="M640,480L720,560L720,640L520,640L520,880L480,920L440,880L440,640L240,640L240,560L320,480L320,200L280,200L280,120L680,120L680,200L640,200L640,480ZM354,560L606,560L560,514L560,200L400,200L400,514L354,560ZM480,560L480,560L480,560L480,560L480,560L480,560Z" />
 </vector>

+ 11 - 0
app/src/main/res/drawable/ic_praise_filled.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="M640,480L720,560L720,640L520,640L520,880L480,920L440,880L440,640L240,640L240,560L320,480L320,200L280,200L280,120L680,120L680,200L640,200L640,480Z" />
+</vector>

BIN
app/src/main/res/drawable/image_cover_default.jpg


BIN
app/src/main/res/drawable/image_cover_default.png


+ 37 - 24
app/src/main/res/layout/dialog_book_change_source.xml

@@ -103,6 +103,12 @@
             android:text="还没有源!" />
     </LinearLayout>
 
+    <androidx.core.widget.NestedScrollView
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content">
+
+    </androidx.core.widget.NestedScrollView>
+
     <androidx.recyclerview.widget.RecyclerView
         android:id="@+id/recycler_view"
         android:layout_width="match_parent"
@@ -112,11 +118,11 @@
     <LinearLayout
         android:id="@+id/ll_bottom_bar"
         android:layout_width="match_parent"
-        android:layout_height="36dp"
+        android:layout_height="wrap_content"
         android:gravity="center_vertical"
         android:orientation="horizontal"
-        android:paddingLeft="10dp"
-        android:paddingRight="10dp">
+        android:paddingHorizontal="16dp"
+        android:paddingVertical="8dp">
 
         <TextView
             android:id="@+id/tv_dur"
@@ -125,32 +131,39 @@
             android:layout_weight="1"
             android:background="?attr/selectableItemBackgroundBorderless"
             android:text="@string/text"
+            android:textStyle="bold"
             android:ellipsize="end"
             android:gravity="center_vertical"
             android:singleLine="true"
             android:textSize="12sp" />
 
-        <com.google.android.material.button.MaterialButton
-            android:id="@+id/iv_top"
-            android:layout_width="36dp"
-            android:layout_height="match_parent"
-            style="@style/Widget.Material3Expressive.Button.IconButton.Tonal"
-            android:contentDescription="@string/go_to_top"
-            app:icon="@drawable/ic_arrow_drop_up"
-            app:iconGravity="textStart"
-            android:tooltipText="@string/go_to_top"
-            tools:ignore="UnusedAttribute" />
-
-        <com.google.android.material.button.MaterialButton
-            android:id="@+id/iv_bottom"
-            android:layout_width="36dp"
-            android:layout_height="match_parent"
-            style="@style/Widget.Material3Expressive.Button.IconButton.Tonal"
-            android:contentDescription="@string/go_to_bottom"
-            app:icon="@drawable/ic_arrow_drop_down"
-            app:iconGravity="textStart"
-            android:tooltipText="@string/go_to_bottom"
-            tools:ignore="UnusedAttribute" />
+        <com.google.android.material.button.MaterialButtonGroup
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content">
+
+            <com.google.android.material.button.MaterialButton
+                android:id="@+id/iv_top"
+                style="@style/Widget.Material3Expressive.Button.IconButton.Tonal"
+                android:layout_width="40dp"
+                android:layout_height="40dp"
+                android:contentDescription="@string/go_to_top"
+                android:tooltipText="@string/go_to_top"
+                app:icon="@drawable/ic_arrow_drop_up"
+                app:iconGravity="textStart"
+                tools:ignore="UnusedAttribute" />
+
+            <com.google.android.material.button.MaterialButton
+                android:id="@+id/iv_bottom"
+                style="@style/Widget.Material3Expressive.Button.IconButton.Tonal"
+                android:layout_width="40dp"
+                android:layout_height="40dp"
+                android:contentDescription="@string/go_to_bottom"
+                android:tooltipText="@string/go_to_bottom"
+                app:icon="@drawable/ic_arrow_drop_down"
+                app:iconGravity="textStart"
+                tools:ignore="UnusedAttribute" />
+        </com.google.android.material.button.MaterialButtonGroup>
+
     </LinearLayout>
 
 </LinearLayout>

+ 67 - 61
app/src/main/res/layout/dialog_book_group_edit.xml

@@ -31,7 +31,7 @@
 
     </LinearLayout>
 
-    <LinearLayout
+    <androidx.constraintlayout.widget.ConstraintLayout
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
         android:orientation="horizontal"
@@ -46,61 +46,61 @@
             android:layout_marginTop="4dp"
             android:contentDescription="@string/img_cover"
             android:scaleType="centerCrop"
-            android:src="?attr/colorSurfaceVariant"
+            android:src="@drawable/image_cover_default"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toTopOf="parent"
             tools:ignore="ImageContrastCheck" />
 
-        <LinearLayout
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:orientation="vertical">
-
             <com.google.android.material.textfield.TextInputLayout
                 android:id="@+id/til_group_name"
-                android:layout_width="match_parent"
+                android:layout_width="0dp"
                 android:layout_height="wrap_content"
-                android:hint="@string/group_name">
+                android:layout_marginStart="8dp"
+                android:hint="@string/group_name"
+                app:layout_constraintEnd_toEndOf="parent"
+                app:layout_constraintStart_toEndOf="@id/iv_cover"
+                app:layout_constraintTop_toTopOf="@id/iv_cover">
 
                 <com.google.android.material.textfield.TextInputEditText
                     android:id="@+id/tie_group_name"
                     android:layout_width="match_parent"
                     android:layout_height="wrap_content"
-                    android:maxLines="2"
-                    tools:ignore="TouchTargetSizeCheck,SpeakableTextPresentCheck" />
+                    android:ellipsize="end"
+                    android:maxLines="1" />
             </com.google.android.material.textfield.TextInputLayout>
 
-            <LinearLayout
+        <com.google.android.material.textfield.TextInputLayout
+            android:id="@+id/til_sort_menu"
+            style="@style/Widget.Material3.TextInputLayout.OutlinedBox.Dense.ExposedDropdownMenu"
+            android:layout_width="0dp"
+            android:layout_height="wrap_content"
+            android:layout_marginStart="8dp"
+            android:hint="@string/sort"
+            app:layout_constraintBottom_toBottomOf="@id/iv_cover"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintStart_toEndOf="@id/iv_cover">
+
+            <com.google.android.material.textfield.MaterialAutoCompleteTextView
+                android:id="@+id/actv_sort_menu"
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content"
-                android:orientation="horizontal"
-                android:layout_marginTop="8dp"
-                android:layout_marginBottom="8dp">
-
-                <TextView
-                    android:layout_width="0dp"
-                    android:layout_height="wrap_content"
-                    android:layout_weight="1"
-                    android:text="@string/sort" />
-
-                <com.google.android.material.chip.Chip
-                    android:id="@+id/chip_sort_menu"
-                    android:layout_width="wrap_content"
-                    android:layout_height="wrap_content"
-                    android:clickable="true"
-                    android:text="@string/sort_default"
-                    app:chipIcon="@drawable/ic_arrow_drop_down"
-                    app:chipIconVisible="true" />
-
-            </LinearLayout>
+                android:cursorVisible="false"
+                android:ellipsize="end"
+                android:focusable="false"
+                android:inputType="none"
+                android:singleLine="true" />
+        </com.google.android.material.textfield.TextInputLayout>
 
             <com.google.android.material.materialswitch.MaterialSwitch
                 android:id="@+id/cb_enable_refresh"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
                 android:text="@string/allow_drop_down_refresh"
-                android:checked="true" />
+                android:checked="true"
+                app:layout_constraintStart_toStartOf="parent"
+                app:layout_constraintTop_toBottomOf="@id/iv_cover" />
 
-        </LinearLayout>
-    </LinearLayout>
+    </androidx.constraintlayout.widget.ConstraintLayout>
 
 
     <LinearLayout
@@ -109,42 +109,48 @@
         android:orientation="horizontal"
         android:gravity="center_vertical">
 
-        <com.google.android.material.button.MaterialButton
-            android:id="@+id/btn_delete"
+        <com.google.android.material.button.MaterialButtonGroup
             android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            style="@style/Widget.Material3Expressive.Button.IconButton.Outlined"
-            android:layout_marginEnd="4dp"
-            app:icon="@drawable/ic_clear_all"
-            tools:ignore="RtlHardcoded" />
+            android:layout_height="wrap_content">
 
-        <com.google.android.material.button.MaterialButton
-            android:id="@+id/btn_reset"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            app:icon="@drawable/ic_restore"
-            style="@style/Widget.Material3Expressive.Button.IconButton.Outlined" />
+            <com.google.android.material.button.MaterialButton
+                android:id="@+id/btn_delete"
+                style="@style/Widget.Material3Expressive.Button.IconButton.Outlined"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                app:icon="@drawable/ic_clear_all" />
+
+            <com.google.android.material.button.MaterialButton
+                android:id="@+id/btn_reset"
+                style="@style/Widget.Material3Expressive.Button.IconButton.Outlined"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                app:icon="@drawable/ic_restore" />
+        </com.google.android.material.button.MaterialButtonGroup>
 
         <Space
             android:layout_width="0dp"
             android:layout_height="1dp"
             android:layout_weight="1" />
 
-        <com.google.android.material.button.MaterialButton
-            android:id="@+id/btn_cancel"
+        <com.google.android.material.button.MaterialButtonGroup
             android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            style="@style/Widget.Material3Expressive.Button.TonalButton"
-            android:layout_marginEnd="8dp"
-            android:text="@string/cancel" />
+            android:layout_height="wrap_content">
 
-        <com.google.android.material.button.MaterialButton
-            android:id="@+id/btn_ok"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            style="@style/Widget.Material3Expressive.Button"
-            android:text="@string/ok"
-            tools:ignore="RtlHardcoded" />
+            <com.google.android.material.button.MaterialButton
+                android:id="@+id/btn_cancel"
+                style="@style/Widget.Material3Expressive.Button.TonalButton"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:text="@string/cancel" />
+
+            <com.google.android.material.button.MaterialButton
+                android:id="@+id/btn_ok"
+                style="@style/Widget.Material3Expressive.Button"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:text="@string/ok" />
+        </com.google.android.material.button.MaterialButtonGroup>
 
     </LinearLayout>
 </LinearLayout>

+ 4 - 2
app/src/main/res/layout/dialog_change_cover.xml

@@ -15,10 +15,12 @@
         app:displayHomeAsUp="false"
         app:fitStatusBar="false" />
 
-    <io.legato.kazusa.ui.widget.anima.RefreshProgressBar
+    <com.google.android.material.progressindicator.LinearProgressIndicator
         android:id="@+id/refresh_progress_bar"
         android:layout_width="match_parent"
-        android:layout_height="2dp" />
+        android:layout_height="wrap_content"
+        android:indeterminate="true"
+        android:visibility="gone" />
 
     <androidx.recyclerview.widget.RecyclerView
         android:id="@+id/recycler_view"

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

@@ -83,8 +83,9 @@
         android:id="@+id/tv_delete"
         android:layout_width="40dp"
         android:layout_height="40dp"
-        style="@style/Widget.Material3.Button.IconButton.Outlined"
+        style="@style/Widget.Material3Expressive.Button.IconButton.Outlined"
         app:icon="@drawable/ic_clear_all"
+        app:iconSize="16dp"
         app:iconGravity="textStart"
         app:layout_constraintTop_toTopOf="@id/tv_group_s"
         app:layout_constraintBottom_toBottomOf="@id/tv_group_s"

+ 15 - 28
app/src/main/res/layout/item_change_source.xml

@@ -7,40 +7,27 @@
     android:background="@android:color/transparent"
     android:foreground="?attr/selectableItemBackground"
     android:paddingHorizontal="16dp"
-    android:paddingVertical="8dp">
+    android:paddingVertical="12dp">
 
     <androidx.appcompat.widget.AppCompatImageView
         android:id="@+id/iv_good"
         android:layout_width="24dp"
         android:layout_height="24dp"
+        android:padding="2dp"
         android:background="?attr/selectableItemBackgroundBorderless"
-        android:padding="4dp"
         android:contentDescription="@string/like_source"
         android:src="@drawable/ic_praise"
         app:layout_constraintStart_toStartOf="parent"
         app:layout_constraintTop_toTopOf="parent"
-        app:tint="@color/md_red_A200" />
-
-    <androidx.appcompat.widget.AppCompatImageView
-        android:id="@+id/iv_bad"
-        android:layout_width="24dp"
-        android:layout_height="24dp"
-        android:background="?attr/selectableItemBackgroundBorderless"
-        android:padding="4dp"
-        android:rotationX="180"
-        android:contentDescription="@string/not_like_source"
-        android:src="@drawable/ic_praise"
-        app:layout_constraintStart_toStartOf="parent"
-        app:layout_constraintTop_toBottomOf="@id/iv_good"
-        app:tint="@color/md_blue_A200" />
-
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:tint="?attr/colorPrimary" />
 
     <!-- 最新章节 -->
     <TextView
         android:id="@+id/tv_last"
         android:layout_width="0dp"
         android:layout_height="wrap_content"
-        android:layout_marginStart="16dp"
+        android:layout_marginStart="12dp"
         android:ellipsize="end"
         android:maxLines="1"
         android:textColor="?attr/colorSecondary"
@@ -56,7 +43,7 @@
         android:id="@+id/tv_author"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
-        android:layout_marginEnd="8dp"
+        android:layout_marginEnd="12dp"
         android:ellipsize="end"
         android:maxLines="1"
         android:maxWidth="160dp"
@@ -69,14 +56,14 @@
         android:id="@+id/tv_origin"
         android:layout_width="0dp"
         android:layout_height="wrap_content"
-        android:layout_marginStart="16dp"
+        android:layout_marginStart="12dp"
+        android:layout_marginTop="4dp"
         android:ellipsize="end"
         android:maxLines="1"
         android:textSize="12sp"
-        app:layout_constraintBottom_toTopOf="@id/iv_bad"
+        app:layout_constraintStart_toEndOf="@id/iv_good"
+        app:layout_constraintTop_toBottomOf="@id/tv_last"
         app:layout_constraintEnd_toStartOf="@id/tv_author"
-        app:layout_constraintStart_toEndOf="@id/iv_bad"
-        app:layout_constraintTop_toBottomOf="@id/iv_bad"
         tools:text="bookSourceName" />
 
     <!-- 字数 -->
@@ -84,7 +71,7 @@
         android:id="@+id/tv_current_chapter_word_count"
         android:layout_width="0dp"
         android:layout_height="wrap_content"
-        android:layout_marginStart="16dp"
+        android:layout_marginStart="12dp"
         android:layout_marginTop="8dp"
         android:textSize="12sp"
         app:layout_constraintEnd_toStartOf="@id/tv_respond_time"
@@ -98,7 +85,7 @@
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:layout_marginStart="8dp"
-        android:layout_marginEnd="8dp"
+        android:layout_marginEnd="12dp"
         android:textSize="12sp"
         app:layout_constraintBaseline_toBaselineOf="@id/tv_current_chapter_word_count"
         app:layout_constraintEnd_toStartOf="@id/iv_checked"
@@ -109,9 +96,9 @@
     <!-- 选中状态 -->
     <androidx.appcompat.widget.AppCompatImageView
         android:id="@+id/iv_checked"
-        android:layout_width="32dp"
-        android:layout_height="32dp"
-        android:paddingVertical="8dp"
+        android:layout_width="24dp"
+        android:layout_height="24dp"
+        android:padding="2dp"
         android:src="@drawable/ic_check"
         android:visibility="gone"
         app:layout_constraintEnd_toEndOf="parent"

+ 21 - 16
app/src/main/res/layout/view_select_action_bar.xml

@@ -17,29 +17,34 @@
         android:layout_marginStart="4dp"
         android:text="@string/select_all" />
 
-    <com.google.android.material.button.MaterialButton
-        android:id="@+id/btn_revert_selection"
-        style="@style/Widget.Material3Expressive.Button.TonalButton"
+    <com.google.android.material.button.MaterialButtonGroup
         android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:minWidth="0dp"
-        android:layout_marginEnd="8dp"
-        android:text="@string/revert_selection" />
+        android:layout_height="wrap_content">
 
-    <com.google.android.material.button.MaterialButton
-        android:id="@+id/btn_select_action_main"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        style="@style/Widget.Material3Expressive.Button"
-        android:layout_marginEnd="8dp"
-        android:text="@string/app_name"
-        android:minWidth="0dp"
-        android:visibility="visible" />
+        <com.google.android.material.button.MaterialButton
+            android:id="@+id/btn_revert_selection"
+            style="@style/Widget.Material3Expressive.Button.TonalButton"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:minWidth="0dp"
+            android:text="@string/revert_selection" />
+
+        <com.google.android.material.button.MaterialButton
+            android:id="@+id/btn_select_action_main"
+            style="@style/Widget.Material3Expressive.Button"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:minWidth="0dp"
+            android:text="@string/app_name"
+            android:visibility="visible" />
+
+    </com.google.android.material.button.MaterialButtonGroup>
 
     <androidx.appcompat.widget.AppCompatImageView
         android:id="@+id/iv_menu_more"
         android:layout_width="32dp"
         android:layout_height="32dp"
+        android:layout_marginStart="4dp"
         android:padding="4dp"
         android:background="?attr/selectableItemBackgroundBorderless"
         android:contentDescription="@string/more_menu"