From 8f6200b7d50e61acc37cf9853d3608e79e4b7eee Mon Sep 17 00:00:00 2001 From: Tangem Date: Sun, 8 Jan 2023 20:34:56 +0300 Subject: [PATCH] Updated on 2026-08-14 --- .../tap/domain/scanCard/ScanCardProcessor.kt | 32 ++++++++++++------- .../disclaimer/redux/DisclaimerAction.kt | 15 ++++----- .../disclaimer/redux/DisclaimerMiddleware.kt | 14 ++++---- .../disclaimer/redux/DisclaimerReducer.kt | 8 +++-- .../disclaimer/redux/DisclaimerState.kt | 7 ++-- .../redux/WalletSelectorMiddleware.kt | 14 +++++--- .../tap/persistence/DisclaimerPrefStorage.kt | 5 +++ 7 files changed, 57 insertions(+), 38 deletions(-) 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 d940a338ad..42e199481b 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 @@ -22,6 +22,7 @@ import com.tangem.tap.common.redux.global.GlobalAction import com.tangem.tap.common.redux.navigation.AppScreen import com.tangem.tap.common.redux.navigation.NavigationAction import com.tangem.tap.features.disclaimer.redux.DisclaimerAction +import com.tangem.tap.features.disclaimer.redux.DisclaimerCallback import com.tangem.tap.features.disclaimer.redux.DisclaimerType import com.tangem.tap.features.disclaimer.redux.isAccepted import com.tangem.tap.features.onboarding.OnboardingHelper @@ -48,7 +49,8 @@ object ScanCardProcessor { cardId: String? = null, onProgressStateChange: suspend (showProgress: Boolean) -> Unit = {}, onScanStateChange: suspend (scanInProgress: Boolean) -> Unit = {}, - onWalletNotCreated: suspend (() -> Unit) = {}, + onWalletNotCreated: suspend () -> Unit = {}, + disclaimerWillShow: () -> Unit = {}, onFailure: suspend (error: TangemError) -> Unit = {}, onSuccess: suspend (scanResponse: ScanResponse) -> Unit = {}, ) = withMainContext { @@ -83,6 +85,8 @@ object ScanCardProcessor { showDisclaimerIfNeed( scanResponse = scanResponse1, onProgressStateChange = onProgressStateChange, + disclaimerWillShow = disclaimerWillShow, + onFailure = onFailure, nextHandler = { scanResponse2 -> onScanSuccess( scanResponse = scanResponse2, @@ -128,8 +132,10 @@ object ScanCardProcessor { private suspend inline fun showDisclaimerIfNeed( scanResponse: ScanResponse, + crossinline disclaimerWillShow: () -> Unit = {}, crossinline onProgressStateChange: suspend (showProgress: Boolean) -> Unit, crossinline nextHandler: suspend (ScanResponse) -> Unit, + crossinline onFailure: suspend (error: TangemError) -> Unit, ) { val disclaimerType = DisclaimerType.get(scanResponse) store.dispatchOnMain(DisclaimerAction.SetDisclaimerType(disclaimerType)) @@ -138,18 +144,22 @@ object ScanCardProcessor { nextHandler((scanResponse)) } else scope.launch(Dispatchers.Main) { delay(DELAY_SDK_DIALOG_CLOSE) + disclaimerWillShow() store.dispatchOnMain( DisclaimerAction.Show( - onAcceptCallback = { - scope.launch(Dispatchers.Main) { - nextHandler(scanResponse) - } - }, - onDismissCallback = { - scope.launch(Dispatchers.Main) { - onProgressStateChange(false) - } - }, + callback = DisclaimerCallback( + onAccept = { + scope.launch(Dispatchers.Main) { + nextHandler(scanResponse) + } + }, + onDismiss = { + scope.launch(Dispatchers.Main) { + onProgressStateChange(false) + onFailure(TangemSdkError.UserCancelled()) + } + }, + ), ), ) } diff --git a/app/src/main/java/com/tangem/tap/features/disclaimer/redux/DisclaimerAction.kt b/app/src/main/java/com/tangem/tap/features/disclaimer/redux/DisclaimerAction.kt index 5461c66441..395137228c 100644 --- a/app/src/main/java/com/tangem/tap/features/disclaimer/redux/DisclaimerAction.kt +++ b/app/src/main/java/com/tangem/tap/features/disclaimer/redux/DisclaimerAction.kt @@ -10,18 +10,17 @@ sealed class DisclaimerAction : Action { ) : DisclaimerAction() data class Show( - val onAcceptCallback: VoidCallback? = null, - val onDismissCallback: VoidCallback? = null, + val callback: DisclaimerCallback? = null, ) : DisclaimerAction() data class AcceptDisclaimer(val type: DisclaimerType) : DisclaimerAction() internal data class UpdateState(val type: DisclaimerType, val accepted: Boolean) : DisclaimerAction() - internal data class SetCallbacks( - val onAcceptCallback: VoidCallback? = null, - val onDismissCallback: VoidCallback? = null, - ) : DisclaimerAction() - object OnBackPressed : DisclaimerAction() -} \ No newline at end of file +} + +data class DisclaimerCallback( + val onAccept: VoidCallback? = null, + val onDismiss: VoidCallback? = null, +) \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/features/disclaimer/redux/DisclaimerMiddleware.kt b/app/src/main/java/com/tangem/tap/features/disclaimer/redux/DisclaimerMiddleware.kt index 01e5de971a..a604d3275f 100644 --- a/app/src/main/java/com/tangem/tap/features/disclaimer/redux/DisclaimerMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/disclaimer/redux/DisclaimerMiddleware.kt @@ -28,33 +28,31 @@ private fun handleDisclaimerMiddleware(action: Action, appState: AppState) { } is DisclaimerAction.Show -> { handleUpdateState = state.type.createUpdateState() - store.dispatch(DisclaimerAction.SetCallbacks(action.onAcceptCallback, action.onDismissCallback)) store.dispatch(NavigationAction.NavigateTo(AppScreen.Disclaimer)) } is DisclaimerAction.AcceptDisclaimer -> { action.type.accept() handleUpdateState = action.type.createUpdateState() store.dispatch(NavigationAction.PopBackTo()) - state.onAcceptCallback?.invoke() - store.dispatch(DisclaimerAction.SetCallbacks(null, null)) + state.callback?.onAccept?.invoke() } is DisclaimerAction.OnBackPressed -> { - state.onDismissCallback?.invoke() - store.dispatch(DisclaimerAction.SetCallbacks(null, null)) store.dispatch(NavigationAction.PopBackTo()) - + state.callback?.onDismiss?.invoke() } } } private fun DisclaimerType.accept() = when (this) { - DisclaimerType.SaltPay -> preferencesStorage.disclaimerPrefStorage.hasSaltPayTosAccepted = true DisclaimerType.Tangem -> preferencesStorage.disclaimerPrefStorage.hasTangemTosAccepted = true + DisclaimerType.Start2Coin -> preferencesStorage.disclaimerPrefStorage.hasStart2CoinTosAccepted = true + DisclaimerType.SaltPay -> preferencesStorage.disclaimerPrefStorage.hasSaltPayTosAccepted = true } fun DisclaimerType.isAccepted(): Boolean = when (this) { - DisclaimerType.SaltPay -> preferencesStorage.disclaimerPrefStorage.hasSaltPayTosAccepted DisclaimerType.Tangem -> preferencesStorage.disclaimerPrefStorage.hasTangemTosAccepted + DisclaimerType.Start2Coin -> preferencesStorage.disclaimerPrefStorage.hasStart2CoinTosAccepted + DisclaimerType.SaltPay -> preferencesStorage.disclaimerPrefStorage.hasSaltPayTosAccepted } private fun DisclaimerType.createUpdateState(): DisclaimerAction.UpdateState { diff --git a/app/src/main/java/com/tangem/tap/features/disclaimer/redux/DisclaimerReducer.kt b/app/src/main/java/com/tangem/tap/features/disclaimer/redux/DisclaimerReducer.kt index 766c6a42ca..d44d02e993 100644 --- a/app/src/main/java/com/tangem/tap/features/disclaimer/redux/DisclaimerReducer.kt +++ b/app/src/main/java/com/tangem/tap/features/disclaimer/redux/DisclaimerReducer.kt @@ -15,13 +15,15 @@ private fun internalReduce(action: Action, state: AppState): DisclaimerState { val disclaimerState = state.disclaimerState return when (action) { + is DisclaimerAction.Show -> disclaimerState.copy( + callback = action.callback, + ) is DisclaimerAction.UpdateState -> disclaimerState.copy( type = action.type, accepted = action.accepted, ) - is DisclaimerAction.SetCallbacks -> disclaimerState.copy( - onAcceptCallback = action.onAcceptCallback, - onDismissCallback = action.onDismissCallback, + is DisclaimerAction.AcceptDisclaimer, is DisclaimerAction.OnBackPressed -> disclaimerState.copy( + callback = null, ) else -> disclaimerState } diff --git a/app/src/main/java/com/tangem/tap/features/disclaimer/redux/DisclaimerState.kt b/app/src/main/java/com/tangem/tap/features/disclaimer/redux/DisclaimerState.kt index d7ca859973..d8dcbddd2a 100644 --- a/app/src/main/java/com/tangem/tap/features/disclaimer/redux/DisclaimerState.kt +++ b/app/src/main/java/com/tangem/tap/features/disclaimer/redux/DisclaimerState.kt @@ -1,23 +1,23 @@ package com.tangem.tap.features.disclaimer.redux import android.net.Uri -import com.tangem.common.extensions.VoidCallback import com.tangem.domain.common.CardDTO import com.tangem.domain.common.ScanResponse import com.tangem.domain.common.TapWorkarounds.isSaltPay +import com.tangem.domain.common.TapWorkarounds.isStart2Coin import org.rekotlin.StateType data class DisclaimerState( val accepted: Boolean = false, val type: DisclaimerType = DisclaimerType.Tangem, - val onAcceptCallback: VoidCallback? = null, - val onDismissCallback: VoidCallback? = null, + val callback: DisclaimerCallback? = null, ) : StateType sealed class DisclaimerType( val uri: Uri, ) { object Tangem : DisclaimerType(Uri.parse("https://tangem.com/tangem_tos.html")) + object Start2Coin : DisclaimerType(Uri.parse("https://tangem.com/tangem_tos.html")) object SaltPay : DisclaimerType(Uri.parse("https://tangem.com/soltpay_tos.html")) companion object { @@ -25,6 +25,7 @@ sealed class DisclaimerType( fun get(card: CardDTO): DisclaimerType = when { card.isSaltPay -> SaltPay + card.isStart2Coin -> Start2Coin else -> Tangem } } diff --git a/app/src/main/java/com/tangem/tap/features/walletSelector/redux/WalletSelectorMiddleware.kt b/app/src/main/java/com/tangem/tap/features/walletSelector/redux/WalletSelectorMiddleware.kt index cc6642743f..6d284c8b95 100644 --- a/app/src/main/java/com/tangem/tap/features/walletSelector/redux/WalletSelectorMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/walletSelector/redux/WalletSelectorMiddleware.kt @@ -138,7 +138,16 @@ internal class WalletSelectorMiddleware { tangemSdkManager.setAccessCodeRequestPolicy( useBiometricsForAccessCode = preferencesStorage.shouldSaveAccessCodes, ) + ScanCardProcessor.scan( + onWalletNotCreated = { + // No need to rollback policy, continue with the policy set before the card scan + store.dispatchOnMain(WalletSelectorAction.AddWallet.Success) + store.dispatchOnMain(NavigationAction.PopBackTo(AppScreen.Wallet)) + }, + disclaimerWillShow = { + store.dispatchOnMain(NavigationAction.PopBackTo()) + }, onSuccess = { scanResponse -> saveUserWalletAndPopBackToWalletScreen(scanResponse) .doOnFailure { error -> @@ -152,11 +161,6 @@ internal class WalletSelectorMiddleware { tangemSdkManager.setAccessCodeRequestPolicy(prevUseBiometricsForAccessCode) store.dispatchOnMain(WalletSelectorAction.AddWallet.Error(error)) }, - onWalletNotCreated = { - // No need to rollback policy, continue with the policy set before the card scan - store.dispatchOnMain(WalletSelectorAction.AddWallet.Success) - store.dispatchOnMain(NavigationAction.PopBackTo(AppScreen.Wallet)) - }, ) } diff --git a/app/src/main/java/com/tangem/tap/persistence/DisclaimerPrefStorage.kt b/app/src/main/java/com/tangem/tap/persistence/DisclaimerPrefStorage.kt index 7c016eaa5d..ffffa7ba40 100644 --- a/app/src/main/java/com/tangem/tap/persistence/DisclaimerPrefStorage.kt +++ b/app/src/main/java/com/tangem/tap/persistence/DisclaimerPrefStorage.kt @@ -14,12 +14,17 @@ class DisclaimerPrefStorage( get() = preferences.getBoolean(KEY_TANGEM_TOS, false) set(value) = preferences.edit { putBoolean(KEY_TANGEM_TOS, value) } + var hasStart2CoinTosAccepted: Boolean + get() = preferences.getBoolean(KEY_START_2_COIN_TOS, false) + set(value) = preferences.edit { putBoolean(KEY_START_2_COIN_TOS, value) } + var hasSaltPayTosAccepted: Boolean get() = preferences.getBoolean(KEY_SALT_PAY_TOS, false) set(value) = preferences.edit { putBoolean(KEY_SALT_PAY_TOS, value) } companion object { private const val KEY_TANGEM_TOS = "tangem_tos_accepted" + private const val KEY_START_2_COIN_TOS = "s2c_tos_accepted" private const val KEY_SALT_PAY_TOS = "saltPay_tos_accepted" } } \ No newline at end of file