commit 32fcb65e12cdec6913dd993d954a77429575051f
parent e9f56b1fa9605d457f2d210a336950c3e901db6d
Author: Iván Ávalos <avalos@disroot.org>
Date: Tue, 27 Oct 2026 16:15:30 +0100
[wallet] fix NFC handling for Android SDK 37
Diffstat:
3 files changed, 65 insertions(+), 2 deletions(-)
diff --git a/wallet/src/main/AndroidManifest.xml b/wallet/src/main/AndroidManifest.xml
@@ -59,7 +59,7 @@
<activity
android:name=".main.MainActivity"
android:exported="true"
- android:launchMode="singleInstance"
+ android:launchMode="singleTask"
android:theme="@style/AppTheme.NoActionBar"
android:windowSoftInputMode="adjustResize"
android:configChanges="keyboardHidden|orientation|screenSize|uiMode">
@@ -69,7 +69,6 @@
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW" />
- <action android:name="android.nfc.action.NDEF_DISCOVERED"/>
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
@@ -91,6 +90,34 @@
</intent-filter>
</activity>
+ <!--
+ Dedicated NFC entry point. Keeping it as an alias leaves the
+ launcher activity above free to change independently.
+ If the app targets SDK 37 again, this alias must additionally be
+ protected by android.permission.DISPATCH_NFC_MESSAGE.
+ -->
+ <activity-alias
+ android:name=".main.NfcEntryActivity"
+ android:targetActivity=".main.MainActivity"
+ android:exported="true"
+ android:permission="android.permission.DISPATCH_NFC_MESSAGE">
+ <intent-filter>
+ <action android:name="android.nfc.action.NDEF_DISCOVERED" />
+
+ <category android:name="android.intent.category.DEFAULT" />
+
+ <data android:scheme="taler" />
+ <data
+ android:scheme="TALER"
+ tools:ignore="AppLinkUrlError" />
+ <data android:scheme="ext+taler" />
+ <data
+ android:scheme="EXT+TALER"
+ tools:ignore="AppLinkUrlError" />
+ <data android:scheme="payto" />
+ </intent-filter>
+ </activity-alias>
+
<service
android:name="net.taler.lib.android.TalerNfcService"
android:exported="true"
diff --git a/wallet/src/main/java/net/taler/wallet/main/MainActivity.kt b/wallet/src/main/java/net/taler/wallet/main/MainActivity.kt
@@ -138,6 +138,18 @@ class MainActivity : FragmentActivity() {
val databaseMigrationState by model.databaseMigrationState.collectAsState()
val walletUnlocked = !biometricEnabled || authenticated || !biometricAvailable
+ var nfcTagIntentBlocked by remember { mutableStateOf(false) }
+ LaunchedEffect(Unit) {
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.BAKLAVA) {
+ val adapter = NfcAdapter.getDefaultAdapter(this@MainActivity)
+ if (adapter?.isTagIntentAppPreferenceSupported == true &&
+ !adapter.isTagIntentAllowed
+ ) {
+ nfcTagIntentBlocked = true
+ }
+ }
+ }
+
val logExportLauncher = rememberLauncherForActivityResult(CreateDocument("text/plain")) { uri ->
uri?.let { model.settingsManager.exportLogcat(it) }
}
@@ -203,6 +215,27 @@ class MainActivity : FragmentActivity() {
)
}
+ if (nfcTagIntentBlocked) {
+ AlertDialog(
+ onDismissRequest = { nfcTagIntentBlocked = false },
+ title = { Text(stringResource(R.string.nfc_tag_intent_disabled_title)) },
+ text = { Text(stringResource(R.string.nfc_tag_intent_disabled_message)) },
+ confirmButton = {
+ TextButton(onClick = {
+ nfcTagIntentBlocked = false
+ startActivity(Intent(NfcAdapter.ACTION_CHANGE_TAG_INTENT_PREFERENCE))
+ }) {
+ Text(stringResource(R.string.nfc_tag_intent_open_settings))
+ }
+ },
+ dismissButton = {
+ TextButton(onClick = { nfcTagIntentBlocked = false }) {
+ Text(stringResource(R.string.cancel))
+ }
+ }
+ )
+ }
+
if (showDbExportConfirm) {
AlertDialog(
onDismissRequest = { showDbExportConfirm = false },
diff --git a/wallet/src/main/res/values/strings.xml b/wallet/src/main/res/values/strings.xml
@@ -83,6 +83,9 @@ GNU Taler is immune to many types of fraud such as credit card data theft, phish
<string name="nfc_not_available">NFC not available</string>
<string name="nfc_scanning">Tap NFC tag to write confirmation codes</string>
<string name="nfc_write_success">Confirmation codes written</string>
+ <string name="nfc_tag_intent_disabled_title">NFC tag scanning is disabled</string>
+ <string name="nfc_tag_intent_disabled_message">Android is currently blocking this app from opening when an NFC tag is scanned. Enable \"Launch via NFC\" for the Taler wallet to open NFC links automatically.</string>
+ <string name="nfc_tag_intent_open_settings">Open settings</string>
<string name="ok">OK</string>
<string name="open">Open</string>
<string name="paste">Paste</string>