gnunet-svn
[Top][All Lists]
Advanced

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

[taler-taler-android] 08/08: [wallet] Improve pending payments UX and er


From: gnunet
Subject: [taler-taler-android] 08/08: [wallet] Improve pending payments UX and error handling
Date: Wed, 06 Mar 2024 18:38:10 +0100

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 621351c4c9a68e7b14e64e77b5717016be302aa2
Author: Iván Ávalos <avalos@disroot.org>
AuthorDate: Wed Mar 6 10:36:30 2024 -0600

    [wallet] Improve pending payments UX and error handling
---
 .../net/taler/wallet/payment/PayTemplateComposable.kt  | 11 +++++++++--
 .../net/taler/wallet/payment/PayTemplateFragment.kt    | 10 ++--------
 .../java/net/taler/wallet/payment/PaymentManager.kt    |  7 +++----
 .../net/taler/wallet/payment/PromptPaymentFragment.kt  | 18 +++++++++---------
 wallet/src/main/res/values/strings.xml                 |  1 +
 5 files changed, 24 insertions(+), 23 deletions(-)

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 e2a8a64..b6c2fb1 100644
--- a/wallet/src/main/java/net/taler/wallet/payment/PayTemplateComposable.kt
+++ b/wallet/src/main/java/net/taler/wallet/payment/PayTemplateComposable.kt
@@ -57,7 +57,7 @@ fun PayTemplateComposable(
         PayTemplateError(stringResource(R.string.receive_amount_invalid))
     } else if (currencies.isEmpty()) {
         PayTemplateError(stringResource(R.string.payment_balance_insufficient))
-    } else when (payStatus) {
+    } else when (val p = payStatus) {
         is PayStatus.None -> PayTemplateOrderComposable(
             currencies = currencies,
             defaultSummary = defaultSummary,
@@ -70,7 +70,14 @@ fun PayTemplateComposable(
         is PayStatus.Loading -> PayTemplateLoading()
         is PayStatus.AlreadyPaid -> 
PayTemplateError(stringResource(R.string.payment_already_paid))
         is PayStatus.InsufficientBalance -> 
PayTemplateError(stringResource(R.string.payment_balance_insufficient))
-        is PayStatus.Error -> {} // handled in fragment will show bottom sheet 
FIXME white page?
+        is PayStatus.Pending -> {
+            val error = p.error
+            PayTemplateError(if (error != null) {
+                stringResource(R.string.payment_error, error.userFacingMsg)
+            } else {
+                stringResource(R.string.payment_template_error)
+            })
+        }
         is PayStatus.Prepared -> {} // handled in fragment, will redirect
         is PayStatus.Success -> {} // handled by other UI flow, no need for 
content here
     }
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 9712254..4eb2c11 100644
--- a/wallet/src/main/java/net/taler/wallet/payment/PayTemplateFragment.kt
+++ b/wallet/src/main/java/net/taler/wallet/payment/PayTemplateFragment.kt
@@ -84,14 +84,8 @@ class PayTemplateFragment : Fragment() {
                     
findNavController().navigate(R.id.action_promptPayTemplate_to_promptPayment)
                 }
 
-                is PayStatus.Error -> if (payStatus.error != null) {
-                    if (model.devMode.value == true) {
-                        showError(payStatus.error)
-                    } else {
-                        showError(R.string.payment_error, 
payStatus.error.userFacingMsg)
-                    }
-                } else {
-                    showError(getString(R.string.payment_template_error))
+                is PayStatus.Pending -> if (payStatus.error != null && 
model.devMode.value == true) {
+                    showError(payStatus.error)
                 }
 
                 else -> {}
diff --git a/wallet/src/main/java/net/taler/wallet/payment/PaymentManager.kt 
b/wallet/src/main/java/net/taler/wallet/payment/PaymentManager.kt
index 804c6a0..35cd9e6 100644
--- a/wallet/src/main/java/net/taler/wallet/payment/PaymentManager.kt
+++ b/wallet/src/main/java/net/taler/wallet/payment/PaymentManager.kt
@@ -55,7 +55,7 @@ sealed class PayStatus {
         val transactionId: String,
     ) : PayStatus()
 
-    data class Error(
+    data class Pending(
         val transactionId: String? = null,
         val error: TalerErrorInfo? = null,
     ) : PayStatus()
@@ -105,8 +105,7 @@ class PaymentManager(
                     transactionId = response.transactionId,
                     currency = currency,
                 )
-                // TODO: is pending == error always?
-                is ConfirmPayResult.Pending -> PayStatus.Error(
+                is ConfirmPayResult.Pending -> PayStatus.Pending(
                     transactionId = response.transactionId,
                     error = response.lastError,
                 )
@@ -146,7 +145,7 @@ class PaymentManager(
 
     private fun handleError(operation: String, error: TalerErrorInfo) {
         Log.e(TAG, "got $operation error result $error")
-        mPayStatus.value = PayStatus.Error(error = error)
+        mPayStatus.value = PayStatus.Pending(error = error)
     }
 
 }
diff --git 
a/wallet/src/main/java/net/taler/wallet/payment/PromptPaymentFragment.kt 
b/wallet/src/main/java/net/taler/wallet/payment/PromptPaymentFragment.kt
index 656ca08..31c26a0 100644
--- a/wallet/src/main/java/net/taler/wallet/payment/PromptPaymentFragment.kt
+++ b/wallet/src/main/java/net/taler/wallet/payment/PromptPaymentFragment.kt
@@ -131,14 +131,14 @@ class PromptPaymentFragment : Fragment(), 
ProductImageClickListener {
                 navigateToTransaction(payStatus.transactionId)
                 Snackbar.make(requireView(), R.string.payment_already_paid, 
LENGTH_LONG).show()
             }
-            is PayStatus.Error -> {
+            is PayStatus.Pending -> {
                 showLoading(false)
-                if (payStatus.error != null) {
-                    if (model.devMode.value == true) {
-                        showError(payStatus.error)
-                    }
-                    ui.details.errorView.text = 
getString(R.string.payment_error, payStatus.error.userFacingMsg)
-                    ui.details.errorView.fadeIn()
+                paymentManager.resetPayStatus()
+                navigateToTransaction(payStatus.transactionId)
+                if (payStatus.error != null && model.devMode.value == true) {
+                    showError(payStatus.error)
+                } else {
+                    showError(getString(R.string.payment_pending))
                 }
             }
             is PayStatus.None -> {
@@ -174,9 +174,9 @@ class PromptPaymentFragment : Fragment(), 
ProductImageClickListener {
         f.show(parentFragmentManager, "image")
     }
 
-    private fun navigateToTransaction(id: String) {
+    private fun navigateToTransaction(id: String?) {
         lifecycleScope.launch {
-            if (transactionManager.selectTransaction(id)) {
+            if (id != null && transactionManager.selectTransaction(id)) {
                 
findNavController().navigate(R.id.action_promptPayment_to_nav_transactions_detail_payment)
             } else {
                 
findNavController().navigate(R.id.action_promptPayment_to_nav_main)
diff --git a/wallet/src/main/res/values/strings.xml 
b/wallet/src/main/res/values/strings.xml
index 829061d..48ec647 100644
--- a/wallet/src/main/res/values/strings.xml
+++ b/wallet/src/main/res/values/strings.xml
@@ -132,6 +132,7 @@ GNU Taler is immune against many types of fraud, such as 
phishing of credit card
     <string name="payment_label_amount_total">Total Amount:</string>
     <string name="payment_label_order_summary">Purchase</string>
     <string name="payment_error">Error: %s</string>
+    <string name="payment_pending">Payment not completed, it will be 
retried</string>
     <string name="payment_balance_insufficient">Balance insufficient!</string>
     <string name="payment_aborted">Aborted</string>
     <string name="payment_failed">Failed</string>

-- 
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]