taler-android

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

commit 4a202140b604b6a40574b009d15bc70bf19e2865
parent 3b059d16cf176fe3e06df49dca71ef3b971c41ff
Author: Florian Dold <dold@taler.net>
Date:   Mon, 10 Aug 2026 02:02:33 +0200

Add payto URI copy menu

Diffstat:
Mwallet/src/main/java/net/taler/wallet/transfer/WireTransferDetailsScreen.kt | 48+++++++++++++++++++++++++++++++++++++++++++-----
Mwallet/src/main/res/values/strings.xml | 1+
2 files changed, 44 insertions(+), 5 deletions(-)

diff --git a/wallet/src/main/java/net/taler/wallet/transfer/WireTransferDetailsScreen.kt b/wallet/src/main/java/net/taler/wallet/transfer/WireTransferDetailsScreen.kt @@ -16,17 +16,27 @@ package net.taler.wallet.transfer +import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.padding +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.MoreVert +import androidx.compose.material3.DropdownMenu +import androidx.compose.material3.DropdownMenuItem +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue import androidx.compose.runtime.livedata.observeAsState +import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource +import net.taler.lib.android.copyToClipBoard import net.taler.lib.android.openUri import net.taler.lib.android.shareText import net.taler.wallet.R @@ -57,6 +67,13 @@ fun WireTransferDetailsScreen( val selectedTx by transactionManager.selectedTransaction.collectAsStateLifecycleAware() val selectedOption by transactionManager.selectedTransferOption.collectAsStateLifecycleAware() val devMode by model.devMode.observeAsState(false) + val paytoUri = when (val option = selectedOption) { + is TransferOption.Payto -> option.paytoUri + is TransferOption.SwissQrBill -> option.paytoUri + else -> null + } + var showMenu by remember(paytoUri) { mutableStateOf(false) } + val copyPaytoUri = stringResource(R.string.copy_payto_uri) LaunchedEffect(selectedTx) { if (selectedTx?.txState?.major == Done || @@ -72,6 +89,32 @@ fun WireTransferDetailsScreen( modifier = Modifier.fillMaxSize(), title = { Text(stringResource(R.string.wire_transfer)) }, onNavigateBack = onNavigateBack, + actions = { + if (paytoUri != null) { + Box { + IconButton( + onClick = { showMenu = true }, + ) { + Icon( + Icons.Default.MoreVert, + contentDescription = stringResource(R.string.menu), + ) + } + DropdownMenu( + expanded = showMenu, + onDismissRequest = { showMenu = false }, + ) { + DropdownMenuItem( + text = { Text(copyPaytoUri) }, + onClick = { + showMenu = false + copyToClipBoard(context, copyPaytoUri, paytoUri) + }, + ) + } + } + } + }, ) { paddingValues -> val tx = selectedTx ?: return@GlobalScaffold @@ -88,11 +131,6 @@ fun WireTransferDetailsScreen( } val option = selectedOption - val paytoUri = when (option) { - is TransferOption.Payto -> option.paytoUri - is TransferOption.SwissQrBill -> option.paytoUri - else -> null - } if (paytoUri == null || option == null) return@GlobalScaffold when (tx) { diff --git a/wallet/src/main/res/values/strings.xml b/wallet/src/main/res/values/strings.xml @@ -53,6 +53,7 @@ GNU Taler is immune to many types of fraud such as credit card data theft, phish <!-- The count should be mirrored in RTL languages --> <string name="char_count">%1$d/%2$d</string> <string name="copy" tools:override="true">Copy</string> + <string name="copy_payto_uri">Copy payto URI</string> <string name="currency">Currency</string> <!-- Currency name (payment service) --> <string name="currency_url">%1$s (%2$s)</string>