From 51ed623916ad3b452d93149122403952012de46d Mon Sep 17 00:00:00 2001 From: Tangem Date: Sun, 11 Dec 2022 10:26:15 +0300 Subject: [PATCH] Updated on 2026-08-14 --- .../userWalletList/UserWalletsListManager.kt | 10 ++- .../BiometricUserWalletsListManager.kt | 66 ++++++++----------- .../DummyUserWalletsListManager.kt | 6 +- .../details/redux/DetailsMiddleware.kt | 2 +- .../features/onboarding/OnboardingHelper.kt | 6 +- .../saveWallet/redux/SaveWalletMiddleware.kt | 4 +- .../features/tokens/redux/TokensMiddleware.kt | 2 +- .../middlewares/MultiWalletMiddleware.kt | 2 +- .../redux/middlewares/WalletMiddleware.kt | 2 +- .../redux/WalletSelectorMiddleware.kt | 2 +- .../tap/persistence/PreferencesStorage.kt | 2 +- 11 files changed, 48 insertions(+), 56 deletions(-) diff --git a/app/src/main/java/com/tangem/tap/domain/userWalletList/UserWalletsListManager.kt b/app/src/main/java/com/tangem/tap/domain/userWalletList/UserWalletsListManager.kt index 3dc337ae61..62ea1a37a4 100644 --- a/app/src/main/java/com/tangem/tap/domain/userWalletList/UserWalletsListManager.kt +++ b/app/src/main/java/com/tangem/tap/domain/userWalletList/UserWalletsListManager.kt @@ -19,8 +19,14 @@ interface UserWalletsListManager { suspend fun selectWallet(walletId: UserWalletId): CompletionResult - suspend fun save(userWallet: UserWallet): CompletionResult - suspend fun update(userWallet: UserWallet): CompletionResult + /** + * Save user's wallet + * @param userWallet User's wallet to save + * @param canOverride If false, then terminate with [UserWalletListError.WalletAlreadySaved] when user tries to save an + * already saved card + * @return [CompletionResult] operation result + * */ + suspend fun save(userWallet: UserWallet, canOverride: Boolean = false): CompletionResult suspend fun delete(walletIds: List): CompletionResult suspend fun clear(): CompletionResult diff --git a/app/src/main/java/com/tangem/tap/domain/userWalletList/implementation/BiometricUserWalletsListManager.kt b/app/src/main/java/com/tangem/tap/domain/userWalletList/implementation/BiometricUserWalletsListManager.kt index d7ab7b396d..ad4c7597c9 100644 --- a/app/src/main/java/com/tangem/tap/domain/userWalletList/implementation/BiometricUserWalletsListManager.kt +++ b/app/src/main/java/com/tangem/tap/domain/userWalletList/implementation/BiometricUserWalletsListManager.kt @@ -110,12 +110,36 @@ internal class BiometricUserWalletsListManager( findSelectedWallet()!! } - override suspend fun save(userWallet: UserWallet): CompletionResult { - return saveInternal(userWallet, override = false) - } + override suspend fun save( + userWallet: UserWallet, + canOverride: Boolean, + ): CompletionResult = withUnlock { + val isWalletSaved = state.value.wallets + .filter { it.isSaved } + .flatMap(UserWallet::cardsInWallet) + .contains(userWallet.cardId) - override suspend fun update(userWallet: UserWallet): CompletionResult { - return saveInternal(userWallet, override = true) + if (isWalletSaved && !canOverride) { + CompletionResult.Failure(UserWalletListError.WalletAlreadySaved) + } else { + keysRepository.save( + walletId = userWallet.walletId, + encryptionKey = userWallet.scanResponse.card.encryptionKey, + ) + .doOnSuccess { keys -> + state.update { prevState -> + prevState.copy( + encryptionKeys = (keys + prevState.encryptionKeys).distinctBy { it.walletId }, + ) + } + } + .flatMap { publicInformationRepository.save(userWallet) } + .flatMap { sensitiveInformationRepository.save(userWallet) } + .flatMap { loadModels() } + .doOnSuccess { + userWallet.isSaved = true + } + } } override suspend fun delete(walletIds: List): CompletionResult { @@ -162,38 +186,6 @@ internal class BiometricUserWalletsListManager( } } - private suspend fun saveInternal( - userWallet: UserWallet, - override: Boolean, - ): CompletionResult = withUnlock { - val isWalletSaved = state.value.wallets - .filter { it.isSaved } - .flatMap(UserWallet::cardsInWallet) - .contains(userWallet.cardId) - - if (isWalletSaved && !override) { - CompletionResult.Failure(UserWalletListError.WalletAlreadySaved) - } else { - keysRepository.save( - walletId = userWallet.walletId, - encryptionKey = userWallet.scanResponse.card.encryptionKey, - ) - .doOnSuccess { keys -> - state.update { prevState -> - prevState.copy( - encryptionKeys = (keys + prevState.encryptionKeys).distinctBy { it.walletId }, - ) - } - } - .flatMap { publicInformationRepository.save(userWallet) } - .flatMap { sensitiveInformationRepository.save(userWallet) } - .flatMap { loadModels() } - .doOnSuccess { - userWallet.isSaved = true - } - } - } - private suspend inline fun withUnlock( block: () -> CompletionResult, ): CompletionResult { diff --git a/app/src/main/java/com/tangem/tap/domain/userWalletList/implementation/DummyUserWalletsListManager.kt b/app/src/main/java/com/tangem/tap/domain/userWalletList/implementation/DummyUserWalletsListManager.kt index 5135966db1..a3c3a3e929 100644 --- a/app/src/main/java/com/tangem/tap/domain/userWalletList/implementation/DummyUserWalletsListManager.kt +++ b/app/src/main/java/com/tangem/tap/domain/userWalletList/implementation/DummyUserWalletsListManager.kt @@ -40,11 +40,7 @@ class DummyUserWalletsListManager : UserWalletsListManager { } } - override suspend fun save(userWallet: UserWallet): CompletionResult { - return CompletionResult.Success(Unit) - } - - override suspend fun update(userWallet: UserWallet): CompletionResult { + override suspend fun save(userWallet: UserWallet, canOverride: Boolean): CompletionResult { return CompletionResult.Success(Unit) } diff --git a/app/src/main/java/com/tangem/tap/features/details/redux/DetailsMiddleware.kt b/app/src/main/java/com/tangem/tap/features/details/redux/DetailsMiddleware.kt index 0a0820e863..297cb3d6e3 100644 --- a/app/src/main/java/com/tangem/tap/features/details/redux/DetailsMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/details/redux/DetailsMiddleware.kt @@ -246,7 +246,7 @@ class DetailsMiddleware { Timber.e(error, "Wallet saving failed") } .doOnSuccess { - preferencesStorage.shouldShowSaveWallet = false + preferencesStorage.shouldShowSaveUserWalletScreen = false preferencesStorage.shouldSaveUserWallets = true store.dispatchOnMain( DetailsAction.AppSettings.SwitchPrivacySetting.Success( diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/OnboardingHelper.kt b/app/src/main/java/com/tangem/tap/features/onboarding/OnboardingHelper.kt index 2fe2d59e78..e14d6cff7d 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/OnboardingHelper.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/OnboardingHelper.kt @@ -11,7 +11,6 @@ import com.tangem.tap.preferencesStorage import com.tangem.tap.scope import com.tangem.tap.store import com.tangem.tap.tangemSdkManager -import com.tangem.tap.userWalletsListManager import kotlinx.coroutines.delay import kotlinx.coroutines.launch @@ -56,8 +55,7 @@ class OnboardingHelper { backupCardsIds: List? = null, ) { when { - userWalletsListManager.hasSavedUserWallets -> scope.launch { - delay(timeMillis = 1_200) + preferencesStorage.shouldSaveUserWallets -> scope.launch { store.dispatchOnMain( SaveWalletAction.ProvideBackupInfo( scanResponse = scanResponse, @@ -68,7 +66,7 @@ class OnboardingHelper { store.dispatchOnMain(SaveWalletAction.Save) } tangemSdkManager.canUseBiometry && - preferencesStorage.shouldShowSaveWallet -> scope.launch { + preferencesStorage.shouldShowSaveUserWalletScreen -> scope.launch { delay(timeMillis = 1_200) store.dispatchOnMain( SaveWalletAction.ProvideBackupInfo( diff --git a/app/src/main/java/com/tangem/tap/features/saveWallet/redux/SaveWalletMiddleware.kt b/app/src/main/java/com/tangem/tap/features/saveWallet/redux/SaveWalletMiddleware.kt index 64101d2fb5..d4717299e0 100644 --- a/app/src/main/java/com/tangem/tap/features/saveWallet/redux/SaveWalletMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/saveWallet/redux/SaveWalletMiddleware.kt @@ -82,7 +82,7 @@ internal class SaveWalletMiddleware { val isFirstSavedWallet = !userWalletsListManager.hasSavedUserWallets saveAccessCodeIfNeeded(state.backupInfo?.accessCode, userWallet.cardsInWallet) - .flatMap { userWalletsListManager.save(userWallet) } + .flatMap { userWalletsListManager.save(userWallet, canOverride = true) } .doOnFailure { error -> store.dispatchOnMain(SaveWalletAction.Save.Error(error)) } @@ -109,7 +109,7 @@ internal class SaveWalletMiddleware { } private fun saveWalletWasShown() { - preferencesStorage.shouldShowSaveWallet = false + preferencesStorage.shouldShowSaveUserWalletScreen = false } private suspend fun saveAccessCodeIfNeeded( diff --git a/app/src/main/java/com/tangem/tap/features/tokens/redux/TokensMiddleware.kt b/app/src/main/java/com/tangem/tap/features/tokens/redux/TokensMiddleware.kt index 5182944017..8465e9d228 100644 --- a/app/src/main/java/com/tangem/tap/features/tokens/redux/TokensMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/tokens/redux/TokensMiddleware.kt @@ -286,7 +286,7 @@ class TokensMiddleware { ) scope.launch { - userWalletsListManager.update(updatedUserWallet) + userWalletsListManager.save(updatedUserWallet, canOverride = true) .flatMap { walletCurrenciesManager.addCurrencies( userWallet = updatedUserWallet, diff --git a/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/MultiWalletMiddleware.kt b/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/MultiWalletMiddleware.kt index 55ea7ddbfc..28f6fcc965 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/MultiWalletMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/MultiWalletMiddleware.kt @@ -189,7 +189,7 @@ class MultiWalletMiddleware { scanResponse = scanResponse, ) - userWalletsListManager.update(userWallet) + userWalletsListManager.save(userWallet, canOverride = true) .doOnSuccess { store.state.globalState.tapWalletManager.loadData(userWallet, refresh = true) } diff --git a/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/WalletMiddleware.kt b/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/WalletMiddleware.kt index c0daa2d56d..83cca6c428 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/WalletMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/WalletMiddleware.kt @@ -338,7 +338,7 @@ class WalletMiddleware { } private fun showSaveWalletIfNeeded() { - if (preferencesStorage.shouldShowSaveWallet + if (preferencesStorage.shouldShowSaveUserWalletScreen && tangemSdkManager.canUseBiometry && store.state.navigationState.backStack.lastOrNull() == AppScreen.Wallet ) { diff --git a/app/src/main/java/com/tangem/tap/features/walletSelector/redux/WalletSelectorMiddleware.kt b/app/src/main/java/com/tangem/tap/features/walletSelector/redux/WalletSelectorMiddleware.kt index 3d14fe926b..ae053d797b 100644 --- a/app/src/main/java/com/tangem/tap/features/walletSelector/redux/WalletSelectorMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/walletSelector/redux/WalletSelectorMiddleware.kt @@ -168,7 +168,7 @@ internal class WalletSelectorMiddleware { scope.launch { userWalletsListManager.get(walletId = UserWalletId(walletId)) .map { it.copy(name = newName) } - .flatMap { userWalletsListManager.update(it) } + .flatMap { userWalletsListManager.save(it, canOverride = true) } .doOnFailure { error -> store.dispatchOnMain(WalletSelectorAction.HandleError(error)) } diff --git a/app/src/main/java/com/tangem/tap/persistence/PreferencesStorage.kt b/app/src/main/java/com/tangem/tap/persistence/PreferencesStorage.kt index 4f4d41a9e4..eaf21b8d83 100644 --- a/app/src/main/java/com/tangem/tap/persistence/PreferencesStorage.kt +++ b/app/src/main/java/com/tangem/tap/persistence/PreferencesStorage.kt @@ -33,7 +33,7 @@ class PreferencesStorage(applicationContext: Application) { get() = preferences.getLong(CHAT_FIRST_LAUNCH_KEY, 0).takeIf { it != 0L } set(value) = preferences.edit { putLong(CHAT_FIRST_LAUNCH_KEY, value ?: 0) } - var shouldShowSaveWallet: Boolean + var shouldShowSaveUserWalletScreen: Boolean get() = preferences.getBoolean(SAVE_WALLET_DIALOG_SHOWN_KEY, true) set(value) = preferences.edit { putBoolean(SAVE_WALLET_DIALOG_SHOWN_KEY, value)