From b76f6d4ae72915be4073646400a5406f26e9b796 Mon Sep 17 00:00:00 2001 From: Tangem Date: Tue, 28 Feb 2023 14:44:37 +0300 Subject: [PATCH] Updated on 2026-08-14 --- .../com/tangem/tap/LockUserWalletsTimer.kt | 6 +- .../main/java/com/tangem/tap/MainActivity.kt | 4 +- .../userWalletList/UserWalletsListManager.kt | 80 ++++++++------ .../UserWalletsListManagerExtensions.kt | 51 +++++++++ .../di/UserWalletsListManagerProvider.kt | 7 ++ .../BiometricUserWalletsListManager.kt | 14 +-- .../RuntimeUserWalletsListManager.kt | 103 ++++++++++++++++++ .../details/redux/DetailsMiddleware.kt | 4 +- .../twins/redux/TwinCardsMiddleware.kt | 3 +- .../saveWallet/redux/SaveWalletMiddleware.kt | 2 +- .../features/tokens/redux/TokensMiddleware.kt | 2 +- .../tap/features/wallet/redux/WalletState.kt | 2 +- .../redux/middlewares/WalletMiddleware.kt | 2 +- .../redux/reducers/MultiWalletReducer.kt | 2 +- .../tap/features/wallet/ui/WalletFragment.kt | 7 +- .../redux/WalletSelectorMiddleware.kt | 9 +- .../ui/WalletSelectorViewModel.kt | 1 + .../welcome/redux/WelcomeMiddleware.kt | 3 +- 18 files changed, 240 insertions(+), 62 deletions(-) create mode 100644 app/src/main/java/com/tangem/tap/domain/userWalletList/UserWalletsListManagerExtensions.kt create mode 100644 app/src/main/java/com/tangem/tap/domain/userWalletList/implementation/RuntimeUserWalletsListManager.kt diff --git a/app/src/main/java/com/tangem/tap/LockUserWalletsTimer.kt b/app/src/main/java/com/tangem/tap/LockUserWalletsTimer.kt index 426f49ca25..9ad0fc6fa9 100644 --- a/app/src/main/java/com/tangem/tap/LockUserWalletsTimer.kt +++ b/app/src/main/java/com/tangem/tap/LockUserWalletsTimer.kt @@ -6,6 +6,7 @@ import androidx.lifecycle.lifecycleScope import com.tangem.tap.common.extensions.dispatchOnMain import com.tangem.tap.common.redux.navigation.AppScreen import com.tangem.tap.common.redux.navigation.NavigationAction +import com.tangem.tap.domain.userWalletList.asLockable import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Job import kotlinx.coroutines.delay @@ -95,8 +96,9 @@ internal class LockUserWalletsTimer( val startTime = System.currentTimeMillis() delay(duration) if (isActive) { - val userWalletsListManager = userWalletsListManagerSafe ?: return@launch - if (userWalletsListManager.hasSavedUserWallets) { + val userWalletsListManager = userWalletsListManagerSafe?.asLockable() + ?: return@launch + if (userWalletsListManager.hasUserWallets) { val currentTime = System.currentTimeMillis() Timber.d( """ diff --git a/app/src/main/java/com/tangem/tap/MainActivity.kt b/app/src/main/java/com/tangem/tap/MainActivity.kt index 6b5d0bd175..c3507df132 100644 --- a/app/src/main/java/com/tangem/tap/MainActivity.kt +++ b/app/src/main/java/com/tangem/tap/MainActivity.kt @@ -122,7 +122,7 @@ class MainActivity : AppCompatActivity(), SnackbarHandler, ActivityResultCallbac override fun onNewIntent(intent: Intent?) { super.onNewIntent(intent) - intentHandler.handleIntent(intent, userWalletsListManager.hasSavedUserWallets) + intentHandler.handleIntent(intent, userWalletsListManager.hasUserWallets) } override fun onStart() { @@ -204,7 +204,7 @@ class MainActivity : AppCompatActivity(), SnackbarHandler, ActivityResultCallbac } private fun navigateToInitialScreen(intent: Intent?) { - if (userWalletsListManager.hasSavedUserWallets) { + if (userWalletsListManager.hasUserWallets) { store.dispatchOnMain(NavigationAction.NavigateTo(AppScreen.Welcome)) store.dispatchOnMain(WelcomeAction.HandleIntentIfNeeded(intent)) } else { 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 91d3b8dd91..ea9b4c6bb9 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 @@ -22,47 +22,19 @@ interface UserWalletsListManager { val selectedUserWalletSync: UserWallet? /** - * Indicates that all [UserWallet]s is unlocked - * - * @see [isLockedSync] - * @see [UserWallet.isLocked] + * Indicates that the [UserWalletsListManager] contains at least one saved [UserWallet] * */ - val isLocked: Flow - - /** - * Indicates that all [UserWallet]s is unlocked - * - * Sync version - * - * @see [isLocked] - * @see [UserWallet.isLocked] - * */ - val isLockedSync: Boolean - - val hasSavedUserWallets: Boolean - - /** - * Receive saved [UserWallet]s, populate [userWallets] flow with it and set [isLocked] as false. - * Require biometric user authorization - * - * @return [CompletionResult] of operation, with selected [UserWallet] - * or null if there is no selected [UserWallet] - * */ - suspend fun unlockWithBiometry(): CompletionResult - - /** - * Remove [UserWallet]s from [userWallets] and set [isLocked] as true - * */ - fun lock() + val hasUserWallets: Boolean /** * Set [UserWallet] with provided [UserWalletId] as selected * * @param userWalletId [UserWalletId] of [UserWallet] which must be selected * - * @return [CompletionResult] of operation with selected [UserWallet] + * @return [CompletionResult.Success] with selected [UserWallet] + * or [CompletionResult.Failure] with [NoSuchElementException] if [UserWallet] with [userWalletId] not found * */ - suspend fun selectWallet(userWalletId: UserWalletId): CompletionResult + suspend fun select(userWalletId: UserWalletId): CompletionResult /** * Save provided user wallet and set it as selected @@ -80,13 +52,16 @@ interface UserWalletsListManager { * Can terminate with [NoSuchElementException] if unable to find [UserWallet] with provided [UserWalletId] * @param userWalletId update [UserWallet] with that [UserWalletId] * @param update lambda that receives stored [UserWallet] and returns updated [UserWallet] - * @return [CompletionResult] of operation with updated [UserWallet] + * @return [CompletionResult.Success] with updated [UserWallet] + * or [CompletionResult.Failure] with [NoSuchElementException] if [UserWallet] with [userWalletId] not found * */ suspend fun update(userWalletId: UserWalletId, update: (UserWallet) -> UserWallet): CompletionResult /** * Delete saved [UserWallet]s with provided [UserWalletId]s * + * Sets [isLocked] as true if [userWallets] is empty or if all [userWallets] are locked + * * @param userWalletIds [UserWalletId]s of [UserWallet]s which must be deleted * * @return [CompletionResult] of operation @@ -102,12 +77,45 @@ interface UserWalletsListManager { /** * Get [UserWallet] with provided [UserWalletId] - * May terminate with [NoSuchElementException] if [UserWallet] is not found * - * @return [CompletionResult] of operation with found [UserWallet] + * @return [CompletionResult.Success] with found [UserWallet] + * or [CompletionResult.Failure] with [NoSuchElementException] if [UserWallet] with [userWalletId] not found * */ suspend fun get(userWalletId: UserWalletId): CompletionResult + interface Lockable : UserWalletsListManager { + /** + * Indicates that all [UserWallet]s is locked + * + * @see [isLockedSync] + * @see [UserWallet.isLocked] + * */ + val isLocked: Flow + + /** + * Indicates that all [UserWallet]s is locked + * + * Sync version + * + * @see [isLocked] + * @see [UserWallet.isLocked] + * */ + val isLockedSync: Boolean + + /** + * Receive saved [UserWallet]s, populate [userWallets] flow with it and set [isLocked] as false. + * + * @return [CompletionResult] of operation, with selected [UserWallet] + * or null if there is no selected [UserWallet] + * */ + suspend fun unlock(): CompletionResult + + /** + * Remove [UserWallet]s from [userWallets] and set [isLocked] as true + * */ + fun lock() + } + // For provider companion object } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/domain/userWalletList/UserWalletsListManagerExtensions.kt b/app/src/main/java/com/tangem/tap/domain/userWalletList/UserWalletsListManagerExtensions.kt new file mode 100644 index 0000000000..47f8b18a7c --- /dev/null +++ b/app/src/main/java/com/tangem/tap/domain/userWalletList/UserWalletsListManagerExtensions.kt @@ -0,0 +1,51 @@ +package com.tangem.tap.domain.userWalletList + +import com.tangem.common.CompletionResult +import com.tangem.tap.domain.model.UserWallet +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.flowOf + +/** + * Indicates that the [UserWalletsListManager] is locked + * + * @return If [UserWalletsListManager] not implements [UserWalletsListManager.Lockable] returns [Flow] which + * produces only one false value + * */ +val UserWalletsListManager.isLocked: Flow + get() = asLockable()?.isLocked ?: flowOf(false) + +/** + * Indicates that the [UserWalletsListManager] is locked + * + * @return If [UserWalletsListManager] not implements [UserWalletsListManager.Lockable] returns false + * */ +val UserWalletsListManager.isLockedSync: Boolean + get() = asLockable()?.isLockedSync ?: false + +/** + * Call [UserWalletsListManager.Lockable.unlock] if [UserWalletsListManager] implements [UserWalletsListManager.Lockable] + * + * @return If [UserWalletsListManager] not implements [UserWalletsListManager.Lockable] + * returns [CompletionResult.Success] with [UserWalletsListManager.selectedUserWalletSync] + * */ +suspend fun UserWalletsListManager.unlockIfLockable(): CompletionResult { + return asLockable()?.unlock() ?: CompletionResult.Success(selectedUserWalletSync) +} + +/** + * Call [UserWalletsListManager.Lockable.lock] if [UserWalletsListManager] implements [UserWalletsListManager.Lockable] + * or do nothing otherwise + * */ +fun UserWalletsListManager.lockIfLockable() { + asLockable()?.lock() +} + +/** + * Safe cast [UserWalletsListManager] to [UserWalletsListManager.Lockable] + * + * @return If [UserWalletsListManager] not implements [UserWalletsListManager.Lockable] then returns null or + * [UserWalletsListManager.Lockable] otherwise + * */ +fun UserWalletsListManager.asLockable(): UserWalletsListManager.Lockable? { + return this as? UserWalletsListManager.Lockable +} \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/domain/userWalletList/di/UserWalletsListManagerProvider.kt b/app/src/main/java/com/tangem/tap/domain/userWalletList/di/UserWalletsListManagerProvider.kt index 3773da7127..163c0cdc60 100644 --- a/app/src/main/java/com/tangem/tap/domain/userWalletList/di/UserWalletsListManagerProvider.kt +++ b/app/src/main/java/com/tangem/tap/domain/userWalletList/di/UserWalletsListManagerProvider.kt @@ -10,6 +10,7 @@ import com.tangem.tangem_sdk_new.storage.createEncryptedSharedPreferences import com.tangem.tap.domain.TangemSdkManager import com.tangem.tap.domain.userWalletList.UserWalletsListManager import com.tangem.tap.domain.userWalletList.implementation.BiometricUserWalletsListManager +import com.tangem.tap.domain.userWalletList.implementation.RuntimeUserWalletsListManager import com.tangem.tap.domain.userWalletList.repository.implementation.BiometricUserWalletsKeysRepository import com.tangem.tap.domain.userWalletList.repository.implementation.DefaultSelectedUserWalletRepository import com.tangem.tap.domain.userWalletList.repository.implementation.DefaultUserWalletsPublicInformationRepository @@ -68,4 +69,10 @@ fun UserWalletsListManager.Companion.provideBiometricImplementation( sensitiveInformationRepository = sensitiveInformationRepository, selectedUserWalletRepository = selectedUserWalletRepository, ) +} + +// TODO: Will be used in further MR's +@Suppress("unused") +fun UserWalletsListManager.Companion.provideRuntimeImplementation(): UserWalletsListManager { + return RuntimeUserWalletsListManager() } \ No newline at end of file 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 5c5be22e1f..060464fd2f 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 @@ -23,7 +23,7 @@ internal class BiometricUserWalletsListManager( private val publicInformationRepository: UserWalletsPublicInformationRepository, private val sensitiveInformationRepository: UserWalletsSensitiveInformationRepository, private val selectedUserWalletRepository: SelectedUserWalletRepository, -) : UserWalletsListManager { +) : UserWalletsListManager.Lockable { private val state = MutableStateFlow(State()) override val userWallets: Flow> @@ -50,10 +50,10 @@ internal class BiometricUserWalletsListManager( override val isLockedSync: Boolean get() = state.value.isLocked - override val hasSavedUserWallets: Boolean + override val hasUserWallets: Boolean get() = keysRepository.hasSavedEncryptionKeys() - override suspend fun unlockWithBiometry(): CompletionResult { + override suspend fun unlock(): CompletionResult { return unlockWithBiometryInternal() .map { selectedUserWalletSync } } @@ -62,20 +62,20 @@ internal class BiometricUserWalletsListManager( state.update { State() } } - override suspend fun selectWallet(userWalletId: UserWalletId): CompletionResult = catching { + override suspend fun select(userWalletId: UserWalletId): CompletionResult = catching { if (state.value.selectedUserWalletId == userWalletId) { return@catching findSelectedUserWallet()!! } selectedUserWalletRepository.set(userWalletId) - state.update { prevState -> + val newState = state.updateAndGet { prevState -> prevState.copy( selectedUserWalletId = userWalletId, ) } - findSelectedUserWallet()!! + newState.userWallets.first { it.walletId == userWalletId } } override suspend fun save(userWallet: UserWallet, canOverride: Boolean): CompletionResult { @@ -289,7 +289,7 @@ internal class BiometricUserWalletsListManager( } private fun findSelectedUserWallet(userWallets: List = state.value.userWallets): UserWallet? { - return userWallets.find { + return userWallets.firstOrNull { it.walletId == state.value.selectedUserWalletId } } diff --git a/app/src/main/java/com/tangem/tap/domain/userWalletList/implementation/RuntimeUserWalletsListManager.kt b/app/src/main/java/com/tangem/tap/domain/userWalletList/implementation/RuntimeUserWalletsListManager.kt new file mode 100644 index 0000000000..01a31ebff4 --- /dev/null +++ b/app/src/main/java/com/tangem/tap/domain/userWalletList/implementation/RuntimeUserWalletsListManager.kt @@ -0,0 +1,103 @@ +package com.tangem.tap.domain.userWalletList.implementation + +import com.tangem.common.CompletionResult +import com.tangem.common.catching +import com.tangem.domain.common.util.UserWalletId +import com.tangem.tap.domain.model.UserWallet +import com.tangem.tap.domain.userWalletList.UserWalletListError +import com.tangem.tap.domain.userWalletList.UserWalletsListManager +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.distinctUntilChanged +import kotlinx.coroutines.flow.filterNotNull +import kotlinx.coroutines.flow.mapLatest +import kotlinx.coroutines.flow.update +import kotlinx.coroutines.flow.updateAndGet + +@OptIn(ExperimentalCoroutinesApi::class) +internal class RuntimeUserWalletsListManager : UserWalletsListManager { + private val state = MutableStateFlow(State()) + + override val userWallets: Flow> + get() = state + .mapLatest { listOfNotNull(it.userWallet) } + .distinctUntilChanged() + + override val selectedUserWallet: Flow + get() = state + .mapLatest { it.userWallet } + .filterNotNull() + .distinctUntilChanged() + + override val selectedUserWalletSync: UserWallet? + get() = state.value.userWallet + + override val hasUserWallets: Boolean + get() = state.value.userWallet != null + + override suspend fun select(userWalletId: UserWalletId): CompletionResult = catching { + state.value.userWallet + ?.takeIf { it.walletId == userWalletId } + ?: walletNotFound() + } + + override suspend fun save(userWallet: UserWallet, canOverride: Boolean): CompletionResult { + return if (canOverride) { + saveInternal(userWallet) + } else { + val isWalletSaved = state.value.userWallet?.walletId == userWallet.walletId + + if (isWalletSaved) { + CompletionResult.Failure(UserWalletListError.WalletAlreadySaved) + } else { + saveInternal(userWallet) + } + } + } + + override suspend fun update( + userWalletId: UserWalletId, + update: (UserWallet) -> UserWallet, + ): CompletionResult = catching { + val wallet = state.value.userWallet + ?.takeIf { it.walletId == userWalletId } + ?: walletNotFound() + + state.updateAndGet { prevState -> + prevState.copy( + userWallet = update(wallet), + ) + }.userWallet!! + } + + override suspend fun delete(userWalletIds: List): CompletionResult = clear() + + override suspend fun clear(): CompletionResult = catching { + state.update { prevState -> + prevState.copy( + userWallet = null, + ) + } + } + + override suspend fun get(userWalletId: UserWalletId): CompletionResult = catching { + state.value.userWallet ?: walletNotFound() + } + + private fun saveInternal(userWallet: UserWallet): CompletionResult = catching { + state.update { prevState -> + prevState.copy( + userWallet = userWallet, + ) + } + } + + private fun walletNotFound(): Nothing { + throw NoSuchElementException("User wallet not found") + } + + private data class State( + val userWallet: UserWallet? = null, + ) +} \ No newline at end of file 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 983be0f335..d5032c7ce7 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 @@ -20,6 +20,8 @@ import com.tangem.tap.common.redux.navigation.AppScreen import com.tangem.tap.common.redux.navigation.NavigationAction import com.tangem.tap.domain.model.builders.UserWalletBuilder import com.tangem.tap.domain.model.builders.UserWalletIdBuilder +import com.tangem.tap.domain.userWalletList.isLockedSync +import com.tangem.tap.domain.userWalletList.lockIfLockable import com.tangem.tap.features.demo.DemoHelper import com.tangem.tap.features.onboarding.products.twins.redux.CreateTwinWalletMode import com.tangem.tap.features.onboarding.products.twins.redux.TwinCardsAction @@ -132,7 +134,7 @@ class DetailsMiddleware { store.onUserWalletSelected(selectedUserWallet) } } else { - userWalletsListManager.lock() + userWalletsListManager.lockIfLockable() store.dispatchOnMain(NavigationAction.PopBackTo(AppScreen.Home)) } } diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/products/twins/redux/TwinCardsMiddleware.kt b/app/src/main/java/com/tangem/tap/features/onboarding/products/twins/redux/TwinCardsMiddleware.kt index 1f77d2ae6f..ff7ff2399e 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/products/twins/redux/TwinCardsMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/products/twins/redux/TwinCardsMiddleware.kt @@ -26,6 +26,7 @@ import com.tangem.tap.domain.TapError import com.tangem.tap.domain.extensions.makePrimaryWalletManager import com.tangem.tap.domain.model.builders.UserWalletIdBuilder import com.tangem.tap.domain.twins.TwinCardsManager +import com.tangem.tap.domain.userWalletList.isLockedSync import com.tangem.tap.features.home.RUSSIA_COUNTRY_CODE import com.tangem.tap.features.onboarding.OnboardingDialog import com.tangem.tap.features.onboarding.OnboardingHelper @@ -335,7 +336,7 @@ private fun handle(action: Action, dispatch: DispatchFunction) { } private fun getPopBackScreen(): AppScreen { - return if (userWalletsListManager.hasSavedUserWallets) { + return if (userWalletsListManager.hasUserWallets) { if (userWalletsListManager.isLockedSync) { AppScreen.Welcome } else { 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 2dfa79cb24..5eaa50d8bc 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 @@ -90,7 +90,7 @@ internal class SaveWalletMiddleware { .backupCardsIds(state.backupInfo?.backupCardsIds) .build() ?: return@launch - val isFirstSavedWallet = !userWalletsListManager.hasSavedUserWallets + val isFirstSavedWallet = !userWalletsListManager.hasUserWallets saveAccessCodeIfNeeded(state.backupInfo?.accessCode, userWallet.cardsInWallet) .flatMap { userWalletsListManager.save(userWallet, canOverride = true) } 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 27aa168f02..4e71d8a002 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 @@ -341,7 +341,7 @@ class TokensMiddleware { private suspend fun removeCurrenciesIfNeeded(currencies: List) { when { currencies.isEmpty() -> Unit - userWalletsListManager.hasSavedUserWallets -> { + userWalletsListManager.hasUserWallets -> { walletCurrenciesManager.removeCurrencies( userWallet = userWalletsListManager.selectedUserWalletSync!!, currenciesToRemove = currencies, diff --git a/app/src/main/java/com/tangem/tap/features/wallet/redux/WalletState.kt b/app/src/main/java/com/tangem/tap/features/wallet/redux/WalletState.kt index 73c49d69ef..973966bc4f 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/redux/WalletState.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/redux/WalletState.kt @@ -103,7 +103,7 @@ data class WalletState( primaryWalletData?.currencyData?.status != BalanceStatus.UnknownBlockchain val hasSavedWallets: Boolean - get() = userWalletsListManager.hasSavedUserWallets + get() = userWalletsListManager.hasUserWallets fun getWalletManager(currency: Currency?): WalletManager? { if (currency?.blockchain == null) return null 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 41a28fa9c9..b1d86b23f1 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 @@ -377,7 +377,7 @@ class WalletMiddleware { private fun changeWallet() { when { - userWalletsListManager.hasSavedUserWallets -> { + userWalletsListManager.hasUserWallets -> { Analytics.send(MainScreen.ButtonMyWallets()) store.dispatchOnMain(NavigationAction.NavigateTo(AppScreen.WalletSelector)) } diff --git a/app/src/main/java/com/tangem/tap/features/wallet/redux/reducers/MultiWalletReducer.kt b/app/src/main/java/com/tangem/tap/features/wallet/redux/reducers/MultiWalletReducer.kt index 1acc7600fd..e415a746a2 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/redux/reducers/MultiWalletReducer.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/redux/reducers/MultiWalletReducer.kt @@ -114,7 +114,7 @@ class MultiWalletReducer { val currency = Currency.fromBlockchainNetwork(action.blockchain, action.token) val walletManager = state.getWalletManager(currency) if (walletManager == null) { - val screen = if (userWalletsListManager.hasSavedUserWallets) { + val screen = if (userWalletsListManager.hasUserWallets) { AppScreen.Welcome } else { AppScreen.Home diff --git a/app/src/main/java/com/tangem/tap/features/wallet/ui/WalletFragment.kt b/app/src/main/java/com/tangem/tap/features/wallet/ui/WalletFragment.kt index b170637f3b..e35f31191d 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/ui/WalletFragment.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/ui/WalletFragment.kt @@ -32,6 +32,7 @@ import com.tangem.tap.common.redux.navigation.NavigationAction import com.tangem.tap.domain.configurable.warningMessage.WarningMessage import com.tangem.tap.domain.statePrinter.printScanResponseState import com.tangem.tap.domain.statePrinter.printWalletState +import com.tangem.tap.domain.userWalletList.lockIfLockable import com.tangem.tap.features.details.redux.DetailsAction import com.tangem.tap.features.wallet.redux.ErrorType import com.tangem.tap.features.wallet.redux.ProgressState @@ -81,13 +82,13 @@ class WalletFragment : Fragment(R.layout.fragment_wallet), StoreSubscriber { - unlockWalletsWithBiometry() + unlockWallets() } is WalletSelectorAction.AddWallet -> { addWallet() @@ -115,11 +116,11 @@ internal class WalletSelectorMiddleware { } } - private fun unlockWalletsWithBiometry() { + private fun unlockWallets() { Analytics.send(MyWallets.Button.UnlockWithBiometrics()) scope.launch { - userWalletsListManager.unlockWithBiometry() + userWalletsListManager.unlockIfLockable() .doOnFailure { error -> Timber.e(error, "Unable to unlock all user wallets") store.dispatchOnMain(WalletSelectorAction.UnlockWithBiometry.Error(error)) @@ -195,7 +196,7 @@ internal class WalletSelectorMiddleware { if (userWallet.isLocked) { unlockUserWalletWithScannedCard(userWallet) } else { - userWalletsListManager.selectWallet(userWalletId) + userWalletsListManager.select(userWalletId) } } .doOnFailure { error -> diff --git a/app/src/main/java/com/tangem/tap/features/walletSelector/ui/WalletSelectorViewModel.kt b/app/src/main/java/com/tangem/tap/features/walletSelector/ui/WalletSelectorViewModel.kt index 41e5ca44f0..b048098525 100644 --- a/app/src/main/java/com/tangem/tap/features/walletSelector/ui/WalletSelectorViewModel.kt +++ b/app/src/main/java/com/tangem/tap/features/walletSelector/ui/WalletSelectorViewModel.kt @@ -8,6 +8,7 @@ import com.tangem.core.analytics.Analytics import com.tangem.domain.common.util.UserWalletId import com.tangem.tap.common.analytics.events.MyWallets import com.tangem.tap.common.extensions.dispatchOnMain +import com.tangem.tap.domain.userWalletList.isLocked import com.tangem.tap.features.details.ui.cardsettings.TextReference import com.tangem.tap.features.walletSelector.redux.WalletSelectorAction import com.tangem.tap.features.walletSelector.redux.WalletSelectorState diff --git a/app/src/main/java/com/tangem/tap/features/welcome/redux/WelcomeMiddleware.kt b/app/src/main/java/com/tangem/tap/features/welcome/redux/WelcomeMiddleware.kt index 94d5b55b3c..c8cde60e79 100644 --- a/app/src/main/java/com/tangem/tap/features/welcome/redux/WelcomeMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/welcome/redux/WelcomeMiddleware.kt @@ -17,6 +17,7 @@ import com.tangem.tap.common.redux.navigation.AppScreen import com.tangem.tap.common.redux.navigation.NavigationAction import com.tangem.tap.domain.model.builders.UserWalletBuilder import com.tangem.tap.domain.scanCard.ScanCardProcessor +import com.tangem.tap.domain.userWalletList.unlockIfLockable import com.tangem.tap.features.onboarding.products.wallet.saltPay.message.SaltPayActivationError import com.tangem.tap.intentHandler import com.tangem.tap.preferencesStorage @@ -66,7 +67,7 @@ internal class WelcomeMiddleware { private fun proceedWithBiometrics(state: WelcomeState) { scope.launch { - userWalletsListManager.unlockWithBiometry() + userWalletsListManager.unlockIfLockable() .doOnFailure { error -> store.dispatchOnMain(WelcomeAction.ProceedWithBiometrics.Error(error)) }