summaryrefslogtreecommitdiff
path: root/wallet/src/main/java/net/taler
diff options
context:
space:
mode:
authorIván Ávalos <avalos@disroot.org>2023-09-04 12:53:50 -0600
committerTorsten Grote <t@grobox.de>2023-09-26 18:30:52 +0200
commit9837f4ba999b65d611ce2b4d2d2af2d3d437c116 (patch)
tree94466d120a05062cbb421f25cb94795f12dbb59e /wallet/src/main/java/net/taler
parent68a3c7ca5c615c35e3066780b909d2acb9eb3c8a (diff)
downloadtaler-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')
-rw-r--r--wallet/src/main/java/net/taler/wallet/deposit/PayToUriFragment.kt3
-rw-r--r--wallet/src/main/java/net/taler/wallet/payment/PayTemplateComposable.kt35
-rw-r--r--wallet/src/main/java/net/taler/wallet/payment/PayTemplateFragment.kt17
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)