diff --git a/app/src/main/assets/features_dev.json b/app/src/main/assets/features_dev.json index 71561c4c69..82e46b21bf 100644 --- a/app/src/main/assets/features_dev.json +++ b/app/src/main/assets/features_dev.json @@ -2,5 +2,5 @@ "isWalletPayIdEnabled": true, "isSendingToPayIdEnabled": true, "isTopUpEnabled": true, - "isCreatingTwinCardsAllowed": false + "isCreatingTwinCardsAllowed": true } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/domain/TapWalletManager.kt b/app/src/main/java/com/tangem/tap/domain/TapWalletManager.kt index acdc924fd4..a67ec007e0 100644 --- a/app/src/main/java/com/tangem/tap/domain/TapWalletManager.kt +++ b/app/src/main/java/com/tangem/tap/domain/TapWalletManager.kt @@ -98,11 +98,10 @@ class TapWalletManager { store.dispatch(GlobalAction.SaveScanNoteResponse(data)) store.dispatch(WalletAction.MultiWallet.SetIsMultiwalletAllowed(data.card.isMultiwalletAllowed)) if (data.card.isTwinCard()) { - val secondCardId = TwinsHelper.getTwinsCardId(data.card.cardId) val cardNumber = TwinsHelper.getTwinCardNumber(data.card.cardId) - if (secondCardId != null && cardNumber != null) { + if (cardNumber != null) { store.dispatch(WalletAction.TwinsAction.SetTwinCard( - secondCardId, cardNumber, isCreatingTwinCardsAllowed = true + cardNumber, isCreatingTwinCardsAllowed = true )) } } diff --git a/app/src/main/java/com/tangem/tap/domain/twins/CreateSecondTwinWalletTask.kt b/app/src/main/java/com/tangem/tap/domain/twins/CreateSecondTwinWalletTask.kt index c8e936bcce..457d2f26ce 100644 --- a/app/src/main/java/com/tangem/tap/domain/twins/CreateSecondTwinWalletTask.kt +++ b/app/src/main/java/com/tangem/tap/domain/twins/CreateSecondTwinWalletTask.kt @@ -3,6 +3,7 @@ package com.tangem.tap.domain.twins import com.tangem.CardSession import com.tangem.CardSessionRunnable import com.tangem.Message +import com.tangem.TangemSdkError import com.tangem.commands.wallet.CreateWalletResponse import com.tangem.commands.wallet.PurgeWalletCommand import com.tangem.common.CompletionResult @@ -14,13 +15,24 @@ import com.tangem.tasks.CreateWalletTask class CreateSecondTwinWalletTask( private val firstPublicKey: String, + private val firstCardId: String, private val preparingMessage: Message, private val creatingWalletMessage: Message ) : CardSessionRunnable { override val requiresPin2 = true + + override fun run(session: CardSession, callback: (result: CompletionResult) -> Unit) { - if (session.environment.card?.getSingleWallet()?.publicKey != null) { + val card = session.environment.card + + if (card?.getSingleWallet()?.publicKey != null) { + + if (!card.cardId.startsWith(TwinsHelper.getPairCardSeries(firstCardId) ?: "")) { + callback(CompletionResult.Failure(TangemSdkError.WrongCardType())) + return + } + session.setInitialMessage(preparingMessage) PurgeWalletCommand(TangemSdkConstants.getDefaultWalletIndex()).run(session) { response -> when (response) { diff --git a/app/src/main/java/com/tangem/tap/domain/twins/TwinCardsManager.kt b/app/src/main/java/com/tangem/tap/domain/twins/TwinCardsManager.kt index 43d313f8a6..877746f413 100644 --- a/app/src/main/java/com/tangem/tap/domain/twins/TwinCardsManager.kt +++ b/app/src/main/java/com/tangem/tap/domain/twins/TwinCardsManager.kt @@ -14,7 +14,6 @@ import com.tangem.tap.tangemSdkManager class TwinCardsManager(private val scanNoteResponse: ScanNoteResponse) { private val currentCardId: String = scanNoteResponse.card.cardId - private val secondCardId: String? = TwinsHelper.getTwinsCardId(currentCardId) private var currentCardPublicKey: String? = null private var secondCardPublicKey: String? = null @@ -39,9 +38,14 @@ class TwinCardsManager(private val scanNoteResponse: ScanNoteResponse) { preparingMessage: Message, creatingWalletMessage: Message ): SimpleResult { + val task = CreateSecondTwinWalletTask( + firstPublicKey = currentCardPublicKey!!, + firstCardId = currentCardId, + preparingMessage = preparingMessage, + creatingWalletMessage = creatingWalletMessage + ) val response = tangemSdkManager.runTaskAsync( - CreateSecondTwinWalletTask(currentCardPublicKey!!, preparingMessage, creatingWalletMessage), - secondCardId, initialMessage + task, null, initialMessage ) when (response) { is CompletionResult.Success -> { diff --git a/app/src/main/java/com/tangem/tap/domain/twins/TwinsHelper.kt b/app/src/main/java/com/tangem/tap/domain/twins/TwinsHelper.kt index c534afbec6..68a70fe179 100644 --- a/app/src/main/java/com/tangem/tap/domain/twins/TwinsHelper.kt +++ b/app/src/main/java/com/tangem/tap/domain/twins/TwinsHelper.kt @@ -24,6 +24,19 @@ class TwinsHelper { } } + fun getPairCardSeries(cardId: String): String? { + return when (getTwinCardNumber(cardId) ?: return null) { + TwinCardNumber.First -> { + val index = firstCardSeries.indexOf(cardId.take(4)) + secondCardSeries[index] + } + TwinCardNumber.Second -> { + val index = secondCardSeries.indexOf(cardId.take(4)) + firstCardSeries[index] + } + } + } + fun getTwinsCardId(cardId: String): String? { val cardIdWithNewSeries = when (getTwinCardNumber(cardId) ?: return null) { TwinCardNumber.First -> { diff --git a/app/src/main/java/com/tangem/tap/features/wallet/redux/WalletAction.kt b/app/src/main/java/com/tangem/tap/features/wallet/redux/WalletAction.kt index ebfadb5df3..4bd89c024b 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/redux/WalletAction.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/redux/WalletAction.kt @@ -6,7 +6,6 @@ import com.tangem.blockchain.common.address.AddressType import com.tangem.commands.common.card.Card import com.tangem.tap.common.redux.ErrorAction import com.tangem.tap.common.redux.NotificationAction -import com.tangem.tap.common.redux.global.CryptoCurrencyName import com.tangem.tap.domain.TapError import com.tangem.tap.domain.configurable.warningMessage.WarningMessage import com.tangem.tap.domain.tokens.CardCurrencies @@ -132,7 +131,7 @@ sealed class WalletAction : Action { object ShowOnboarding : TwinsAction() object SetOnboardingShown : TwinsAction() data class SetTwinCard( - val secondCardId: String, val number: TwinCardNumber, + val number: TwinCardNumber, val isCreatingTwinCardsAllowed: Boolean, ) : TwinsAction() } diff --git a/app/src/main/java/com/tangem/tap/features/wallet/redux/WalletState.kt b/app/src/main/java/com/tangem/tap/features/wallet/redux/WalletState.kt index 35b301fd50..5cfe80591f 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/redux/WalletState.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/redux/WalletState.kt @@ -196,7 +196,6 @@ data class TopUpState( ) data class TwinCardsState( - val secondCardId: String?, val cardNumber: TwinCardNumber?, val showTwinOnboarding: Boolean, val isCreatingTwinCardsAllowed: Boolean diff --git a/app/src/main/java/com/tangem/tap/features/wallet/redux/reducers/TwinsReducer.kt b/app/src/main/java/com/tangem/tap/features/wallet/redux/reducers/TwinsReducer.kt index 79025ca6cc..ad83caca20 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/redux/reducers/TwinsReducer.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/redux/reducers/TwinsReducer.kt @@ -10,7 +10,6 @@ class TwinsReducer { is WalletAction.TwinsAction.SetTwinCard -> { state.copy( twinCardsState = TwinCardsState( - secondCardId = action.secondCardId, cardNumber = action.number, showTwinOnboarding = state.twinCardsState?.showTwinOnboarding ?: false, @@ -21,7 +20,7 @@ class TwinsReducer { is WalletAction.TwinsAction.ShowOnboarding -> { state.copy( twinCardsState = state.twinCardsState?.copy(showTwinOnboarding = true) - ?: TwinCardsState(null, null, + ?: TwinCardsState(cardNumber = null, showTwinOnboarding = true, isCreatingTwinCardsAllowed = false) ) diff --git a/app/src/main/java/com/tangem/tap/features/wallet/ui/dialogs/TwinsOnboardingFragment.kt b/app/src/main/java/com/tangem/tap/features/wallet/ui/dialogs/TwinsOnboardingFragment.kt index a20b06aa72..1daec73f5b 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/ui/dialogs/TwinsOnboardingFragment.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/ui/dialogs/TwinsOnboardingFragment.kt @@ -8,7 +8,6 @@ import androidx.transition.TransitionInflater import com.squareup.picasso.Picasso import com.tangem.tap.common.redux.navigation.AppScreen import com.tangem.tap.common.redux.navigation.NavigationAction -import com.tangem.tap.domain.twins.TwinsHelper import com.tangem.tap.features.wallet.redux.Artwork import com.tangem.tap.features.wallet.redux.WalletAction import com.tangem.tap.store @@ -34,10 +33,9 @@ class TwinsOnboardingFragment : Fragment(R.layout.fragment_twin_cards) { super.onViewCreated(view, savedInstanceState) store.dispatch(WalletAction.TwinsAction.SetOnboardingShown) - - val secondCardId = store.state.walletState.twinCardsState?.secondCardId ?: "" - val secondTwinCardId = TwinsHelper.getTwinCardIdForUser(secondCardId) - val text = getString(R.string.twins_onboarding_description_format, secondTwinCardId) + val secondTwinNumber = + store.state.walletState.twinCardsState?.cardNumber?.pairNumber()?.number ?: "" + val text = getString(R.string.twins_onboarding_description_format, secondTwinNumber) tv_twin_cards_description_1.text = text setOnClickListeners()