From 1d3c107a938d8655fc5bdaf9921a3ed57a649b62 Mon Sep 17 00:00:00 2001 From: Tangem Date: Thu, 19 Jan 2023 15:09:30 +0300 Subject: [PATCH] Updated on 2026-08-14 --- app/src/main/AndroidManifest.xml | 29 +++++----- .../main/java/com/tangem/tap/MainActivity.kt | 22 +++----- .../com/tangem/tap/common/IntentHandler.kt | 53 ++++++++++++++----- .../features/welcome/redux/WelcomeAction.kt | 2 +- .../welcome/redux/WelcomeMiddleware.kt | 16 ++++-- .../features/welcome/redux/WelcomeReducer.kt | 2 +- .../features/welcome/redux/WelcomeState.kt | 2 +- app/src/main/res/xml/nfc_tech_filter.xml | 7 +-- 8 files changed, 80 insertions(+), 53 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index f09883d42e..5fa1e04d9d 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -3,10 +3,6 @@ xmlns:tools="http://schemas.android.com/tools" package="com.tangem.wallet"> - - @@ -19,6 +15,9 @@ + @@ -51,47 +50,49 @@ android:windowSoftInputMode="adjustResize"> - + - - - - - - + + + + + + diff --git a/app/src/main/java/com/tangem/tap/MainActivity.kt b/app/src/main/java/com/tangem/tap/MainActivity.kt index 98f5a2c65c..4d3d7d4488 100644 --- a/app/src/main/java/com/tangem/tap/MainActivity.kt +++ b/app/src/main/java/com/tangem/tap/MainActivity.kt @@ -116,17 +116,12 @@ class MainActivity : AppCompatActivity(), SnackbarHandler, ActivityResultCallbac super.onResume() notificationsHandler = NotificationsHandler(binding.fragmentContainer) - navigateToInitialScreenIfNeeded() - - intentHandler.handleBackgroundScan(intent) - intentHandler.handleSellCurrencyCallback(intent) + navigateToInitialScreenIfNeeded(intent) } override fun onNewIntent(intent: Intent?) { super.onNewIntent(intent) - intentHandler.handleBackgroundScan(intent) - intentHandler.handleSellCurrencyCallback(intent) - intentHandler.handleWalletConnectLink(intent) + intentHandler.handleIntent(intent, userWalletsListManager.hasSavedUserWallets) } override fun onStart() { @@ -192,29 +187,28 @@ class MainActivity : AppCompatActivity(), SnackbarHandler, ActivityResultCallbac lockUserWalletsTimer?.restart() } - private fun navigateToInitialScreenIfNeeded() { + private fun navigateToInitialScreenIfNeeded(intent: Intent?) { val backStackIsEmpty = supportFragmentManager.backStackEntryCount == 0 val isNotScannedBefore = store.state.globalState.scanResponse == null val isOnboardingServiceNotActive = store.state.globalState.onboardingState.onboardingStarted val isShopNotOpened = store.state.shopState.total != null when { !backStackIsEmpty && isNotScannedBefore && isOnboardingServiceNotActive && isShopNotOpened -> { - navigateToInitialScreen() + navigateToInitialScreen(intent) } backStackIsEmpty -> { - navigateToInitialScreen() + navigateToInitialScreen(intent) } } } - private fun navigateToInitialScreen() { + private fun navigateToInitialScreen(intent: Intent?) { if (userWalletsListManager.hasSavedUserWallets) { - store.dispatchOnMain(WelcomeAction.HandleDeepLink(intent)) store.dispatchOnMain(NavigationAction.NavigateTo(AppScreen.Welcome)) - store.dispatchOnMain(WelcomeAction.ProceedWithBiometrics) + store.dispatchOnMain(WelcomeAction.HandleIntentIfNeeded(intent)) } else { store.dispatchOnMain(NavigationAction.NavigateTo(AppScreen.Home)) - intentHandler.handleWalletConnectLink(intent) + intentHandler.handleIntent(intent, hasSavedUserWallets = false) } store.dispatch(BackupAction.CheckForUnfinishedBackup) } diff --git a/app/src/main/java/com/tangem/tap/common/IntentHandler.kt b/app/src/main/java/com/tangem/tap/common/IntentHandler.kt index ec30d82d45..f1cd3b1027 100644 --- a/app/src/main/java/com/tangem/tap/common/IntentHandler.kt +++ b/app/src/main/java/com/tangem/tap/common/IntentHandler.kt @@ -3,18 +3,33 @@ package com.tangem.tap.common import android.content.Intent import android.nfc.NfcAdapter import android.nfc.Tag +import android.os.Build import com.tangem.tap.common.extensions.removePrefixOrNull -import com.tangem.tap.common.redux.navigation.AppScreen -import com.tangem.tap.common.redux.navigation.NavigationAction import com.tangem.tap.domain.walletconnect.WalletConnectManager import com.tangem.tap.features.details.redux.walletconnect.WalletConnectAction import com.tangem.tap.features.home.redux.HomeAction import com.tangem.tap.features.wallet.redux.WalletAction +import com.tangem.tap.features.welcome.redux.WelcomeAction +import com.tangem.tap.scope import com.tangem.tap.store +import kotlinx.coroutines.delay +import kotlinx.coroutines.launch import timber.log.Timber class IntentHandler { + private val nfcActions = arrayOf( + NfcAdapter.ACTION_NDEF_DISCOVERED, + NfcAdapter.ACTION_TECH_DISCOVERED, + NfcAdapter.ACTION_TAG_DISCOVERED, + ) + + fun handleIntent(intent: Intent?, hasSavedUserWallets: Boolean) { + handleBackgroundScan(intent, hasSavedUserWallets) + handleWalletConnectLink(intent) + handleSellCurrencyCallback(intent) + } + fun handleWalletConnectLink(intent: Intent?) { val wcUri = when (intent?.scheme) { WalletConnectManager.WC_SCHEME -> { @@ -32,19 +47,29 @@ class IntentHandler { } } - fun handleBackgroundScan(intent: Intent?) { - if (intent != null && (NfcAdapter.ACTION_TECH_DISCOVERED == intent.action || - NfcAdapter.ACTION_NDEF_DISCOVERED == intent.action - ) - ) { - val tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG) - if (tag != null) { - intent.action = null - store.dispatch(NavigationAction.NavigateTo(AppScreen.Home)) - store.dispatch(NavigationAction.PopBackTo(AppScreen.Home)) - store.dispatch(HomeAction.ReadCard()) - } + fun handleBackgroundScan(intent: Intent?, hasSavedUserWallets: Boolean): Boolean { + if (intent == null || intent.action !in nfcActions) return false + + val tag: Tag? = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + intent.getParcelableExtra(NfcAdapter.EXTRA_TAG, Tag::class.java) + } else { + @Suppress("DEPRECATION") + intent.getParcelableExtra(NfcAdapter.EXTRA_TAG) } + if (tag == null) return false + + intent.action = null + if (hasSavedUserWallets) { + // TODO: Remove delay after [REDACTED_JIRA] + scope.launch { + delay(timeMillis = 200) + store.dispatch(WelcomeAction.ProceedWithCard) + } + } else { + store.dispatch(HomeAction.ReadCard()) + } + + return true } fun handleSellCurrencyCallback(intent: Intent?) { diff --git a/app/src/main/java/com/tangem/tap/features/welcome/redux/WelcomeAction.kt b/app/src/main/java/com/tangem/tap/features/welcome/redux/WelcomeAction.kt index 681a3cea77..0d248ec7af 100644 --- a/app/src/main/java/com/tangem/tap/features/welcome/redux/WelcomeAction.kt +++ b/app/src/main/java/com/tangem/tap/features/welcome/redux/WelcomeAction.kt @@ -15,7 +15,7 @@ internal sealed interface WelcomeAction : Action { data class Error(val error: TangemError) : WelcomeAction } - data class HandleDeepLink(val intent: Intent?) : WelcomeAction + data class HandleIntentIfNeeded(val intent: Intent?) : WelcomeAction object CloseError : WelcomeAction } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/features/welcome/redux/WelcomeMiddleware.kt b/app/src/main/java/com/tangem/tap/features/welcome/redux/WelcomeMiddleware.kt index b9e142d8ba..4c91a6da7c 100644 --- a/app/src/main/java/com/tangem/tap/features/welcome/redux/WelcomeMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/welcome/redux/WelcomeMiddleware.kt @@ -44,12 +44,14 @@ internal class WelcomeMiddleware { is WelcomeAction.ProceedWithCard -> { proceedWithCard(state) } + is WelcomeAction.HandleIntentIfNeeded -> { + handleInitialIntent(action.intent) + } is WelcomeAction.ProceedWithBiometrics.Error, is WelcomeAction.ProceedWithCard.Error, is WelcomeAction.ProceedWithBiometrics.Success, is WelcomeAction.ProceedWithCard.Success, is WelcomeAction.CloseError, - is WelcomeAction.HandleDeepLink, -> Unit } } @@ -66,7 +68,7 @@ internal class WelcomeMiddleware { store.dispatchOnMain(WelcomeAction.ProceedWithBiometrics.Success) store.onUserWalletSelected(selectedUserWallet) - handleDeepLinkIfNeeded(state.deepLinkIntent) + intentHandler.handleWalletConnectLink(state.intent) } } } @@ -85,13 +87,17 @@ internal class WelcomeMiddleware { store.dispatchOnMain(WelcomeAction.ProceedWithCard.Success) store.onUserWalletSelected(userWallet) - handleDeepLinkIfNeeded(state.deepLinkIntent) + intentHandler.handleWalletConnectLink(state.intent) } } } - private fun handleDeepLinkIfNeeded(intent: Intent?) { - intentHandler.handleWalletConnectLink(intent) + private fun handleInitialIntent(intent: Intent?) { + val isBackgroundScanWasHandled = intentHandler.handleBackgroundScan(intent, hasSavedUserWallets = true) + + if (!isBackgroundScanWasHandled) { + store.dispatchOnMain(WelcomeAction.ProceedWithBiometrics) + } } private suspend inline fun scanCardInternal( diff --git a/app/src/main/java/com/tangem/tap/features/welcome/redux/WelcomeReducer.kt b/app/src/main/java/com/tangem/tap/features/welcome/redux/WelcomeReducer.kt index 42a6d4d0e1..d7d71b7ce0 100644 --- a/app/src/main/java/com/tangem/tap/features/welcome/redux/WelcomeReducer.kt +++ b/app/src/main/java/com/tangem/tap/features/welcome/redux/WelcomeReducer.kt @@ -12,7 +12,7 @@ internal object WelcomeReducer { private fun internalReduce(action: WelcomeAction, state: WelcomeState): WelcomeState { return when (action) { - is WelcomeAction.HandleDeepLink -> state.copy(deepLinkIntent = action.intent) + is WelcomeAction.HandleIntentIfNeeded -> state.copy(intent = action.intent) is WelcomeAction.ProceedWithBiometrics -> state.copy(isUnlockWithBiometricsInProgress = true) is WelcomeAction.ProceedWithCard -> state.copy(isUnlockWithCardInProgress = true) is WelcomeAction.ProceedWithBiometrics.Error -> state.copy( diff --git a/app/src/main/java/com/tangem/tap/features/welcome/redux/WelcomeState.kt b/app/src/main/java/com/tangem/tap/features/welcome/redux/WelcomeState.kt index f40046600d..a8a55d3984 100644 --- a/app/src/main/java/com/tangem/tap/features/welcome/redux/WelcomeState.kt +++ b/app/src/main/java/com/tangem/tap/features/welcome/redux/WelcomeState.kt @@ -7,6 +7,6 @@ import org.rekotlin.StateType data class WelcomeState( val isUnlockWithBiometricsInProgress: Boolean = false, val isUnlockWithCardInProgress: Boolean = false, - val deepLinkIntent: Intent? = null, + val intent: Intent? = null, val error: TangemError? = null, ) : StateType \ No newline at end of file diff --git a/app/src/main/res/xml/nfc_tech_filter.xml b/app/src/main/res/xml/nfc_tech_filter.xml index e2921c8701..6b9426b857 100644 --- a/app/src/main/res/xml/nfc_tech_filter.xml +++ b/app/src/main/res/xml/nfc_tech_filter.xml @@ -1,8 +1,9 @@ - + android.nfc.tech.IsoDep - android.nfc.tech.Ndef + android.nfc.tech.NfcA android.nfc.tech.NfcV + android.nfc.tech.Ndef - \ No newline at end of file +