This commit is contained in:
HapeLee
2025-06-08 02:08:15 +08:00
parent 55ac1f6070
commit 8325a17864
13 changed files with 384 additions and 157 deletions
@@ -26,9 +26,9 @@ object AppUpdateGitHub : AppUpdate.AppUpdateInterface {
private suspend fun getLatestRelease(): List<AppReleaseInfo> {
val lastReleaseUrl = if (checkVariant.isBeta()) {
"https://api.github.com/repos/gedoor/legado/releases/tags/beta"
"https://api.github.com/repos/HapeLee/legado/releases/tags/beta"
} else {
"https://api.github.com/repos/gedoor/legado/releases/latest"
"https://api.github.com/repos/HapeLee/legado/releases/latest"
}
val res = okHttpClient.newCallResponse {
url(lastReleaseUrl)
@@ -0,0 +1,131 @@
package io.legato.kazusa.lib.prefs
import android.annotation.SuppressLint
import android.content.Context
import android.content.res.ColorStateList
import android.graphics.Color
import android.util.AttributeSet
import android.view.ContextThemeWrapper
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import androidx.preference.PreferenceViewHolder
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.google.android.material.card.MaterialCardView
import io.legato.kazusa.R
import androidx.core.graphics.toColorInt
@SuppressLint("ResourceType")
class ThemeCardPreference(
context: Context,
attrs: AttributeSet
) : Preference(context, attrs) {
private var entries: Array<CharSequence> = context.resources.getTextArray(R.array.themes_item)
private var entryValues: Array<CharSequence> = context.resources.getTextArray(R.array.themes_value)
private var currentValue: String? = null
init {
layoutResource = R.layout.preference_theme_card
widgetLayoutResource = R.layout.item_theme_card
}
override fun onSetInitialValue(defaultValue: Any?) {
currentValue = getPersistedString(defaultValue as? String ?: entryValues.getOrNull(0)?.toString())
}
override fun onBindViewHolder(holder: PreferenceViewHolder) {
super.onBindViewHolder(holder)
//val titleView = holder.findViewById(R.id.title) as TextView
val recyclerView = holder.findViewById(R.id.recyclerView) as RecyclerView
//titleView.text = title
recyclerView.layoutManager = LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false)
recyclerView.adapter = ThemeAdapter()
}
private inner class ThemeAdapter : RecyclerView.Adapter<ThemeViewHolder>() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ThemeViewHolder {
val view = LayoutInflater.from(parent.context).inflate(R.layout.item_theme_card, parent, false)
return ThemeViewHolder(view)
}
@SuppressLint("NotifyDataSetChanged")
override fun onBindViewHolder(holder: ThemeViewHolder, position: Int) {
val label = entries.getOrNull(position)?.toString() ?: return
val value = entryValues.getOrNull(position)?.toString() ?: return
holder.label.text = label
holder.card.isChecked = (value == currentValue)
val colors = getThemeColors(value)
holder.colorTop.setCardBackgroundColor(colors[0])
holder.colorBook.setCardBackgroundColor(colors[1])
holder.colorPin.setCardBackgroundColor(colors[2])
holder.colorBottom.setCardBackgroundColor(colors[3])
holder.colorBottomLeft.setCardBackgroundColor(colors[4])
holder.colorBottomRight.setCardBackgroundColor(colors[5])
holder.background.setCardBackgroundColor(colors[6])
val isSelected = (value == currentValue)
holder.background.strokeColor = if (isSelected) colors[4] else colors[7]
holder.card.checkedIconTint = ColorStateList.valueOf(colors[2])
holder.card.setOnClickListener {
if (value != currentValue) {
currentValue = value
persistString(value)
callChangeListener(value)
notifyDataSetChanged()
}
}
}
override fun getItemCount(): Int = entries.size
}
private val themeResIdMap = mapOf(
"0" to R.style.Base_AppTheme,
"1" to R.style.Theme_Base_GR,
"2" to R.style.Theme_Base_WH
)
private fun getThemeColors(value: String): List<Int> {
val themeResId = themeResIdMap[value] ?: return listOf(Color.GRAY, Color.GRAY, Color.GRAY, Color.GRAY)
val themedContext = ContextThemeWrapper(context, themeResId)
val attrs = intArrayOf(
com.google.android.material.R.attr.colorOnSurface,
com.google.android.material.R.attr.colorSecondaryContainer,
com.google.android.material.R.attr.colorSecondaryVariant,
com.google.android.material.R.attr.colorSurfaceContainer,
com.google.android.material.R.attr.colorPrimary,
com.google.android.material.R.attr.colorOnSurfaceVariant,
com.google.android.material.R.attr.colorSurface,
com.google.android.material.R.attr.colorPrimaryFixed,
)
val ta = themedContext.obtainStyledAttributes(attrs)
return List(attrs.size) { ta.getColor(it, Color.GRAY) }.also { ta.recycle() }
}
class ThemeViewHolder(view: View) : RecyclerView.ViewHolder(view) {
val card: MaterialCardView = view.findViewById(R.id.cardView)
val label: TextView = view.findViewById(R.id.themeLabel)
val colorTop: MaterialCardView = view.findViewById(R.id.cv_title)
val colorBook: MaterialCardView = view.findViewById(R.id.cv_book)
val colorPin: MaterialCardView = view.findViewById(R.id.cv_pin)
val colorBottom: MaterialCardView = view.findViewById(R.id.cv_bottom)
val colorBottomRight: MaterialCardView = view.findViewById(R.id.right_rect)
val colorBottomLeft : MaterialCardView = view.findViewById(R.id.left_circle)
val background : MaterialCardView = view.findViewById(R.id.cardView)
}
}
@@ -8,20 +8,15 @@ import android.view.ViewGroup
import androidx.preference.PreferenceViewHolder
import com.google.android.material.button.MaterialButtonToggleGroup
import io.legato.kazusa.R
import androidx.core.content.withStyledAttributes
class ThemeModePreference(context: Context, attrs: AttributeSet) : Preference(context, attrs) {
private var currentValue: String? = null
private var isBottomBackground: Boolean = false
init {
layoutResource = R.layout.view_pref
widgetLayoutResource = R.layout.view_theme_mode
context.withStyledAttributes(attrs, R.styleable.Preference) {
isBottomBackground = getBoolean(R.styleable.Preference_isBottomBackground, false)
}
}
override fun onBindViewHolder(holder: PreferenceViewHolder) {
@@ -65,14 +60,9 @@ class ThemeModePreference(context: Context, attrs: AttributeSet) : Preference(co
}
override fun onSetInitialValue(defaultValue: Any?) {
super.onSetInitialValue(defaultValue)
currentValue = getPersistedString(defaultValue as? String ?: "0")
}
fun getDefaultValue(): Any {
return "0"
}
override fun shouldDisableDependents(): Boolean {
return currentValue == null || super.shouldDisableDependents()
}
@@ -0,0 +1,3 @@
package io.legato.kazusa.lib.theme
@@ -23,6 +23,7 @@ import io.legato.kazusa.lib.dialogs.alert
import io.legato.kazusa.lib.dialogs.selector
import io.legato.kazusa.lib.prefs.ColorPreference
import io.legato.kazusa.lib.prefs.NameListPreference
import io.legato.kazusa.lib.prefs.ThemeCardPreference
import io.legato.kazusa.lib.prefs.ThemeModePreference
//import io.legado.app.lib.theme.primaryColor
import io.legato.kazusa.ui.widget.number.NumberPickerDialog
@@ -104,7 +105,7 @@ class ThemeConfigFragment : PreferenceFragmentCompat(),
true
}
}
findPreference<ListPreference>(PreferKey.themePref)?.let {
findPreference<ThemeCardPreference>(PreferKey.themePref)?.let {
it.setOnPreferenceChangeListener { _, _ ->
val intent = requireActivity().intent
requireActivity().finish()