From 55ac1f607068186b1db883906defa4ac1b5965b6 Mon Sep 17 00:00:00 2001 From: HapeLee <1321903405@qq.com> Date: Sat, 7 Jun 2025 12:47:48 +0800 Subject: [PATCH] =?UTF-8?q?=E9=87=8D=E5=86=99=E4=B8=BB=E9=A2=98=E7=B3=BB?= =?UTF-8?q?=E7=BB=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kazusa/lib/prefs/ThemeModePreference.kt | 79 +++++++++++++ .../io/legato/kazusa/utils/DataStoreUtil.kt | 39 +++++++ .../main/res/drawable/popup_background.xml | 8 ++ app/src/main/res/layout/view_pref.xml | 10 ++ app/src/main/res/layout/view_theme_mode.xml | 35 ++++++ app/src/main/res/values-night/themes.xml | 110 ++++++++++++++++++ app/src/main/res/values/styles.xml | 68 +++++++++++ app/src/main/res/xml/pref_config_theme.xml | 2 +- 8 files changed, 350 insertions(+), 1 deletion(-) create mode 100644 app/src/main/java/io/legato/kazusa/lib/prefs/ThemeModePreference.kt create mode 100644 app/src/main/java/io/legato/kazusa/utils/DataStoreUtil.kt create mode 100644 app/src/main/res/drawable/popup_background.xml create mode 100644 app/src/main/res/layout/view_pref.xml create mode 100644 app/src/main/res/layout/view_theme_mode.xml create mode 100644 app/src/main/res/values-night/themes.xml create mode 100644 app/src/main/res/values/styles.xml diff --git a/app/src/main/java/io/legato/kazusa/lib/prefs/ThemeModePreference.kt b/app/src/main/java/io/legato/kazusa/lib/prefs/ThemeModePreference.kt new file mode 100644 index 000000000..16ed2e6a3 --- /dev/null +++ b/app/src/main/java/io/legato/kazusa/lib/prefs/ThemeModePreference.kt @@ -0,0 +1,79 @@ +package io.legato.kazusa.lib.prefs + +import android.content.Context +import android.util.AttributeSet +import android.view.LayoutInflater +import android.view.View +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) { + super.onBindViewHolder(holder) + + val toggleGroup = holder.itemView.findViewById(R.id.theme_toggle_group) + if (toggleGroup == null) { + val rootView = holder.itemView as ViewGroup + val inflater = LayoutInflater.from(context) + val themeToggleView = inflater.inflate(R.layout.view_theme_mode, rootView, false) + rootView.addView(themeToggleView) + + setupToggleGroup(themeToggleView.findViewById(R.id.theme_toggle_group)) + } + } + + private fun setupToggleGroup(toggleGroup: MaterialButtonToggleGroup) { + + when (currentValue) { + "0" -> toggleGroup.check(R.id.btn_system) + "1" -> toggleGroup.check(R.id.btn_light) + "2" -> toggleGroup.check(R.id.btn_dark) + } + + // 监听选择变化 + toggleGroup.addOnButtonCheckedListener { group, checkedId, isChecked -> + if (isChecked) { + val newValue = when (checkedId) { + R.id.btn_system -> "0" + R.id.btn_light -> "1" + R.id.btn_dark -> "2" + else -> null + } + + if (newValue != null && callChangeListener(newValue)) { + currentValue = newValue + persistString(newValue) + } + } + } + } + + 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() + } +} \ No newline at end of file diff --git a/app/src/main/java/io/legato/kazusa/utils/DataStoreUtil.kt b/app/src/main/java/io/legato/kazusa/utils/DataStoreUtil.kt new file mode 100644 index 000000000..8b619abdf --- /dev/null +++ b/app/src/main/java/io/legato/kazusa/utils/DataStoreUtil.kt @@ -0,0 +1,39 @@ +package io.legato.kazusa.utils + +import android.content.Context +import androidx.datastore.preferences.core.booleanPreferencesKey +import androidx.datastore.preferences.core.edit +import androidx.datastore.preferences.core.floatPreferencesKey +import androidx.datastore.preferences.core.intPreferencesKey +import androidx.datastore.preferences.core.longPreferencesKey +import androidx.datastore.preferences.core.stringPreferencesKey +import kotlinx.coroutines.flow.first +import kotlinx.coroutines.flow.map + +object DataStoreUtil { + + suspend fun save(context: Context, key: String, value: T) { + context.dataStore.edit { preferences -> + when (value) { + is String -> preferences[stringPreferencesKey(key)] = value + is Int -> preferences[intPreferencesKey(key)] = value + is Boolean -> preferences[booleanPreferencesKey(key)] = value + is Float -> preferences[floatPreferencesKey(key)] = value + is Long -> preferences[longPreferencesKey(key)] = value + } + } + } + + suspend fun read(context: Context, key: String, defaultValue: T): T { + return context.dataStore.data.map { preferences -> + when (defaultValue) { + is String -> preferences[stringPreferencesKey(key)] ?: defaultValue + is Int -> preferences[intPreferencesKey(key)] ?: defaultValue + is Boolean -> preferences[booleanPreferencesKey(key)] ?: defaultValue + is Float -> preferences[floatPreferencesKey(key)] ?: defaultValue + is Long -> preferences[longPreferencesKey(key)] ?: defaultValue + else -> defaultValue + } as T + }.first() + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/popup_background.xml b/app/src/main/res/drawable/popup_background.xml new file mode 100644 index 000000000..e6ec599b1 --- /dev/null +++ b/app/src/main/res/drawable/popup_background.xml @@ -0,0 +1,8 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/view_pref.xml b/app/src/main/res/layout/view_pref.xml new file mode 100644 index 000000000..4246a4d89 --- /dev/null +++ b/app/src/main/res/layout/view_pref.xml @@ -0,0 +1,10 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/view_theme_mode.xml b/app/src/main/res/layout/view_theme_mode.xml new file mode 100644 index 000000000..bd5c38b4a --- /dev/null +++ b/app/src/main/res/layout/view_theme_mode.xml @@ -0,0 +1,35 @@ + + + + + + + + + diff --git a/app/src/main/res/values-night/themes.xml b/app/src/main/res/values-night/themes.xml new file mode 100644 index 000000000..2f8701b61 --- /dev/null +++ b/app/src/main/res/values-night/themes.xml @@ -0,0 +1,110 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml new file mode 100644 index 000000000..4c98b8da4 --- /dev/null +++ b/app/src/main/res/values/styles.xml @@ -0,0 +1,68 @@ + + + + + + + + + + + + //**********System Style******************// + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/xml/pref_config_theme.xml b/app/src/main/res/xml/pref_config_theme.xml index 88bc789c4..6e95d8c3d 100644 --- a/app/src/main/res/xml/pref_config_theme.xml +++ b/app/src/main/res/xml/pref_config_theme.xml @@ -11,7 +11,7 @@ android:title="@string/theme_mode" android:summary="切换浅色/深色/跟随系统" /> -