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
+