gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[taler-taler-android] 07/14: [wallet] fixes for templates parsing and UI


From: gnunet
Subject: [taler-taler-android] 07/14: [wallet] fixes for templates parsing and UI
Date: Tue, 26 Sep 2023 18:31:27 +0200

This is an automated email from the git hooks/post-receive script.

torsten-grote pushed a commit to branch master
in repository taler-android.

commit 9837f4ba999b65d611ce2b4d2d2af2d3d437c116
Author: Iván Ávalos <avalos@disroot.org>
AuthorDate: Mon Sep 4 12:53:50 2023 -0600

    [wallet] fixes for templates parsing and UI
---
 .../net/taler/wallet/deposit/PayToUriFragment.kt   |  3 +-
 .../taler/wallet/payment/PayTemplateComposable.kt  | 35 +++++++++++++++-------
 .../taler/wallet/payment/PayTemplateFragment.kt    | 17 +++++------
 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)

-- 
To stop receiving notification emails like this one, please contact
gnunet@gnunet.org.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]