gnunet-svn
[Top][All Lists]
Advanced

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

[taler-taler-android] branch master updated (b490d94 -> 621351c)


From: gnunet
Subject: [taler-taler-android] branch master updated (b490d94 -> 621351c)
Date: Wed, 06 Mar 2024 18:38:02 +0100

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

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

    from b490d94      [wallet] Tweaks for non-dev settings
     new 8185330      [wallet] More logical order of amounts
     new 0574cad      [wallet] Don't show JSON errors to non-devs
     new 993e5ab  [wallet] Fix serialization error of "pending" payments
     new 6120660      [wallet] Fix label of invoiced amount in peer pull credit 
tx
     new da3d59b      [wallet] Fix NullPointerException in base64 decoding of 
product image
     new eac4bca  [wallet] Generalize some string resources
     new 917a017  [wallet] Add refresh-expired minor state
     new 621351c  [wallet] Improve pending payments UX and error handling

The 8 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../net/taler/wallet/balances/BalancesFragment.kt  |  7 ++-
 .../taler/wallet/deposit/MakeDepositComposable.kt  | 10 +---
 .../wallet/deposit/TransactionDepositComposable.kt | 16 +++--
 .../taler/wallet/payment/PayTemplateComposable.kt  | 11 +++-
 .../taler/wallet/payment/PayTemplateFragment.kt    |  8 +--
 .../net/taler/wallet/payment/PaymentManager.kt     |  8 +--
 .../net/taler/wallet/payment/PaymentResponses.kt   |  2 +-
 .../net/taler/wallet/payment/ProductAdapter.kt     | 21 +++----
 .../taler/wallet/payment/PromptPaymentFragment.kt  | 14 +++--
 .../wallet/payment/TransactionPaymentComposable.kt | 16 +++--
 .../wallet/peer/IncomingPullPaymentFragment.kt     |  7 ++-
 .../wallet/peer/IncomingPushPaymentFragment.kt     |  7 ++-
 .../taler/wallet/peer/TransactionPeerPullCredit.kt | 16 ++---
 .../taler/wallet/peer/TransactionPeerPullDebit.kt  | 13 ++--
 .../taler/wallet/peer/TransactionPeerPushCredit.kt | 15 +++--
 .../taler/wallet/peer/TransactionPeerPushDebit.kt  | 12 ++--
 .../transactions/TransactionDetailFragment.kt      | 37 ++++++++++--
 .../taler/wallet/transactions/TransactionState.kt  |  3 +
 .../wallet/transactions/TransactionsFragment.kt    |  7 ++-
 .../main/res/layout/fragment_prompt_withdraw.xml   | 70 +++++++++++-----------
 wallet/src/main/res/values/strings.xml             |  6 +-
 21 files changed, 188 insertions(+), 118 deletions(-)

diff --git a/wallet/src/main/java/net/taler/wallet/balances/BalancesFragment.kt 
b/wallet/src/main/java/net/taler/wallet/balances/BalancesFragment.kt
index 466246d..cfbbc46 100644
--- a/wallet/src/main/java/net/taler/wallet/balances/BalancesFragment.kt
+++ b/wallet/src/main/java/net/taler/wallet/balances/BalancesFragment.kt
@@ -29,6 +29,7 @@ import androidx.fragment.app.activityViewModels
 import androidx.recyclerview.widget.DividerItemDecoration
 import androidx.recyclerview.widget.LinearLayoutManager.VERTICAL
 import net.taler.common.fadeIn
+import net.taler.common.showError
 import net.taler.wallet.MainViewModel
 import net.taler.wallet.balances.BalanceState.Error
 import net.taler.wallet.balances.BalanceState.Loading
@@ -87,7 +88,11 @@ class BalancesFragment : Fragment(),
                     ui.mainList.fadeIn()
                 }
             }
-            is Error -> showError(state.error)
+            is Error -> if (model.devMode.value == true) {
+                showError(state.error)
+            } else {
+                showError(state.error.userFacingMsg)
+            }
         }
     }
 
diff --git 
a/wallet/src/main/java/net/taler/wallet/deposit/MakeDepositComposable.kt 
b/wallet/src/main/java/net/taler/wallet/deposit/MakeDepositComposable.kt
index 2fc4d55..97e2eb0 100644
--- a/wallet/src/main/java/net/taler/wallet/deposit/MakeDepositComposable.kt
+++ b/wallet/src/main/java/net/taler/wallet/deposit/MakeDepositComposable.kt
@@ -123,12 +123,8 @@ fun MakeDepositComposable(
             }
         )
         TransactionAmountComposable(
-            label = if (state.effectiveDepositAmount == null) {
-                stringResource(R.string.amount_chosen)
-            } else {
-                stringResource(R.string.send_deposit_amount_effective)
-            },
-            amount = state.effectiveDepositAmount ?: amount,
+            label = stringResource(R.string.amount_chosen),
+            amount = amount,
             amountType = Positive,
         )
         AnimatedVisibility(visible = state.showFees) {
@@ -148,7 +144,7 @@ fun MakeDepositComposable(
 
                 TransactionAmountComposable(
                     label = stringResource(R.string.send_amount),
-                    amount = totalAmount,
+                    amount = effectiveAmount,
                     amountType = Positive,
                 )
             }
diff --git 
a/wallet/src/main/java/net/taler/wallet/deposit/TransactionDepositComposable.kt 
b/wallet/src/main/java/net/taler/wallet/deposit/TransactionDepositComposable.kt
index 1d5c91e..807d631 100644
--- 
a/wallet/src/main/java/net/taler/wallet/deposit/TransactionDepositComposable.kt
+++ 
b/wallet/src/main/java/net/taler/wallet/deposit/TransactionDepositComposable.kt
@@ -68,16 +68,13 @@ fun TransactionDepositComposable(
             text = t.timestamp.ms.toAbsoluteTime(context).toString(),
             style = MaterialTheme.typography.bodyLarge,
         )
+
         TransactionAmountComposable(
-            label = stringResource(id = R.string.transaction_paid),
-            amount = t.amountEffective,
-            amountType = AmountType.Negative,
-        )
-        TransactionAmountComposable(
-            label = stringResource(id = R.string.transaction_order_total),
+            label = stringResource(id = R.string.amount_chosen),
             amount = t.amountRaw,
             amountType = AmountType.Neutral,
         )
+
         val fee = t.amountEffective - t.amountRaw
         if (!fee.isZero()) {
             TransactionAmountComposable(
@@ -86,6 +83,13 @@ fun TransactionDepositComposable(
                 amountType = AmountType.Negative,
             )
         }
+
+        TransactionAmountComposable(
+            label = stringResource(id = R.string.amount_sent),
+            amount = t.amountEffective,
+            amountType = AmountType.Negative,
+        )
+
         TransitionsComposable(t, devMode, onTransition)
         if (devMode && t.error != null) {
             ErrorTransactionButton(error = t.error)
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 e05d1bd..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,12 +84,8 @@ class PayTemplateFragment : Fragment() {
                     
findNavController().navigate(R.id.action_promptPayTemplate_to_promptPayment)
                 }
 
-                is PayStatus.Error -> {
-                    if (model.devMode.value == true) {
-                        showError(payStatus.error)
-                    } else {
-                        showError(R.string.payment_template_error, 
payStatus.error.userFacingMsg)
-                    }
+                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 19be280..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,9 +55,9 @@ sealed class PayStatus {
         val transactionId: String,
     ) : PayStatus()
 
-    data class Error(
+    data class Pending(
         val transactionId: String? = null,
-        val error: TalerErrorInfo,
+        val error: TalerErrorInfo? = null,
     ) : PayStatus()
     data class Success(
         val transactionId: String,
@@ -105,7 +105,7 @@ class PaymentManager(
                     transactionId = response.transactionId,
                     currency = currency,
                 )
-                is ConfirmPayResult.Pending -> PayStatus.Error(
+                is ConfirmPayResult.Pending -> PayStatus.Pending(
                     transactionId = response.transactionId,
                     error = response.lastError,
                 )
@@ -145,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/PaymentResponses.kt 
b/wallet/src/main/java/net/taler/wallet/payment/PaymentResponses.kt
index 5e97f58..407f55f 100644
--- a/wallet/src/main/java/net/taler/wallet/payment/PaymentResponses.kt
+++ b/wallet/src/main/java/net/taler/wallet/payment/PaymentResponses.kt
@@ -79,6 +79,6 @@ sealed class ConfirmPayResult {
     @SerialName("pending")
     data class Pending(
         val transactionId: String,
-        val lastError: TalerErrorInfo,
+        val lastError: TalerErrorInfo? = null,
     ) : ConfirmPayResult()
 }
diff --git a/wallet/src/main/java/net/taler/wallet/payment/ProductAdapter.kt 
b/wallet/src/main/java/net/taler/wallet/payment/ProductAdapter.kt
index 35ec18b..289f0d7 100644
--- a/wallet/src/main/java/net/taler/wallet/payment/ProductAdapter.kt
+++ b/wallet/src/main/java/net/taler/wallet/payment/ProductAdapter.kt
@@ -67,17 +67,18 @@ internal class ProductAdapter(private val listener: 
ProductImageClickListener) :
 
         fun bind(product: ContractProduct) {
             quantity.text = product.quantity.toString()
-            if (product.image == null) {
+            val productImage = product.image
+            if (productImage == null) {
                 image.visibility = GONE
-            } else {
-                image.visibility = VISIBLE
-                // product.image was validated before, so non-null below
-                val match = REGEX_PRODUCT_IMAGE.matchEntire(product.image!!)!!
-                val decodedString = Base64.decode(match.groups[2]!!.value, 
Base64.DEFAULT)
-                val bitmap = decodeByteArray(decodedString, 0, 
decodedString.size)
-                image.setImageBitmap(bitmap)
-                image.setOnClickListener {
-                    listener.onImageClick(bitmap)
+            } else REGEX_PRODUCT_IMAGE.matchEntire(productImage)?.let { match 
->
+                match.groups[2]?.value?.let { group ->
+                    image.visibility = VISIBLE
+                    val decodedString = Base64.decode(group, Base64.DEFAULT)
+                    val bitmap = decodeByteArray(decodedString, 0, 
decodedString.size)
+                    image.setImageBitmap(bitmap)
+                    image.setOnClickListener {
+                        listener.onImageClick(bitmap)
+                    }
                 }
             }
             name.text = product.description
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 73da394..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,13 +131,15 @@ 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 (model.devMode.value == true) {
+                paymentManager.resetPayStatus()
+                navigateToTransaction(payStatus.transactionId)
+                if (payStatus.error != null && model.devMode.value == true) {
                     showError(payStatus.error)
+                } else {
+                    showError(getString(R.string.payment_pending))
                 }
-                ui.details.errorView.text = getString(R.string.payment_error, 
payStatus.error.userFacingMsg)
-                ui.details.errorView.fadeIn()
             }
             is PayStatus.None -> {
                 // No payment active.
@@ -172,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/java/net/taler/wallet/payment/TransactionPaymentComposable.kt 
b/wallet/src/main/java/net/taler/wallet/payment/TransactionPaymentComposable.kt
index 7de16b6..5bbbd97 100644
--- 
a/wallet/src/main/java/net/taler/wallet/payment/TransactionPaymentComposable.kt
+++ 
b/wallet/src/main/java/net/taler/wallet/payment/TransactionPaymentComposable.kt
@@ -73,16 +73,13 @@ fun TransactionPaymentComposable(
             text = t.timestamp.ms.toAbsoluteTime(context).toString(),
             style = MaterialTheme.typography.bodyLarge,
         )
-        TransactionAmountComposable(
-            label = stringResource(id = R.string.transaction_paid),
-            amount = t.amountEffective,
-            amountType = AmountType.Negative,
-        )
+
         TransactionAmountComposable(
             label = stringResource(id = R.string.transaction_order_total),
             amount = t.amountRaw,
             amountType = AmountType.Neutral,
         )
+
         val fee = t.amountEffective - t.amountRaw
         if (!fee.isZero()) {
             TransactionAmountComposable(
@@ -91,15 +88,24 @@ fun TransactionPaymentComposable(
                 amountType = AmountType.Negative,
             )
         }
+
+        TransactionAmountComposable(
+            label = stringResource(id = R.string.transaction_paid),
+            amount = t.amountEffective,
+            amountType = AmountType.Negative,
+        )
+
         if (t.posConfirmation != null) {
             TransactionInfoComposable(
                 label = stringResource(id = 
R.string.payment_confirmation_code),
                 info = t.posConfirmation,
             )
         }
+
         PurchaseDetails(info = t.info) {
             onFulfill(t.info.fulfillmentUrl ?: "")
         }
+
         TransitionsComposable(t, devMode, onTransition)
         if (devMode && t.error != null) {
             ErrorTransactionButton(error = t.error)
diff --git 
a/wallet/src/main/java/net/taler/wallet/peer/IncomingPullPaymentFragment.kt 
b/wallet/src/main/java/net/taler/wallet/peer/IncomingPullPaymentFragment.kt
index 87abb47..df71c72 100644
--- a/wallet/src/main/java/net/taler/wallet/peer/IncomingPullPaymentFragment.kt
+++ b/wallet/src/main/java/net/taler/wallet/peer/IncomingPullPaymentFragment.kt
@@ -25,6 +25,7 @@ import androidx.fragment.app.Fragment
 import androidx.fragment.app.activityViewModels
 import androidx.lifecycle.lifecycleScope
 import androidx.navigation.fragment.findNavController
+import net.taler.common.showError
 import net.taler.wallet.MainViewModel
 import net.taler.wallet.R
 import net.taler.wallet.compose.TalerSurface
@@ -45,7 +46,11 @@ class IncomingPullPaymentFragment : Fragment() {
                 if (it is IncomingAccepted) {
                     
findNavController().navigate(R.id.action_promptPullPayment_to_nav_main)
                 } else if (it is IncomingError) {
-                    showError(it.info)
+                    if (model.devMode.value == true) {
+                        showError(it.info)
+                    } else {
+                        showError(it.info.userFacingMsg)
+                    }
                 }
             }
         }
diff --git 
a/wallet/src/main/java/net/taler/wallet/peer/IncomingPushPaymentFragment.kt 
b/wallet/src/main/java/net/taler/wallet/peer/IncomingPushPaymentFragment.kt
index 118104e..ced2b82 100644
--- a/wallet/src/main/java/net/taler/wallet/peer/IncomingPushPaymentFragment.kt
+++ b/wallet/src/main/java/net/taler/wallet/peer/IncomingPushPaymentFragment.kt
@@ -25,6 +25,7 @@ import androidx.fragment.app.Fragment
 import androidx.fragment.app.activityViewModels
 import androidx.lifecycle.lifecycleScope
 import androidx.navigation.fragment.findNavController
+import net.taler.common.showError
 import net.taler.wallet.MainViewModel
 import net.taler.wallet.R
 import net.taler.wallet.compose.TalerSurface
@@ -45,7 +46,11 @@ class IncomingPushPaymentFragment : Fragment() {
                 if (it is IncomingAccepted) {
                     
findNavController().navigate(R.id.action_promptPushPayment_to_nav_main)
                 } else if (it is IncomingError) {
-                    showError(it.info)
+                    if (model.devMode.value == true) {
+                        showError(it.info)
+                    } else {
+                        showError(it.info.userFacingMsg)
+                    }
                 }
             }
         }
diff --git 
a/wallet/src/main/java/net/taler/wallet/peer/TransactionPeerPullCredit.kt 
b/wallet/src/main/java/net/taler/wallet/peer/TransactionPeerPullCredit.kt
index de377fc..898ff69 100644
--- a/wallet/src/main/java/net/taler/wallet/peer/TransactionPeerPullCredit.kt
+++ b/wallet/src/main/java/net/taler/wallet/peer/TransactionPeerPullCredit.kt
@@ -46,15 +46,9 @@ fun ColumnScope.TransactionPeerPullCreditComposable(t: 
TransactionPeerPullCredit
         state = t.txState,
         talerUri = t.talerUri,
     )
-
-    TransactionAmountComposable(
-        label = stringResource(id = R.string.receive_amount),
-        amount = t.amountEffective,
-        amountType = AmountType.Positive,
-    )
-
+    
     TransactionAmountComposable(
-        label = stringResource(id = R.string.amount_chosen),
+        label = stringResource(id = R.string.receive_peer_amount_invoiced),
         amount = t.amountRaw,
         amountType = AmountType.Neutral,
     )
@@ -68,6 +62,12 @@ fun ColumnScope.TransactionPeerPullCreditComposable(t: 
TransactionPeerPullCredit
         )
     }
 
+    TransactionAmountComposable(
+        label = stringResource(id = R.string.amount_received),
+        amount = t.amountEffective,
+        amountType = AmountType.Positive,
+    )
+
     TransactionInfoComposable(
         label = stringResource(id = R.string.send_peer_purpose),
         info = t.info.summary ?: "",
diff --git 
a/wallet/src/main/java/net/taler/wallet/peer/TransactionPeerPullDebit.kt 
b/wallet/src/main/java/net/taler/wallet/peer/TransactionPeerPullDebit.kt
index aa12a8e..783907e 100644
--- a/wallet/src/main/java/net/taler/wallet/peer/TransactionPeerPullDebit.kt
+++ b/wallet/src/main/java/net/taler/wallet/peer/TransactionPeerPullDebit.kt
@@ -39,16 +39,12 @@ import net.taler.wallet.transactions.TransactionState
 
 @Composable
 fun TransactionPeerPullDebitComposable(t: TransactionPeerPullDebit) {
-    TransactionAmountComposable(
-        label = stringResource(id = R.string.transaction_paid),
-        amount = t.amountEffective,
-        amountType = AmountType.Negative,
-    )
     TransactionAmountComposable(
         label = stringResource(id = R.string.transaction_order_total),
         amount = t.amountRaw,
         amountType = AmountType.Neutral,
     )
+    
     val fee = t.amountEffective - t.amountRaw
     if (!fee.isZero()) {
         TransactionAmountComposable(
@@ -57,6 +53,13 @@ fun TransactionPeerPullDebitComposable(t: 
TransactionPeerPullDebit) {
             amountType = AmountType.Negative,
         )
     }
+
+    TransactionAmountComposable(
+        label = stringResource(id = R.string.transaction_paid),
+        amount = t.amountEffective,
+        amountType = AmountType.Negative,
+    )
+
     TransactionInfoComposable(
         label = stringResource(id = R.string.send_peer_purpose),
         info = t.info.summary ?: "",
diff --git 
a/wallet/src/main/java/net/taler/wallet/peer/TransactionPeerPushCredit.kt 
b/wallet/src/main/java/net/taler/wallet/peer/TransactionPeerPushCredit.kt
index 2c1c24c..75d299b 100644
--- a/wallet/src/main/java/net/taler/wallet/peer/TransactionPeerPushCredit.kt
+++ b/wallet/src/main/java/net/taler/wallet/peer/TransactionPeerPushCredit.kt
@@ -40,15 +40,11 @@ import net.taler.wallet.transactions.TransactionState
 @Composable
 fun TransactionPeerPushCreditComposable(t: TransactionPeerPushCredit) {
     TransactionAmountComposable(
-        label = stringResource(id = 
R.string.send_peer_payment_amount_received),
-        amount = t.amountEffective,
-        amountType = AmountType.Positive,
-    )
-    TransactionAmountComposable(
-        label = stringResource(id = R.string.send_peer_payment_amount_sent),
+        label = stringResource(id = R.string.amount_sent),
         amount = t.amountRaw,
         amountType = AmountType.Neutral,
     )
+
     val fee = t.amountRaw - t.amountEffective
     if (!fee.isZero()) {
         TransactionAmountComposable(
@@ -57,6 +53,13 @@ fun TransactionPeerPushCreditComposable(t: 
TransactionPeerPushCredit) {
             amountType = AmountType.Negative,
         )
     }
+
+    TransactionAmountComposable(
+        label = stringResource(id = R.string.amount_received),
+        amount = t.amountEffective,
+        amountType = AmountType.Positive,
+    )
+
     TransactionInfoComposable(
         label = stringResource(id = R.string.send_peer_purpose),
         info = t.info.summary ?: "",
diff --git 
a/wallet/src/main/java/net/taler/wallet/peer/TransactionPeerPushDebit.kt 
b/wallet/src/main/java/net/taler/wallet/peer/TransactionPeerPushDebit.kt
index d83d8fe..909fd47 100644
--- a/wallet/src/main/java/net/taler/wallet/peer/TransactionPeerPushDebit.kt
+++ b/wallet/src/main/java/net/taler/wallet/peer/TransactionPeerPushDebit.kt
@@ -58,12 +58,6 @@ fun ColumnScope.TransactionPeerPushDebitComposable(t: 
TransactionPeerPushDebit)
         talerUri = t.talerUri,
     )
 
-    TransactionAmountComposable(
-        label = stringResource(id = R.string.transaction_paid),
-        amount = t.amountEffective,
-        amountType = AmountType.Negative,
-    )
-
     TransactionAmountComposable(
         label = stringResource(id = R.string.transaction_order_total),
         amount = t.amountRaw,
@@ -79,6 +73,12 @@ fun ColumnScope.TransactionPeerPushDebitComposable(t: 
TransactionPeerPushDebit)
         )
     }
 
+    TransactionAmountComposable(
+        label = stringResource(id = R.string.transaction_paid),
+        amount = t.amountEffective,
+        amountType = AmountType.Negative,
+    )
+
     TransactionInfoComposable(
         label = stringResource(id = R.string.send_peer_purpose),
         info = t.info.summary ?: "",
diff --git 
a/wallet/src/main/java/net/taler/wallet/transactions/TransactionDetailFragment.kt
 
b/wallet/src/main/java/net/taler/wallet/transactions/TransactionDetailFragment.kt
index d799b8e..78b728a 100644
--- 
a/wallet/src/main/java/net/taler/wallet/transactions/TransactionDetailFragment.kt
+++ 
b/wallet/src/main/java/net/taler/wallet/transactions/TransactionDetailFragment.kt
@@ -23,6 +23,7 @@ import androidx.fragment.app.Fragment
 import androidx.fragment.app.activityViewModels
 import androidx.navigation.fragment.findNavController
 import com.google.android.material.dialog.MaterialAlertDialogBuilder
+import net.taler.common.showError
 import net.taler.wallet.MainViewModel
 import net.taler.wallet.R
 import net.taler.wallet.TAG
@@ -98,7 +99,11 @@ abstract class TransactionDetailFragment : Fragment() {
     private fun deleteTransaction(t: Transaction) {
         transactionManager.deleteTransaction(t.transactionId) {
             Log.e(TAG, "Error deleteTransaction $it")
-            showError(it)
+            if (model.devMode.value == true) {
+                showError(it)
+            } else {
+                showError(it.userFacingMsg)
+            }
         }
         findNavController().popBackStack()
     }
@@ -106,35 +111,55 @@ abstract class TransactionDetailFragment : Fragment() {
     private fun retryTransaction(t: Transaction) {
         transactionManager.retryTransaction(t.transactionId) {
             Log.e(TAG, "Error retryTransaction $it")
-            showError(it)
+            if (model.devMode.value == true) {
+                showError(it)
+            } else {
+                showError(it.userFacingMsg)
+            }
         }
     }
 
     private fun abortTransaction(t: Transaction) {
         transactionManager.abortTransaction(t.transactionId) {
             Log.e(TAG, "Error abortTransaction $it")
-            showError(it)
+            if (model.devMode.value == true) {
+                showError(it)
+            } else {
+                showError(it.userFacingMsg)
+            }
         }
     }
 
     private fun failTransaction(t: Transaction) {
         transactionManager.failTransaction(t.transactionId) {
             Log.e(TAG, "Error failTransaction $it")
-            showError(it)
+            if (model.devMode.value == true) {
+                showError(it)
+            } else {
+                showError(it.userFacingMsg)
+            }
         }
     }
 
     private fun suspendTransaction(t: Transaction) {
         transactionManager.suspendTransaction(t.transactionId) {
             Log.e(TAG, "Error suspendTransaction $it")
-            showError(it)
+            if (model.devMode.value == true) {
+                showError(it)
+            } else {
+                showError(it.userFacingMsg)
+            }
         }
     }
 
     private fun resumeTransaction(t: Transaction) {
         transactionManager.resumeTransaction(t.transactionId) {
             Log.e(TAG, "Error resumeTransaction $it")
-            showError(it)
+            if (model.devMode.value == true) {
+                showError(it)
+            } else {
+                showError(it.userFacingMsg)
+            }
         }
     }
 }
diff --git 
a/wallet/src/main/java/net/taler/wallet/transactions/TransactionState.kt 
b/wallet/src/main/java/net/taler/wallet/transactions/TransactionState.kt
index ae581ad..7091c90 100644
--- a/wallet/src/main/java/net/taler/wallet/transactions/TransactionState.kt
+++ b/wallet/src/main/java/net/taler/wallet/transactions/TransactionState.kt
@@ -133,6 +133,9 @@ enum class TransactionMinorState {
     @SerialName("delete-purse")
     DeletePurse,
 
+    @SerialName("refresh-expired")
+    RefreshExpired,
+
     @SerialName("ready")
     Ready,
 
diff --git 
a/wallet/src/main/java/net/taler/wallet/transactions/TransactionsFragment.kt 
b/wallet/src/main/java/net/taler/wallet/transactions/TransactionsFragment.kt
index b898bec..3f610d3 100644
--- a/wallet/src/main/java/net/taler/wallet/transactions/TransactionsFragment.kt
+++ b/wallet/src/main/java/net/taler/wallet/transactions/TransactionsFragment.kt
@@ -40,6 +40,7 @@ import 
com.google.android.material.dialog.MaterialAlertDialogBuilder
 import net.taler.common.Amount
 import net.taler.common.fadeIn
 import net.taler.common.fadeOut
+import net.taler.common.showError
 import net.taler.wallet.MainViewModel
 import net.taler.wallet.R
 import net.taler.wallet.TAG
@@ -240,7 +241,11 @@ class TransactionsFragment : Fragment(), 
OnTransactionClickListener, ActionMode.
                         .setNegativeButton(R.string.transactions_delete) { 
dialog, _ ->
                             
transactionManager.deleteTransactions(transactionIds) {
                                 Log.e(TAG, "Error deleteTransaction $it")
-                                showError(it)
+                                if (model.devMode.value == true) {
+                                    showError(it)
+                                } else {
+                                    showError(it.userFacingMsg)
+                                }
                             }
                             dialog.dismiss()
                         }
diff --git a/wallet/src/main/res/layout/fragment_prompt_withdraw.xml 
b/wallet/src/main/res/layout/fragment_prompt_withdraw.xml
index 748a51a..44d95de 100644
--- a/wallet/src/main/res/layout/fragment_prompt_withdraw.xml
+++ b/wallet/src/main/res/layout/fragment_prompt_withdraw.xml
@@ -22,106 +22,108 @@
     tools:context=".withdraw.PromptWithdrawFragment">
 
     <TextView
-        android:id="@+id/introView"
+        android:id="@+id/chosenAmountLabel"
         android:layout_width="0dp"
         android:layout_height="wrap_content"
         android:layout_marginStart="16dp"
+        android:layout_marginTop="32dp"
         android:layout_marginEnd="16dp"
-        android:layout_marginBottom="8dp"
         android:gravity="center"
-        android:text="@string/withdraw_total"
+        android:text="@string/amount_chosen"
         android:visibility="invisible"
-        app:layout_constraintBottom_toTopOf="@+id/effectiveAmountView"
+        app:layout_constraintBottom_toTopOf="@+id/chosenAmountView"
         app:layout_constraintEnd_toEndOf="parent"
-        app:layout_constraintHorizontal_bias="0.5"
         app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toBottomOf="@+id/effectiveAmountView"
         app:layout_constraintTop_toTopOf="parent"
         app:layout_constraintVertical_chainStyle="packed"
         tools:visibility="visible" />
 
     <TextView
-        android:id="@+id/effectiveAmountView"
+        android:id="@+id/chosenAmountView"
         android:layout_width="0dp"
         android:layout_height="wrap_content"
         android:layout_marginStart="16dp"
+        android:layout_marginTop="8dp"
         android:layout_marginEnd="16dp"
         android:gravity="center"
-        android:textColor="@color/green"
-        android:textSize="24sp"
+        android:textSize="20sp"
         android:visibility="invisible"
-        app:layout_constraintBottom_toTopOf="@+id/chosenAmountLabel"
+        app:layout_constraintBottom_toTopOf="@+id/feeLabel"
         app:layout_constraintEnd_toEndOf="parent"
         app:layout_constraintStart_toStartOf="parent"
-        app:layout_constraintTop_toBottomOf="@+id/introView"
-        tools:text="9.8 TESTKUDOS"
+        app:layout_constraintTop_toBottomOf="@id/chosenAmountLabel"
+        tools:text="10 TESTKUDOS"
         tools:visibility="visible" />
 
     <TextView
-        android:id="@+id/chosenAmountLabel"
+        android:id="@+id/feeLabel"
         android:layout_width="0dp"
         android:layout_height="wrap_content"
         android:layout_marginStart="16dp"
         android:layout_marginTop="32dp"
         android:layout_marginEnd="16dp"
         android:gravity="center"
-        android:text="@string/amount_chosen"
-        android:visibility="invisible"
-        app:layout_constraintBottom_toTopOf="@+id/chosenAmountView"
+        android:text="@string/withdraw_fees"
+        android:visibility="gone"
+        app:layout_constraintBottom_toTopOf="@+id/feeView"
         app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintHorizontal_bias="0.5"
         app:layout_constraintStart_toStartOf="parent"
-        app:layout_constraintTop_toBottomOf="@+id/effectiveAmountView"
+        app:layout_constraintTop_toBottomOf="@+id/chosenAmountView"
         tools:visibility="visible" />
 
     <TextView
-        android:id="@+id/chosenAmountView"
+        android:id="@+id/feeView"
         android:layout_width="0dp"
         android:layout_height="wrap_content"
         android:layout_marginStart="16dp"
         android:layout_marginTop="8dp"
         android:layout_marginEnd="16dp"
         android:gravity="center"
+        android:textColor="?colorError"
         android:textSize="20sp"
-        android:visibility="invisible"
-        app:layout_constraintBottom_toTopOf="@+id/feeLabel"
+        android:visibility="gone"
+        app:layout_constraintBottom_toTopOf="@+id/introView"
         app:layout_constraintEnd_toEndOf="parent"
         app:layout_constraintStart_toStartOf="parent"
-        app:layout_constraintTop_toBottomOf="@+id/chosenAmountLabel"
-        tools:text="10 TESTKUDOS"
+        app:layout_constraintTop_toBottomOf="@+id/feeLabel"
+        tools:text="-0.2 TESTKUDOS"
         tools:visibility="visible" />
 
     <TextView
-        android:id="@+id/feeLabel"
+        android:id="@+id/introView"
         android:layout_width="0dp"
         android:layout_height="wrap_content"
         android:layout_marginStart="16dp"
         android:layout_marginTop="32dp"
         android:layout_marginEnd="16dp"
+        android:layout_marginBottom="8dp"
         android:gravity="center"
-        android:text="@string/withdraw_fees"
-        android:visibility="gone"
-        app:layout_constraintBottom_toTopOf="@+id/feeView"
+        android:text="@string/withdraw_total"
+        android:visibility="invisible"
+        app:layout_constraintBottom_toTopOf="@+id/effectiveAmountView"
         app:layout_constraintEnd_toEndOf="parent"
         app:layout_constraintHorizontal_bias="0.5"
         app:layout_constraintStart_toStartOf="parent"
-        app:layout_constraintTop_toBottomOf="@+id/chosenAmountView"
+        app:layout_constraintTop_toBottomOf="@id/feeView"
         tools:visibility="visible" />
 
     <TextView
-        android:id="@+id/feeView"
+        android:id="@+id/effectiveAmountView"
         android:layout_width="0dp"
         android:layout_height="wrap_content"
         android:layout_marginStart="16dp"
-        android:layout_marginTop="8dp"
         android:layout_marginEnd="16dp"
         android:gravity="center"
-        android:textColor="?colorError"
-        android:textSize="20sp"
-        android:visibility="gone"
+        android:textColor="@color/green"
+        android:textSize="24sp"
+        android:visibility="invisible"
         app:layout_constraintBottom_toTopOf="@+id/exchangeIntroView"
         app:layout_constraintEnd_toEndOf="parent"
         app:layout_constraintStart_toStartOf="parent"
-        app:layout_constraintTop_toBottomOf="@+id/feeLabel"
-        tools:text="-0.2 TESTKUDOS"
+        app:layout_constraintTop_toBottomOf="@+id/introView"
+        tools:text="9.8 TESTKUDOS"
         tools:visibility="visible" />
 
     <TextView
@@ -139,7 +141,7 @@
         app:layout_constraintEnd_toEndOf="parent"
         app:layout_constraintHorizontal_bias="0.5"
         app:layout_constraintStart_toStartOf="parent"
-        app:layout_constraintTop_toBottomOf="@+id/feeView"
+        app:layout_constraintTop_toBottomOf="@+id/effectiveAmountView"
         tools:visibility="visible" />
 
     <TextView
diff --git a/wallet/src/main/res/values/strings.xml 
b/wallet/src/main/res/values/strings.xml
index 4f580af..48ec647 100644
--- a/wallet/src/main/res/values/strings.xml
+++ b/wallet/src/main/res/values/strings.xml
@@ -76,6 +76,8 @@ GNU Taler is immune against many types of fraud, such as 
phishing of credit card
     <string name="amount_positive">+%s</string>
     <string name="amount_negative">-%s</string>
     <string name="amount_chosen">Chosen Amount</string>
+    <string name="amount_sent">Amount sent</string>
+    <string name="amount_received">Amount received</string>
     <string name="balances_inbound_label">inbound</string>
     <string name="balances_empty_state">There is no digital cash in your 
wallet.\n\nYou can get test money from the demo 
bank:\n\nhttps://bank.demo.taler.net</string>
     <string name="balance_scope_exchange">Exchange: %1$s</string>
@@ -130,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>
@@ -150,6 +153,7 @@ GNU Taler is immune against many types of fraud, such as 
phishing of credit card
     <string name="receive_peer_create_button">Create invoice</string>
     <string name="receive_peer_invoice_instruction">Let the payer scan this QR 
code to pay:</string>
     <string name="receive_peer_invoice_uri">Alternatively, copy and send this 
URI:</string>
+    <string name="receive_peer_amount_invoiced">Amount invoiced</string>
 
     <string name="send_amount">Amount to send</string>
     <string name="send_intro">Choose where to send money to:</string>
@@ -171,8 +175,6 @@ GNU Taler is immune against many types of fraud, such as 
phishing of credit card
     <string name="send_peer_title">Send money to another wallet</string>
     <string name="send_peer_create_button">Send funds now</string>
     <string name="send_peer_payment_instruction">Let the payee scan this QR 
code to receive:</string>
-    <string name="send_peer_payment_amount_received">Amount received</string>
-    <string name="send_peer_payment_amount_sent">Amount sent</string>
     <string name="send_peer_expiration_period">Expires in</string>
     <string name="send_peer_expiration_1d">1 day</string>
     <string name="send_peer_expiration_7d">7 days</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]