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 d18b590dfd..3bfef52562 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 @@ -31,7 +31,6 @@ import com.tangem.operations.issuerAndUserData.ReadIssuerDataCommand import com.tangem.tap.domain.TapSdkError import com.tangem.tap.domain.extensions.getPrimaryCurve import com.tangem.tap.domain.extensions.getSingleWallet -import com.tangem.tap.domain.extensions.hasNoWallets import com.tangem.tap.domain.extensions.isMultiwalletAllowed import com.tangem.tap.domain.tokens.UserTokensRepository import com.tangem.tap.domain.tokens.models.BlockchainNetwork @@ -85,7 +84,6 @@ class ScanProductTask( private fun getErrorIfExcludedCard(card: Card): TangemError? { if (card.isExcluded) return TapSdkError.CardForDifferentApp if (card.isNotSupportedInThatRelease) return TapSdkError.CardNotSupportedByRelease - if (card.isSaltPay && card.hasNoWallets()) return TapSdkError.ScanPrimaryCard return null } } diff --git a/app/src/main/java/com/tangem/tap/features/home/redux/HomeMiddleware.kt b/app/src/main/java/com/tangem/tap/features/home/redux/HomeMiddleware.kt index 5fcd71137a..7ecc17b56e 100644 --- a/app/src/main/java/com/tangem/tap/features/home/redux/HomeMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/home/redux/HomeMiddleware.kt @@ -15,6 +15,7 @@ import com.tangem.tap.common.extensions.dispatchDialogShow import com.tangem.tap.common.extensions.dispatchOpenUrl import com.tangem.tap.common.extensions.onCardScanned import com.tangem.tap.common.postUiDelayBg +import com.tangem.tap.common.redux.AppDialog import com.tangem.tap.common.redux.AppState import com.tangem.tap.common.redux.global.GlobalAction import com.tangem.tap.common.redux.navigation.AppScreen @@ -35,6 +36,7 @@ import com.tangem.tap.features.send.redux.states.ButtonState import com.tangem.tap.preferencesStorage import com.tangem.tap.scope import com.tangem.tap.store +import com.tangem.wallet.R import kotlinx.coroutines.delay import kotlinx.coroutines.launch import org.rekotlin.Action @@ -107,42 +109,59 @@ private fun onScanSuccess(scanResponse: ScanResponse) { store.dispatch(TwinCardsAction.IfTwinsPrepareState(scanResponse)) if (scanResponse.isSaltPay()) { - scope.launch { - val result = OnboardingSaltPayHelper.isOnboardingCase(scanResponse) - delay(500) - withMainContext { - when (result) { - is Result.Success -> { - val isOnboardingCase = result.data - if (isOnboardingCase) { - store.dispatch(GlobalAction.Onboarding.Start(scanResponse, canSkipBackup = false)) - val (manager, config) = OnboardingSaltPayState.initDependency(scanResponse) - store.dispatch(OnboardingSaltPayAction.Init.SetDependencies(manager, config)) - store.dispatch(OnboardingSaltPayAction.Update) - // store.dispatch(OnboardingSaltPayAction.Init.DiscardBackupSteps) - navigateTo(AppScreen.OnboardingWallet) - } else { - navigateTo(AppScreen.Wallet) - withIOContext { store.onCardScanned(scanResponse) } - } - } - is Result.Failure -> { - changeButtonState(ButtonState.ENABLED) - when (val error = result.error) { - is SaltPayRegistrationError -> { - val dialog = when (error) { - is SaltPayRegistrationError.NoGas -> SaltPayDialog.NoFundsForActivation - else -> SaltPayDialog.RegistrationError(error) - } - store.dispatchDialogShow(dialog) + if (scanResponse.isSaltPayVisa()) { + scope.launch { + val result = OnboardingSaltPayHelper.isOnboardingCase(scanResponse) + delay(500) + withMainContext { + when (result) { + is Result.Success -> { + val isOnboardingCase = result.data + if (isOnboardingCase) { + store.dispatch(GlobalAction.Onboarding.Start(scanResponse, canSkipBackup = false)) + val (manager, config) = OnboardingSaltPayState.initDependency(scanResponse) + store.dispatch(OnboardingSaltPayAction.Init.SetDependencies(manager, config)) + store.dispatch(OnboardingSaltPayAction.Update) + // store.dispatch(OnboardingSaltPayAction.Init.DiscardBackupSteps) + navigateTo(AppScreen.OnboardingWallet) + } else { + navigateTo(AppScreen.Wallet) + withIOContext { store.onCardScanned(scanResponse) } } - else -> { - store.dispatchDebugErrorNotification(error.localizedMessage ?: "SaltPay: Unknown error") + } + is Result.Failure -> { + changeButtonState(ButtonState.ENABLED) + when (val error = result.error) { + is SaltPayRegistrationError -> { + val dialog = when (error) { + is SaltPayRegistrationError.NoGas -> SaltPayDialog.NoFundsForActivation + else -> SaltPayDialog.RegistrationError(error) + } + store.dispatchDialogShow(dialog) + } + else -> { + store.dispatchDebugErrorNotification( + error.localizedMessage ?: "SaltPay: Unknown error", + ) + } } } } } } + } else { + if (scanResponse.card.backupStatus?.isActive == false) { + changeButtonState(ButtonState.ENABLED) + store.dispatchDialogShow( + AppDialog.SimpleOkDialogRes( + headerId = R.string.saltpay_error_empty_backup_title, + messageId = R.string.saltpay_error_empty_backup_message, + ), + ) + } else { + navigateTo(AppScreen.Wallet, null) + scope.launch { store.onCardScanned(scanResponse) } + } } } else { if (OnboardingHelper.isOnboardingCase(scanResponse)) { diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/redux/OnboardingWalletMiddleware.kt b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/redux/OnboardingWalletMiddleware.kt index 39d354a8b2..301c031459 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/redux/OnboardingWalletMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/redux/OnboardingWalletMiddleware.kt @@ -245,8 +245,8 @@ private fun handleBackupAction(appState: () -> AppState?, action: BackupAction) is BackupAction.AddBackupCard -> { backupService.skipCompatibilityChecks = true tangemSdk.config.filter.cardIdFilter = CardFilter.Companion.CardIdFilter.Allow( - items = SaltPayWorkaround.tangemWalletCardIds.toSet(), - ranges = SaltPayWorkaround.tangemWalletCardIdRanges, + items = SaltPayWorkaround.walletCardIds.toSet(), + ranges = SaltPayWorkaround.walletCardIdRanges, ) backupService.addBackupCard { result -> diff --git a/domain/src/main/java/com/tangem/domain/common/SaltPayWorkaround.kt b/domain/src/main/java/com/tangem/domain/common/SaltPayWorkaround.kt index 839d59bd76..61a9f363b3 100644 --- a/domain/src/main/java/com/tangem/domain/common/SaltPayWorkaround.kt +++ b/domain/src/main/java/com/tangem/domain/common/SaltPayWorkaround.kt @@ -32,7 +32,7 @@ object SaltPayWorkaround { "AE03", ) + attachDebugVisaBatches() - val tangemWalletCardIds = listOf( + val walletCardIds = listOf( "AC01000000033503", "AC01000000033594", "AC01000000033586", @@ -61,16 +61,16 @@ object SaltPayWorkaround { "AC03000000076203", "AC03000000076211", "AC03000000076229", - ) + attachDebugTangemCardIds() + ) + attachDebugWalletCardIds() - val tangemWalletCardIdRanges = listOf( + val walletCardIdRanges = listOf( CardIdRange("AC05000000000003", "AC05000000023997")!!, - ) + attachDebugTangemCardIdRanges() + ) + attachDebugWalletCardIdRanges() fun isVisaBatchId(batchId: String): Boolean = visaBatches.contains(batchId) - fun isTangemWalletCardId(cardId: String): Boolean { - return if (tangemWalletCardIds.contains(cardId)) true else tangemWalletCardIdRanges.contains(cardId) + fun isWalletCardId(cardId: String): Boolean { + return if (walletCardIds.contains(cardId)) true else walletCardIdRanges.contains(cardId) } private fun attachDebugVisaBatches(): List { @@ -79,13 +79,13 @@ object SaltPayWorkaround { ) else listOf() } - private fun attachDebugTangemCardIds(): List { + private fun attachDebugWalletCardIds(): List { return if (BuildConfig.DEBUG) listOf( "FF04000000000232", ) else listOf() } - private fun attachDebugTangemCardIdRanges(): List { + private fun attachDebugWalletCardIdRanges(): List { return if (BuildConfig.DEBUG) listOf( CardIdRange("FF04000000000000", "FF04999999999999")!!, ) else listOf() diff --git a/domain/src/main/java/com/tangem/domain/common/ScanResponse.kt b/domain/src/main/java/com/tangem/domain/common/ScanResponse.kt index 7fa3def1a8..56c6979d5e 100644 --- a/domain/src/main/java/com/tangem/domain/common/ScanResponse.kt +++ b/domain/src/main/java/com/tangem/domain/common/ScanResponse.kt @@ -10,6 +10,8 @@ import com.tangem.common.extensions.toMapKey import com.tangem.common.hdWallet.DerivationPath import com.tangem.domain.common.TapWorkarounds.getTangemNoteBlockchain import com.tangem.domain.common.TapWorkarounds.isSaltPay +import com.tangem.domain.common.TapWorkarounds.isSaltPayVisa +import com.tangem.domain.common.TapWorkarounds.isSaltPayWallet import com.tangem.domain.common.TapWorkarounds.isTangemNote import com.tangem.domain.common.TapWorkarounds.isTangemTwins import com.tangem.domain.common.TapWorkarounds.isTestCard @@ -54,6 +56,8 @@ data class ScanResponse( fun isTangemNote(): Boolean = productType == ProductType.Note fun isTangemWallet(): Boolean = productType == ProductType.Wallet fun isSaltPay(): Boolean = productType == ProductType.SaltPay + fun isSaltPayVisa(): Boolean = card.isSaltPayVisa + fun isSaltPayWallet(): Boolean = card.isSaltPayWallet fun isTangemTwins(): Boolean = productType == ProductType.Twins fun twinsIsTwinned(): Boolean = card.isTangemTwins && walletData != null && secondTwinPublicKey != null fun supportsHdWallet(): Boolean = card.settings.isHDWalletAllowed diff --git a/domain/src/main/java/com/tangem/domain/common/TapWorkarounds.kt b/domain/src/main/java/com/tangem/domain/common/TapWorkarounds.kt index 3ffc1bf352..69ec26308b 100644 --- a/domain/src/main/java/com/tangem/domain/common/TapWorkarounds.kt +++ b/domain/src/main/java/com/tangem/domain/common/TapWorkarounds.kt @@ -65,13 +65,13 @@ object TapWorkarounds { val Card.isSaltPay: Boolean - get() = isSaltPayVisa || isSaltPayTangem + get() = isSaltPayVisa || isSaltPayWallet val Card.isSaltPayVisa: Boolean get() = SaltPayWorkaround.isVisaBatchId(batchId) - val Card.isSaltPayTangem: Boolean - get() = SaltPayWorkaround.isTangemWalletCardId(cardId) + val Card.isSaltPayWallet: Boolean + get() = SaltPayWorkaround.isWalletCardId(cardId) val Card.isExcluded: Boolean