Updated on 2026-08-14

This commit is contained in:
Tangem 2022-10-18 02:05:00 +05:00
parent 5a8292a92a
commit 58f34c4a2e
6 changed files with 66 additions and 45 deletions

View file

@ -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
}
}

View file

@ -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)) {

View file

@ -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 ->

View file

@ -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<String> {
@ -79,13 +79,13 @@ object SaltPayWorkaround {
) else listOf()
}
private fun attachDebugTangemCardIds(): List<String> {
private fun attachDebugWalletCardIds(): List<String> {
return if (BuildConfig.DEBUG) listOf(
"FF04000000000232",
) else listOf()
}
private fun attachDebugTangemCardIdRanges(): List<CardIdRange> {
private fun attachDebugWalletCardIdRanges(): List<CardIdRange> {
return if (BuildConfig.DEBUG) listOf(
CardIdRange("FF04000000000000", "FF04999999999999")!!,
) else listOf()

View file

@ -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

View file

@ -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