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 diff --git a/data/app-currency/src/main/kotlin/com/tangem/data/appcurrency/DefaultAppCurrencyRepository.kt b/data/app-currency/src/main/kotlin/com/tangem/data/appcurrency/DefaultAppCurrencyRepository.kt index bce54591e8..b86e0bb03c 100644 --- a/data/app-currency/src/main/kotlin/com/tangem/data/appcurrency/DefaultAppCurrencyRepository.kt +++ b/data/app-currency/src/main/kotlin/com/tangem/data/appcurrency/DefaultAppCurrencyRepository.kt @@ -9,6 +9,7 @@ import com.tangem.datasource.local.appcurrency.AvailableAppCurrenciesStore import com.tangem.datasource.local.preferences.AppPreferencesStore import com.tangem.datasource.local.preferences.PreferencesKeys import com.tangem.datasource.local.preferences.utils.getObject +import com.tangem.datasource.local.preferences.utils.getSyncOrNull import com.tangem.datasource.local.preferences.utils.storeObject import com.tangem.domain.appcurrency.model.AppCurrency import com.tangem.domain.appcurrency.repository.AppCurrencyRepository @@ -42,7 +43,9 @@ internal class DefaultAppCurrencyRepository( } withContext(dispatchers.io) { - fetchDefaultAppCurrency() + if (appPreferencesStore.getSyncOrNull(PreferencesKeys.SELECTED_APP_CURRENCY_KEY) == null) { + fetchDefaultAppCurrency() + } } } } diff --git a/data/card/src/main/java/com/tangem/data/card/DefaultCardRepository.kt b/data/card/src/main/java/com/tangem/data/card/DefaultCardRepository.kt index 7f0a56fd9a..84c73a8dc7 100644 --- a/data/card/src/main/java/com/tangem/data/card/DefaultCardRepository.kt +++ b/data/card/src/main/java/com/tangem/data/card/DefaultCardRepository.kt @@ -3,7 +3,7 @@ package com.tangem.data.card import com.tangem.datasource.local.card.UsedCardInfo import com.tangem.datasource.local.preferences.AppPreferencesStore import com.tangem.datasource.local.preferences.PreferencesKeys -import com.tangem.datasource.local.preferences.utils.getObject +import com.tangem.datasource.local.preferences.utils.getObjectList import com.tangem.domain.card.repository.CardRepository import com.tangem.utils.extensions.addOrReplace import kotlinx.coroutines.flow.Flow @@ -14,7 +14,7 @@ internal class DefaultCardRepository( ) : CardRepository { override fun wasCardScanned(cardId: String): Flow { - return appPreferencesStore.getObject>(key = PreferencesKeys.USED_CARDS_INFO_KEY) + return appPreferencesStore.getObjectList(key = PreferencesKeys.USED_CARDS_INFO_KEY) .map { savedCards -> savedCards?.any { it.cardId == cardId } ?: false } @@ -22,14 +22,14 @@ internal class DefaultCardRepository( override suspend fun setCardWasScanned(cardId: String) { appPreferencesStore.editData { mutablePreferences -> - val usedCards: List? = mutablePreferences.getObject( + val usedCards: List? = mutablePreferences.getObjectList( key = PreferencesKeys.USED_CARDS_INFO_KEY, ) val updatedUsedCards = usedCards?.updateCard(cardId) ?: listOf(UsedCardInfo(cardId = cardId, isScanned = true)) - mutablePreferences.setObject( + mutablePreferences.setObjectList( key = PreferencesKeys.USED_CARDS_INFO_KEY, value = updatedUsedCards, )