[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.
- [taler-taler-android] branch master updated (b490d94 -> 621351c),
gnunet <=
- [taler-taler-android] 04/08: [wallet] Fix label of invoiced amount in peer pull credit tx, gnunet, 2024/03/06
- [taler-taler-android] 02/08: [wallet] Don't show JSON errors to non-devs, gnunet, 2024/03/06
- [taler-taler-android] 05/08: [wallet] Fix NullPointerException in base64 decoding of product image, gnunet, 2024/03/06
- [taler-taler-android] 03/08: [wallet] Fix serialization error of "pending" payments, gnunet, 2024/03/06
- [taler-taler-android] 07/08: [wallet] Add refresh-expired minor state, gnunet, 2024/03/06
- [taler-taler-android] 08/08: [wallet] Improve pending payments UX and error handling, gnunet, 2024/03/06
- [taler-taler-android] 01/08: [wallet] More logical order of amounts, gnunet, 2024/03/06
- [taler-taler-android] 06/08: [wallet] Generalize some string resources, gnunet, 2024/03/06