taler-android

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

commit 67d766bbfd44ef5648faa1861359e8dd0c8e2b62
parent 0b400a106c49f0b4c83e35d8d81c5a574210d900
Author: Iván Ávalos <avalos@disroot.org>
Date:   Thu, 21 Nov 2024 15:05:02 +0100

[android] QC: clarify that deposit must be to your own bank account + show exchange URL in peer-push-credit

Diffstat:
Awallet/src/main/java/net/taler/wallet/compose/WarningLabel.kt | 46++++++++++++++++++++++++++++++++++++++++++++++
Mwallet/src/main/java/net/taler/wallet/deposit/MakeDepositComposable.kt | 23++++++++++++++++++++++-
Mwallet/src/main/java/net/taler/wallet/peer/OutgoingPushComposable.kt | 39++++++++++++++++++++++++++-------------
Mwallet/src/main/java/net/taler/wallet/peer/PeerManager.kt | 2++
Mwallet/src/main/java/net/taler/wallet/withdraw/manual/TransferIBAN.kt | 18++++--------------
Mwallet/src/main/res/values/strings.xml | 1+
6 files changed, 101 insertions(+), 28 deletions(-)

diff --git a/wallet/src/main/java/net/taler/wallet/compose/WarningLabel.kt b/wallet/src/main/java/net/taler/wallet/compose/WarningLabel.kt @@ -0,0 +1,45 @@ +/* + * 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 <http://www.gnu.org/licenses/> + */ + +package net.taler.wallet.compose + +import androidx.compose.foundation.BorderStroke +import androidx.compose.foundation.background +import androidx.compose.foundation.border +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.Modifier +import androidx.compose.ui.res.colorResource +import androidx.compose.ui.unit.dp +import net.taler.wallet.R + +@Composable +fun WarningLabel( + label: String, + modifier: Modifier = Modifier, +) { + Text( + text = label, + style = MaterialTheme.typography.bodyMedium, + color = colorResource(R.color.notice_text), + modifier = modifier + .background(colorResource(R.color.notice_background)) + .border(BorderStroke(2.dp, colorResource(R.color.notice_border))) + .padding(all = 16.dp) + ) +} +\ No newline at end of file diff --git a/wallet/src/main/java/net/taler/wallet/deposit/MakeDepositComposable.kt b/wallet/src/main/java/net/taler/wallet/deposit/MakeDepositComposable.kt @@ -53,6 +53,7 @@ import net.taler.wallet.R import net.taler.wallet.backend.TalerErrorCode import net.taler.wallet.backend.TalerErrorInfo import net.taler.wallet.compose.AmountCurrencyField +import net.taler.wallet.compose.WarningLabel import net.taler.wallet.peer.OutgoingError import net.taler.wallet.peer.PeerErrorComposable import net.taler.wallet.transactions.AmountType.Negative @@ -152,6 +153,11 @@ fun MakeDepositComposable( ) } + WarningLabel( + modifier = Modifier.padding(16.dp), + label = stringResource(R.string.send_deposit_account_warning), + ) + when(selectedWireType) { WireType.IBAN -> { var ibanError by rememberSaveable { mutableStateOf(false) } @@ -344,7 +350,22 @@ fun PreviewMakeDepositComposable() { defaultCurrency = "KUDOS", currencies = listOf("KUDOS", "TESTKUDOS", "NETZBON"), getCurrencySpec = { null }, - getDepositWireTypes = { GetDepositWireTypesForCurrencyResponse(listOf(), listOf())}, + getDepositWireTypes = { GetDepositWireTypesForCurrencyResponse( + wireTypes = listOf( + WireType.IBAN, + WireType.TalerBank, + ), + wireTypeDetails = listOf( + WireTypeDetails( + paymentTargetType = WireType.IBAN, + talerBankHostnames = listOf("bank.test.taler.net") + ), + WireTypeDetails( + paymentTargetType = WireType.TalerBank, + talerBankHostnames = listOf("bank.test.taler.net") + ), + ), + )}, checkDeposit = { _, _ -> CheckDepositResult.Success( totalDepositCost = Amount.fromJSONString("KUDOS:10"), effectiveDepositAmount = Amount.fromJSONString("KUDOS:12"), diff --git a/wallet/src/main/java/net/taler/wallet/peer/OutgoingPushComposable.kt b/wallet/src/main/java/net/taler/wallet/peer/OutgoingPushComposable.kt @@ -38,7 +38,6 @@ import androidx.compose.ui.Alignment.Companion.CenterHorizontally import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.res.stringResource -import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import kotlinx.serialization.json.JsonPrimitive @@ -48,12 +47,14 @@ import net.taler.wallet.BottomInsetsSpacer import net.taler.wallet.R import net.taler.wallet.backend.TalerErrorCode import net.taler.wallet.backend.TalerErrorInfo +import net.taler.wallet.cleanExchange import net.taler.wallet.compose.AmountCurrencyField import net.taler.wallet.compose.TalerSurface import net.taler.wallet.exchanges.ExchangeTosStatus import net.taler.wallet.peer.CheckFeeResult.InsufficientBalance import net.taler.wallet.peer.CheckFeeResult.None import net.taler.wallet.peer.CheckFeeResult.Success +import net.taler.wallet.transactions.TransactionInfoComposable import net.taler.wallet.useDebounce import kotlin.random.Random @@ -173,20 +174,14 @@ fun OutgoingPushIntroComposable( MaterialTheme.colorScheme.error } else Color.Unspecified, ) - } - ) - - Text( - modifier = Modifier - .fillMaxWidth() - .padding(top = 5.dp), - color = if (subject.isBlank()) MaterialTheme.colorScheme.error else Color.Unspecified, - text = stringResource(R.string.char_count, subject.length, MAX_LENGTH_SUBJECT), - textAlign = TextAlign.End, + }, + supportingText = { + Text(stringResource(R.string.char_count, subject.length, MAX_LENGTH_SUBJECT)) + }, ) Text( - modifier = Modifier.padding(top = 16.dp, start = 16.dp, end = 16.dp), + modifier = Modifier.padding(top = 8.dp, start = 16.dp, end = 16.dp), text = stringResource(R.string.send_peer_expiration_period), style = MaterialTheme.typography.bodyMedium, ) @@ -194,12 +189,26 @@ fun OutgoingPushIntroComposable( var option by rememberSaveable { mutableStateOf(DEFAULT_EXPIRY) } var hours by rememberSaveable { mutableLongStateOf(DEFAULT_EXPIRY.hours) } ExpirationComposable( - modifier = Modifier.padding(top = 8.dp, bottom = 16.dp), + modifier = Modifier.padding(vertical = 8.dp), option = option, hours = hours, onOptionChange = { option = it } ) { hours = it } + AnimatedVisibility(feeResult is Success) { + (feeResult as? Success)?.let { + Column( + modifier = Modifier.padding(bottom = 8.dp), + horizontalAlignment = CenterHorizontally, + ) { + TransactionInfoComposable( + label = stringResource(id = R.string.withdraw_exchange), + info = cleanExchange(it.exchangeBaseUrl), + ) + } + } + } + Button( enabled = feeResult is Success && subject.isNotBlank(), onClick = { onSend(amount, subject, hours) }, @@ -223,6 +232,7 @@ fun PeerPushComposableCreatingPreview() { getFees = { Success( amountEffective = Amount.fromJSONString("KUDOS:10"), amountRaw = Amount.fromJSONString("KUDOS:12"), + exchangeBaseUrl = "https://exchange.demo.taler.net" ) }, onSend = { _, _, _ -> }, onClose = {}, @@ -244,6 +254,7 @@ fun PeerPushComposableCheckingPreview() { amountEffective = Amount.fromJSONString("KUDOS:10"), amountRaw = Amount.fromJSONString("KUDOS:12"), maxDepositAmountEffective = Amount.fromJSONString("KUDOS:12"), + exchangeBaseUrl = "https://exchange.demo.taler.net" ) }, onSend = { _, _, _ -> }, onClose = {}, @@ -267,6 +278,7 @@ fun PeerPushComposableCheckedPreview() { amountEffective = Amount.fromJSONString("KUDOS:10"), amountRaw = Amount.fromJSONString("KUDOS:12"), maxDepositAmountEffective = Amount.fromJSONString("KUDOS:12"), + exchangeBaseUrl = "https://exchange.demo.taler.net" ) }, onSend = { _, _, _ -> }, onClose = {}, @@ -289,6 +301,7 @@ fun PeerPushComposableErrorPreview() { amountEffective = Amount.fromJSONString("KUDOS:10"), amountRaw = Amount.fromJSONString("KUDOS:12"), maxDepositAmountEffective = Amount.fromJSONString("KUDOS:12"), + exchangeBaseUrl = "https://exchange.demo.taler.net" ) }, onSend = { _, _, _ -> }, onClose = {}, diff --git a/wallet/src/main/java/net/taler/wallet/peer/PeerManager.kt b/wallet/src/main/java/net/taler/wallet/peer/PeerManager.kt @@ -63,6 +63,7 @@ sealed class CheckFeeResult { data class Success( val amountRaw: Amount, val amountEffective: Amount, + val exchangeBaseUrl: String, override val maxDepositAmountEffective: Amount? = null, ): CheckFeeResult() } @@ -153,6 +154,7 @@ class PeerManager( amountRaw = it.amountRaw, amountEffective = it.amountEffective, maxDepositAmountEffective = max?.effectiveAmount, + exchangeBaseUrl = it.exchangeBaseUrl, ) }.onError { error -> Log.e(TAG, "got checkPeerPushDebit error result $error") diff --git a/wallet/src/main/java/net/taler/wallet/withdraw/manual/TransferIBAN.kt b/wallet/src/main/java/net/taler/wallet/withdraw/manual/TransferIBAN.kt @@ -16,9 +16,6 @@ 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 @@ -26,12 +23,12 @@ 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.compose.WarningLabel import net.taler.wallet.transactions.TransactionInfoComposable import net.taler.wallet.withdraw.TransferData @@ -61,16 +58,9 @@ fun TransferIBAN( .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) + WarningLabel( + modifier = Modifier.padding(8.dp), + label = stringResource(R.string.withdraw_manual_ready_warning), ) DetailRow( diff --git a/wallet/src/main/res/values/strings.xml b/wallet/src/main/res/values/strings.xml @@ -215,6 +215,7 @@ GNU Taler is immune against many types of fraud, such as phishing of credit card <string name="pay_peer_intro">Do you want to pay this request?</string> <string name="pay_peer_title">Pay request</string> <string name="send_deposit_account">Account</string> + <string name="send_deposit_account_warning">You must enter an account that you control, otherwise you will not be able to fulfill the regulatory requirements.</string> <string name="send_deposit_bitcoin_address">Bitcoin address</string> <string name="send_deposit_bitcoin_create_button">Transfer Bitcoin</string> <string name="send_deposit_button_label">Deposit</string>