taler-android

Android apps for GNU Taler (wallet, PoS, cashier)
Log | Files | Refs | README | LICENSE

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:
Mwallet/src/main/AndroidManifest.xml | 31+++++++++++++++++++++++++++++--
Mwallet/src/main/java/net/taler/wallet/main/MainActivity.kt | 33+++++++++++++++++++++++++++++++++
Mwallet/src/main/res/values/strings.xml | 3+++
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>