From 29d94db06da12c1bf618b323c792bb852e2bc4f1 Mon Sep 17 00:00:00 2001 From: Tangem Date: Mon, 30 Jan 2023 12:56:19 +0300 Subject: [PATCH] Updated on 2026-08-14 --- .../com/tangem/tap/common/DialogManager.kt | 2 ++ .../tap/domain/scanCard/ScanCardProcessor.kt | 31 +++++++------------ .../wallet/saltPay/SaltPayExceptionHandler.kt | 5 ++- .../saltPay/dialog/PutVisaCardDialog.kt | 27 ++++++++++++++++ .../wallet/saltPay/dialog/SaltPayDialog.kt | 1 + .../saltPay/message/SaltPayModuleMessage.kt | 2 ++ .../redux/WalletSelectorMiddleware.kt | 11 ++++++- .../welcome/redux/WelcomeMiddleware.kt | 11 ++++++- 8 files changed, 65 insertions(+), 25 deletions(-) create mode 100644 app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/dialog/PutVisaCardDialog.kt diff --git a/app/src/main/java/com/tangem/tap/common/DialogManager.kt b/app/src/main/java/com/tangem/tap/common/DialogManager.kt index 94dd3ff6c1..f36d0656e8 100644 --- a/app/src/main/java/com/tangem/tap/common/DialogManager.kt +++ b/app/src/main/java/com/tangem/tap/common/DialogManager.kt @@ -20,6 +20,7 @@ import com.tangem.tap.features.onboarding.products.wallet.redux.BackupDialog import com.tangem.tap.features.onboarding.products.wallet.redux.OnboardingDialog import com.tangem.tap.features.onboarding.products.wallet.saltPay.dialog.InterruptOnboardingDialog import com.tangem.tap.features.onboarding.products.wallet.saltPay.dialog.NoFundsForActivationDialog +import com.tangem.tap.features.onboarding.products.wallet.saltPay.dialog.PutVisaCardDialog import com.tangem.tap.features.onboarding.products.wallet.saltPay.dialog.RegistrationErrorDialog import com.tangem.tap.features.onboarding.products.wallet.saltPay.dialog.SaltPayDialog import com.tangem.tap.features.onboarding.products.wallet.ui.dialogs.AddMoreBackupCardsDialog @@ -131,6 +132,7 @@ class DialogManager : StoreSubscriber { is BackupDialog.UnfinishedBackupFound -> UnfinishedBackupFoundDialog.create(context) is BackupDialog.ConfirmDiscardingBackup -> ConfirmDiscardingBackupDialog.create(context) is SaltPayDialog.Activation.NoGas -> NoFundsForActivationDialog.create(context) + is SaltPayDialog.Activation.PutVisaCard -> PutVisaCardDialog.create(context) is SaltPayDialog.Activation.OnError -> RegistrationErrorDialog.create(context, state.dialog) is WalletDialog.CurrencySelectionDialog -> CurrencySelectionDialog.create(state.dialog, context) is WalletDialog.ChooseTradeActionDialog -> ChooseTradeActionBottomSheetDialog(context) 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 4dc0722d61..452a7a57ff 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 @@ -14,10 +14,8 @@ import com.tangem.operations.backup.BackupService import com.tangem.tap.DELAY_SDK_DIALOG_CLOSE import com.tangem.tap.backupService import com.tangem.tap.common.analytics.paramsInterceptor.BatchIdParamsInterceptor -import com.tangem.tap.common.extensions.dispatchDialogShow import com.tangem.tap.common.extensions.dispatchOnMain import com.tangem.tap.common.extensions.primaryCardIsSaltPayVisa -import com.tangem.tap.common.redux.AppDialog import com.tangem.tap.common.redux.global.GlobalAction import com.tangem.tap.common.redux.navigation.AppScreen import com.tangem.tap.common.redux.navigation.NavigationAction @@ -30,6 +28,7 @@ import com.tangem.tap.features.onboarding.OnboardingSaltPayHelper import com.tangem.tap.features.onboarding.products.twins.redux.TwinCardsAction import com.tangem.tap.features.onboarding.products.twins.redux.TwinCardsStep import com.tangem.tap.features.onboarding.products.wallet.saltPay.SaltPayExceptionHandler +import com.tangem.tap.features.onboarding.products.wallet.saltPay.message.SaltPayActivationError import com.tangem.tap.features.onboarding.products.wallet.saltPay.redux.OnboardingSaltPayAction import com.tangem.tap.features.onboarding.products.wallet.saltPay.redux.OnboardingSaltPayState import com.tangem.tap.preferencesStorage @@ -37,7 +36,6 @@ import com.tangem.tap.scope import com.tangem.tap.store import com.tangem.tap.tangemSdkManager import com.tangem.tap.userTokensRepository -import com.tangem.wallet.R import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.delay import kotlinx.coroutines.launch @@ -82,7 +80,7 @@ object ScanCardProcessor { checkForUnfinishedBackupForSaltPay( backupService = backupService, scanResponse = scanResponse, - onProgressStateChange = { onProgressStateChange(it) }, + onFailure = onFailure, nextHandler = { scanResponse1 -> showDisclaimerIfNeed( scanResponse = scanResponse1, @@ -116,11 +114,11 @@ object ScanCardProcessor { * see BackupAction.CheckForUnfinishedBackup * If user touches card other than Visa SaltPay - show dialog and block next processing */ - private inline fun checkForUnfinishedBackupForSaltPay( + private suspend inline fun checkForUnfinishedBackupForSaltPay( backupService: BackupService, scanResponse: ScanResponse, - onProgressStateChange: (showProgress: Boolean) -> Unit, nextHandler: (ScanResponse) -> Unit, + onFailure: suspend (error: TangemError) -> Unit, ) { if (!backupService.hasIncompletedBackup || !backupService.primaryCardIsSaltPayVisa()) { nextHandler(scanResponse) @@ -132,8 +130,9 @@ object ScanCardProcessor { ?: false if (scanResponse.isSaltPayWallet() || !isTheSamePrimaryCard) { - onProgressStateChange(false) - showSaltPayTapVisaLogoCardDialog() + val error = SaltPayActivationError.PutVisaCard + SaltPayExceptionHandler.handle(error) + onFailure(TangemSdkError.ExceptionError(error)) } else { nextHandler(scanResponse) } @@ -207,8 +206,8 @@ object ScanCardProcessor { } } is Result.Failure -> { - SaltPayExceptionHandler.handle(result.error) delay(DELAY_SDK_DIALOG_CLOSE) + SaltPayExceptionHandler.handle(result.error) onFailure(TangemSdkError.ExceptionError(result.error)) } } @@ -216,8 +215,9 @@ object ScanCardProcessor { } else { delay(DELAY_SDK_DIALOG_CLOSE) if (scanResponse.card.backupStatus?.isActive == false) { - showSaltPayTapVisaLogoCardDialog() - onProgressStateChange(false) + val error = SaltPayActivationError.PutVisaCard + SaltPayExceptionHandler.handle(error) + onFailure(TangemSdkError.ExceptionError(error)) } else { onSuccess(scanResponse) } @@ -241,15 +241,6 @@ object ScanCardProcessor { } } - private fun showSaltPayTapVisaLogoCardDialog() { - store.dispatchDialogShow( - AppDialog.SimpleOkDialogRes( - headerId = R.string.saltpay_error_empty_backup_title, - messageId = R.string.saltpay_error_empty_backup_message, - ), - ) - } - private suspend inline fun navigateTo( screen: AppScreen, onProgressStateChange: (showProgress: Boolean) -> Unit, diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/SaltPayExceptionHandler.kt b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/SaltPayExceptionHandler.kt index 3b4ed41a05..0f0b207431 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/SaltPayExceptionHandler.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/SaltPayExceptionHandler.kt @@ -18,6 +18,7 @@ class SaltPayExceptionHandler { is SaltPayActivationError -> { val dialog = when (throwable) { is SaltPayActivationError.NoGas -> SaltPayDialog.Activation.NoGas + is SaltPayActivationError.PutVisaCard -> SaltPayDialog.Activation.PutVisaCard else -> SaltPayDialog.Activation.OnError(throwable) } store.dispatchDialogShow(dialog) @@ -28,9 +29,7 @@ class SaltPayExceptionHandler { val message = (throwable).customMessage store.dispatchDialogShow(AppDialog.SimpleOkErrorDialog(message)) } - else -> { - // do nothing - } + else -> Unit } } is BlockchainSdkError -> { diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/dialog/PutVisaCardDialog.kt b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/dialog/PutVisaCardDialog.kt new file mode 100644 index 0000000000..ba689a1449 --- /dev/null +++ b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/dialog/PutVisaCardDialog.kt @@ -0,0 +1,27 @@ +package com.tangem.tap.features.onboarding.products.wallet.saltPay.dialog + +import android.app.Dialog +import android.content.Context +import androidx.appcompat.app.AlertDialog +import com.tangem.tap.common.redux.global.GlobalAction +import com.tangem.tap.store +import com.tangem.wallet.R + +/** +[REDACTED_AUTHOR] + */ +class PutVisaCardDialog { + companion object { + fun create(context: Context): Dialog { + return AlertDialog.Builder(context).apply { + setTitle(R.string.saltpay_error_empty_backup_title) + setMessage(R.string.saltpay_error_empty_backup_message) + setPositiveButton(R.string.common_ok) { _, _ -> } + setOnDismissListener { + store.dispatch(GlobalAction.HideDialog) + } + setCancelable(false) + }.create() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/dialog/SaltPayDialog.kt b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/dialog/SaltPayDialog.kt index b8b512aef1..26228ba27f 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/dialog/SaltPayDialog.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/dialog/SaltPayDialog.kt @@ -9,6 +9,7 @@ import com.tangem.tap.features.onboarding.products.wallet.saltPay.message.SaltPa sealed class SaltPayDialog : StateDialog { sealed class Activation : SaltPayDialog() { object NoGas : SaltPayDialog() + object PutVisaCard : SaltPayDialog() data class OnError(val error: SaltPayActivationError) : SaltPayDialog() } } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/message/SaltPayModuleMessage.kt b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/message/SaltPayModuleMessage.kt index 6f2a5de7ad..6097e52cc2 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/message/SaltPayModuleMessage.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/message/SaltPayModuleMessage.kt @@ -50,6 +50,8 @@ sealed class SaltPayActivationError( object ClaimTransactionFailed : SaltPayActivationError(16) object NotClaimed : SaltPayActivationError(17) + object PutVisaCard : SaltPayActivationError(18) + companion object { const val EMPTY_MESSAGE = "" } 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 9d690e7df7..aa4f559888 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 @@ -21,6 +21,7 @@ import com.tangem.tap.domain.model.UserWallet import com.tangem.tap.domain.model.WalletStoreModel import com.tangem.tap.domain.model.builders.UserWalletBuilder import com.tangem.tap.domain.scanCard.ScanCardProcessor +import com.tangem.tap.features.onboarding.products.wallet.saltPay.message.SaltPayActivationError import com.tangem.tap.preferencesStorage import com.tangem.tap.scope import com.tangem.tap.store @@ -155,7 +156,15 @@ internal class WalletSelectorMiddleware { onFailure = { error -> // Rollback policy if card scanning was failed tangemSdkManager.setAccessCodeRequestPolicy(prevUseBiometricsForAccessCode) - store.dispatchOnMain(WalletSelectorAction.AddWallet.Error(error)) + when { + error is TangemSdkError.ExceptionError && error.cause is SaltPayActivationError -> { + store.dispatchOnMain(WalletSelectorAction.AddWallet.Success) + store.dispatchOnMain(NavigationAction.PopBackTo()) + } + else -> { + store.dispatchOnMain(WalletSelectorAction.AddWallet.Error(error)) + } + } }, ) } 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 c1cdf0f74e..4c39b5cb3c 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 @@ -1,6 +1,7 @@ package com.tangem.tap.features.welcome.redux import android.content.Intent +import com.tangem.common.core.TangemSdkError import com.tangem.common.doOnFailure import com.tangem.common.doOnSuccess import com.tangem.domain.common.ScanResponse @@ -12,6 +13,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.features.onboarding.products.wallet.saltPay.message.SaltPayActivationError import com.tangem.tap.intentHandler import com.tangem.tap.preferencesStorage import com.tangem.tap.scope @@ -104,7 +106,14 @@ internal class WelcomeMiddleware { scope.launch { onCardScanned(scanResponse) } }, onFailure = { - store.dispatchOnMain(WelcomeAction.ProceedWithCard.Error(it)) + when { + it is TangemSdkError.ExceptionError && it.cause is SaltPayActivationError -> { + store.dispatchOnMain(WelcomeAction.ProceedWithCard.Success) + } + else -> { + store.dispatchOnMain(WelcomeAction.ProceedWithCard.Error(it)) + } + } }, onWalletNotCreated = { store.dispatchOnMain(WelcomeAction.ProceedWithCard.Success)