Deduplicate and fix deprecation warnings

This commit is contained in:
Syer10
2022-08-01 16:47:24 -04:00
parent b518e494bd
commit cfa9a796f6
6 changed files with 64 additions and 159 deletions

View File

@@ -22,16 +22,6 @@ internal class AndroidPreference<T>(
private val adapter: Adapter<T>
) : Preference<T> {
interface Adapter<T> {
fun get(key: String, preferences: ObservableSettings): T
fun set(key: String, value: T, editor: ObservableSettings)
fun isSet(keys: Set<String>, key: String): Boolean = key in keys
fun keyListener(key: String) = key
}
/**
* Returns the key of this preference.
*/
@@ -83,7 +73,7 @@ internal class AndroidPreference<T>(
*/
override fun changes(): Flow<T> {
return callbackFlow {
val listener = preferences.addListener(adapter.keyListener(key)) {
val listener = adapter.addListener(key, preferences) {
trySend(get())
}
awaitClose { listener.deactivate() }

View File

@@ -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

View File

@@ -22,16 +22,6 @@ internal class JvmPreference<T>(
private val adapter: Adapter<T>
) : Preference<T> {
interface Adapter<T> {
fun get(key: String, preferences: ObservableSettings): T
fun set(key: String, value: T, editor: ObservableSettings)
fun isSet(keys: Set<String>, key: String): Boolean = key in keys
fun keyListener(key: String) = key
}
/**
* Returns the key of this preference.
*/
@@ -83,7 +73,7 @@ internal class JvmPreference<T>(
*/
override fun changes(): Flow<T> {
return callbackFlow {
val listener = preferences.addListener(adapter.keyListener(key)) {
val listener = adapter.addListener(key, preferences) {
trySend(get())
}
awaitClose { listener.deactivate() }

View File

@@ -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<String> {
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<Long> {
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<Int> {
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<Float> {
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<Boolean> {
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<Set<String>> {
override fun get(key: String, preferences: ObservableSettings): Set<String> {
return preferences.decodeValue(SetSerializer(String.serializer()), key, emptySet()) // Not called unless key is present.
}
override fun set(key: String, value: Set<String>, 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<String>, 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<T>(
private val serializer: (T) -> String,
private val deserializer: (String) -> T
) : JvmPreference.Adapter<T> {
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<T>(
private val defaultValue: T,
private val serializer: KSerializer<T>,
private val serializersModule: SerializersModule = EmptySerializersModule
) : JvmPreference.Adapter<T> {
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<String>, key: String): Boolean {
return keys.any { it.startsWith(key) }
}
}

View File

@@ -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 = "/"))
)
)

View File

@@ -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<String> {
interface Adapter<T> {
fun get(key: String, preferences: ObservableSettings): T
fun set(key: String, value: T, editor: ObservableSettings)
fun isSet(keys: Set<String>, key: String): Boolean = key in keys
fun addListener(key: String, preferences: ObservableSettings, callback: () -> Unit): SettingsListener
}
internal object StringAdapter : Adapter<String> {
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<String> {
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<Long> {
internal object LongAdapter : Adapter<Long> {
override fun get(key: String, preferences: ObservableSettings): Long {
return preferences.getLong(key, 0)
}
@@ -33,9 +48,13 @@ internal object LongAdapter : AndroidPreference.Adapter<Long> {
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<Int> {
internal object IntAdapter : Adapter<Int> {
override fun get(key: String, preferences: ObservableSettings): Int {
return preferences.getInt(key, 0)
}
@@ -43,9 +62,13 @@ internal object IntAdapter : AndroidPreference.Adapter<Int> {
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<Float> {
internal object FloatAdapter : Adapter<Float> {
override fun get(key: String, preferences: ObservableSettings): Float {
return preferences.getFloat(key, 0f)
}
@@ -53,9 +76,13 @@ internal object FloatAdapter : AndroidPreference.Adapter<Float> {
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<Boolean> {
internal object BooleanAdapter : Adapter<Boolean> {
override fun get(key: String, preferences: ObservableSettings): Boolean {
return preferences.getBoolean(key, false)
}
@@ -63,15 +90,21 @@ internal object BooleanAdapter : AndroidPreference.Adapter<Boolean> {
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<Set<String>> {
internal object StringSetAdapter : Adapter<Set<String>> {
private val serializer = SetSerializer(String.serializer())
override fun get(key: String, preferences: ObservableSettings): Set<String> {
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<String>, editor: ObservableSettings) {
editor.encodeValue(SetSerializer(String.serializer()), key, value)
editor.encodeValue(serializer, key, value)
}
/**
@@ -82,18 +115,18 @@ internal object StringSetAdapter : AndroidPreference.Adapter<Set<String>> {
}
/**
* 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<T>(
private val serializer: (T) -> String,
private val deserializer: (String) -> T
) : AndroidPreference.Adapter<T> {
) : Adapter<T> {
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<T>(
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<T>(
private val defaultValue: T,
private val serializer: KSerializer<T>,
private val serializersModule: SerializersModule = EmptySerializersModule
) : AndroidPreference.Adapter<T> {
) : Adapter<T> {
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<T>(
override fun isSet(keys: Set<String>, 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() }
}
}