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:
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>