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.annotation.SuppressLint
import android.app.PendingIntent
import android.content.Intent
import android.content.IntentFilter
import android.content.pm.ActivityInfo
import android.content.pm.PackageManager
import android.content.res.Configuration
import android.nfc.NfcAdapter
import android.os.Build
import android.os.Bundle
import android.view.View
@ -290,12 +293,31 @@ class MainActivity : AppCompatActivity(), SnackbarHandler, ActivityResultCallbac
override fun 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
notificationsHandler = NotificationsHandler(binding.fragmentContainer)
navigateToInitialScreenIfNeeded(intent)
}
override fun onPause() {
super.onPause()
val nfcAdapter = NfcAdapter.getDefaultAdapter(this)
nfcAdapter.disableForegroundDispatch(this)
}
override fun onStop() {
notificationsHandler = null
dialogManager.onStop()
@ -348,7 +370,7 @@ class MainActivity : AppCompatActivity(), SnackbarHandler, ActivityResultCallbac
cardSdkLifecycleObserver.onCreate(context = this)
lifecycleScope.launch {
intentProcessor.handleIntent(intent)
intentProcessor.handleIntent(intent, true)
}
if (intent != null) {
@ -456,7 +478,7 @@ class MainActivity : AppCompatActivity(), SnackbarHandler, ActivityResultCallbac
} else {
store.dispatch(NavigationAction.NavigateTo(AppScreen.Home))
lifecycleScope.launch {
intentProcessor.handleIntent(intentWhichStartedActivity)
intentProcessor.handleIntent(intentWhichStartedActivity, false)
}
}

View file

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

View file

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

View file

@ -25,7 +25,8 @@ class BackgroundScanIntentHandler(
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
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 {
override fun handleIntent(intent: Intent?): Boolean {
override fun handleIntent(intent: Intent?, isFromForeground: Boolean): Boolean {
val intentData = intent?.data ?: return false
val scheme = intent.scheme ?: return false

View file

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