更新界面与图标

This commit is contained in:
HapeLee
2025-08-23 13:15:34 +08:00
parent bf514ffd26
commit 4004b2e386
57 changed files with 488 additions and 351 deletions
@@ -2,9 +2,7 @@ package io.legato.kazusa.help
import android.content.ComponentName
import android.content.pm.PackageManager
import android.os.Build
import io.legato.kazusa.R
import io.legato.kazusa.ui.welcome.*
import io.legato.kazusa.utils.toastOnUi
import splitties.init.appCtx
@@ -15,6 +13,7 @@ import splitties.init.appCtx
object LauncherIconHelp {
private val packageManager: PackageManager = appCtx.packageManager
private val componentNames = arrayListOf(
ComponentName(appCtx.packageName, "${appCtx.packageName}.Launcher0"),
ComponentName(appCtx.packageName, "${appCtx.packageName}.Launcher1"),
ComponentName(appCtx.packageName, "${appCtx.packageName}.Launcher2"),
ComponentName(appCtx.packageName, "${appCtx.packageName}.Launcher3"),
@@ -31,10 +30,6 @@ object LauncherIconHelp {
fun changeIcon(icon: String?) {
if (icon.isNullOrEmpty()) return
if (Build.VERSION.SDK_INT < 26) {
appCtx.toastOnUi(R.string.change_icon_error)
return
}
try {
// 首先禁用主Activity的启动器intent
@@ -18,6 +18,7 @@ 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
@@ -62,8 +63,10 @@ class ChangeBookSourceAdapter(
tvRespondTime.text = context.getString(R.string.respondTime, item.respondTime)
if (callBack.oldBookUrl == item.bookUrl) {
ivChecked.visible()
root.setBackgroundColor(context.themeColor(com.google.android.material.R.attr.colorSurfaceContainerHighest))
} else {
ivChecked.invisible()
root.setBackgroundColor(context.themeColor(com.google.android.material.R.attr.colorSurfaceContainerLow))
}
} else {
for (i in payloads.indices) {
@@ -74,8 +77,10 @@ class ChangeBookSourceAdapter(
"latest" -> tvLast.text = item.getDisplayLastChapterTitle()
"upCurSource" -> if (callBack.oldBookUrl == item.bookUrl) {
ivChecked.visible()
root.setBackgroundColor(context.themeColor(com.google.android.material.R.attr.colorSurfaceContainer))
} else {
ivChecked.invisible()
root.setBackgroundColor(context.themeColor(com.google.android.material.R.attr.colorSurfaceContainerLow))
}
}
}
@@ -2,6 +2,7 @@ package io.legato.kazusa.ui.book.changesource
//import io.legado.app.lib.theme.getPrimaryTextColor
//import io.legado.app.lib.theme.primaryColor
import android.annotation.SuppressLint
import android.os.Bundle
import android.view.Menu
import android.view.MenuItem
@@ -41,6 +42,7 @@ import io.legato.kazusa.utils.observeEvent
import io.legato.kazusa.utils.startActivity
import io.legato.kazusa.utils.transaction
import io.legato.kazusa.utils.viewbindingdelegate.viewBinding
import io.legato.kazusa.utils.visible
import kotlinx.coroutines.Dispatchers.IO
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.conflate
@@ -205,9 +207,11 @@ class ChangeBookSourceDialog() : BaseBottomSheetDialogFragment(R.layout.dialog_b
}
}
@SuppressLint("SetTextI18n")
private fun initLiveData() {
viewModel.searchStateData.observe(viewLifecycleOwner) {
binding.refreshProgressBar.isVisible = it
if (it) {
startStopMenuItem?.let { item ->
item.setIcon(R.drawable.ic_stop_black_24dp)
@@ -226,7 +230,7 @@ class ChangeBookSourceDialog() : BaseBottomSheetDialogFragment(R.layout.dialog_b
viewModel.searchDataFlow.conflate().collect {
adapter.setItems(it)
binding.loadingIndicator.isVisible = it.isEmpty()
binding.tvEmptyMsg.isVisible = it.isEmpty()
binding.recyclerView.isVisible = it.isNotEmpty()
delay(1000)
@@ -239,15 +243,16 @@ class ChangeBookSourceDialog() : BaseBottomSheetDialogFragment(R.layout.dialog_b
viewModel.changeSourceProgress
.drop(1)
.collect { (count, name) ->
binding.tvDur.text =
getString(
R.string.change_source_progress,
adapter.itemCount,
count,
viewModel.totalSourceCount,
name
)
delay(500)
val total = viewModel.totalSourceCount
val progress = if (total > 0) (count * 100 / total) else 0
binding.refreshProgressBar.isIndeterminate = false
binding.refreshProgressBar.progress = progress
binding.llInfo.visible()
binding.tvProgress.text = "$count / $total"
binding.tvResult.text =
getString(R.string.change_source_progress, adapter.itemCount)
}
}
}
@@ -549,6 +549,8 @@ class ReadMangaActivity : VMBaseActivity<ActivityMangaBinding, ReadMangaViewMode
override fun showFooterConfig() {
showDialogFragment(MangaFooterSettingDialog().apply {
initialScrollMode = viewModel.getEffectiveScrollMode()
initialWebtoonSidePadding = viewModel.getEffectiveWebtoonSidePadding()
callback = this@ReadMangaActivity
})
}
@@ -565,8 +567,6 @@ class ReadMangaActivity : VMBaseActivity<ActivityMangaBinding, ReadMangaViewMode
override fun showScrollModeDialog() {
showDialogFragment(MangaScrollModeDialog().apply {
initialScrollMode = viewModel.getEffectiveScrollMode()
initialWebtoonSidePadding = viewModel.getEffectiveWebtoonSidePadding()
initialAutoPageEnabled = enableScroll
callback = this@ReadMangaActivity
})
@@ -574,7 +574,7 @@ class ReadMangaActivity : VMBaseActivity<ActivityMangaBinding, ReadMangaViewMode
//漫画模式
override fun onScrollModeChanged(mode: Int) {
//AppConfig.mangaScrollMode = mode
onAutoPageToggle(false)
viewModel.updateReadConfig {
mangaScrollMode = mode
}
@@ -28,7 +28,6 @@ class MangaColorFilterDialog : BaseBottomSheetDialogFragment(R.layout.dialog_man
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?) {
@@ -4,6 +4,7 @@ import android.content.DialogInterface
import android.os.Bundle
import android.view.Gravity
import android.view.View
import com.google.android.material.chip.Chip
import io.legato.kazusa.R
import io.legato.kazusa.base.BaseBottomSheetDialogFragment
import io.legato.kazusa.constant.EventBus
@@ -21,6 +22,9 @@ class MangaFooterSettingDialog :
val config = GSON.fromJsonObject<MangaFooterConfig>(AppConfig.mangaFooterConfig).getOrNull()
?: MangaFooterConfig()
var initialWebtoonSidePadding: Int = 0
var initialScrollMode: Int = MangaScrollMode.PAGE_RIGHT_TO_LEFT
var callback: Callback? = null
private val binding by viewBinding(DialogMangaFooterSettingBinding::bind)
@@ -32,6 +36,56 @@ class MangaFooterSettingDialog :
override fun onFragmentCreated(view: View, savedInstanceState: Bundle?) {
binding.chipGroupScrollMode.removeAllViews()
MangaScrollMode.ALL.forEach { mode ->
binding.chipGroupScrollMode.addView(Chip(requireContext()).apply {
text = MangaScrollMode.labelOf(mode)
isCheckable = true
isChecked = (mode == initialScrollMode)
setOnClickListener {
callback?.onScrollModeChanged(mode)
}
})
}
binding.scvPadding.apply {
valueFormat = { "$it %" }
progress = initialWebtoonSidePadding
onChanged = { newValue ->
callback?.upSidePadding(newValue)
}
}
binding.checkboxDisableClickScroll.apply {
isChecked = AppConfig.disableClickScroll
setOnCheckedChangeListener { _, isChecked ->
callback?.onClickScrollDisabledChanged(isChecked)
}
}
binding.checkboxDisableMangaScale.apply {
isChecked = AppConfig.disableMangaScale
setOnCheckedChangeListener { _, isChecked ->
callback?.onMangaScaleDisabledChanged(isChecked)
}
}
binding.checkboxHideMangaTitle.apply {
isChecked = AppConfig.hideMangaTitle
setOnCheckedChangeListener { _, isChecked ->
callback?.onHideMangaTitleChanged(isChecked)
}
}
binding.checkboxVolumeKeyPage.apply {
isChecked = AppConfig.MangaVolumeKeyPage
setOnCheckedChangeListener { _, isChecked ->
callback?.onVolumeKeyPageChanged(isChecked)
}
}
binding.cbChapterLabel.run {
isChecked = !config.hideChapterLabel
setOnCheckedChangeListener { _, isChecked ->
@@ -187,6 +241,12 @@ class MangaFooterSettingDialog :
fun onAutoPageSpeedChanged(speed: Int)
fun showColorFilterConfig()
fun showClickConfig()
fun onScrollModeChanged(mode: Int)
fun upSidePadding(padding: Int)
fun onClickScrollDisabledChanged(disabled: Boolean)
fun onMangaScaleDisabledChanged(disabled: Boolean)
fun onHideMangaTitleChanged(hide: Boolean)
fun onVolumeKeyPageChanged(enable: Boolean)
}
}
@@ -2,7 +2,6 @@ package io.legato.kazusa.ui.book.manga.config
import android.os.Bundle
import android.view.View
import com.google.android.material.chip.Chip
import io.legato.kazusa.R
import io.legato.kazusa.base.BaseBottomSheetDialogFragment
import io.legato.kazusa.databinding.DialogMangaScrollModeBinding
@@ -14,8 +13,6 @@ class MangaScrollModeDialog : BaseBottomSheetDialogFragment(R.layout.dialog_mang
private val binding by viewBinding(DialogMangaScrollModeBinding::bind)
var initialAutoPageEnabled: Boolean = false
var initialWebtoonSidePadding: Int = 0
var initialScrollMode: Int = MangaScrollMode.PAGE_RIGHT_TO_LEFT
var callback: Callback? = null
@@ -24,20 +21,6 @@ class MangaScrollModeDialog : BaseBottomSheetDialogFragment(R.layout.dialog_mang
}
private fun initView() {
binding.chipGroupScrollMode.removeAllViews()
MangaScrollMode.ALL.forEach { mode ->
binding.chipGroupScrollMode.addView(Chip(requireContext()).apply {
text = MangaScrollMode.labelOf(mode)
isCheckable = true
isChecked = (mode == initialScrollMode)
setOnClickListener {
callback?.onScrollModeChanged(mode)
binding.chipAutoPage.isChecked = false
}
})
}
binding.chipAutoPage.run {
isChecked = initialAutoPageEnabled
@@ -47,42 +30,6 @@ class MangaScrollModeDialog : BaseBottomSheetDialogFragment(R.layout.dialog_mang
}
}
binding.checkboxDisableClickScroll.apply {
isChecked = AppConfig.disableClickScroll
setOnCheckedChangeListener { _, isChecked ->
callback?.onClickScrollDisabledChanged(isChecked)
}
}
binding.checkboxDisableMangaScale.apply {
isChecked = AppConfig.disableMangaScale
setOnCheckedChangeListener { _, isChecked ->
callback?.onMangaScaleDisabledChanged(isChecked)
}
}
binding.checkboxHideMangaTitle.apply {
isChecked = AppConfig.hideMangaTitle
setOnCheckedChangeListener { _, isChecked ->
callback?.onHideMangaTitleChanged(isChecked)
}
}
binding.checkboxVolumeKeyPage.apply {
isChecked = AppConfig.MangaVolumeKeyPage
setOnCheckedChangeListener { _, isChecked ->
callback?.onVolumeKeyPageChanged(isChecked)
}
}
binding.scvPadding.apply {
valueFormat = { "$it %" }
progress = initialWebtoonSidePadding
onChanged = { newValue ->
callback?.upSidePadding(newValue)
}
}
initAutoPageSpeed(initialAutoPageEnabled)
}
@@ -101,12 +48,6 @@ class MangaScrollModeDialog : BaseBottomSheetDialogFragment(R.layout.dialog_mang
interface Callback {
fun onAutoPageToggle(enable: Boolean)
fun onAutoPageSpeedChanged(speed: Int)
fun onScrollModeChanged(mode: Int)
fun onClickScrollDisabledChanged(disabled: Boolean)
fun onMangaScaleDisabledChanged(disabled: Boolean)
fun upSidePadding(padding: Int)
fun onHideMangaTitleChanged(hide: Boolean)
fun onVolumeKeyPageChanged(enable: Boolean)
}
}