Updated on 2026-08-14

This commit is contained in:
Tangem 2024-05-29 15:22:52 +01:00
parent 3ec1b5c88e
commit 590888db59
6 changed files with 33 additions and 10 deletions

View file

@ -2,10 +2,13 @@ package com.tangem.tap
import android.Manifest import android.Manifest
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.app.PendingIntent
import android.content.Intent import android.content.Intent
import android.content.IntentFilter
import android.content.pm.ActivityInfo import android.content.pm.ActivityInfo
import android.content.pm.PackageManager import android.content.pm.PackageManager
import android.content.res.Configuration import android.content.res.Configuration
import android.nfc.NfcAdapter
import android.os.Build import android.os.Build
import android.os.Bundle import android.os.Bundle
import android.view.View import android.view.View
@ -290,12 +293,31 @@ class MainActivity : AppCompatActivity(), SnackbarHandler, ActivityResultCallbac
override fun onResume() { override fun onResume() {
super.onResume() super.onResume()
val nfcAdapter = NfcAdapter.getDefaultAdapter(this)
val pendingIntent = PendingIntent.getActivity(
this,
0,
Intent(this, javaClass).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP),
PendingIntent.FLAG_ONE_SHOT or PendingIntent.FLAG_IMMUTABLE,
)
val intentFilters = arrayOf(
IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED),
IntentFilter(NfcAdapter.ACTION_TAG_DISCOVERED),
IntentFilter(NfcAdapter.ACTION_TECH_DISCOVERED),
)
nfcAdapter.enableForegroundDispatch(this, pendingIntent, intentFilters, null)
// TODO: RESEARCH! NotificationsHandler is created in onResume and destroyed in onStop // TODO: RESEARCH! NotificationsHandler is created in onResume and destroyed in onStop
notificationsHandler = NotificationsHandler(binding.fragmentContainer) notificationsHandler = NotificationsHandler(binding.fragmentContainer)
navigateToInitialScreenIfNeeded(intent) navigateToInitialScreenIfNeeded(intent)
} }
override fun onPause() {
super.onPause()
val nfcAdapter = NfcAdapter.getDefaultAdapter(this)
nfcAdapter.disableForegroundDispatch(this)
}
override fun onStop() { override fun onStop() {
notificationsHandler = null notificationsHandler = null
dialogManager.onStop() dialogManager.onStop()
@ -348,7 +370,7 @@ class MainActivity : AppCompatActivity(), SnackbarHandler, ActivityResultCallbac
cardSdkLifecycleObserver.onCreate(context = this) cardSdkLifecycleObserver.onCreate(context = this)
lifecycleScope.launch { lifecycleScope.launch {
intentProcessor.handleIntent(intent) intentProcessor.handleIntent(intent, true)
} }
if (intent != null) { if (intent != null) {
@ -456,7 +478,7 @@ class MainActivity : AppCompatActivity(), SnackbarHandler, ActivityResultCallbac
} else { } else {
store.dispatch(NavigationAction.NavigateTo(AppScreen.Home)) store.dispatch(NavigationAction.NavigateTo(AppScreen.Home))
lifecycleScope.launch { lifecycleScope.launch {
intentProcessor.handleIntent(intentWhichStartedActivity) intentProcessor.handleIntent(intentWhichStartedActivity, false)
} }
} }

View file

@ -7,5 +7,5 @@ import android.content.Intent
*/ */
interface IntentHandler { interface IntentHandler {
fun handleIntent(intent: Intent?): Boolean fun handleIntent(intent: Intent?, isFromForeground: Boolean): Boolean
} }

View file

@ -19,9 +19,9 @@ class IntentProcessor {
intentHandlers.clear() intentHandlers.clear()
} }
fun handleIntent(intent: Intent?) { fun handleIntent(intent: Intent?, isFromForeground: Boolean) {
intentHandlers.forEach { intentHandlers.forEach {
it.handleIntent(intent) it.handleIntent(intent, isFromForeground)
} }
} }
} }

View file

@ -25,7 +25,8 @@ class BackgroundScanIntentHandler(
NfcAdapter.ACTION_TAG_DISCOVERED, NfcAdapter.ACTION_TAG_DISCOVERED,
) )
override fun handleIntent(intent: Intent?): Boolean { override fun handleIntent(intent: Intent?, isFromForeground: Boolean): Boolean {
if (isFromForeground) return true
if (intent == null || intent.action !in nfcActions) return false if (intent == null || intent.action !in nfcActions) return false
val tag: Tag? = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { val tag: Tag? = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {

View file

@ -14,7 +14,7 @@ import java.net.URLDecoder
*/ */
class WalletConnectLinkIntentHandler : IntentHandler { class WalletConnectLinkIntentHandler : IntentHandler {
override fun handleIntent(intent: Intent?): Boolean { override fun handleIntent(intent: Intent?, isFromForeground: Boolean): Boolean {
val intentData = intent?.data ?: return false val intentData = intent?.data ?: return false
val scheme = intent.scheme ?: return false val scheme = intent.scheme ?: return false

View file

@ -70,7 +70,7 @@ internal class WelcomeMiddleware {
scope = scope, scope = scope,
hasSavedUserWalletsProvider = { true }, hasSavedUserWalletsProvider = { true },
) )
val isBackgroundScanHandled = handler.handleIntent(initialIntent) val isBackgroundScanHandled = handler.handleIntent(initialIntent, isFromForeground = false)
val hasUncompletedBackup = backupService.hasIncompletedBackup val hasUncompletedBackup = backupService.hasIncompletedBackup
if (!isBackgroundScanHandled && !hasUncompletedBackup) { if (!isBackgroundScanHandled && !hasUncompletedBackup) {
@ -103,7 +103,7 @@ internal class WelcomeMiddleware {
store.onUserWalletSelected(userWallet = selectedUserWallet) store.onUserWalletSelected(userWallet = selectedUserWallet)
afterUnlockIntent?.let { afterUnlockIntent?.let {
WalletConnectLinkIntentHandler().handleIntent(it) WalletConnectLinkIntentHandler().handleIntent(it, false)
} }
} }
} }
@ -135,7 +135,7 @@ internal class WelcomeMiddleware {
store.onUserWalletSelected(userWallet = userWallet) store.onUserWalletSelected(userWallet = userWallet)
afterScanIntent?.let { afterScanIntent?.let {
WalletConnectLinkIntentHandler().handleIntent(it) WalletConnectLinkIntentHandler().handleIntent(it, false)
} }
} }
} }