diff --git a/app/src/main/java/com/tangem/tap/domain/TangemSdkManager.kt b/app/src/main/java/com/tangem/tap/domain/TangemSdkManager.kt index 8b33c12085..3b13e7243e 100644 --- a/app/src/main/java/com/tangem/tap/domain/TangemSdkManager.kt +++ b/app/src/main/java/com/tangem/tap/domain/TangemSdkManager.kt @@ -40,10 +40,9 @@ import com.tangem.tap.domain.tasks.product.ScanProductTask import com.tangem.tap.domain.tokens.UserTokensRepository import com.tangem.wallet.R import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.isActive +import kotlinx.coroutines.suspendCancellableCoroutine import kotlinx.coroutines.withContext import kotlin.coroutines.resume -import kotlin.coroutines.suspendCoroutine class TangemSdkManager(private val tangemSdk: TangemSdk, private val context: Context) { @@ -68,6 +67,7 @@ class TangemSdkManager(private val tangemSdk: TangemSdk, private val context: Co cardId: String? = null, additionalBlockchainsToDerive: Collection? = null, messageRes: Int? = null, + allowsRequestAccessCodeFromRepository: Boolean = false, ): CompletionResult { val message = Message(context.getString(messageRes ?: R.string.initial_message_scan_header)) return runTaskAsyncReturnOnMain( @@ -75,6 +75,7 @@ class TangemSdkManager(private val tangemSdk: TangemSdk, private val context: Co card = null, userTokensRepository = userTokensRepository, additionalBlockchainsToDerive = additionalBlockchainsToDerive, + allowsRequestAccessCodeFromRepository = allowsRequestAccessCodeFromRepository, ), cardId = cardId, initialMessage = message, @@ -195,9 +196,9 @@ class TangemSdkManager(private val tangemSdk: TangemSdk, private val context: Co accessCode: String? = null, ): CompletionResult = withContext(Dispatchers.Main) { - suspendCoroutine { continuation -> + suspendCancellableCoroutine { continuation -> tangemSdk.startSessionWithRunnable(runnable, cardId, initialMessage, accessCode) { result -> - if (continuation.context.isActive) continuation.resume(result) + if (continuation.isActive) continuation.resume(result) } } } diff --git a/app/src/main/java/com/tangem/tap/domain/scanCard/ScanCardProcessor.kt b/app/src/main/java/com/tangem/tap/domain/scanCard/ScanCardProcessor.kt index f7c823369f..56e9beaf22 100644 --- a/app/src/main/java/com/tangem/tap/domain/scanCard/ScanCardProcessor.kt +++ b/app/src/main/java/com/tangem/tap/domain/scanCard/ScanCardProcessor.kt @@ -1,6 +1,5 @@ package com.tangem.tap.domain.scanCard -import com.tangem.blockchain.common.Blockchain import com.tangem.common.core.TangemError import com.tangem.common.core.TangemSdkError import com.tangem.common.doOnFailure @@ -46,7 +45,6 @@ import kotlinx.coroutines.launch object ScanCardProcessor { suspend fun scan( analyticsEvent: AnalyticsEvent? = null, - additionalBlockchainsToDerive: Collection? = null, cardId: String? = null, onProgressStateChange: suspend (showProgress: Boolean) -> Unit = {}, onScanStateChange: suspend (scanInProgress: Boolean) -> Unit = {}, @@ -63,7 +61,6 @@ object ScanCardProcessor { val result = tangemSdkManager.scanProduct( userTokensRepository = userTokensRepository, cardId = cardId, - additionalBlockchainsToDerive = additionalBlockchainsToDerive, ) store.dispatchOnMain(GlobalAction.ScanFailsCounter.ChooseBehavior(result)) diff --git a/app/src/main/java/com/tangem/tap/domain/tasks/product/ScanProductTask.kt b/app/src/main/java/com/tangem/tap/domain/tasks/product/ScanProductTask.kt index 524924875a..8dde976a16 100644 --- a/app/src/main/java/com/tangem/tap/domain/tasks/product/ScanProductTask.kt +++ b/app/src/main/java/com/tangem/tap/domain/tasks/product/ScanProductTask.kt @@ -49,11 +49,9 @@ class ScanProductTask( val card: Card? = null, private val userTokensRepository: UserTokensRepository?, private val additionalBlockchainsToDerive: Collection? = null, + override val allowsRequestAccessCodeFromRepository: Boolean = false, ) : CardSessionRunnable { - override val allowsRequestAccessCodeFromRepository: Boolean - get() = !additionalBlockchainsToDerive.isNullOrEmpty() - override fun run( session: CardSession, callback: (result: CompletionResult) -> 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 f8626aa139..983be0f335 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 @@ -68,7 +68,10 @@ class DetailsMiddleware { } DetailsAction.ScanCard -> { scope.launch { - tangemSdkManager.scanProduct(userTokensRepository) + tangemSdkManager.scanProduct( + userTokensRepository = userTokensRepository, + allowsRequestAccessCodeFromRepository = true, + ) .doOnSuccess { scanResponse -> val currentUserWalletId = state.scanResponse ?.let { UserWalletIdBuilder.scanResponse(it).build() } 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 557e187c0a..2749e3db13 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 @@ -5,6 +5,7 @@ import com.tangem.blockchain.common.Token import com.tangem.blockchain.common.WalletManager import com.tangem.common.doOnSuccess import com.tangem.common.extensions.guard +import com.tangem.common.flatMap import com.tangem.core.analytics.Analytics import com.tangem.tap.common.analytics.events.AnalyticsParam import com.tangem.tap.common.analytics.events.Token.ButtonRemoveToken @@ -20,7 +21,6 @@ import com.tangem.tap.common.redux.navigation.NavigationAction import com.tangem.tap.domain.TapError import com.tangem.tap.domain.extensions.makeWalletManagerForApp import com.tangem.tap.domain.model.UserWallet -import com.tangem.tap.domain.scanCard.ScanCardProcessor import com.tangem.tap.domain.tokens.models.BlockchainNetwork import com.tangem.tap.features.demo.DemoHelper import com.tangem.tap.features.demo.isDemoCard @@ -32,6 +32,7 @@ import com.tangem.tap.features.wallet.redux.models.WalletDialog import com.tangem.tap.features.wallet.redux.reducers.toWallet import com.tangem.tap.scope import com.tangem.tap.store +import com.tangem.tap.tangemSdkManager import com.tangem.tap.userTokensRepository import com.tangem.tap.userWalletsListManager import com.tangem.tap.walletCurrenciesManager @@ -193,24 +194,26 @@ class MultiWalletMiddleware { state: WalletState?, ) = scope.launch(Dispatchers.Default) { dispatchOnMain(WalletAction.MultiWallet.ScheduleCheckForMissingDerivation) - ScanCardProcessor.scan( - analyticsEvent = null, + tangemSdkManager.scanProduct( cardId = selectedUserWallet.cardId, + userTokensRepository = userTokensRepository, additionalBlockchainsToDerive = state?.missingDerivations?.map { it.blockchain }, - ) { scanResponse -> - userWalletsListManager.update( - userWalletId = selectedUserWallet.walletId, - update = { userWallet -> - userWallet.copy( - scanResponse = scanResponse, - ) - }, - ) - .doOnSuccess { updatedUserWallet -> - store.dispatchOnMain(WalletAction.MultiWallet.AddMissingDerivations(emptyList())) - store.state.globalState.tapWalletManager.loadData(updatedUserWallet, refresh = true) - } - } + allowsRequestAccessCodeFromRepository = true, + ) + .flatMap { scanResponse -> + userWalletsListManager.update( + userWalletId = selectedUserWallet.walletId, + update = { userWallet -> + userWallet.copy( + scanResponse = scanResponse, + ) + }, + ) + } + .doOnSuccess { updatedUserWallet -> + store.dispatchOnMain(WalletAction.MultiWallet.AddMissingDerivations(emptyList())) + store.state.globalState.tapWalletManager.loadData(updatedUserWallet, refresh = true) + } } private fun addDummyBalances(walletManagers: List) { 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 7cb9f0b6a6..1acc7600fd 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 @@ -5,6 +5,7 @@ import com.tangem.blockchain.blockchains.polkadot.ExistentialDepositProvider import com.tangem.blockchain.common.AmountType import com.tangem.blockchain.common.Token import com.tangem.blockchain.common.WalletManager +import com.tangem.tap.common.extensions.dispatchOnMain import com.tangem.tap.common.extensions.dispatchToastNotification import com.tangem.tap.common.extensions.getBlockchainTxHistory import com.tangem.tap.common.extensions.getTokenTxHistory @@ -113,14 +114,17 @@ class MultiWalletReducer { val currency = Currency.fromBlockchainNetwork(action.blockchain, action.token) val walletManager = state.getWalletManager(currency) if (walletManager == null) { - if (userWalletsListManager.hasSavedUserWallets) { - store.dispatch(NavigationAction.PopBackTo(screen = AppScreen.Welcome)) + val screen = if (userWalletsListManager.hasSavedUserWallets) { + AppScreen.Welcome } else { - store.dispatch(NavigationAction.PopBackTo(screen = AppScreen.Home)) + AppScreen.Home } + store.dispatchOnMain(NavigationAction.PopBackTo(screen)) + FirebaseCrashlytics.getInstance().recordException( IllegalStateException("MultiWallet.TokenLoaded: walletManager is null"), ) + store.dispatchToastNotification(R.string.internal_error_wallet_manager_not_found) return state }