From 5134c9b3788e632d1a78bd1b4dad2d424d81f43d Mon Sep 17 00:00:00 2001 From: tarsin Date: Mon, 5 Jun 2023 19:04:31 +0800 Subject: [PATCH] [DO NOT USE] Observe theme changed --- app/src/main/java/com/hippo/ehviewer/Settings.kt | 14 ++++++++++---- .../java/com/hippo/ehviewer/SettingsCollector.kt | 9 +++++++++ 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/com/hippo/ehviewer/Settings.kt b/app/src/main/java/com/hippo/ehviewer/Settings.kt index b208212c7..08d2ff1ff 100755 --- a/app/src/main/java/com/hippo/ehviewer/Settings.kt +++ b/app/src/main/java/com/hippo/ehviewer/Settings.kt @@ -3,6 +3,8 @@ package com.hippo.ehviewer import com.hippo.ehviewer.client.data.FavListUrlBuilder +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.flow import splitties.preferences.DataStorePreferences import splitties.preferences.DataStorePreferencesPreview import splitties.preferences.edit @@ -48,7 +50,7 @@ object Settings : DataStorePreferences(null) { var gallerySite by intFromStrPref(KEY_GALLERY_SITE, 0) var multiThreadDownload by intFromStrPref("download_thread", 3) var preloadImage by intFromStrPref("preload_image", 5) - var theme by intFromStrPref("theme", -1) + var theme by intFromStrPref("theme", -1).observed { updateWhenThemeChanges() } var listMode by intFromStrPref("list_mode", 0) var detailSize by intFromStrPref("detail_size", 0) var thumbResolution by intFromStrPref("thumb_resolution", 0) @@ -73,7 +75,7 @@ object Settings : DataStorePreferences(null) { var removeImageFiles by boolPref("include_pic", true) var needSignIn by boolPref("need_sign_in", true) var selectSite by boolPref("select_site", true) - var blackDarkTheme by boolPref("black_dark_theme", false) + var blackDarkTheme by boolPref("black_dark_theme", false).observed { updateWhenThemeChanges() } var preloadThumbAggressively by boolPref("preload_thumb_aggressively", false) var dF by boolPref(KEY_DOMAIN_FRONTING, false) var downloadOriginImage by boolPref("download_origin_image", false) @@ -107,18 +109,21 @@ object Settings : DataStorePreferences(null) { } } - private interface Delegate { + interface Delegate { + val flowGetter: () -> Flow operator fun getValue(thisRef: Any?, prop: KProperty<*>?): R operator fun setValue(thisRef: Any?, prop: KProperty<*>?, value: R) } private fun intFromStrPref(key: String, defValue: Int) = object : Delegate { - private var _value by stringPref(key, defValue.toString()) + override val flowGetter: () -> Flow + private var _value by stringPref(key, defValue.toString()).also { flowGetter = { it.changesFlow() } } override fun getValue(thisRef: Any?, prop: KProperty<*>?) = _value.toIntOrNull() ?: defValue override fun setValue(thisRef: Any?, prop: KProperty<*>?, value: Int) { _value = value.toString() } } private fun intArrayPref(key: String, count: Int) = object : Delegate { + override val flowGetter: () -> Flow = { flow { } } private var _value = (0 until count).map { intPref("${key}_$it", 0) }.toTypedArray() override fun getValue(thisRef: Any?, prop: KProperty<*>?): IntArray = _value.map { it.value }.toIntArray() override fun setValue(thisRef: Any?, prop: KProperty<*>?, value: IntArray) { @@ -128,6 +133,7 @@ object Settings : DataStorePreferences(null) { } private fun stringArrayPref(key: String, count: Int, defMetaValue: String) = object : Delegate> { + override val flowGetter: () -> Flow = { flow { } } private var _value = (0 until count).map { stringPref("${key}_$it", "$defMetaValue $it") }.toTypedArray() override fun getValue(thisRef: Any?, prop: KProperty<*>?): Array = _value.map { it.value }.toTypedArray() override fun setValue(thisRef: Any?, prop: KProperty<*>?, value: Array) { diff --git a/app/src/main/java/com/hippo/ehviewer/SettingsCollector.kt b/app/src/main/java/com/hippo/ehviewer/SettingsCollector.kt index 40398e19f..3a2584b2c 100644 --- a/app/src/main/java/com/hippo/ehviewer/SettingsCollector.kt +++ b/app/src/main/java/com/hippo/ehviewer/SettingsCollector.kt @@ -7,11 +7,13 @@ import eu.kanade.tachiyomi.util.lang.launchIO import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.SupervisorJob +import kotlinx.coroutines.delay import kotlinx.coroutines.launch import splitties.preferences.PrefDelegate val collectScope = CoroutineScope(Dispatchers.Main + SupervisorJob()) fun > R.observed(func: (Unit) -> Unit) = apply { collectScope.launch { changesFlow().collect(func) } } +fun > R.observed(func: (Unit) -> Unit) = apply { collectScope.launch { flowGetter().collect(func) } } fun updateWhenLocaleChanges() { val newValue = Settings.language @@ -29,3 +31,10 @@ fun updateWhenKeepMediaStatusChanges() { } } } + +fun updateWhenThemeChanges() { + collectScope.launch { + delay(100) // Avoid recompose being cancelled + AppCompatDelegate.setDefaultNightMode(Settings.theme) + } +}