taler-android

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

commit 2f9853c5eeecf7181ca3a386c6d5870e09a70eed
parent 77c51c3919bc25de82cd1d6154dae97083e948cc
Author: Iván Ávalos <avalos@disroot.org>
Date:   Thu, 22 Oct 2026 15:05:09 +0200

[wallet] currency conversion / wire transfer option fixes

Diffstat:
Mwallet/src/main/java/net/taler/wallet/transactions/TransactionDetailScreen.kt | 4+++-
Mwallet/src/main/java/net/taler/wallet/transactions/TransactionManager.kt | 12+++++++++++-
Mwallet/src/main/java/net/taler/wallet/transfer/WireTransferDetailsScreen.kt | 20+++++++++++++++-----
Mwallet/src/main/java/net/taler/wallet/withdraw/TransactionWithdrawalComposable.kt | 10+++++-----
4 files changed, 34 insertions(+), 12 deletions(-)

diff --git a/wallet/src/main/java/net/taler/wallet/transactions/TransactionDetailScreen.kt b/wallet/src/main/java/net/taler/wallet/transactions/TransactionDetailScreen.kt @@ -239,7 +239,9 @@ fun TransactionDetailScreen( modifier = modifier, t = tx, devMode = devMode, - onSelectOption = { it?.let { transactionManager.selectTransferOption(it) } }, + onSelectOption = { account, option -> + transactionManager.selectTransferOption(option, account) + }, onConfirmKyc = { url -> launchInAppBrowser(context, url) }, diff --git a/wallet/src/main/java/net/taler/wallet/transactions/TransactionManager.kt b/wallet/src/main/java/net/taler/wallet/transactions/TransactionManager.kt @@ -92,9 +92,11 @@ class TransactionManager( private val mSelectedTransactionId = MutableStateFlow<String?>(null) private val selectionMutex = Mutex() private val mSelectedTransferOption = MutableStateFlow<TransferOption?>(null) + private val mSelectedTransferAccount = MutableStateFlow<WithdrawalExchangeAccountDetails?>(null) val selectedTransaction = mSelectedTransaction.asStateFlow() val selectedTransferOption = mSelectedTransferOption.asStateFlow() + val selectedTransferAccount = mSelectedTransferAccount.asStateFlow() /** * Streams the [RECENT_LIMIT] most recent transactions for [scopeInfo], as @@ -331,6 +333,8 @@ class TransactionManager( * [selectionMutex] so that an older snapshot cannot overwrite a newer one. */ suspend fun selectTransaction(transactionId: String): Boolean { + mSelectedTransferOption.value = null + mSelectedTransferAccount.value = null mSelectedTransactionId.value = transactionId return refreshSelectedTransaction() } @@ -354,11 +358,17 @@ class TransactionManager( } } - fun selectTransferOption(option: TransferOption) { + fun selectTransferOption( + option: TransferOption?, + account: WithdrawalExchangeAccountDetails? = null, + ) { + mSelectedTransferAccount.value = account mSelectedTransferOption.value = option } fun selectTransaction(tx: Transaction?) = scope.launch { + mSelectedTransferOption.value = null + mSelectedTransferAccount.value = null if (tx == null) { mSelectedTransactionId.value = null mSelectedTransaction.value = null diff --git a/wallet/src/main/java/net/taler/wallet/transfer/WireTransferDetailsScreen.kt b/wallet/src/main/java/net/taler/wallet/transfer/WireTransferDetailsScreen.kt @@ -52,6 +52,7 @@ import net.taler.wallet.transactions.TransactionWithdrawal import net.taler.wallet.transactions.TransferOption import net.taler.wallet.transactions.WithdrawalExchangeAccountDetails import net.taler.wallet.withdraw.TransferData +import net.taler.wallet.withdraw.transferAccounts @Composable fun WireTransferDetailsScreen( @@ -65,6 +66,7 @@ fun WireTransferDetailsScreen( val selectedTx by transactionManager.selectedTransaction.collectAsStateLifecycleAware() val selectedOption by transactionManager.selectedTransferOption.collectAsStateLifecycleAware() + val selectedTransferAccount by transactionManager.selectedTransferAccount.collectAsStateLifecycleAware() val devMode by model.devMode.observeAsState(false) val paytoUri = when (val option = selectedOption) { is TransferOption.Payto -> option.paytoUri @@ -130,11 +132,19 @@ fun WireTransferDetailsScreen( when (tx) { is TransactionWithdrawal -> { - val transferData = remember(option, tx) { - WithdrawalExchangeAccountDetails( - paytoUri = paytoUri, - status = WithdrawalExchangeAccountDetails.Status.Ok, - ).getTransferDetails( + val transferData = remember(option, tx, selectedTransferAccount) { + val account = tx.transferAccounts() + ?.firstOrNull { it.transferOptions.contains(option) } + ?: selectedTransferAccount + ?: WithdrawalExchangeAccountDetails( + paytoUri = paytoUri, + status = WithdrawalExchangeAccountDetails.Status.Ok, + ) + // The account may offer several transfer options with different + // wire methods. Use the selected option's payto URI for the + // instructions, but keep the account's transfer amount and + // currency specification. + account.copy(paytoUri = paytoUri).getTransferDetails( amountRaw = tx.amountRaw, amountEffective = tx.amountEffective, transferOption = option, diff --git a/wallet/src/main/java/net/taler/wallet/withdraw/TransactionWithdrawalComposable.kt b/wallet/src/main/java/net/taler/wallet/withdraw/TransactionWithdrawalComposable.kt @@ -93,7 +93,7 @@ fun transferOptionAt( fun TransactionWithdrawalComposable( t: TransactionWithdrawal, devMode: Boolean, - onSelectOption: (option: TransferOption?) -> Unit, + onSelectOption: (account: WithdrawalExchangeAccountDetails?, option: TransferOption?) -> Unit, onConfirmKyc: (url: String) -> Unit, onConfirmBank: () -> Unit, onConfirmManual: (option: TransferOption?) -> Unit, @@ -120,8 +120,8 @@ fun TransactionWithdrawalComposable( val selectedOption = transferOptionAt(accounts, selectedAccountIndex, selectedOptionIndex) - LaunchedEffect(selectedOption) { - selectedOption?.let { onSelectOption(it) } + LaunchedEffect(selectedAccount, selectedOption) { + onSelectOption(selectedAccount, selectedOption) } val showAccountChooser = accounts != null @@ -320,7 +320,7 @@ fun TransactionWithdrawalComposableSingleQrPreview() { TransactionWithdrawalComposable( t = previewWithdrawalTx, devMode = true, - onSelectOption = {}, + onSelectOption = { _, _ -> }, onConfirmKyc = {}, onConfirmBank = {}, onConfirmManual = {}, @@ -337,7 +337,7 @@ fun TransactionWithdrawalComposableMultiQrPreview() { TransactionWithdrawalComposable( t = previewWithdrawalTx, devMode = true, - onSelectOption = {}, + onSelectOption = { _, _ -> }, onConfirmKyc = {}, onConfirmBank = {}, onConfirmManual = {},