From 6d95dfe1fdae924f935536a85142b61caa505cd9 Mon Sep 17 00:00:00 2001 From: Tangem Date: Tue, 7 Dec 2021 23:32:06 +0300 Subject: [PATCH 01/10] Updated on 2026-08-14 --- app/src/main/java/com/tangem/tap/MainActivity.kt | 4 ++-- .../tangem/tap/common/redux/global/GlobalAction.kt | 2 +- .../tangem/tap/common/redux/global/GlobalReducer.kt | 12 ++++++++---- .../tangem/tap/common/redux/global/GlobalState.kt | 13 +++++++++---- .../domain/tasks/product/CreateProductWalletTask.kt | 2 +- .../products/note/redux/OnboardingNoteMiddleware.kt | 2 +- .../redux/OnboardingOtherCardsMiddleware.kt | 2 +- .../products/twins/redux/TwinCardsMiddleware.kt | 2 +- .../wallet/redux/OnboardingWalletMiddleware.kt | 8 +++++--- app/src/main/res/drawable/shape_chip.xml | 2 +- 10 files changed, 30 insertions(+), 19 deletions(-) diff --git a/app/src/main/java/com/tangem/tap/MainActivity.kt b/app/src/main/java/com/tangem/tap/MainActivity.kt index 43eaa90ca3..0c9f4a0bbf 100644 --- a/app/src/main/java/com/tangem/tap/MainActivity.kt +++ b/app/src/main/java/com/tangem/tap/MainActivity.kt @@ -96,8 +96,8 @@ class MainActivity : AppCompatActivity(), SnackbarHandler { val backStackIsEmpty = supportFragmentManager.backStackEntryCount == 0 val isScannedBefore = store.state.globalState.scanResponse != null - val isOnboardingServiceActive = store.state.globalState.onboardingManager != null - if (backStackIsEmpty && (!isOnboardingServiceActive && !isScannedBefore)) { + val isOnboardingServiceActive = store.state.globalState.onboardingState.onboardingStarted + if (backStackIsEmpty || (!isOnboardingServiceActive && !isScannedBefore)) { store.dispatch(NavigationAction.NavigateTo(AppScreen.Home)) } intentHandler.handleIntent(intent) diff --git a/app/src/main/java/com/tangem/tap/common/redux/global/GlobalAction.kt b/app/src/main/java/com/tangem/tap/common/redux/global/GlobalAction.kt index f448916049..bbea6e43f9 100644 --- a/app/src/main/java/com/tangem/tap/common/redux/global/GlobalAction.kt +++ b/app/src/main/java/com/tangem/tap/common/redux/global/GlobalAction.kt @@ -31,7 +31,7 @@ sealed class GlobalAction : Action { object HideDialog : GlobalAction() sealed class Onboarding { - data class Start(val scanResponse: ScanResponse, val fromHomeScreen: Boolean = true) : GlobalAction() + data class Start(val scanResponse: ScanResponse?, val fromHomeScreen: Boolean = true) : GlobalAction() object Stop : GlobalAction() } diff --git a/app/src/main/java/com/tangem/tap/common/redux/global/GlobalReducer.kt b/app/src/main/java/com/tangem/tap/common/redux/global/GlobalReducer.kt index 993830329a..e549a2f386 100644 --- a/app/src/main/java/com/tangem/tap/common/redux/global/GlobalReducer.kt +++ b/app/src/main/java/com/tangem/tap/common/redux/global/GlobalReducer.kt @@ -17,12 +17,16 @@ fun globalReducer(action: Action, state: AppState): GlobalState { globalState.copy(resources = action.resources) } is GlobalAction.Onboarding.Start -> { - val usedCardsPrefStorage = preferencesStorage.usedCardsPrefStorage - val onboardingState = OnboardingManager(action.scanResponse, usedCardsPrefStorage) - globalState.copy(onboardingManager = onboardingState) + val onboardingManager = if (action.scanResponse != null) { + val usedCardsPrefStorage = preferencesStorage.usedCardsPrefStorage + OnboardingManager(action.scanResponse, usedCardsPrefStorage) + } else { + null + } + globalState.copy(onboardingState = OnboardingState(true, onboardingManager)) } is GlobalAction.Onboarding.Stop -> { - globalState.copy(onboardingManager = null) + globalState.copy(onboardingState = OnboardingState(false)) } is GlobalAction.ScanFailsCounter.Increment -> { globalState.copy(scanCardFailsCounter = globalState.scanCardFailsCounter + 1) diff --git a/app/src/main/java/com/tangem/tap/common/redux/global/GlobalState.kt b/app/src/main/java/com/tangem/tap/common/redux/global/GlobalState.kt index 484142c611..f634a6a0ff 100644 --- a/app/src/main/java/com/tangem/tap/common/redux/global/GlobalState.kt +++ b/app/src/main/java/com/tangem/tap/common/redux/global/GlobalState.kt @@ -15,7 +15,7 @@ import org.rekotlin.StateType data class GlobalState( val scanResponse: ScanResponse? = null, - val onboardingManager: OnboardingManager? = null, + val onboardingState: OnboardingState = OnboardingState(), val cardVerifiedOnline: Boolean = false, val tapWalletManager: TapWalletManager = TapWalletManager(), val payIdManager: PayIdManager = PayIdManager(), @@ -32,12 +32,17 @@ data class GlobalState( data class AndroidResources( - val strings: RString = RString() + val strings: RString = RString(), ) { data class RString( val addressWasCopied: Int = -1, - val walletIsNotEmpty: Int = -1 + val walletIsNotEmpty: Int = -1, ) } typealias CryptoCurrencyName = String -typealias FiatCurrencyName = String \ No newline at end of file +typealias FiatCurrencyName = String + +data class OnboardingState( + val onboardingStarted: Boolean = false, + val onboardingManager: OnboardingManager? = null, +) \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/domain/tasks/product/CreateProductWalletTask.kt b/app/src/main/java/com/tangem/tap/domain/tasks/product/CreateProductWalletTask.kt index 8818309e08..530b53ac4c 100644 --- a/app/src/main/java/com/tangem/tap/domain/tasks/product/CreateProductWalletTask.kt +++ b/app/src/main/java/com/tangem/tap/domain/tasks/product/CreateProductWalletTask.kt @@ -113,7 +113,7 @@ private class CreateWalletTangemWallet : ProductCommandProcessor = { dispatch, state - private fun handleNoteAction(action: Action, dispatch: DispatchFunction) { if (action !is OnboardingNoteAction) return val globalState = store.state.globalState - val onboardingManager = globalState.onboardingManager ?: return + val onboardingManager = globalState.onboardingState.onboardingManager ?: return val scanResponse = onboardingManager.scanResponse val card = onboardingManager.scanResponse.card diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/products/otherCards/redux/OnboardingOtherCardsMiddleware.kt b/app/src/main/java/com/tangem/tap/features/onboarding/products/otherCards/redux/OnboardingOtherCardsMiddleware.kt index 4606c539ae..f3419e67fa 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/products/otherCards/redux/OnboardingOtherCardsMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/products/otherCards/redux/OnboardingOtherCardsMiddleware.kt @@ -37,7 +37,7 @@ private val onboardingOtherCardsMiddleware: Middleware = { dispatch, s private fun handleOtherCardsAction(action: Action, dispatch: DispatchFunction) { if (action !is OnboardingOtherCardsAction) return val globalState = store.state.globalState - val onboardingManager = globalState.onboardingManager ?: return + val onboardingManager = globalState.onboardingState.onboardingManager ?: return val card = onboardingManager.scanResponse.card diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/products/twins/redux/TwinCardsMiddleware.kt b/app/src/main/java/com/tangem/tap/features/onboarding/products/twins/redux/TwinCardsMiddleware.kt index 818b1974aa..f69e59381f 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/products/twins/redux/TwinCardsMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/products/twins/redux/TwinCardsMiddleware.kt @@ -45,7 +45,7 @@ private fun handle(action: Action, dispatch: DispatchFunction) { val action = action as? TwinCardsAction ?: return val globalState = store.state.globalState - val onboardingManager = globalState.onboardingManager + val onboardingManager = globalState.onboardingState.onboardingManager val twinCardsState = store.state.twinCardsState fun getScanResponse(): ScanResponse { diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/redux/OnboardingWalletMiddleware.kt b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/redux/OnboardingWalletMiddleware.kt index cecbb010c6..4e8cc263ab 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/redux/OnboardingWalletMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/redux/OnboardingWalletMiddleware.kt @@ -38,7 +38,7 @@ private val onboardingWalletMiddleware: Middleware = { dispatch, state private fun handleWalletAction(action: Action) { if (action !is OnboardingWalletAction) return val globalState = store.state.globalState - val onboardingManager = globalState.onboardingManager + val onboardingManager = globalState.onboardingState.onboardingManager val scanResponse = onboardingManager?.scanResponse val card = scanResponse?.card @@ -73,7 +73,8 @@ private fun handleWalletAction(action: Action) { when (result) { is CompletionResult.Success -> { //here we must use updated scanResponse after createWallet & derivation - val updatedResponse = globalState.onboardingManager.scanResponse.copy(card = result.data) + val updatedResponse = + globalState.onboardingState.onboardingManager.scanResponse.copy(card = result.data) onboardingManager.scanResponse = updatedResponse onboardingManager.activationStarted(updatedResponse.card.cardId) store.dispatch(OnboardingWalletAction.ProceedBackup) @@ -134,7 +135,7 @@ private fun updateScanResponseAfterBackup( scanResponse: ScanResponse, backupState: BackupState ): ScanResponse { val card = if (backupState.backupStep == BackupStep.Finished) { - val cardsCount = backupState.backupCardsNumber + 1 + val cardsCount = backupState.backupCardsNumber scanResponse.card.copy( backupStatus = Card.BackupStatus.Active(cardCount = cardsCount), isAccessCodeSet = true @@ -250,6 +251,7 @@ class BackupMiddleware { } } is BackupAction.ResumeBackup -> { + store.dispatch(GlobalAction.Onboarding.Start(null, true)) store.dispatch(OnboardingWalletAction.ProceedBackup) store.dispatch(NavigationAction.NavigateTo(AppScreen.OnboardingWallet)) } diff --git a/app/src/main/res/drawable/shape_chip.xml b/app/src/main/res/drawable/shape_chip.xml index 9544d9916d..658e94c9a7 100644 --- a/app/src/main/res/drawable/shape_chip.xml +++ b/app/src/main/res/drawable/shape_chip.xml @@ -1,7 +1,7 @@ - + Date: Tue, 7 Dec 2021 23:48:15 +0300 Subject: [PATCH 02/10] Updated on 2026-08-14 --- app/src/main/res/layout/fragment_onboarding_wallet.xml | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/app/src/main/res/layout/fragment_onboarding_wallet.xml b/app/src/main/res/layout/fragment_onboarding_wallet.xml index 56427dc352..7f004c814d 100644 --- a/app/src/main/res/layout/fragment_onboarding_wallet.xml +++ b/app/src/main/res/layout/fragment_onboarding_wallet.xml @@ -165,7 +165,6 @@ android:layout_height="wrap_content" android:visibility="gone" app:layout_constraintHorizontal_bias="0.504" - app:layout_constraintBottom_toTopOf="@id/layout_buttons_common" app:flow_verticalBias="0" app:layout_constraintTop_toTopOf="@+id/guideline2" android:layout_marginBottom="8dp"/> @@ -173,7 +172,7 @@ From 4239b2aa25755855f7a41348c5c159f1aec7a728 Mon Sep 17 00:00:00 2001 From: Tangem Date: Tue, 7 Dec 2021 23:57:35 +0300 Subject: [PATCH 03/10] Updated on 2026-08-14 --- .../products/wallet/redux/OnboardingWalletMiddleware.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/redux/OnboardingWalletMiddleware.kt b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/redux/OnboardingWalletMiddleware.kt index 4e8cc263ab..8b248a9422 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/redux/OnboardingWalletMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/redux/OnboardingWalletMiddleware.kt @@ -134,7 +134,7 @@ private fun handleWalletAction(action: Action) { private fun updateScanResponseAfterBackup( scanResponse: ScanResponse, backupState: BackupState ): ScanResponse { - val card = if (backupState.backupStep == BackupStep.Finished) { + val card = if (backupState.backupCardsNumber > 0) { val cardsCount = backupState.backupCardsNumber scanResponse.card.copy( backupStatus = Card.BackupStatus.Active(cardCount = cardsCount), From f80e12e9ca0f0001bdf0878faa24490ac1336d95 Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 8 Dec 2021 10:45:33 +0300 Subject: [PATCH 04/10] Updated on 2026-08-14 --- .../wallet/redux/OnboardingWalletAction.kt | 1 + .../redux/OnboardingWalletMiddleware.kt | 25 +++++++++++-------- .../wallet/redux/OnboardingWalletReducer.kt | 1 + .../dialogs/ConfirmDiscardingBackupDialog.kt | 2 +- 4 files changed, 18 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/redux/OnboardingWalletAction.kt b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/redux/OnboardingWalletAction.kt index f00b5c5273..b3056d7bdd 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/redux/OnboardingWalletAction.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/redux/OnboardingWalletAction.kt @@ -61,6 +61,7 @@ sealed class BackupAction : Action { object FinishBackup : BackupAction() object DiscardBackup : BackupAction() + object DiscardSavedBackup : BackupAction() object ResumeBackup : BackupAction() } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/redux/OnboardingWalletMiddleware.kt b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/redux/OnboardingWalletMiddleware.kt index 8b248a9422..dd9ea5cd54 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/redux/OnboardingWalletMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/redux/OnboardingWalletMiddleware.kt @@ -89,13 +89,6 @@ private fun handleWalletAction(action: Action) { OnboardingWalletAction.FinishOnboarding -> { store.dispatch(GlobalAction.Onboarding.Stop) - (listOf(walletState.backupState.primaryCardId) + - walletState.backupState.backupCardIds + scanResponse?.card?.cardId) - .distinct().filterNotNull() - .forEach { cardId -> - preferencesStorage.usedCardsPrefStorage.activationFinished(cardId) - } - if (scanResponse == null) { store.dispatch(NavigationAction.PopBackTo()) store.dispatch(HomeAction.ReadCard) @@ -119,7 +112,7 @@ private fun handleWalletAction(action: Action) { when (walletState.backupState.backupStep) { BackupStep.InitBackup, BackupStep.Finished -> store.dispatch(NavigationAction.PopBackTo()) BackupStep.ScanOriginCard, BackupStep.AddBackupCards, BackupStep.EnterAccessCode, - BackupStep.ReenterAccessCode, BackupStep.SetAccessCode, BackupStep.WritePrimaryCard + BackupStep.ReenterAccessCode, BackupStep.SetAccessCode, BackupStep.WritePrimaryCard, -> { store.dispatch(BackupAction.DiscardBackup) store.dispatch(NavigationAction.PopBackTo()) @@ -132,7 +125,7 @@ private fun handleWalletAction(action: Action) { } private fun updateScanResponseAfterBackup( - scanResponse: ScanResponse, backupState: BackupState + scanResponse: ScanResponse, backupState: BackupState, ): ScanResponse { val card = if (backupState.backupCardsNumber > 0) { val cardsCount = backupState.backupCardsNumber @@ -240,11 +233,23 @@ class BackupMiddleware { } } is BackupAction.FinishBackup -> { -// store.dispatch(OnboardingWalletAction.Done) + (listOf(backupState?.primaryCardId, + store.state.globalState.onboardingState.onboardingManager?.scanResponse?.card?.cardId) + + backupState?.backupCardIds as List) + .distinct().filterNotNull() + .forEach { cardId -> + preferencesStorage.usedCardsPrefStorage.activationFinished(cardId) + } } is BackupAction.DiscardBackup -> { backupService.discardSavedBackup() } + is BackupAction.DiscardSavedBackup -> { + backupService.primaryCardId?.let { + preferencesStorage.usedCardsPrefStorage.activationFinished(it) + } + backupService.discardSavedBackup() + } is BackupAction.CheckForUnfinishedBackup -> { if (backupService.hasIncompletedBackup) { store.dispatch(GlobalAction.ShowDialog(BackupDialog.UnfinishedBackupFound)) diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/redux/OnboardingWalletReducer.kt b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/redux/OnboardingWalletReducer.kt index 1d48365843..3947cd5d3f 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/redux/OnboardingWalletReducer.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/redux/OnboardingWalletReducer.kt @@ -126,6 +126,7 @@ class BackupReducer { BackupAction.CheckForUnfinishedBackup -> state BackupAction.DiscardBackup -> state BackupAction.ResumeBackup -> state + BackupAction.DiscardSavedBackup -> state } } diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/ui/dialogs/ConfirmDiscardingBackupDialog.kt b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/ui/dialogs/ConfirmDiscardingBackupDialog.kt index 07900822ba..8b88890be8 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/ui/dialogs/ConfirmDiscardingBackupDialog.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/ui/dialogs/ConfirmDiscardingBackupDialog.kt @@ -17,7 +17,7 @@ class ConfirmDiscardingBackupDialog { store.dispatch(BackupAction.ResumeBackup) } setNegativeButton(R.string.welcome_interrupted_backup_discard_discard) { _, _ -> - store.dispatch(BackupAction.DiscardBackup) + store.dispatch(BackupAction.DiscardSavedBackup) } setOnDismissListener { store.dispatch(GlobalAction.HideDialog) From aa50fa63ba6c382b28ac4a75337069be74db560a Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 8 Dec 2021 14:16:36 +0300 Subject: [PATCH 05/10] Updated on 2026-08-14 --- app/src/main/java/com/tangem/tap/common/DialogManager.kt | 4 ++-- .../products/wallet/redux/OnboardingWalletMiddleware.kt | 2 +- .../products/wallet/redux/OnboardingWalletState.kt | 2 +- ...MoreBackupCardsDialog.kt => AddMoreBackupCardsDialog.kt} | 6 +++--- app/src/main/res/values/strings_untranslated.xml | 2 +- 5 files changed, 8 insertions(+), 8 deletions(-) rename app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/ui/dialogs/{BuyMoreBackupCardsDialog.kt => AddMoreBackupCardsDialog.kt} (89%) 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 6533bab1a3..8f1491368c 100644 --- a/app/src/main/java/com/tangem/tap/common/DialogManager.kt +++ b/app/src/main/java/com/tangem/tap/common/DialogManager.kt @@ -10,8 +10,8 @@ import com.tangem.tap.features.onboarding.AddressInfoBottomSheetDialog import com.tangem.tap.features.onboarding.products.twins.redux.TwinCardsAction import com.tangem.tap.features.onboarding.products.twins.ui.dialog.CreateWalletInterruptDialog import com.tangem.tap.features.onboarding.products.wallet.redux.BackupDialog +import com.tangem.tap.features.onboarding.products.wallet.ui.dialogs.AddMoreBackupCardsDialog import com.tangem.tap.features.onboarding.products.wallet.ui.dialogs.BackupInProgressDialog -import com.tangem.tap.features.onboarding.products.wallet.ui.dialogs.BuyMoreBackupCardsDialog import com.tangem.tap.features.onboarding.products.wallet.ui.dialogs.ConfirmDiscardingBackupDialog import com.tangem.tap.features.onboarding.products.wallet.ui.dialogs.UnfinishedBackupFoundDialog import com.tangem.tap.features.wallet.ui.dialogs.ScanFailsDialog @@ -79,7 +79,7 @@ class DialogManager : StoreSubscriber { TransactionDialog.create(state.dialog.dialogData, context) is WalletConnectDialog.PersonalSign -> PersonalSignDialog.create(state.dialog.data, context) - is BackupDialog.BuyMoreBackupCards -> BuyMoreBackupCardsDialog.create(context) + is BackupDialog.AddMoreBackupCards -> AddMoreBackupCardsDialog.create(context) is BackupDialog.BackupInProgress -> BackupInProgressDialog.create(context) is BackupDialog.UnfinishedBackupFound -> UnfinishedBackupFoundDialog.create(context) is BackupDialog.ConfirmDiscardingBackup -> ConfirmDiscardingBackupDialog.create(context) diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/redux/OnboardingWalletMiddleware.kt b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/redux/OnboardingWalletMiddleware.kt index dd9ea5cd54..95e7b3e0a5 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/redux/OnboardingWalletMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/redux/OnboardingWalletMiddleware.kt @@ -176,7 +176,7 @@ class BackupMiddleware { } is BackupAction.FinishAddingBackupCards -> { if (backupService.addedBackupCardsCount == 1) { - store.dispatchOnMain(GlobalAction.ShowDialog(BackupDialog.BuyMoreBackupCards)) + store.dispatchOnMain(GlobalAction.ShowDialog(BackupDialog.AddMoreBackupCards)) } if (backupService.addedBackupCardsCount == 2) { store.dispatchOnMain(BackupAction.ShowAccessCodeInfoScreen) diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/redux/OnboardingWalletState.kt b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/redux/OnboardingWalletState.kt index 6c6ff6d1f7..d8d0c687b7 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/redux/OnboardingWalletState.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/redux/OnboardingWalletState.kt @@ -74,7 +74,7 @@ sealed class BackupStep { } sealed class BackupDialog: StateDialog { - object BuyMoreBackupCards : StateDialog + object AddMoreBackupCards : StateDialog object BackupInProgress : StateDialog object UnfinishedBackupFound : StateDialog object ConfirmDiscardingBackup : StateDialog diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/ui/dialogs/BuyMoreBackupCardsDialog.kt b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/ui/dialogs/AddMoreBackupCardsDialog.kt similarity index 89% rename from app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/ui/dialogs/BuyMoreBackupCardsDialog.kt rename to app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/ui/dialogs/AddMoreBackupCardsDialog.kt index 06f4c1565d..883ce390dc 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/ui/dialogs/BuyMoreBackupCardsDialog.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/ui/dialogs/AddMoreBackupCardsDialog.kt @@ -7,7 +7,7 @@ import com.tangem.tap.features.onboarding.products.wallet.redux.BackupAction import com.tangem.tap.store import com.tangem.wallet.R -class BuyMoreBackupCardsDialog { +class AddMoreBackupCardsDialog { companion object { fun create(context: Context): AlertDialog { return AlertDialog.Builder(context).apply { @@ -16,8 +16,8 @@ class BuyMoreBackupCardsDialog { setPositiveButton(R.string.common_continue) { _, _ -> store.dispatch(BackupAction.ShowAccessCodeInfoScreen) } - setNegativeButton(R.string.onboarding_button_buy_more_cards) { _, _ -> - store.dispatch(BackupAction.GoToShop) + setNegativeButton(R.string.onboarding_button_add_more_cards) { _, _ -> + } setOnDismissListener { store.dispatch(GlobalAction.HideDialog) diff --git a/app/src/main/res/values/strings_untranslated.xml b/app/src/main/res/values/strings_untranslated.xml index 3a6508fd00..e81e6a07bf 100644 --- a/app/src/main/res/values/strings_untranslated.xml +++ b/app/src/main/res/values/strings_untranslated.xml @@ -218,7 +218,7 @@ + Add backup card Scan the card #%d Scan primary card - Buy more cards + Add more cards Backup your wallet No backup cards From 03a73dfa78e308b60700e8287184b7772b59df1c Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 8 Dec 2021 14:27:38 +0300 Subject: [PATCH 06/10] Updated on 2026-08-14 --- .../com/tangem/tap/features/home/redux/HomeMiddleware.kt | 3 +-- .../products/wallet/redux/OnboardingWalletMiddleware.kt | 6 ++++-- .../products/wallet/ui/OnboardingWalletFragment.kt | 4 ++-- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/com/tangem/tap/features/home/redux/HomeMiddleware.kt b/app/src/main/java/com/tangem/tap/features/home/redux/HomeMiddleware.kt index 0ad3f5d218..b93b3a2e7e 100644 --- a/app/src/main/java/com/tangem/tap/features/home/redux/HomeMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/home/redux/HomeMiddleware.kt @@ -27,8 +27,7 @@ class HomeMiddleware { companion object { val handler = homeMiddleware - const val CARD_SHOP_URI = - "https://shop.tangem.com/?afmc=1i&utm_campaign=1i&utm_source=leaddyno&utm_medium=affiliate" + const val CARD_SHOP_URI = "http://cards.tangem.com/" } } diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/redux/OnboardingWalletMiddleware.kt b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/redux/OnboardingWalletMiddleware.kt index 95e7b3e0a5..b4e4fa28f8 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/redux/OnboardingWalletMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/redux/OnboardingWalletMiddleware.kt @@ -14,8 +14,8 @@ import com.tangem.tap.common.redux.navigation.NavigationAction import com.tangem.tap.domain.extensions.hasWallets import com.tangem.tap.domain.tasks.product.ScanResponse import com.tangem.tap.features.home.redux.HomeAction -import com.tangem.tap.features.home.redux.HomeMiddleware import com.tangem.tap.features.onboarding.products.note.redux.OnboardingNoteAction +import com.tangem.tap.features.onboarding.products.wallet.redux.OnboardingWalletMiddleware.Companion.BUY_WALLET_URL import kotlinx.coroutines.launch import org.rekotlin.Action import org.rekotlin.Middleware @@ -23,6 +23,8 @@ import org.rekotlin.Middleware class OnboardingWalletMiddleware { companion object { val handler = onboardingWalletMiddleware + + const val BUY_WALLET_URL = "https://wallet.tangem.com/" } } @@ -172,7 +174,7 @@ class BackupMiddleware { } } is BackupAction.GoToShop -> { - store.dispatchOpenUrl(HomeMiddleware.CARD_SHOP_URI) + store.dispatchOpenUrl(BUY_WALLET_URL) } is BackupAction.FinishAddingBackupCards -> { if (backupService.addedBackupCardsCount == 1) { 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 dd517f6e3b..f415e176b9 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 @@ -17,8 +17,8 @@ import com.tangem.tap.common.leapfrogWidget.LeapfrogWidget import com.tangem.tap.common.postUi import com.tangem.tap.features.FragmentOnBackPressedHandler import com.tangem.tap.features.addBackPressHandler -import com.tangem.tap.features.home.redux.HomeMiddleware import com.tangem.tap.features.onboarding.products.wallet.redux.* +import com.tangem.tap.features.onboarding.products.wallet.redux.OnboardingWalletMiddleware.Companion.BUY_WALLET_URL import com.tangem.tap.features.onboarding.products.wallet.ui.dialogs.AccessCodeDialog import com.tangem.tap.store import com.tangem.wallet.R @@ -363,7 +363,7 @@ class OnboardingWalletFragment : Fragment(R.layout.fragment_onboarding_wallet), override fun onOptionsItemSelected(item: MenuItem): Boolean { return when (item.itemId) { R.id.shop_menu -> { - store.dispatchOpenUrl(HomeMiddleware.CARD_SHOP_URI) + store.dispatchOpenUrl(BUY_WALLET_URL) true } else -> super.onOptionsItemSelected(item) From 05f9be0331ef817cf5cd749c7b99757e49798de7 Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 8 Dec 2021 14:39:26 +0300 Subject: [PATCH 07/10] Updated on 2026-08-14 --- .../redux/OnboardingWalletMiddleware.kt | 251 +++++++++--------- 1 file changed, 130 insertions(+), 121 deletions(-) diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/redux/OnboardingWalletMiddleware.kt b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/redux/OnboardingWalletMiddleware.kt index b4e4fa28f8..f9465751c3 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/redux/OnboardingWalletMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/redux/OnboardingWalletMiddleware.kt @@ -145,129 +145,138 @@ class BackupMiddleware { val backupMiddleware: Middleware = { dispatch, state -> { next -> { action -> - val backupState = state()?.onboardingWalletState?.backupState - when (action) { - is BackupAction.StartBackup -> { - backupService.discardSavedBackup() - } - is BackupAction.ScanPrimaryCard -> { - backupService.readPrimaryCard { result -> - when (result) { - is CompletionResult.Success -> { - store.dispatchOnMain(BackupAction.StartAddingBackupCards) - } - is CompletionResult.Failure -> { - } - } - } - } - is BackupAction.AddBackupCard -> { - backupService.addBackupCard { result -> - when (result) { - is CompletionResult.Success -> { - store.dispatchOnMain(BackupAction.AddBackupCard.Success) - } - is CompletionResult.Failure -> { - - } - } - } - } - is BackupAction.GoToShop -> { - store.dispatchOpenUrl(BUY_WALLET_URL) - } - is BackupAction.FinishAddingBackupCards -> { - if (backupService.addedBackupCardsCount == 1) { - store.dispatchOnMain(GlobalAction.ShowDialog(BackupDialog.AddMoreBackupCards)) - } - if (backupService.addedBackupCardsCount == 2) { - store.dispatchOnMain(BackupAction.ShowAccessCodeInfoScreen) - } - } - is BackupAction.CheckAccessCode -> { - if (action.accessCode.length < 4) { - store.dispatch(BackupAction.SetAccessCodeError( - AccessCodeError.CodeTooShort - )) - } else { - store.dispatch(BackupAction.SaveFirstAccessCode(action.accessCode)) - } - } - is BackupAction.SaveAccessCodeConfirmation -> { - if (action.accessCodeConfirmation == backupState?.accessCode) { - backupService.setAccessCode(action.accessCodeConfirmation) - store.dispatch(BackupAction.PrepareToWritePrimaryCard) - } else { - store.dispatch(BackupAction.SetAccessCodeError( - AccessCodeError.CodesDoNotMatch - )) - } - } - is BackupAction.WritePrimaryCard -> { - backupService.proceedBackup { result -> - when (result) { - is CompletionResult.Success -> { - store.dispatchOnMain( - BackupAction.PrepareToWriteBackupCard(1) - ) - } - is CompletionResult.Failure -> { - } - } - } - } - is BackupAction.WriteBackupCard -> { - backupService.proceedBackup { result -> - when (result) { - is CompletionResult.Success -> { - if (backupService.currentState == BackupService.State.Finished) { - store.dispatchOnMain(BackupAction.FinishBackup) - } else { - store.dispatchOnMain( - BackupAction.PrepareToWriteBackupCard(action.cardNumber + 1) - ) - } - } - is CompletionResult.Failure -> { - - } - } - } - } - is BackupAction.FinishBackup -> { - (listOf(backupState?.primaryCardId, - store.state.globalState.onboardingState.onboardingManager?.scanResponse?.card?.cardId) + - backupState?.backupCardIds as List) - .distinct().filterNotNull() - .forEach { cardId -> - preferencesStorage.usedCardsPrefStorage.activationFinished(cardId) - } - } - is BackupAction.DiscardBackup -> { - backupService.discardSavedBackup() - } - is BackupAction.DiscardSavedBackup -> { - backupService.primaryCardId?.let { - preferencesStorage.usedCardsPrefStorage.activationFinished(it) - } - backupService.discardSavedBackup() - } - is BackupAction.CheckForUnfinishedBackup -> { - if (backupService.hasIncompletedBackup) { - store.dispatch(GlobalAction.ShowDialog(BackupDialog.UnfinishedBackupFound)) - } - } - is BackupAction.ResumeBackup -> { - store.dispatch(GlobalAction.Onboarding.Start(null, true)) - store.dispatch(OnboardingWalletAction.ProceedBackup) - store.dispatch(NavigationAction.NavigateTo(AppScreen.OnboardingWallet)) - } - is BackupAction.DismissBackup -> { - store.dispatch(BackupAction.FinishBackup) - } - } + if (action is BackupAction) handleBackupAction(action) next(action) } } } +} + +private fun handleBackupAction(action: BackupAction) { + val backupState = store.state.onboardingWalletState.backupState + + val globalState = store.state.globalState + val onboardingManager = globalState.onboardingState.onboardingManager + + val scanResponse = onboardingManager?.scanResponse + val card = scanResponse?.card + + when (action) { + is BackupAction.StartBackup -> { + backupService.discardSavedBackup() + } + is BackupAction.ScanPrimaryCard -> { + backupService.readPrimaryCard(cardId = card?.cardId) { result -> + when (result) { + is CompletionResult.Success -> { + store.dispatchOnMain(BackupAction.StartAddingBackupCards) + } + is CompletionResult.Failure -> { + } + } + } + } + is BackupAction.AddBackupCard -> { + backupService.addBackupCard { result -> + when (result) { + is CompletionResult.Success -> { + store.dispatchOnMain(BackupAction.AddBackupCard.Success) + } + is CompletionResult.Failure -> { + + } + } + } + } + is BackupAction.GoToShop -> { + store.dispatchOpenUrl(BUY_WALLET_URL) + } + is BackupAction.FinishAddingBackupCards -> { + if (backupService.addedBackupCardsCount == 1) { + store.dispatchOnMain(GlobalAction.ShowDialog(BackupDialog.AddMoreBackupCards)) + } + if (backupService.addedBackupCardsCount == 2) { + store.dispatchOnMain(BackupAction.ShowAccessCodeInfoScreen) + } + } + is BackupAction.CheckAccessCode -> { + if (action.accessCode.length < 4) { + store.dispatch(BackupAction.SetAccessCodeError( + AccessCodeError.CodeTooShort + )) + } else { + store.dispatch(BackupAction.SaveFirstAccessCode(action.accessCode)) + } + } + is BackupAction.SaveAccessCodeConfirmation -> { + if (action.accessCodeConfirmation == backupState.accessCode) { + backupService.setAccessCode(action.accessCodeConfirmation) + store.dispatch(BackupAction.PrepareToWritePrimaryCard) + } else { + store.dispatch(BackupAction.SetAccessCodeError( + AccessCodeError.CodesDoNotMatch + )) + } + } + is BackupAction.WritePrimaryCard -> { + backupService.proceedBackup { result -> + when (result) { + is CompletionResult.Success -> { + store.dispatchOnMain( + BackupAction.PrepareToWriteBackupCard(1) + ) + } + is CompletionResult.Failure -> { + } + } + } + } + is BackupAction.WriteBackupCard -> { + backupService.proceedBackup { result -> + when (result) { + is CompletionResult.Success -> { + if (backupService.currentState == BackupService.State.Finished) { + store.dispatchOnMain(BackupAction.FinishBackup) + } else { + store.dispatchOnMain( + BackupAction.PrepareToWriteBackupCard(action.cardNumber + 1) + ) + } + } + is CompletionResult.Failure -> { + + } + } + } + } + is BackupAction.FinishBackup -> { + (listOf(backupState.primaryCardId, card?.cardId) + backupState.backupCardIds) + .distinct().filterNotNull() + .forEach { cardId -> + preferencesStorage.usedCardsPrefStorage.activationFinished(cardId) + } + } + is BackupAction.DiscardBackup -> { + backupService.discardSavedBackup() + } + is BackupAction.DiscardSavedBackup -> { + backupService.primaryCardId?.let { + preferencesStorage.usedCardsPrefStorage.activationFinished(it) + } + backupService.discardSavedBackup() + } + is BackupAction.CheckForUnfinishedBackup -> { + if (backupService.hasIncompletedBackup) { + store.dispatch(GlobalAction.ShowDialog(BackupDialog.UnfinishedBackupFound)) + } + } + is BackupAction.ResumeBackup -> { + store.dispatch(GlobalAction.Onboarding.Start(null, true)) + store.dispatch(OnboardingWalletAction.ProceedBackup) + store.dispatch(NavigationAction.NavigateTo(AppScreen.OnboardingWallet)) + } + is BackupAction.DismissBackup -> { + store.dispatch(BackupAction.FinishBackup) + } + } } \ No newline at end of file From a6a59e086342a53a6af875a90e1c4fd928aefcc6 Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 8 Dec 2021 15:08:04 +0300 Subject: [PATCH 08/10] Updated on 2026-08-14 --- .../tap/features/tokens/redux/TokensAction.kt | 6 +- .../features/tokens/redux/TokensMiddleware.kt | 6 +- .../features/tokens/redux/TokensReducer.kt | 10 -- .../tap/features/tokens/redux/TokensState.kt | 1 - .../features/tokens/ui/AddTokensFragment.kt | 10 +- .../tokens/ui/adapters/CurrenciesAdapter.kt | 128 ++++++++++++------ 6 files changed, 97 insertions(+), 64 deletions(-) diff --git a/app/src/main/java/com/tangem/tap/features/tokens/redux/TokensAction.kt b/app/src/main/java/com/tangem/tap/features/tokens/redux/TokensAction.kt index 27db550708..0a27c90233 100644 --- a/app/src/main/java/com/tangem/tap/features/tokens/redux/TokensAction.kt +++ b/app/src/main/java/com/tangem/tap/features/tokens/redux/TokensAction.kt @@ -21,9 +21,5 @@ sealed class TokensAction : Action { data class ToggleShowTokensForBlockchain(val isShown: Boolean, val blockchain: Blockchain) : TokensAction() - sealed class TokensList : TokensAction() { - data class AddBlockchain(val blockchain: Blockchain) : TokensList() - data class AddToken(val token: Token) : TokensList() - object SaveChanges : TokensList() - } + data class SaveChanges(val addedItems: List) : TokensAction() } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/features/tokens/redux/TokensMiddleware.kt b/app/src/main/java/com/tangem/tap/features/tokens/redux/TokensMiddleware.kt index 4e1d90b2e4..2176e4ea51 100644 --- a/app/src/main/java/com/tangem/tap/features/tokens/redux/TokensMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/tokens/redux/TokensMiddleware.kt @@ -29,7 +29,7 @@ class TokensMiddleware { { action -> when (action) { is TokensAction.LoadCurrencies -> handleLoadCurrencies(action) - is TokensAction.TokensList.SaveChanges -> handleSaveChanges(action) + is TokensAction.SaveChanges -> handleSaveChanges(action) } next(action) } @@ -69,10 +69,10 @@ class TokensMiddleware { store.dispatch(TokensAction.LoadCurrencies.Success(currencies)) } - private fun handleSaveChanges(action: TokensAction.TokensList.SaveChanges) { + private fun handleSaveChanges(action: TokensAction.SaveChanges) { val scanResponse = store.state.globalState.scanResponse ?: return - val candidatesToAdd = store.state.tokensState.candidateToAdd + val candidatesToAdd = action.addedItems if (candidatesToAdd.isEmpty()) return val blockchains = candidatesToAdd.filterIsInstance() diff --git a/app/src/main/java/com/tangem/tap/features/tokens/redux/TokensReducer.kt b/app/src/main/java/com/tangem/tap/features/tokens/redux/TokensReducer.kt index f6ba05bc49..8496a9c7fb 100644 --- a/app/src/main/java/com/tangem/tap/features/tokens/redux/TokensReducer.kt +++ b/app/src/main/java/com/tangem/tap/features/tokens/redux/TokensReducer.kt @@ -43,16 +43,6 @@ private fun internalReduce(action: Action, state: AppState): TokensState { tokensState.copy(shownCurrencies = shownCurrencies) } } - is TokensAction.TokensList.AddBlockchain -> { - val candidates = tokensState.candidateToAdd.toMutableSet() - candidates.add(CurrencyListItem.BlockchainListItem(action.blockchain)) - tokensState.copy(candidateToAdd = candidates.toList()) - } - is TokensAction.TokensList.AddToken -> { - val candidates = tokensState.candidateToAdd.toMutableSet() - candidates.add(CurrencyListItem.TokenListItem(action.token)) - tokensState.copy(candidateToAdd = candidates.toList()) - } else -> tokensState } } diff --git a/app/src/main/java/com/tangem/tap/features/tokens/redux/TokensState.kt b/app/src/main/java/com/tangem/tap/features/tokens/redux/TokensState.kt index d0c204ee45..ef30a92229 100644 --- a/app/src/main/java/com/tangem/tap/features/tokens/redux/TokensState.kt +++ b/app/src/main/java/com/tangem/tap/features/tokens/redux/TokensState.kt @@ -10,7 +10,6 @@ data class TokensState( val addedCurrencies: CardCurrencies? = null, val currencies: List = emptyList(), val shownCurrencies: List = emptyList(), - val candidateToAdd: List = emptyList(), ) : StateType data class TokenWithAmount( diff --git a/app/src/main/java/com/tangem/tap/features/tokens/ui/AddTokensFragment.kt b/app/src/main/java/com/tangem/tap/features/tokens/ui/AddTokensFragment.kt index e29365e728..38de45981b 100644 --- a/app/src/main/java/com/tangem/tap/features/tokens/ui/AddTokensFragment.kt +++ b/app/src/main/java/com/tangem/tap/features/tokens/ui/AddTokensFragment.kt @@ -61,12 +61,18 @@ class AddTokensFragment : Fragment(R.layout.fragment_add_tokens), (activity as? AppCompatActivity)?.setSupportActionBar(toolbar) toolbar.setNavigationOnClickListener { activity?.onBackPressed() } - btn_tokens_save_changes.setOnClickListener { store.dispatch(TokensAction.TokensList.SaveChanges)} setupPopularTokensRecyclerView() + btn_tokens_save_changes.setOnClickListener { + store.dispatch(TokensAction.SaveChanges(viewAdapter.getAddedItems())) + } } private fun setupPopularTokensRecyclerView() { viewAdapter = CurrenciesAdapter() + viewAdapter.setOnItemAddListener { + btn_tokens_save_changes.isEnabled = viewAdapter.getAddedItems().isNotEmpty() + } + rv_popular_tokens.layoutManager = LinearLayoutManager(context) rv_popular_tokens.adapter = viewAdapter } @@ -74,8 +80,6 @@ class AddTokensFragment : Fragment(R.layout.fragment_add_tokens), override fun newState(state: TokensState) { if (activity == null) return - btn_tokens_save_changes.isEnabled = state.candidateToAdd.isNotEmpty() - viewAdapter.addedCurrencies = state.addedCurrencies viewAdapter.submitUnfilteredList(state.shownCurrencies) } diff --git a/app/src/main/java/com/tangem/tap/features/tokens/ui/adapters/CurrenciesAdapter.kt b/app/src/main/java/com/tangem/tap/features/tokens/ui/adapters/CurrenciesAdapter.kt index 5935014bf4..b3d0ecdc04 100644 --- a/app/src/main/java/com/tangem/tap/features/tokens/ui/adapters/CurrenciesAdapter.kt +++ b/app/src/main/java/com/tangem/tap/features/tokens/ui/adapters/CurrenciesAdapter.kt @@ -7,6 +7,9 @@ import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.ListAdapter import androidx.recyclerview.widget.RecyclerView import com.squareup.picasso.Picasso +import com.tangem.blockchain.common.Blockchain +import com.tangem.blockchain.common.Token +import com.tangem.common.extensions.VoidCallback import com.tangem.tap.common.extensions.getString import com.tangem.tap.common.extensions.hide import com.tangem.tap.common.extensions.loadCurrenciesIcon @@ -26,11 +29,28 @@ class CurrenciesAdapter : ListAdapter private var unfilteredList = listOf() + private val currentlyAddedItems = mutableListOf() + + private var vhOnItemAddListener: ((CurrencyListItem) -> Unit) = { + currentlyAddedItems.add(it) + onItemAddListener?.invoke() + } + private var onItemAddListener: VoidCallback? = null + fun submitUnfilteredList(list: List) { unfilteredList = list submitList(list) } + fun setOnItemAddListener(itemAddListener: VoidCallback) { + onItemAddListener = itemAddListener + if (currentlyAddedItems.isNotEmpty()) itemAddListener() + } + + fun getAddedItems(): List { + return currentlyAddedItems.toList() + } + override fun getItemViewType(position: Int): Int { return when (currentList[position]) { is CurrencyListItem.TitleListItem -> 0 @@ -46,11 +66,13 @@ class CurrenciesAdapter : ListAdapter ) 1 -> CurrenciesViewHolder( LayoutInflater.from(parent.context) - .inflate(R.layout.item_popular_token, parent, false) + .inflate(R.layout.item_popular_token, parent, false), + vhOnItemAddListener ) else -> CurrenciesViewHolder( LayoutInflater.from(parent.context) - .inflate(R.layout.item_popular_token, parent, false) + .inflate(R.layout.item_popular_token, parent, false), + vhOnItemAddListener ) } } @@ -60,7 +82,7 @@ class CurrenciesAdapter : ListAdapter if (holder is TitleViewHolder && listItem is CurrencyListItem.TitleListItem) { holder.bind(listItem) } else if (holder is CurrenciesViewHolder) { - holder.bind(listItem, addedCurrencies) + holder.bind(listItem, addedCurrencies, currentlyAddedItems) } } @@ -104,56 +126,78 @@ class CurrenciesAdapter : ListAdapter submitList(list) } - class CurrenciesViewHolder(val view: View) : RecyclerView.ViewHolder(view) { + class CurrenciesViewHolder( + private val view: View, + private val onItemAddListener: ((CurrencyListItem) -> Unit), + ) : RecyclerView.ViewHolder(view) { - fun bind(currency: CurrencyListItem, addedCurrencies: CardCurrencies?) { + fun bind( + currency: CurrencyListItem, + addedCurrencies: CardCurrencies?, + currentlyAddedItems: MutableList + ) { when (currency) { is CurrencyListItem.BlockchainListItem -> { - val blockchain = currency.blockchain - view.tv_currency_name.text = blockchain.fullName - view.tv_currency_symbol.text = blockchain.currency - currency.isAdded = addedCurrencies?.blockchains?.contains(blockchain) == true - modifyAddTokenButton(currency) - - Picasso.get().loadCurrenciesIcon( - imageView = view.iv_currency, - textView = view.tv_token_letter, - blockchain = blockchain, token = null - ) - - view.btn_add_token.setOnClickListener { - store.dispatch(TokensAction.TokensList.AddBlockchain(blockchain)) - currency.isAdded = !currency.isAdded - modifyAddTokenButton(currency) - } + val addedBlockchains = addedCurrencies?.blockchains ?: listOf() + val currentlyAdded = currentlyAddedItems.filterIsInstance() + bindBlockchain(currency, addedBlockchains, currentlyAdded) } is CurrencyListItem.TokenListItem -> { - val token = currency.token - view.tv_currency_name.text = token.name - view.tv_currency_symbol.text = token.symbol - - currency.isAdded = addedCurrencies?.tokens - ?.any { - it.symbol == token.symbol && it.contractAddress == token.contractAddress - } == true - modifyAddTokenButton(currency) - - Picasso.get().loadCurrenciesIcon( - imageView = view.iv_currency, - textView = view.tv_token_letter, - token = token, blockchain = token.blockchain - ) - view.btn_add_token.setOnClickListener { - store.dispatch(TokensAction.TokensList.AddToken(token)) - currency.isAdded = !currency.isAdded - modifyAddTokenButton(currency) - } + val addedTokens = addedCurrencies?.tokens ?: listOf() + val currentlyAdded = currentlyAddedItems.filterIsInstance() + bindToken(currency, addedTokens, currentlyAdded) } } } + private fun bindBlockchain( + currency: CurrencyListItem.BlockchainListItem, + addedBlockchains: List, + currentlyAdded: List + ) { + val blockchain = currency.blockchain + Picasso.get().loadCurrenciesIcon(view.iv_currency, view.tv_token_letter, null, blockchain) + + view.tv_currency_name.text = blockchain.fullName + view.tv_currency_symbol.text = blockchain.currency + view.btn_add_token.setOnClickListener { + onItemAddListener.invoke(currency) + currency.isAdded = true + modifyAddTokenButton(currency) + } + + val isAddedBefore = addedBlockchains.contains(blockchain) + val isCurrentlyAdded = currentlyAdded.any { it.blockchain == blockchain } + currency.isAdded = isAddedBefore || isCurrentlyAdded + modifyAddTokenButton(currency) + } + + private fun bindToken( + currency: CurrencyListItem.TokenListItem, + addedTokens: List, + currentlyAdded: List + ) { + val token = currency.token + Picasso.get().loadCurrenciesIcon(view.iv_currency, view.tv_token_letter, token, token.blockchain) + + view.tv_currency_name.text = token.name + view.tv_currency_symbol.text = token.symbol + view.btn_add_token.setOnClickListener { + onItemAddListener.invoke(currency) + currency.isAdded = true + modifyAddTokenButton(currency) + } + + val isAddedBefore = addedTokens.any { it == token } + val isCurrentlyAdded = currentlyAdded.any { it.token == token } + currency.isAdded = isAddedBefore || isCurrentlyAdded + + modifyAddTokenButton(currency) + } + private fun modifyAddTokenButton(currency: CurrencyListItem) { if (currency.isLock) { + view.btn_add_token.setText(R.string.common_add) view.btn_add_token.isEnabled = false } else { val text = if (currency.isAdded) R.string.add_token_added else R.string.common_add From 850beb1ec10f908de8e49d51b6970d88565495e8 Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 8 Dec 2021 16:30:02 +0300 Subject: [PATCH 09/10] Updated on 2026-08-14 --- .../features/wallet/redux/middlewares/MultiWalletMiddleware.kt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/MultiWalletMiddleware.kt b/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/MultiWalletMiddleware.kt index 7d93d65312..2906fca76b 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/MultiWalletMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/MultiWalletMiddleware.kt @@ -84,6 +84,7 @@ class MultiWalletMiddleware { } is WalletAction.MultiWallet.FindBlockchainsInUse -> { val scanResponse = globalState.scanResponse ?: return + if (scanResponse.isTangemWallet()) return val cardFirmware = scanResponse.card.firmwareVersion val blockchains = currenciesRepository.getBlockchains(cardFirmware) @@ -123,6 +124,7 @@ class MultiWalletMiddleware { } is WalletAction.MultiWallet.FindTokensInUse -> { val scanResponse = globalState.scanResponse ?: return + if (scanResponse.isTangemWallet()) return val walletFactory = tapWalletManager.walletManagerFactory val card = scanResponse.card From eead85f6efe0e1e8d27ccc95c7609db9d9c8f6b1 Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 8 Dec 2021 18:02:39 +0300 Subject: [PATCH 10/10] Updated on 2026-08-14 --- app/build.gradle | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 0d1c8f68ca..058f6937ca 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -77,9 +77,9 @@ dependencies { implementation 'com.google.android.play:core-ktx:1.8.1' coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.5' - implementation 'com.tangem:blockchain:develop-50' - implementation 'com.tangem.tangem-sdk-kotlin:core:develop-104' - implementation 'com.tangem.tangem-sdk-kotlin:android:develop-104' + implementation 'com.tangem:blockchain:develop-51' + implementation 'com.tangem.tangem-sdk-kotlin:core:develop-105' + implementation 'com.tangem.tangem-sdk-kotlin:android:develop-105' // WebView implementation "androidx.browser:browser:1.3.0"