diff --git a/app/src/main/assets/tangem-app-config b/app/src/main/assets/tangem-app-config index 0cf3af21e6..e80938f7d9 160000 --- a/app/src/main/assets/tangem-app-config +++ b/app/src/main/assets/tangem-app-config @@ -1 +1 @@ -Subproject commit 0cf3af21e6f441e6323a1ba127ee7518168797df +Subproject commit e80938f7d9ba378a91ac544a9170597e64afa696 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 466e463f19..f40128eb85 100644 --- a/app/src/main/java/com/tangem/tap/domain/TapWalletManager.kt +++ b/app/src/main/java/com/tangem/tap/domain/TapWalletManager.kt @@ -99,11 +99,10 @@ class TapWalletManager { store.dispatch(WalletAction.SetIfTestnetCard(data.card.isTestCard)) 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/tasks/ScanNoteTask.kt b/app/src/main/java/com/tangem/tap/domain/tasks/ScanNoteTask.kt index ca90ead2c5..784a2bc667 100644 --- a/app/src/main/java/com/tangem/tap/domain/tasks/ScanNoteTask.kt +++ b/app/src/main/java/com/tangem/tap/domain/tasks/ScanNoteTask.kt @@ -20,6 +20,7 @@ import com.tangem.tap.domain.TapSdkError import com.tangem.tap.domain.TapWorkarounds.isExcluded import com.tangem.tap.domain.TapWorkarounds.isMultiCurrencyWallet import com.tangem.tap.domain.TapWorkarounds.noteCurrency +import com.tangem.tap.domain.TapWorkarounds.isNote import com.tangem.tap.domain.extensions.getSingleWallet import com.tangem.tap.domain.twins.TwinCardsManager import com.tangem.tap.domain.twins.isTwinCard @@ -31,7 +32,6 @@ data class ScanNoteResponse( val walletData: WalletData?, val secondTwinPublicKey: String? = null, ) : CommandResponse { - fun getBlockchain(): Blockchain? { if (card.noteCurrency != null) return card.noteCurrency val blockchainName: String = walletData?.blockchain ?: return null @@ -148,14 +148,14 @@ class ScanNoteTask(val card: Card? = null) : CardSessionRunnable { override fun run(session: CardSession, callback: (result: CompletionResult) -> Unit) { - val publicKey = session.environment.card?.getSingleWallet()?.publicKey + val card = session.environment.card + val publicKey = card?.getSingleWallet()?.publicKey if (publicKey != null) { + if (!card.cardId.startsWith(TwinsHelper.getPairCardSeries(firstCardId) ?: "")) { + callback(CompletionResult.Failure(TangemSdkError.WrongCardType())) + return + } + session.setInitialMessage(preparingMessage) PurgeWalletCommand(publicKey).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 8f742b5852..ccca28d77a 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 @@ -21,7 +21,6 @@ import com.tangem.tap.tangemSdkManager class TwinCardsManager(private val scanNoteResponse: ScanNoteResponse, context: Context) { private val currentCardId: String = scanNoteResponse.card.cardId - private val secondCardId: String? = TwinsHelper.getTwinsCardId(currentCardId) private var currentCardPublicKey: String? = null private var secondCardPublicKey: String? = null @@ -59,13 +58,15 @@ class TwinCardsManager(private val scanNoteResponse: ScanNoteResponse, context: preparingMessage: Message, creatingWalletMessage: Message, ): SimpleResult { + val task = CreateSecondTwinWalletTask( + firstPublicKey = currentCardPublicKey!!, + firstCardId = currentCardId, + issuerKeys = issuerKeyPair, + preparingMessage = preparingMessage, + creatingWalletMessage = creatingWalletMessage + ) val response = tangemSdkManager.runTaskAsync( - CreateSecondTwinWalletTask( - firstPublicKey = currentCardPublicKey!!, - issuerKeys = issuerKeyPair, - preparingMessage = preparingMessage, - creatingWalletMessage = 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 9a6a892264..941c8f46bb 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 @@ -22,6 +22,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/details/redux/DetailsReducer.kt b/app/src/main/java/com/tangem/tap/features/details/redux/DetailsReducer.kt index f9a55c5271..91f7a75152 100644 --- a/app/src/main/java/com/tangem/tap/features/details/redux/DetailsReducer.kt +++ b/app/src/main/java/com/tangem/tap/features/details/redux/DetailsReducer.kt @@ -172,12 +172,16 @@ private fun handleSecurityAction( state.copy(confirmScreenState = confirmScreenState) } is DetailsAction.ManageSecurity.SaveChanges.Success -> { - // Setting options to show only LongTap from now on + // Setting options to show only LongTap from now on for non-twins state.copy( - securityScreenState = state.securityScreenState?.copy( - currentOption = state.securityScreenState.selectedOption, - allowedOptions = EnumSet.of(SecurityOption.LongTap) - )) + securityScreenState = state.securityScreenState?.copy( + currentOption = state.securityScreenState.selectedOption, + allowedOptions = state.card?.let { + prepareAllowedSecurityOptions( + it, state.securityScreenState.selectedOption + ) + } ?: EnumSet.of(SecurityOption.LongTap) + )) } else -> state @@ -188,8 +192,11 @@ private fun prepareAllowedSecurityOptions( card: Card?, currentSecurityOption: SecurityOption? ): EnumSet { val prohibitDefaultPin = card?.settings?.isRemovingAccessCodeAllowed != true - val allowedSecurityOptions = EnumSet.noneOf(SecurityOption::class.java) + + if (card?.isTwinCard() == true) { + allowedSecurityOptions.add(SecurityOption.PassCode) + } if ((currentSecurityOption == SecurityOption.LongTap) || !prohibitDefaultPin) { allowedSecurityOptions.add(SecurityOption.LongTap) } 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 488adca48d..d2f58bf842 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 @@ -152,8 +152,8 @@ sealed class WalletAction : Action { object ShowOnboarding : TwinsAction() object SetOnboardingShown : TwinsAction() data class SetTwinCard( - val secondCardId: String, val number: TwinCardNumber, - val isCreatingTwinCardsAllowed: Boolean, + val number: TwinCardNumber, + val isCreatingTwinCardsAllowed: Boolean, ) : TwinsAction() } } \ No newline at end of file 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 0d81713483..33b0093e4f 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 @@ -195,7 +195,6 @@ data class TradeCryptoAvailability( ) 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/middlewares/WalletMiddleware.kt b/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/WalletMiddleware.kt index 8c0b638587..8a680fcf1c 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/WalletMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/WalletMiddleware.kt @@ -109,7 +109,7 @@ class WalletMiddleware { when (result) { is CompletionResult.Success -> { val scanNoteResponse = - globalState?.scanNoteResponse?.copy(card = result.data) + globalState?.scanNoteResponse?.copy(card = result.data) scanNoteResponse?.let { globalState.tapWalletManager.onCardScanned(scanNoteResponse) } 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/WalletFragment.kt b/app/src/main/java/com/tangem/tap/features/wallet/ui/WalletFragment.kt index f5f61139b1..98c2b0d6fe 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/ui/WalletFragment.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/ui/WalletFragment.kt @@ -94,7 +94,10 @@ class WalletFragment : Fragment(R.layout.fragment_wallet), StoreSubscriber