From cfa9a796f6c33d0a45a19582dc71e4719f06e17f Mon Sep 17 00:00:00 2001 From: Syer10 Date: Mon, 1 Aug 2022 16:47:24 -0400 Subject: [PATCH] Deduplicate and fix deprecation warnings --- .../jui/core/prefs/AndroidPreference.kt | 12 +- .../jui/core/prefs/PreferenceStoreFactory.kt | 4 +- .../ca/gosyer/jui/core/prefs/JvmPreference.kt | 12 +- .../jui/core/prefs/JvmPreferenceAdapters.kt | 119 ------------------ .../jui/core/prefs/PreferenceStoreFactory.kt | 4 +- .../ca/gosyer/jui/core/prefs/JvmAdapters.kt} | 72 ++++++++--- 6 files changed, 64 insertions(+), 159 deletions(-) rename core/src/{androidMain/kotlin/ca/gosyer/jui/core/prefs/AndroidPreferenceAdapters.kt => jvmMain/kotlin/ca/gosyer/jui/core/prefs/JvmAdapters.kt} (57%) diff --git a/core/src/androidMain/kotlin/ca/gosyer/jui/core/prefs/AndroidPreference.kt b/core/src/androidMain/kotlin/ca/gosyer/jui/core/prefs/AndroidPreference.kt index b7c2637e..e085363f 100644 --- a/core/src/androidMain/kotlin/ca/gosyer/jui/core/prefs/AndroidPreference.kt +++ b/core/src/androidMain/kotlin/ca/gosyer/jui/core/prefs/AndroidPreference.kt @@ -22,16 +22,6 @@ internal class AndroidPreference( private val adapter: Adapter ) : Preference { - interface Adapter { - fun get(key: String, preferences: ObservableSettings): T - - fun set(key: String, value: T, editor: ObservableSettings) - - fun isSet(keys: Set, key: String): Boolean = key in keys - - fun keyListener(key: String) = key - } - /** * Returns the key of this preference. */ @@ -83,7 +73,7 @@ internal class AndroidPreference( */ override fun changes(): Flow { return callbackFlow { - val listener = preferences.addListener(adapter.keyListener(key)) { + val listener = adapter.addListener(key, preferences) { trySend(get()) } awaitClose { listener.deactivate() } diff --git a/core/src/androidMain/kotlin/ca/gosyer/jui/core/prefs/PreferenceStoreFactory.kt b/core/src/androidMain/kotlin/ca/gosyer/jui/core/prefs/PreferenceStoreFactory.kt index 70f7842f..7672056a 100644 --- a/core/src/androidMain/kotlin/ca/gosyer/jui/core/prefs/PreferenceStoreFactory.kt +++ b/core/src/androidMain/kotlin/ca/gosyer/jui/core/prefs/PreferenceStoreFactory.kt @@ -7,13 +7,13 @@ package ca.gosyer.jui.core.prefs import android.content.Context -import com.russhwolf.settings.AndroidSettings +import com.russhwolf.settings.SharedPreferencesSettings import me.tatarka.inject.annotations.Inject actual class PreferenceStoreFactory @Inject constructor(private val context: Context) { actual fun create(vararg names: String): PreferenceStore { return AndroidPreferenceStore( - AndroidSettings( + SharedPreferencesSettings( context.getSharedPreferences( names.joinToString(separator = "_"), Context.MODE_PRIVATE diff --git a/core/src/desktopMain/kotlin/ca/gosyer/jui/core/prefs/JvmPreference.kt b/core/src/desktopMain/kotlin/ca/gosyer/jui/core/prefs/JvmPreference.kt index 139539ec..7697d98d 100644 --- a/core/src/desktopMain/kotlin/ca/gosyer/jui/core/prefs/JvmPreference.kt +++ b/core/src/desktopMain/kotlin/ca/gosyer/jui/core/prefs/JvmPreference.kt @@ -22,16 +22,6 @@ internal class JvmPreference( private val adapter: Adapter ) : Preference { - interface Adapter { - fun get(key: String, preferences: ObservableSettings): T - - fun set(key: String, value: T, editor: ObservableSettings) - - fun isSet(keys: Set, key: String): Boolean = key in keys - - fun keyListener(key: String) = key - } - /** * Returns the key of this preference. */ @@ -83,7 +73,7 @@ internal class JvmPreference( */ override fun changes(): Flow { return callbackFlow { - val listener = preferences.addListener(adapter.keyListener(key)) { + val listener = adapter.addListener(key, preferences) { trySend(get()) } awaitClose { listener.deactivate() } diff --git a/core/src/desktopMain/kotlin/ca/gosyer/jui/core/prefs/JvmPreferenceAdapters.kt b/core/src/desktopMain/kotlin/ca/gosyer/jui/core/prefs/JvmPreferenceAdapters.kt index f8236f88..0d3c54da 100644 --- a/core/src/desktopMain/kotlin/ca/gosyer/jui/core/prefs/JvmPreferenceAdapters.kt +++ b/core/src/desktopMain/kotlin/ca/gosyer/jui/core/prefs/JvmPreferenceAdapters.kt @@ -6,123 +6,4 @@ package ca.gosyer.jui.core.prefs -import com.russhwolf.settings.ObservableSettings -import com.russhwolf.settings.serialization.decodeValue -import com.russhwolf.settings.serialization.encodeValue -import kotlinx.serialization.KSerializer -import kotlinx.serialization.builtins.SetSerializer -import kotlinx.serialization.builtins.serializer -import kotlinx.serialization.modules.EmptySerializersModule -import kotlinx.serialization.modules.SerializersModule -internal object StringAdapter : JvmPreference.Adapter { - override fun get(key: String, preferences: ObservableSettings): String { - return preferences.getString(key, "") // Not called unless key is present. - } - - override fun set(key: String, value: String, editor: ObservableSettings) { - editor.putString(key, value) - } -} - -internal object LongAdapter : JvmPreference.Adapter { - override fun get(key: String, preferences: ObservableSettings): Long { - return preferences.getLong(key, 0) - } - - override fun set(key: String, value: Long, editor: ObservableSettings) { - editor.putLong(key, value) - } -} - -internal object IntAdapter : JvmPreference.Adapter { - override fun get(key: String, preferences: ObservableSettings): Int { - return preferences.getInt(key, 0) - } - - override fun set(key: String, value: Int, editor: ObservableSettings) { - editor.putInt(key, value) - } -} - -internal object FloatAdapter : JvmPreference.Adapter { - override fun get(key: String, preferences: ObservableSettings): Float { - return preferences.getFloat(key, 0f) - } - - override fun set(key: String, value: Float, editor: ObservableSettings) { - editor.putFloat(key, value) - } -} - -internal object BooleanAdapter : JvmPreference.Adapter { - override fun get(key: String, preferences: ObservableSettings): Boolean { - return preferences.getBoolean(key, false) - } - - override fun set(key: String, value: Boolean, editor: ObservableSettings) { - editor.putBoolean(key, value) - } -} - -internal object StringSetAdapter : JvmPreference.Adapter> { - override fun get(key: String, preferences: ObservableSettings): Set { - return preferences.decodeValue(SetSerializer(String.serializer()), key, emptySet()) // Not called unless key is present. - } - - override fun set(key: String, value: Set, editor: ObservableSettings) { - editor.encodeValue(SetSerializer(String.serializer()), key, value) - } - - /** - * Encoding a string set makes a list of keys and a size key, such as key.size and key.0-size - */ - override fun isSet(keys: Set, key: String): Boolean { - return keys.contains("$key.size") - } - - /** - * Watching the regular key doesnt produce updates for a string set for some reason - * TODO make better, doesnt produce updates when you add something and remove something - */ - override fun keyListener(key: String): String { - return "$key.size" - } -} - -internal class ObjectAdapter( - private val serializer: (T) -> String, - private val deserializer: (String) -> T -) : JvmPreference.Adapter { - - override fun get(key: String, preferences: ObservableSettings): T { - return deserializer(preferences.getString(key, "")) // Not called unless key is present. - } - - override fun set(key: String, value: T, editor: ObservableSettings) { - editor.putString(key, serializer(value)) - } -} - -internal class JsonObjectAdapter( - private val defaultValue: T, - private val serializer: KSerializer, - private val serializersModule: SerializersModule = EmptySerializersModule -) : JvmPreference.Adapter { - - override fun get(key: String, preferences: ObservableSettings): T { - return preferences.decodeValue(serializer, key, defaultValue, serializersModule) // Not called unless key is present. - } - - override fun set(key: String, value: T, editor: ObservableSettings) { - editor.encodeValue(serializer, key, value, serializersModule) - } - - /** - * Encoding a structure makes keys start with the [key] and adds extensions for values, - * for a pair it would be like [key].first [key].second. - */ - override fun isSet(keys: Set, key: String): Boolean { - return keys.any { it.startsWith(key) } - } -} diff --git a/core/src/desktopMain/kotlin/ca/gosyer/jui/core/prefs/PreferenceStoreFactory.kt b/core/src/desktopMain/kotlin/ca/gosyer/jui/core/prefs/PreferenceStoreFactory.kt index fbc93d13..885f816d 100644 --- a/core/src/desktopMain/kotlin/ca/gosyer/jui/core/prefs/PreferenceStoreFactory.kt +++ b/core/src/desktopMain/kotlin/ca/gosyer/jui/core/prefs/PreferenceStoreFactory.kt @@ -6,7 +6,7 @@ package ca.gosyer.jui.core.prefs -import com.russhwolf.settings.JvmPreferencesSettings +import com.russhwolf.settings.PreferencesSettings import me.tatarka.inject.annotations.Inject import java.util.prefs.Preferences @@ -16,7 +16,7 @@ actual class PreferenceStoreFactory @Inject constructor() { actual fun create(vararg names: String): PreferenceStore { return JvmPreferenceStore( - JvmPreferencesSettings( + PreferencesSettings( rootNode.node(names.joinToString(separator = "/")) ) ) diff --git a/core/src/androidMain/kotlin/ca/gosyer/jui/core/prefs/AndroidPreferenceAdapters.kt b/core/src/jvmMain/kotlin/ca/gosyer/jui/core/prefs/JvmAdapters.kt similarity index 57% rename from core/src/androidMain/kotlin/ca/gosyer/jui/core/prefs/AndroidPreferenceAdapters.kt rename to core/src/jvmMain/kotlin/ca/gosyer/jui/core/prefs/JvmAdapters.kt index b338e4e2..362c73cb 100644 --- a/core/src/androidMain/kotlin/ca/gosyer/jui/core/prefs/AndroidPreferenceAdapters.kt +++ b/core/src/jvmMain/kotlin/ca/gosyer/jui/core/prefs/JvmAdapters.kt @@ -7,6 +7,7 @@ package ca.gosyer.jui.core.prefs import com.russhwolf.settings.ObservableSettings +import com.russhwolf.settings.SettingsListener import com.russhwolf.settings.serialization.decodeValue import com.russhwolf.settings.serialization.encodeValue import kotlinx.serialization.KSerializer @@ -15,7 +16,17 @@ import kotlinx.serialization.builtins.serializer import kotlinx.serialization.modules.EmptySerializersModule import kotlinx.serialization.modules.SerializersModule -internal object StringAdapter : AndroidPreference.Adapter { +interface Adapter { + fun get(key: String, preferences: ObservableSettings): T + + fun set(key: String, value: T, editor: ObservableSettings) + + fun isSet(keys: Set, key: String): Boolean = key in keys + + fun addListener(key: String, preferences: ObservableSettings, callback: () -> Unit): SettingsListener +} + +internal object StringAdapter : Adapter { override fun get(key: String, preferences: ObservableSettings): String { return preferences.getString(key, "") // Not called unless key is present. } @@ -23,9 +34,13 @@ internal object StringAdapter : AndroidPreference.Adapter { override fun set(key: String, value: String, editor: ObservableSettings) { editor.putString(key, value) } + + override fun addListener(key: String, preferences: ObservableSettings, callback: () -> Unit): SettingsListener { + return preferences.addStringOrNullListener(key) { callback() } + } } -internal object LongAdapter : AndroidPreference.Adapter { +internal object LongAdapter : Adapter { override fun get(key: String, preferences: ObservableSettings): Long { return preferences.getLong(key, 0) } @@ -33,9 +48,13 @@ internal object LongAdapter : AndroidPreference.Adapter { override fun set(key: String, value: Long, editor: ObservableSettings) { editor.putLong(key, value) } + + override fun addListener(key: String, preferences: ObservableSettings, callback: () -> Unit): SettingsListener { + return preferences.addLongOrNullListener(key) { callback() } + } } -internal object IntAdapter : AndroidPreference.Adapter { +internal object IntAdapter : Adapter { override fun get(key: String, preferences: ObservableSettings): Int { return preferences.getInt(key, 0) } @@ -43,9 +62,13 @@ internal object IntAdapter : AndroidPreference.Adapter { override fun set(key: String, value: Int, editor: ObservableSettings) { editor.putInt(key, value) } + + override fun addListener(key: String, preferences: ObservableSettings, callback: () -> Unit): SettingsListener { + return preferences.addIntOrNullListener(key) { callback() } + } } -internal object FloatAdapter : AndroidPreference.Adapter { +internal object FloatAdapter : Adapter { override fun get(key: String, preferences: ObservableSettings): Float { return preferences.getFloat(key, 0f) } @@ -53,9 +76,13 @@ internal object FloatAdapter : AndroidPreference.Adapter { override fun set(key: String, value: Float, editor: ObservableSettings) { editor.putFloat(key, value) } + + override fun addListener(key: String, preferences: ObservableSettings, callback: () -> Unit): SettingsListener { + return preferences.addFloatOrNullListener(key) { callback() } + } } -internal object BooleanAdapter : AndroidPreference.Adapter { +internal object BooleanAdapter : Adapter { override fun get(key: String, preferences: ObservableSettings): Boolean { return preferences.getBoolean(key, false) } @@ -63,15 +90,21 @@ internal object BooleanAdapter : AndroidPreference.Adapter { override fun set(key: String, value: Boolean, editor: ObservableSettings) { editor.putBoolean(key, value) } + + override fun addListener(key: String, preferences: ObservableSettings, callback: () -> Unit): SettingsListener { + return preferences.addBooleanOrNullListener(key) { callback() } + } } -internal object StringSetAdapter : AndroidPreference.Adapter> { +internal object StringSetAdapter : Adapter> { + private val serializer = SetSerializer(String.serializer()) + override fun get(key: String, preferences: ObservableSettings): Set { - return preferences.decodeValue(SetSerializer(String.serializer()), key, emptySet()) // Not called unless key is present. + return preferences.decodeValue(serializer, key, emptySet()) // Not called unless key is present. } override fun set(key: String, value: Set, editor: ObservableSettings) { - editor.encodeValue(SetSerializer(String.serializer()), key, value) + editor.encodeValue(serializer, key, value) } /** @@ -82,18 +115,18 @@ internal object StringSetAdapter : AndroidPreference.Adapter> { } /** - * Watching the regular key doesnt produce updates for a string set for some reason - * TODO make better, doesnt produce updates when you add something and remove something + * Watching the regular key doesn't produce updates for a string set for some reason + * TODO make better, doesn't produce updates when you add something and remove something */ - override fun keyListener(key: String): String { - return "$key.size" + override fun addListener(key: String, preferences: ObservableSettings, callback: () -> Unit): SettingsListener { + return preferences.addStringOrNullListener("$key.size") { callback() } } } internal class ObjectAdapter( private val serializer: (T) -> String, private val deserializer: (String) -> T -) : AndroidPreference.Adapter { +) : Adapter { override fun get(key: String, preferences: ObservableSettings): T { return deserializer(preferences.getString(key, "")) // Not called unless key is present. @@ -102,13 +135,17 @@ internal class ObjectAdapter( override fun set(key: String, value: T, editor: ObservableSettings) { editor.putString(key, serializer(value)) } + + override fun addListener(key: String, preferences: ObservableSettings, callback: () -> Unit): SettingsListener { + return preferences.addStringOrNullListener(key) { callback() } + } } internal class JsonObjectAdapter( private val defaultValue: T, private val serializer: KSerializer, private val serializersModule: SerializersModule = EmptySerializersModule -) : AndroidPreference.Adapter { +) : Adapter { override fun get(key: String, preferences: ObservableSettings): T { return preferences.decodeValue(serializer, key, defaultValue, serializersModule) // Not called unless key is present. @@ -125,4 +162,11 @@ internal class JsonObjectAdapter( override fun isSet(keys: Set, key: String): Boolean { return keys.any { it.startsWith(key) } } + + /** + * Todo doesn't work + */ + override fun addListener(key: String, preferences: ObservableSettings, callback: () -> Unit): SettingsListener { + return preferences.addStringOrNullListener(key) { callback() } + } }