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 452a7a57ff..6caafef969 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 @@ -196,9 +196,9 @@ object ScanCardProcessor { val isOnboardingCase = result.data if (isOnboardingCase) { onWalletNotCreated() - store.dispatchOnMain(GlobalAction.Onboarding.Start(scanResponse, canSkipBackup = false)) - store.dispatchOnMain(OnboardingSaltPayAction.SetDependencies(manager, config)) - store.dispatchOnMain(OnboardingSaltPayAction.Update) + store.dispatch(GlobalAction.Onboarding.Start(scanResponse, canSkipBackup = false)) + store.dispatch(OnboardingSaltPayAction.SetDependencies(manager, config)) + store.dispatch(OnboardingSaltPayAction.Update) navigateTo(AppScreen.OnboardingWallet) { onProgressStateChange(it) } } else { delay(DELAY_SDK_DIALOG_CLOSE) diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/GnosisRegistrator.kt b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/GnosisRegistrator.kt index 42c54a9395..93d229380f 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/GnosisRegistrator.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/GnosisRegistrator.kt @@ -21,6 +21,7 @@ import com.tangem.tap.domain.getFirstToken import kotlinx.coroutines.async import kotlinx.coroutines.awaitAll import kotlinx.coroutines.coroutineScope +import timber.log.Timber import java.math.BigDecimal import java.math.BigInteger import java.util.concurrent.atomic.AtomicLong @@ -149,6 +150,12 @@ class GnosisRegistrator( } suspend fun transferFrom(amountToClaim: BigDecimal, signer: TransactionSigner): Result { + Timber.e(Throwable("transferFrom")) + if (walletManager.txCount == -1L) { + walletManager.safeUpdate().successOr { + return Result.Failure(BlockchainSdkError.WrappedThrowable(it.error)) + } + } val amount = Amount(token, amountToClaim) val feeAmount = walletManager.getFeeToTransferFrom(amount, addressTreasureSafe) .extractFeeAmount().successOr { return it } diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/SaltPayActivationManager.kt b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/SaltPayActivationManager.kt index 187425c2af..57ebce4491 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/SaltPayActivationManager.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/SaltPayActivationManager.kt @@ -7,6 +7,7 @@ import com.tangem.blockchain.common.AmountType import com.tangem.blockchain.common.BlockchainSdkError import com.tangem.blockchain.common.TransactionSigner import com.tangem.blockchain.extensions.successOr +import com.tangem.common.core.TangemSdkError import com.tangem.common.extensions.guard import com.tangem.common.extensions.isZero import com.tangem.common.services.Result @@ -31,11 +32,12 @@ import java.math.BigDecimal class SaltPayActivationManager( val cardId: String, val cardPublicKey: ByteArray, - val walletPublicKey: ByteArray, private val kycProvider: KYCProvider, private val paymentologyService: PaymentologyApiService, private val gnosisRegistrator: GnosisRegistrator, ) { + + val walletPublicKey = gnosisRegistrator.walletManager.wallet.publicKey.seedKey val kycUrlProvider = KYCUrlProvider(walletPublicKey, kycProvider) private val approvalValue: BigDecimal = BigDecimal(2).pow(256).minus(BigDecimal.ONE) @@ -124,7 +126,13 @@ class SaltPayActivationManager( suspend fun claim(amountToClaim: BigDecimal, signer: TransactionSigner): Result { gnosisRegistrator.transferFrom(amountToClaim, signer).successOr { - return Result.Failure(SaltPayActivationError.ClaimTransactionFailed) + val userCancelledError = (it.error as? BlockchainSdkError.WrappedTangemError) + ?.tangemError as? TangemSdkError.UserCancelled + + return when (userCancelledError) { + null -> Result.Failure(SaltPayActivationError.ClaimTransactionFailed) + else -> Result.Failure(userCancelledError) + } } return Result.Success(Unit) } @@ -167,7 +175,6 @@ class SaltPayActivationManager( gnosisRegistrator = GnosisRegistrator.stub(), cardId = "", cardPublicKey = byteArrayOf(), - walletPublicKey = byteArrayOf(), ) } } diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/redux/OnboardingSaltPayMiddleware.kt b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/redux/OnboardingSaltPayMiddleware.kt index b7bcb4761b..dfdfb619b5 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/redux/OnboardingSaltPayMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/redux/OnboardingSaltPayMiddleware.kt @@ -4,6 +4,7 @@ import com.tangem.Message import com.tangem.blockchain.common.Amount import com.tangem.blockchain.extensions.successOr import com.tangem.common.Filter +import com.tangem.common.core.TangemSdkError import com.tangem.common.extensions.guard import com.tangem.common.services.Result import com.tangem.core.analytics.Analytics @@ -200,7 +201,11 @@ private fun handleOnboardingSaltPayAction(anyAction: Action, appState: () -> App } state.saltPayManager.claim(amountToClaim.value!!, signer).successOr { dispatchOnMain(OnboardingSaltPayAction.SetStep(SaltPayActivationStep.Claim)) - onException(it.error) + if (it.error is TangemSdkError.UserCancelled) { + handleInProgress = false + } else { + onException(it.error) + } return@launch } @@ -279,6 +284,7 @@ suspend fun SaltPayActivationManager.update( val registrationResponse = checkRegistration().successOr { return it } val amountToClaim = getAmountToClaimIfNeeded(this, currentAmountToClaim) + dispatchOnMain(OnboardingSaltPayAction.SetAmountToClaim(amountToClaim)) val newStep = try { determineStep(currentStep, amountToClaim, registrationResponse) diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/redux/OnboardingSaltPayState.kt b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/redux/OnboardingSaltPayState.kt index e1317622a4..a14ad10252 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/redux/OnboardingSaltPayState.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/redux/OnboardingSaltPayState.kt @@ -69,14 +69,10 @@ data class OnboardingSaltPayState( if (!scanResponse.isSaltPay()) { throw IllegalArgumentException("Can't initialize the OnboardingSaltPayMiddleware if card is not SalPay") } - val saltPaySingleWallet = scanResponse.card.wallets.firstOrNull().guard { - throw NullPointerException("SaltPay card must have one wallet at least") - } return SaltPayActivationManager( cardId = scanResponse.card.cardId, cardPublicKey = scanResponse.card.cardPublicKey, - walletPublicKey = saltPaySingleWallet.publicKey, kycProvider = kycProvider, paymentologyService = paymentologyService, gnosisRegistrator = gnosisRegistrator, diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/ui/OnboardingSaltPayView.kt b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/ui/OnboardingSaltPayView.kt index 569e87ee0f..84e012cad9 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/ui/OnboardingSaltPayView.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/ui/OnboardingSaltPayView.kt @@ -99,7 +99,7 @@ internal class OnboardingSaltPayView( } else { walletFragment.loadImageIntoImageView(state.onboardingSaltPayState.saltPayCardArtworkUrl, imvFrontCard) } - imvFirstBackupCard.load(R.drawable.card_placeholder_wallet) + imvFirstBackupCard.load(R.drawable.img_salt_pay_visa) // if (state.onboardingSaltPayState?.saltPayCardArtworkUrl == null) { // //if saltPay url not loaded -> load from resource diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/ui/OnboardingWalletFragment.kt b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/ui/OnboardingWalletFragment.kt index 04fc588577..2dfed0997d 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/ui/OnboardingWalletFragment.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/ui/OnboardingWalletFragment.kt @@ -98,7 +98,7 @@ class OnboardingWalletFragment : BaseFragment(R.layout.fragment_onboarding_walle cardsWidget.toFolded(false) if (viewBackupCount > backupCardsCounts) { - flCardsContainer.removeViewAt(viewBackupCount - 1) + flCardsContainer.removeViews(0, viewBackupCount - backupCardsCounts) } else { flCardsContainer.inflate(R.layout.view_onboarding_card, true) } @@ -108,7 +108,12 @@ class OnboardingWalletFragment : BaseFragment(R.layout.fragment_onboarding_walle } private fun createLeapfrogWidget(container: FrameLayout, deviceScaleFactor: Float): LeapfrogWidget { - val leapfrogCalculator = PropertyCalculator(yTranslationFactor = 25f * deviceScaleFactor) + val leapfrogCalculator = PropertyCalculator( + yTranslationFactor = when (container.childCount) { + 3 -> 25f + else -> 35f + } * deviceScaleFactor, + ) return LeapfrogWidget(container, leapfrogCalculator) } diff --git a/core/res/src/main/res/values-de/strings.xml b/core/res/src/main/res/values-de/strings.xml index 8eff587ac8..b51d54d8e1 100644 --- a/core/res/src/main/res/values-de/strings.xml +++ b/core/res/src/main/res/values-de/strings.xml @@ -151,7 +151,7 @@ Set PIN code for your SaltPay card Chat with support Please hold the card until the operation complete - To start the backup process you have to add Tangem card as your backup + To start the backup process you have to add the Tangem card as your backup No backup card Backup card ready Finalize the backup process by creating an access code @@ -351,7 +351,7 @@ Your card is activated and ready to be used Balance Send only %s (%s) from %s network to this address. Using other tokens and networks may result in loss of funds. - If the process of creating the wallet gets interrupted in any way, you\'ll have to start over. + If the process of creating the wallet gets interrupted in any way, you\'ll have to start over The twinning process is partly complete. You can\'t exit it now. OK, ich hab\'s! Getting started @@ -376,10 +376,10 @@ Protect Personalize Restore - You have to set up a single access code to protect all your wallets. - You can set an individual access code on each card later. - The access code can be restored with a linked card, don\'t keep all cards in one place. - Choose any word, phrase, or number you want as your access code. + You have to set up a single access code to protect all your wallets + You can set up an individual access code on each card later + The access code can be restored with a linked card, don\'t keep all cards in one place + Choose any word, phrase, or number you want as your access code Access code must be at least 4 characters long Entered access code didn\'t match the initial access code Create diff --git a/core/res/src/main/res/values-fr/strings.xml b/core/res/src/main/res/values-fr/strings.xml index f3004f001d..d9ecb258a9 100644 --- a/core/res/src/main/res/values-fr/strings.xml +++ b/core/res/src/main/res/values-fr/strings.xml @@ -151,7 +151,7 @@ Set PIN code for your SaltPay card Chat with support Please hold the card until the operation complete - To start the backup process you have to add Tangem card as your backup + To start the backup process you have to add the Tangem card as your backup No backup card Backup card ready Finalize the backup process by creating an access code @@ -351,7 +351,7 @@ Your card is activated and ready to be used Balance Send only %s (%s) from %s network to this address. Using other tokens and networks may result in loss of funds. - If the process of creating the wallet gets interrupted in any way, you\'ll have to start over. + If the process of creating the wallet gets interrupted in any way, you\'ll have to start over The twinning process is partly complete. You can\'t exit it now. Ok, je l\'ai! Getting started @@ -376,10 +376,10 @@ Protect Personalize Restore - You have to set up a single access code to protect all your wallets. - You can set an individual access code on each card later. - The access code can be restored with a linked card, don\'t keep all cards in one place. - Choose any word, phrase, or number you want as your access code. + You have to set up a single access code to protect all your wallets + You can set up an individual access code on each card later + The access code can be restored with a linked card, don\'t keep all cards in one place + Choose any word, phrase, or number you want as your access code Access code must be at least 4 characters long Entered access code didn\'t match the initial access code Create diff --git a/core/res/src/main/res/values-it/strings.xml b/core/res/src/main/res/values-it/strings.xml index d3906dabb8..24a93ecc47 100644 --- a/core/res/src/main/res/values-it/strings.xml +++ b/core/res/src/main/res/values-it/strings.xml @@ -151,7 +151,7 @@ Set PIN code for your SaltPay card Chat with support Please hold the card until the operation complete - To start the backup process you have to add Tangem card as your backup + To start the backup process you have to add the Tangem card as your backup No backup card Backup card ready Finalize the backup process by creating an access code @@ -351,7 +351,7 @@ Your card is activated and ready to be used Balance Send only %s (%s) from %s network to this address. Using other tokens and networks may result in loss of funds. - If the process of creating the wallet gets interrupted in any way, you\'ll have to start over. + If the process of creating the wallet gets interrupted in any way, you\'ll have to start over The twinning process is partly complete. You can\'t exit it now. Ok, ho capito! Getting started @@ -376,10 +376,10 @@ Protect Personalize Restore - You have to set up a single access code to protect all your wallets. - You can set an individual access code on each card later. - The access code can be restored with a linked card, don\'t keep all cards in one place. - Choose any word, phrase, or number you want as your access code. + You have to set up a single access code to protect all your wallets + You can set up an individual access code on each card later + The access code can be restored with a linked card, don\'t keep all cards in one place + Choose any word, phrase, or number you want as your access code Access code must be at least 4 characters long Entered access code didn\'t match the initial access code Create diff --git a/core/res/src/main/res/values-ru/strings.xml b/core/res/src/main/res/values-ru/strings.xml index 3ecb8d910d..9e35a8bbff 100644 --- a/core/res/src/main/res/values-ru/strings.xml +++ b/core/res/src/main/res/values-ru/strings.xml @@ -351,7 +351,7 @@ Ваша карта активирована и готова к использованию Баланс Отправляйте только %s (%s) в сети %s на этот адрес. Использование другой сети может привести к утрате средств. - Если процесc создания кошелька каким-либо образом прервется, вам придется начинать сначала. + Если процесc создания кошелька каким-либо образом прервется, вам придется начинать сначала Процесс связывания карт частично завершен. Вы не можете выйти из него сейчас. Понятно! Подготовка @@ -376,10 +376,10 @@ Защита Персонализация Восстановление - Вам необходимо установить единый код доступа для защиты всех ваших карт. - Позже вы сможете установить индивидуальный код доступа для каждой карты. - Код доступа можно восстановить с помощью привязанной карты. Не храните все карты в одном месте. - Выберите любое слово, фразу или число в качестве кода доступа. + Вам необходимо установить единый код доступа для защиты всех ваших карт + Позже вы сможете установить индивидуальный код доступа для каждой карты + Код доступа можно восстановить с помощью привязанной карты. Не храните все карты в одном месте + Выберите любое слово, фразу или число в качестве кода доступа Код доступа должен состоять не менее чем из 4 символов. Введенные коды доступа не совпадают Создать diff --git a/core/res/src/main/res/values/strings.xml b/core/res/src/main/res/values/strings.xml index 091568c2f0..a178187b22 100644 --- a/core/res/src/main/res/values/strings.xml +++ b/core/res/src/main/res/values/strings.xml @@ -151,7 +151,7 @@ Set PIN code for your SaltPay card Chat with support Please hold the card until the operation complete - To start the backup process you have to add Tangem card as your backup + To start the backup process you have to add the Tangem card as your backup No backup card Backup card ready Finalize the backup process by creating an access code @@ -351,7 +351,7 @@ Your card is activated and ready to be used Balance Send only %s (%s) from %s network to this address. Using other tokens and networks may result in loss of funds. - If the process of creating the wallet gets interrupted in any way, you\'ll have to start over. + If the process of creating the wallet gets interrupted in any way, you\'ll have to start over The twinning process is partly complete. You can\'t exit it now. Ok, Got it! Getting started @@ -376,10 +376,10 @@ Protect Personalize Restore - You have to set up a single access code to protect all your wallets. - You can set an individual access code on each card later. - The access code can be restored with a linked card, don\'t keep all cards in one place. - Choose any word, phrase, or number you want as your access code. + You have to set up a single access code to protect all your wallets + You can set up an individual access code on each card later + The access code can be restored with a linked card, don\'t keep all cards in one place + Choose any word, phrase, or number you want as your access code Access code must be at least 4 characters long Entered access code didn\'t match the initial access code Create