From 53163f914e8173239188beb01da2570642041b6a Mon Sep 17 00:00:00 2001 From: Iván Ávalos Date: Wed, 28 Feb 2024 10:03:24 -0600 Subject: [wallet] Add proper rendering for x-taler-bank URIs bug 0008532 --- .../net/taler/wallet/withdraw/WithdrawManager.kt | 39 +++++++-- .../taler/wallet/withdraw/manual/ScreenTransfer.kt | 7 ++ .../taler/wallet/withdraw/manual/TransferTaler.kt | 94 ++++++++++++++++++++++ 3 files changed, 132 insertions(+), 8 deletions(-) create mode 100644 wallet/src/main/java/net/taler/wallet/withdraw/manual/TransferTaler.kt (limited to 'wallet/src/main/java/net/taler/wallet/withdraw') diff --git a/wallet/src/main/java/net/taler/wallet/withdraw/WithdrawManager.kt b/wallet/src/main/java/net/taler/wallet/withdraw/WithdrawManager.kt index 231091f..d5438f2 100644 --- a/wallet/src/main/java/net/taler/wallet/withdraw/WithdrawManager.kt +++ b/wallet/src/main/java/net/taler/wallet/withdraw/WithdrawManager.kt @@ -91,11 +91,22 @@ sealed class TransferData { val currency get() = withdrawalAccount.transferAmount?.currency + data class Taler( + override val subject: String, + override val amountRaw: Amount, + override val amountEffective: Amount, + override val withdrawalAccount: WithdrawalExchangeAccountDetails, + val receiverName: String? = null, + val bankUrl: String, + val account: String, + ): TransferData() + data class IBAN( override val subject: String, override val amountRaw: Amount, override val amountEffective: Amount, override val withdrawalAccount: WithdrawalExchangeAccountDetails, + val receiverName: String? = null, val iban: String, ): TransferData() @@ -353,7 +364,7 @@ fun createManualTransferRequired( transactionAmountRaw = amountRaw, transactionAmountEffective = amountEffective, exchangeBaseUrl = exchangeBaseUrl, - withdrawalTransfers = withdrawalAccountList.map { + withdrawalTransfers = withdrawalAccountList.mapNotNull { val uri = Uri.parse(it.paytoUri.replace("receiver-name=", "receiver_name=")) if ("bitcoin".equals(uri.authority, true)) { val msg = uri.getQueryParameter("message").orEmpty() @@ -368,13 +379,25 @@ fun createManualTransferRequired( amountEffective = amountEffective, withdrawalAccount = it.copy(paytoUri = uri.toString()) ) - } else TransferData.IBAN( - iban = uri.lastPathSegment!!, - subject = uri.getQueryParameter("message") ?: "Error: No message in URI", - amountRaw = amountRaw, - amountEffective = amountEffective, - withdrawalAccount = it.copy(paytoUri = uri.toString()) - ) + } else if (uri.authority.equals("x-taler-bank", true)) { + TransferData.Taler( + account = uri.lastPathSegment!!, + bankUrl = uri.pathSegments.first(), + receiverName = uri.getQueryParameter("receiver_name"), + subject = uri.getQueryParameter("message") ?: "Error: No message in URI", + amountRaw = amountRaw, + amountEffective = amountEffective, + withdrawalAccount = it.copy(paytoUri = uri.toString()), + ) + } else if (uri.authority.equals("iban", true)) { + TransferData.IBAN( + iban = uri.lastPathSegment!!, + subject = uri.getQueryParameter("message") ?: "Error: No message in URI", + amountRaw = amountRaw, + amountEffective = amountEffective, + withdrawalAccount = it.copy(paytoUri = uri.toString()), + ) + } else null }, ) diff --git a/wallet/src/main/java/net/taler/wallet/withdraw/manual/ScreenTransfer.kt b/wallet/src/main/java/net/taler/wallet/withdraw/manual/ScreenTransfer.kt index 19cfbdb..b9fd9dd 100644 --- a/wallet/src/main/java/net/taler/wallet/withdraw/manual/ScreenTransfer.kt +++ b/wallet/src/main/java/net/taler/wallet/withdraw/manual/ScreenTransfer.kt @@ -86,6 +86,13 @@ fun ScreenTransfer( horizontalAlignment = Alignment.CenterHorizontally, ) { when (val transfer = selectedTransfer) { + is TransferData.Taler -> TransferTaler( + transfer = transfer, + exchangeBaseUrl = status.exchangeBaseUrl, + transactionAmountRaw = status.transactionAmountRaw, + transactionAmountEffective = status.transactionAmountEffective, + ) + is TransferData.IBAN -> TransferIBAN( transfer = transfer, exchangeBaseUrl = status.exchangeBaseUrl, diff --git a/wallet/src/main/java/net/taler/wallet/withdraw/manual/TransferTaler.kt b/wallet/src/main/java/net/taler/wallet/withdraw/manual/TransferTaler.kt new file mode 100644 index 0000000..e15af89 --- /dev/null +++ b/wallet/src/main/java/net/taler/wallet/withdraw/manual/TransferTaler.kt @@ -0,0 +1,94 @@ +/* + * This file is part of GNU Taler + * (C) 2024 Taler Systems S.A. + * + * GNU Taler is free software; you can redistribute it and/or modify it under the + * terms of the GNU General Public License as published by the Free Software + * Foundation; either version 3, or (at your option) any later version. + * + * GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with + * GNU Taler; see the file COPYING. If not, see + */ + +package net.taler.wallet.withdraw.manual + +import androidx.compose.foundation.BorderStroke +import androidx.compose.foundation.background +import androidx.compose.foundation.border +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.padding +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.colorResource +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.unit.dp +import net.taler.common.Amount +import net.taler.wallet.R +import net.taler.wallet.cleanExchange +import net.taler.wallet.transactions.TransactionInfoComposable +import net.taler.wallet.withdraw.TransferData + +@Composable +fun TransferTaler( + transfer: TransferData.Taler, + exchangeBaseUrl: String, + transactionAmountRaw: Amount, + transactionAmountEffective: Amount, +) { + Column( + modifier = Modifier.padding(all = 16.dp), + horizontalAlignment = Alignment.CenterHorizontally, + ) { + Text( + text = stringResource( + R.string.withdraw_manual_ready_intro, + transfer.amountRaw.toString()), + style = MaterialTheme.typography.bodyLarge, + modifier = Modifier + .padding(vertical = 8.dp) + ) + + Text( + text = stringResource(R.string.withdraw_manual_ready_warning), + style = MaterialTheme.typography.bodyMedium, + color = colorResource(R.color.notice_text), + modifier = Modifier + .align(Alignment.CenterHorizontally) + .padding(all = 8.dp) + .background(colorResource(R.color.notice_background)) + .border(BorderStroke(2.dp, colorResource(R.color.notice_border))) + .padding(all = 16.dp) + ) + + transfer.receiverName?.let { + DetailRow(stringResource(R.string.withdraw_manual_ready_receiver), it) + } + DetailRow(stringResource(R.string.withdraw_manual_ready_account), transfer.account) + DetailRow(stringResource(R.string.withdraw_manual_ready_subject), transfer.subject) + + TransactionInfoComposable( + label = stringResource(R.string.withdraw_bank), + info = cleanExchange(transfer.bankUrl), + ) + + TransactionInfoComposable( + label = stringResource(R.string.withdraw_exchange), + info = cleanExchange(exchangeBaseUrl), + ) + + transfer.withdrawalAccount.transferAmount?.let { amount -> + WithdrawalAmountTransfer( + amountRaw = transactionAmountRaw, + amountEffective = transactionAmountEffective, + conversionAmountRaw = amount, + ) + } + } +} \ No newline at end of file -- cgit v1.2.3