From 3c3af4cb34609ba71899ff8906352d2129edcbca Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 29 Nov 2023 11:59:04 +0300 Subject: [PATCH] Updated on 2026-08-14 --- .../local/preferences/AppPreferencesStore.kt | 33 ++++++++++-- .../utils/AppPreferencesStoreExt.kt | 52 ++++++++++++++++--- 2 files changed, 75 insertions(+), 10 deletions(-) diff --git a/core/datasource/src/main/java/com/tangem/datasource/local/preferences/AppPreferencesStore.kt b/core/datasource/src/main/java/com/tangem/datasource/local/preferences/AppPreferencesStore.kt index 7e401b9333..ae7bb4ee8c 100644 --- a/core/datasource/src/main/java/com/tangem/datasource/local/preferences/AppPreferencesStore.kt +++ b/core/datasource/src/main/java/com/tangem/datasource/local/preferences/AppPreferencesStore.kt @@ -5,6 +5,7 @@ import androidx.datastore.preferences.core.MutablePreferences import androidx.datastore.preferences.core.Preferences import androidx.datastore.preferences.core.edit import com.squareup.moshi.Moshi +import com.squareup.moshi.Types /** * Application preferences store. @@ -31,15 +32,39 @@ class AppPreferencesStore( return edit { transform(it) } } - /** Get nullable data [T] by string [key] from [MutablePreferences] */ + /** + * Get nullable data [T] by string [key] from [MutablePreferences] + * + * Warning: This method cannot be used for T with parameterized types (e.g. List, Set, etc.). + * + * @see getObjectList + * */ inline fun MutablePreferences.getObject(key: Preferences.Key): T? { - val adapter = moshi.adapter(T::class.java) + val adapter = moshi.adapter(T::class.java) // TODO: Support parameterized types return this[key]?.let(adapter::fromJson) } - /** Set data [T] by string [key] to [MutablePreferences] */ + /** Get nullable list of data [T] by string [key] */ + inline fun MutablePreferences.getObjectList(key: Preferences.Key): List? { + val adapter = moshi.adapter>(Types.newParameterizedType(List::class.java, T::class.java)) + return this[key]?.let(adapter::fromJson) + } + + /** + * Set data [T] by string [key] to [MutablePreferences] + * + * Warning: This method cannot be used for T with parameterized types (e.g. List, Set, etc.). + * + * @see setObjectList + * */ inline fun MutablePreferences.setObject(key: Preferences.Key, value: T) { - val adapter = moshi.adapter(T::class.java) + val adapter = moshi.adapter(T::class.java) // TODO: Support parameterized types + this[key] = adapter.toJson(value) + } + + /** Set list of data [T] by string [key] to [MutablePreferences] */ + inline fun MutablePreferences.setObjectList(key: Preferences.Key, value: List) { + val adapter = moshi.adapter>(Types.newParameterizedType(List::class.java, T::class.java)) this[key] = adapter.toJson(value) } } \ No newline at end of file diff --git a/core/datasource/src/main/java/com/tangem/datasource/local/preferences/utils/AppPreferencesStoreExt.kt b/core/datasource/src/main/java/com/tangem/datasource/local/preferences/utils/AppPreferencesStoreExt.kt index 1ca1355871..974b36147a 100644 --- a/core/datasource/src/main/java/com/tangem/datasource/local/preferences/utils/AppPreferencesStoreExt.kt +++ b/core/datasource/src/main/java/com/tangem/datasource/local/preferences/utils/AppPreferencesStoreExt.kt @@ -2,6 +2,7 @@ package com.tangem.datasource.local.preferences.utils import androidx.datastore.preferences.core.Preferences import androidx.datastore.preferences.core.edit +import com.squareup.moshi.Types import com.tangem.datasource.local.preferences.AppPreferencesStore import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.firstOrNull @@ -13,15 +14,27 @@ inline fun AppPreferencesStore.getObject(key: Preferences.Key AppPreferencesStore.getObject(key: Preferences.Key, default: T): Flow { - val adapter = moshi.adapter(T::class.java) + val adapter = moshi.adapter(T::class.java) // TODO: Support parameterized types return data.map { it[key]?.let(adapter::fromJson) ?: default } } -/** Get nullable data [T] by string [key] */ +/** + * Get nullable data [T] by string [key] + * + * Warning: This method cannot be used for T with parameterized types (e.g. List, Set, etc.). + * + * @see getObjectListSync + * */ suspend inline fun AppPreferencesStore.getObjectSyncOrNull(key: Preferences.Key): T? { - val adapter = moshi.adapter(T::class.java) + val adapter = moshi.adapter(T::class.java) // TODO: Support parameterized types return data.firstOrNull() ?.get(key) ?.let(adapter::fromJson) @@ -39,8 +52,35 @@ suspend inline fun AppPreferencesStore.getObjectSyncOrDefault( ?: default } -/** Store data [value] by string [key] */ +/** + * Store data [value] by string [key] + * + * Warning: This method cannot be used for T with parameterized types (e.g. List, Set, etc.). + * + * @see storeObjectList + * */ suspend inline fun AppPreferencesStore.storeObject(key: Preferences.Key, value: T) { - val adapter = moshi.adapter(T::class.java) + val adapter = moshi.adapter(T::class.java) // TODO: Support parameterized types edit { it[key] = adapter.toJson(value) } +} + +/** Store list of data [value] by string [key] */ +suspend inline fun AppPreferencesStore.storeObjectList(key: Preferences.Key, value: List) { + val adapter = moshi.adapter>(Types.newParameterizedType(List::class.java, T::class.java)) + edit { it[key] = adapter.toJson(value) } +} + +/** Get flow of list of data [T] by string [key]. If data is not found, it returns `null` */ +inline fun AppPreferencesStore.getObjectList(key: Preferences.Key): Flow?> { + val adapter = moshi.adapter>(Types.newParameterizedType(List::class.java, T::class.java)) + return data.map { it[key]?.let(adapter::fromJson) } +} + +/** Get nullable list of data [T] by string [key] */ +suspend inline fun AppPreferencesStore.getObjectListSync(key: Preferences.Key): List { + val adapter = moshi.adapter>(Types.newParameterizedType(List::class.java, T::class.java)) + return data.firstOrNull() + ?.get(key) + ?.let(adapter::fromJson) + .orEmpty() } \ No newline at end of file