|
@@ -1,7 +1,11 @@
|
|
|
package io.legado.app.ui.config
|
|
package io.legado.app.ui.config
|
|
|
|
|
|
|
|
|
|
+import android.content.SharedPreferences
|
|
|
import androidx.compose.runtime.MutableState
|
|
import androidx.compose.runtime.MutableState
|
|
|
import androidx.compose.runtime.mutableStateOf
|
|
import androidx.compose.runtime.mutableStateOf
|
|
|
|
|
+import androidx.lifecycle.DefaultLifecycleObserver
|
|
|
|
|
+import androidx.lifecycle.LifecycleOwner
|
|
|
|
|
+import io.legado.app.utils.defaultSharedPreferences
|
|
|
import io.legado.app.utils.getPrefBoolean
|
|
import io.legado.app.utils.getPrefBoolean
|
|
|
import io.legado.app.utils.getPrefInt
|
|
import io.legado.app.utils.getPrefInt
|
|
|
import io.legado.app.utils.getPrefLong
|
|
import io.legado.app.utils.getPrefLong
|
|
@@ -14,14 +18,39 @@ import splitties.init.appCtx
|
|
|
import kotlin.properties.ReadWriteProperty
|
|
import kotlin.properties.ReadWriteProperty
|
|
|
import kotlin.reflect.KProperty
|
|
import kotlin.reflect.KProperty
|
|
|
|
|
|
|
|
|
|
+interface PrefDelegate<T> : ReadWriteProperty<Any?, T> {
|
|
|
|
|
+ fun dispose()
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
fun <T> prefDelegate(
|
|
fun <T> prefDelegate(
|
|
|
key: String,
|
|
key: String,
|
|
|
defaultValue: T,
|
|
defaultValue: T,
|
|
|
|
|
+ lifecycleOwner: LifecycleOwner? = null,
|
|
|
onValueChange: ((T) -> Unit)? = null
|
|
onValueChange: ((T) -> Unit)? = null
|
|
|
-): ReadWriteProperty<Any?, T> {
|
|
|
|
|
- return object : ReadWriteProperty<Any?, T> {
|
|
|
|
|
|
|
+): PrefDelegate<T> {
|
|
|
|
|
+ return object : PrefDelegate<T>, SharedPreferences.OnSharedPreferenceChangeListener, DefaultLifecycleObserver {
|
|
|
private var _value: MutableState<T> = mutableStateOf(readInitialValue())
|
|
private var _value: MutableState<T> = mutableStateOf(readInitialValue())
|
|
|
|
|
|
|
|
|
|
+ init {
|
|
|
|
|
+ if (lifecycleOwner != null) {
|
|
|
|
|
+ lifecycleOwner.lifecycle.addObserver(this)
|
|
|
|
|
+ } else {
|
|
|
|
|
+ appCtx.defaultSharedPreferences.registerOnSharedPreferenceChangeListener(this)
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ override fun onCreate(owner: LifecycleOwner) {
|
|
|
|
|
+ appCtx.defaultSharedPreferences.registerOnSharedPreferenceChangeListener(this)
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ override fun onDestroy(owner: LifecycleOwner) {
|
|
|
|
|
+ dispose()
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ override fun dispose() {
|
|
|
|
|
+ appCtx.defaultSharedPreferences.unregisterOnSharedPreferenceChangeListener(this)
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
@Suppress("UNCHECKED_CAST")
|
|
@Suppress("UNCHECKED_CAST")
|
|
|
private fun readInitialValue(): T {
|
|
private fun readInitialValue(): T {
|
|
|
return when (defaultValue) {
|
|
return when (defaultValue) {
|
|
@@ -49,5 +78,15 @@ fun <T> prefDelegate(
|
|
|
onValueChange?.invoke(value)
|
|
onValueChange?.invoke(value)
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+ override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences?, changedKey: String?) {
|
|
|
|
|
+ if (changedKey == key) {
|
|
|
|
|
+ val newValue = readInitialValue()
|
|
|
|
|
+ if (_value.value != newValue) {
|
|
|
|
|
+ _value.value = newValue
|
|
|
|
|
+ onValueChange?.invoke(newValue)
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|