From e5f25fdfb155d93004d1f53d3a49ce1ef4c14f2a Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 16 Jul 2025 17:23:44 +0500 Subject: [PATCH] Updated on 2026-08-14 --- .../datasource/info/AndroidAppInfoProvider.kt | 3 +- .../data/common/currency/UserTokensSaver.kt | 1 + .../repository/DefaultCurrenciesRepository.kt | 78 ++++++++++++++++--- .../managetokens/SaveManagedTokensUseCase.kt | 4 +- .../domain/markets/SaveMarketTokensUseCase.kt | 3 +- .../tokens/AddCryptoCurrenciesUseCase.kt | 7 +- .../tokens/repository/CurrenciesRepository.kt | 20 +++++ 7 files changed, 97 insertions(+), 19 deletions(-) diff --git a/core/datasource/src/main/java/com/tangem/datasource/info/AndroidAppInfoProvider.kt b/core/datasource/src/main/java/com/tangem/datasource/info/AndroidAppInfoProvider.kt index 08d960e333..0bc5462596 100644 --- a/core/datasource/src/main/java/com/tangem/datasource/info/AndroidAppInfoProvider.kt +++ b/core/datasource/src/main/java/com/tangem/datasource/info/AndroidAppInfoProvider.kt @@ -1,7 +1,6 @@ package com.tangem.datasource.info import android.os.Build -import com.tangem.utils.SupportedLanguages import com.tangem.utils.info.AppInfoProvider import com.tangem.utils.version.AppVersionProvider import java.util.* @@ -17,7 +16,7 @@ internal class AndroidAppInfoProvider @Inject constructor( override val osVersion: String get() = Build.VERSION.RELEASE override val language: String - get() = SupportedLanguages.getCurrentSupportedLanguageCode() + get() = Locale.getDefault().language override val timezone: String get() = TimeZone.getDefault().id override val appVersion: String diff --git a/data/common/src/main/kotlin/com/tangem/data/common/currency/UserTokensSaver.kt b/data/common/src/main/kotlin/com/tangem/data/common/currency/UserTokensSaver.kt index 487b96f427..30f78dac03 100644 --- a/data/common/src/main/kotlin/com/tangem/data/common/currency/UserTokensSaver.kt +++ b/data/common/src/main/kotlin/com/tangem/data/common/currency/UserTokensSaver.kt @@ -38,6 +38,7 @@ class UserTokensSaver( userWalletId = userWalletId, response = response, ) + store(userWalletId, enrichedUserTokensResponse, false) push(userWalletId, enrichedUserTokensResponse, false) } diff --git a/data/tokens/src/main/kotlin/com/tangem/data/tokens/repository/DefaultCurrenciesRepository.kt b/data/tokens/src/main/kotlin/com/tangem/data/tokens/repository/DefaultCurrenciesRepository.kt index 429979f670..c2135f836f 100644 --- a/data/tokens/src/main/kotlin/com/tangem/data/tokens/repository/DefaultCurrenciesRepository.kt +++ b/data/tokens/src/main/kotlin/com/tangem/data/tokens/repository/DefaultCurrenciesRepository.kt @@ -71,7 +71,7 @@ internal class DefaultCurrenciesRepository( isGroupedByNetwork = isGroupedByNetwork, isSortedByBalance = isSortedByBalance, ) - userTokensSaver.storeAndPush(userWalletId, response) + userTokensSaver.store(userWalletId, response) } override suspend fun saveNewCurrenciesList(userWalletId: UserWalletId, currencies: List) { @@ -129,6 +129,61 @@ internal class DefaultCurrenciesRepository( currenciesToAdd } + override suspend fun saveNewCurrenciesListCache(userWalletId: UserWalletId, currencies: List) { + withContext(dispatchers.io) { + val savedResponse = requireNotNull( + value = getSavedUserTokensResponseSync(key = userWalletId), + lazyMessage = { "Saved tokens empty. Can not perform add currencies action." }, + ) + + val newCurrencies = populateCurrenciesWithMissedCoins(currencies) + + val updatedResponse = savedResponse.copy( + tokens = newCurrencies.map(userTokensResponseFactory::createResponseToken), + ) + userTokensSaver.store( + userWalletId = userWalletId, + response = updatedResponse, + ) + + fetchExpressAssetsByNetworkIds( + userWallet = userWalletsStore.getSyncStrict(key = userWalletId), + userTokens = updatedResponse, + ) + } + } + + override suspend fun addCurrenciesCache( + userWalletId: UserWalletId, + currencies: List, + ): List = withContext(dispatchers.io) { + val savedCurrencies = requireNotNull( + value = getSavedUserTokensResponseSync(key = userWalletId), + lazyMessage = { "Saved tokens empty. Can not perform add currencies action" }, + ) + + val currenciesToAdd = filterAlreadyAddedCurrencies( + savedCurrencies = savedCurrencies.tokens, + currenciesToAdd = populateCurrenciesWithMissedCoins(currencies = currencies), + ) + + val updatedResponse = savedCurrencies.copy( + tokens = savedCurrencies.tokens + currenciesToAdd.map(userTokensResponseFactory::createResponseToken), + ) + + userTokensSaver.store( + userWalletId = userWalletId, + response = updatedResponse, + ) + + fetchExpressAssetsByNetworkIds( + userWallet = userWalletsStore.getSyncStrict(key = userWalletId), + userTokens = updatedResponse, + ) + + currenciesToAdd + } + private fun filterAlreadyAddedCurrencies( savedCurrencies: List, currenciesToAdd: List, @@ -589,17 +644,16 @@ internal class DefaultCurrenciesRepository( } override suspend fun syncTokens(userWalletId: UserWalletId) { - val savedCurrencies = requireNotNull( - value = getSavedUserTokensResponseSync(key = userWalletId), - lazyMessage = { "Saved tokens empty. Can not perform add currencies action" }, - ) - userTokensSaver.push( - userWalletId = userWalletId, - response = savedCurrencies, - onFailSend = { - throw IllegalStateException("Unable to push tokens") - }, - ) + runCatching { + val savedCurrencies = requireNotNull( + value = getSavedUserTokensResponseSync(key = userWalletId), + lazyMessage = { "Saved tokens empty. Can not perform add currencies action" }, + ) + userTokensSaver.storeAndPush( + userWalletId = userWalletId, + response = savedCurrencies, + ) + } } override fun getCardTypesResolver(userWalletId: UserWalletId): CardTypesResolver { diff --git a/domain/manage-tokens/src/main/kotlin/com/tangem/domain/managetokens/SaveManagedTokensUseCase.kt b/domain/manage-tokens/src/main/kotlin/com/tangem/domain/managetokens/SaveManagedTokensUseCase.kt index 2599d4675c..8db4bc4638 100644 --- a/domain/manage-tokens/src/main/kotlin/com/tangem/domain/managetokens/SaveManagedTokensUseCase.kt +++ b/domain/manage-tokens/src/main/kotlin/com/tangem/domain/managetokens/SaveManagedTokensUseCase.kt @@ -50,7 +50,7 @@ class SaveManagedTokensUseCase( val addingCurrencies = currenciesToAdd.mapToCryptoCurrencies(userWalletId) - val savedCurrencies = currenciesRepository.addCurrencies( + val savedCurrencies = currenciesRepository.addCurrenciesCache( userWalletId = userWalletId, currencies = addingCurrencies, ) @@ -87,6 +87,8 @@ class SaveManagedTokensUseCase( networks = addedCurrencies.map(CryptoCurrency::network).toSet(), ), ) + + currenciesRepository.syncTokens(userWalletId) } private suspend fun refreshUpdatedYieldBalances( diff --git a/domain/markets/src/main/java/com/tangem/domain/markets/SaveMarketTokensUseCase.kt b/domain/markets/src/main/java/com/tangem/domain/markets/SaveMarketTokensUseCase.kt index dd0ad48ebc..ee87a2bd6a 100644 --- a/domain/markets/src/main/java/com/tangem/domain/markets/SaveMarketTokensUseCase.kt +++ b/domain/markets/src/main/java/com/tangem/domain/markets/SaveMarketTokensUseCase.kt @@ -66,7 +66,7 @@ class SaveMarketTokensUseCase( ) } - val savedCurrencies = currenciesRepository.addCurrencies( + val savedCurrencies = currenciesRepository.addCurrenciesCache( userWalletId = userWalletId, currencies = addedCurrencies, ) @@ -86,6 +86,7 @@ class SaveMarketTokensUseCase( networks = addedCurrencies.map(CryptoCurrency::network).toSet(), ), ) + currenciesRepository.syncTokens(userWalletId) } private suspend fun refreshUpdatedYieldBalances( diff --git a/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/AddCryptoCurrenciesUseCase.kt b/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/AddCryptoCurrenciesUseCase.kt index 290a8de379..29b564c683 100644 --- a/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/AddCryptoCurrenciesUseCase.kt +++ b/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/AddCryptoCurrenciesUseCase.kt @@ -119,7 +119,7 @@ class AddCryptoCurrenciesUseCase( * Refreshes the network statuses for tokens that have corresponding coins in the * [existingCurrencies] list. */ - private suspend fun Raise.refreshUpdatedNetworks( + private suspend fun refreshUpdatedNetworks( userWalletId: UserWalletId, currencyToAdd: CryptoCurrency, existingCurrencies: List, @@ -140,7 +140,8 @@ class AddCryptoCurrenciesUseCase( networks = setOfNotNull(networksToUpdate, networkToUpdate), ), ) - .bind() + + currenciesRepository.syncTokens(userWalletId) } private suspend fun refreshUpdatedYieldBalances(userWalletId: UserWalletId, addedCurrency: CryptoCurrency) { @@ -191,7 +192,7 @@ class AddCryptoCurrenciesUseCase( private suspend fun Raise.addCurrencies(userWalletId: UserWalletId, currency: CryptoCurrency) { catch( - { currenciesRepository.addCurrencies(userWalletId, listOf(currency)) }, + { currenciesRepository.addCurrenciesCache(userWalletId, listOf(currency)) }, ) { raise(it) } diff --git a/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/repository/CurrenciesRepository.kt b/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/repository/CurrenciesRepository.kt index 1807cc4a60..99ac7faff7 100644 --- a/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/repository/CurrenciesRepository.kt +++ b/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/repository/CurrenciesRepository.kt @@ -52,6 +52,26 @@ interface CurrenciesRepository { */ suspend fun addCurrencies(userWalletId: UserWalletId, currencies: List): List + /** + * Saves the given list of cryptocurrencies for a specific multi-currency user wallet. + * + * @param userWalletId The unique identifier of the user wallet. + * @param currencies The list of cryptocurrencies to be saved. + */ + @Deprecated("Tech debt") + suspend fun saveNewCurrenciesListCache(userWalletId: UserWalletId, currencies: List) + + /** + * Add currencies to a specific user wallet. + * + * @param userWalletId The unique identifier of the user wallet. + * @param currencies The currencies which must be added. + * @throws DataError.UserWalletError.WrongUserWallet If single-currency user wallet + * ID provided. + */ + @Deprecated("Tech debt") + suspend fun addCurrenciesCache(userWalletId: UserWalletId, currencies: List): List + /** * Removes currency from a specific user wallet. *