diff options
author | Iván Ávalos <avalos@disroot.org> | 2023-09-04 12:53:50 -0600 |
---|---|---|
committer | Torsten Grote <t@grobox.de> | 2023-09-26 18:30:52 +0200 |
commit | 9837f4ba999b65d611ce2b4d2d2af2d3d437c116 (patch) | |
tree | 94466d120a05062cbb421f25cb94795f12dbb59e /wallet/src/main/java/net/taler | |
parent | 68a3c7ca5c615c35e3066780b909d2acb9eb3c8a (diff) | |
download | taler-android-9837f4ba999b65d611ce2b4d2d2af2d3d437c116.tar.gz taler-android-9837f4ba999b65d611ce2b4d2d2af2d3d437c116.tar.bz2 taler-android-9837f4ba999b65d611ce2b4d2d2af2d3d437c116.zip |
[wallet] fixes for templates parsing and UI
Diffstat (limited to 'wallet/src/main/java/net/taler')
3 files changed, 35 insertions, 20 deletions
diff --git a/wallet/src/main/java/net/taler/wallet/deposit/PayToUriFragment.kt b/wallet/src/main/java/net/taler/wallet/deposit/PayToUriFragment.kt index 81f3617..2584763 100644 --- a/wallet/src/main/java/net/taler/wallet/deposit/PayToUriFragment.kt +++ b/wallet/src/main/java/net/taler/wallet/deposit/PayToUriFragment.kt @@ -195,6 +195,7 @@ fun CurrencyDropdown( onCurrencyChanged: (String) -> Unit, modifier: Modifier = Modifier, initialCurrency: String? = null, + readOnly: Boolean = false, ) { val initialIndex = currencies.indexOf(initialCurrency).let { if (it < 0) 0 else it } var selectedIndex by remember { mutableStateOf(initialIndex) } @@ -204,7 +205,7 @@ fun CurrencyDropdown( ) { OutlinedTextField( modifier = Modifier - .clickable(onClick = { expanded = true }), + .clickable(onClick = { if (!readOnly) expanded = true }), value = currencies[selectedIndex], onValueChange = { }, readOnly = true, diff --git a/wallet/src/main/java/net/taler/wallet/payment/PayTemplateComposable.kt b/wallet/src/main/java/net/taler/wallet/payment/PayTemplateComposable.kt index a5812c0..8bbff03 100644 --- a/wallet/src/main/java/net/taler/wallet/payment/PayTemplateComposable.kt +++ b/wallet/src/main/java/net/taler/wallet/payment/PayTemplateComposable.kt @@ -47,10 +47,19 @@ import net.taler.wallet.R import net.taler.wallet.compose.TalerSurface import net.taler.wallet.deposit.CurrencyDropdown +sealed class AmountFieldStatus { + object FixedAmount: AmountFieldStatus() + class Default( + val amountStr: String? = null, + val currency: String? = null, + ): AmountFieldStatus() + object Invalid: AmountFieldStatus() +} + @Composable fun PayTemplateComposable( summary: String?, - amountResult: AmountResult?, + amountStatus: AmountFieldStatus, currencies: List<String>, payStatus: PayStatus, onCreateAmount: (String, String) -> AmountResult, @@ -59,7 +68,7 @@ fun PayTemplateComposable( ) { // If wallet is empty, there's no way the user can pay something - if (amountResult is AmountResult.InvalidAmount) { + if (amountStatus is AmountFieldStatus.Invalid) { PayTemplateError(stringResource(R.string.receive_amount_invalid)) } else if (payStatus is PayStatus.InsufficientBalance || currencies.isEmpty()) { PayTemplateError(stringResource(R.string.payment_balance_insufficient)) @@ -67,7 +76,7 @@ fun PayTemplateComposable( is PayStatus.None -> PayTemplateDefault( currencies = currencies, summary = summary, - amount = amountResult?.let { (it as AmountResult.Success).amount }, + amountStatus = amountStatus, onCreateAmount = onCreateAmount, onError = onError, onSubmit = { s, a -> @@ -90,13 +99,17 @@ fun PayTemplateComposable( fun PayTemplateDefault( currencies: List<String>, summary: String? = null, - amount: Amount? = null, + amountStatus: AmountFieldStatus, onCreateAmount: (String, String) -> AmountResult, onError: (msgRes: Int) -> Unit, onSubmit: (summary: String?, amount: Amount?) -> Unit, ) { var localSummary by remember { mutableStateOf(summary) } - var localAmount by remember { mutableStateOf(amount) } + var localAmount by remember { mutableStateOf( + (amountStatus as? AmountFieldStatus.Default)?.let { s -> + Amount.fromString(s.currency ?: currencies[0], s.amountStr ?: "0") + } + ) } Column(horizontalAlignment = End) { localSummary?.let { summary -> @@ -119,6 +132,7 @@ fun PayTemplateDefault( .fillMaxWidth(), amount = amount, currencies = currencies, + fixedCurrency = (amountStatus as? AmountFieldStatus.Default)?.currency != null, onAmountChosen = { localAmount = it }, ) } @@ -175,6 +189,7 @@ fun PayTemplateLoading() { private fun AmountField( modifier: Modifier = Modifier, currencies: List<String>, + fixedCurrency: Boolean, amount: Amount, onAmountChosen: (Amount) -> Unit, ) { @@ -182,7 +197,6 @@ private fun AmountField( modifier = modifier, ) { val amountText = if (amount.value == 0L) "" else amount.value.toString() - val currency = currencies.find { amount.currency == it } ?: currencies[0] OutlinedTextField( modifier = Modifier .padding(end = 16.dp) @@ -191,9 +205,9 @@ private fun AmountField( placeholder = { Text("0") }, onValueChange = { input -> if (input.isNotBlank()) { - onAmountChosen(Amount.fromString(currency, input)) + onAmountChosen(Amount.fromString(amount.currency, input)) } else { - onAmountChosen(Amount.zero(currency)) + onAmountChosen(Amount.zero(amount.currency)) } }, keyboardOptions = KeyboardOptions.Default.copy(keyboardType = KeyboardType.Decimal), @@ -202,11 +216,12 @@ private fun AmountField( ) CurrencyDropdown( modifier = Modifier.weight(1f), - initialCurrency = currency, + initialCurrency = amount.currency, currencies = currencies, onCurrencyChanged = { c -> onAmountChosen(Amount.fromString(c, amount.amountStr)) }, + readOnly = fixedCurrency, ) } } @@ -217,7 +232,7 @@ fun PayTemplateComposablePreview() { TalerSurface { PayTemplateComposable( summary = "Donation", - amountResult = AmountResult.Success(Amount("ARS", 20L, 0)), + amountStatus = AmountFieldStatus.Default("ARS", "20"), currencies = listOf("KUDOS", "ARS"), // TODO create previews for other states payStatus = PayStatus.None, diff --git a/wallet/src/main/java/net/taler/wallet/payment/PayTemplateFragment.kt b/wallet/src/main/java/net/taler/wallet/payment/PayTemplateFragment.kt index 93fe48c..c4b8132 100644 --- a/wallet/src/main/java/net/taler/wallet/payment/PayTemplateFragment.kt +++ b/wallet/src/main/java/net/taler/wallet/payment/PayTemplateFragment.kt @@ -29,9 +29,7 @@ import androidx.fragment.app.activityViewModels import androidx.lifecycle.asFlow import androidx.navigation.NavOptions import androidx.navigation.fragment.findNavController -import net.taler.common.Amount import net.taler.common.showError -import net.taler.wallet.AmountResult import net.taler.wallet.MainViewModel import net.taler.wallet.R import net.taler.wallet.compose.TalerSurface @@ -56,15 +54,16 @@ class PayTemplateFragment : Fragment() { val summary = if ("summary" in queryParams) uri.getQueryParameter("summary")!! else null - val amountResult = if ("amount" in queryParams) { + val amountStatus = if ("amount" in queryParams) { val amount = uri.getQueryParameter("amount")!! - val parts = amount.split(':') + val parts = if (amount.isEmpty()) emptyList() else amount.split(":") when (parts.size) { - 1 -> AmountResult.Success(Amount.fromString(parts[0], "0")) - 2 -> AmountResult.Success(Amount.fromString(parts[0], parts[1])) - else -> AmountResult.InvalidAmount + 0 -> AmountFieldStatus.Default() + 1 -> AmountFieldStatus.Default(currency = parts[0]) + 2 -> AmountFieldStatus.Default(parts[0], parts[1]) + else -> AmountFieldStatus.Invalid } - } else null + } else AmountFieldStatus.FixedAmount return ComposeView(requireContext()).apply { setContent { @@ -75,7 +74,7 @@ class PayTemplateFragment : Fragment() { PayTemplateComposable( currencies = model.getCurrencies(), summary = summary, - amountResult = amountResult, + amountStatus = amountStatus, payStatus = payStatus, onCreateAmount = { text, currency -> model.createAmount(text, currency) |