From e3edd5f58fe1d2f3f70d1ff20f58564f8990bcc2 Mon Sep 17 00:00:00 2001 From: Torsten Grote Date: Tue, 19 May 2020 14:59:03 -0300 Subject: [wallet] show transaction errors to user --- .../wallet/transactions/TransactionAdapter.kt | 22 +++++++++++++++++---- .../net/taler/wallet/transactions/Transactions.kt | 23 +++++++++++++++++----- wallet/src/main/res/values/strings.xml | 2 ++ 3 files changed, 38 insertions(+), 9 deletions(-) (limited to 'wallet') diff --git a/wallet/src/main/java/net/taler/wallet/transactions/TransactionAdapter.kt b/wallet/src/main/java/net/taler/wallet/transactions/TransactionAdapter.kt index e6dad6f..d670b74 100644 --- a/wallet/src/main/java/net/taler/wallet/transactions/TransactionAdapter.kt +++ b/wallet/src/main/java/net/taler/wallet/transactions/TransactionAdapter.kt @@ -92,15 +92,29 @@ internal class TransactionAdapter( icon.setImageResource(transaction.icon) title.text = transaction.getTitle(context) - if (transaction is TransactionWithdrawal && !transaction.confirmed) { + bindExtraInfo(transaction) + time.text = transaction.timestamp.ms.toRelativeTime(context) + bindAmount(transaction) + pendingView.visibility = if (transaction.pending) VISIBLE else GONE + } + + private fun bindExtraInfo(transaction: Transaction) { + if (transaction.error != null) { + extraInfoView.text = + context.getString(R.string.payment_error, transaction.error.text) + extraInfoView.setTextColor(red) + extraInfoView.visibility = VISIBLE + } else if (transaction is TransactionWithdrawal && !transaction.confirmed) { extraInfoView.setText(R.string.withdraw_waiting_confirm) + extraInfoView.setTextColor(amountColor) + extraInfoView.visibility = VISIBLE + } else if (transaction is TransactionPayment && transaction.status != PaymentStatus.Paid && transaction.status != PaymentStatus.Accepted) { + extraInfoView.setText(if (transaction.status == PaymentStatus.Aborted) R.string.payment_aborted else R.string.payment_failed) + extraInfoView.setTextColor(amountColor) extraInfoView.visibility = VISIBLE } else { extraInfoView.visibility = GONE } - time.text = transaction.timestamp.ms.toRelativeTime(context) - bindAmount(transaction) - pendingView.visibility = if (transaction.pending) VISIBLE else GONE } private fun bindAmount(transaction: Transaction) { diff --git a/wallet/src/main/java/net/taler/wallet/transactions/Transactions.kt b/wallet/src/main/java/net/taler/wallet/transactions/Transactions.kt index 55579cc..8567259 100644 --- a/wallet/src/main/java/net/taler/wallet/transactions/Transactions.kt +++ b/wallet/src/main/java/net/taler/wallet/transactions/Transactions.kt @@ -46,6 +46,7 @@ abstract class Transaction( val transactionId: String, val timestamp: Timestamp, val pending: Boolean, + val error: TransactionError? = null, val amountRaw: Amount, val amountEffective: Amount ) { @@ -69,6 +70,10 @@ sealed class AmountType { object Neutral : AmountType() } +class TransactionError(private val ec: Int, private val hint: String?) { + val text get() = if (hint == null) "$ec" else "$ec - $hint" +} + @JsonTypeName("withdrawal") class TransactionWithdrawal( transactionId: String, @@ -77,9 +82,10 @@ class TransactionWithdrawal( val exchangeBaseUrl: String, val confirmed: Boolean, val bankConfirmationUrl: String?, + error: TransactionError? = null, amountRaw: Amount, amountEffective: Amount -) : Transaction(transactionId, timestamp, pending, amountRaw, amountEffective) { +) : Transaction(transactionId, timestamp, pending, error, amountRaw, amountEffective) { override val icon = R.drawable.transaction_withdrawal override val detailPageLayout = R.layout.fragment_transaction_withdrawal override val amountType = AmountType.Positive @@ -94,9 +100,10 @@ class TransactionPayment( pending: Boolean, val info: TransactionInfo, val status: PaymentStatus, + error: TransactionError? = null, amountRaw: Amount, amountEffective: Amount -) : Transaction(transactionId, timestamp, pending, amountRaw, amountEffective) { +) : Transaction(transactionId, timestamp, pending, error, amountRaw, amountEffective) { override val icon = R.drawable.ic_cash_usd_outline override val detailPageLayout = R.layout.fragment_transaction_payment override val amountType = AmountType.Negative @@ -136,15 +143,17 @@ class TransactionRefund( val refundedTransactionId: String, val info: TransactionInfo, val amountInvalid: Amount, + error: TransactionError? = null, amountRaw: Amount, amountEffective: Amount -) : Transaction(transactionId, timestamp, pending, amountRaw, amountEffective) { +) : Transaction(transactionId, timestamp, pending, error, amountRaw, amountEffective) { override val icon = R.drawable.transaction_refund override val detailPageLayout = R.layout.fragment_transaction_payment override val amountType = AmountType.Positive override fun getTitle(context: Context): String { return context.getString(R.string.transaction_refund_from, info.merchant.name) } + override val generalTitleRes = R.string.refund_title } @@ -156,15 +165,17 @@ class TransactionTip( // TODO status: TipStatus, val exchangeBaseUrl: String, val merchant: ContractMerchant, + error: TransactionError? = null, amountRaw: Amount, amountEffective: Amount -) : Transaction(transactionId, timestamp, pending, amountRaw, amountEffective) { +) : Transaction(transactionId, timestamp, pending, error, amountRaw, amountEffective) { override val icon = R.drawable.transaction_tip_accepted // TODO different when declined override val detailPageLayout = R.layout.fragment_transaction_payment override val amountType = AmountType.Positive override fun getTitle(context: Context): String { return context.getString(R.string.transaction_tip_from, merchant.name) } + override val generalTitleRes = R.string.tip_title } @@ -174,14 +185,16 @@ class TransactionRefresh( timestamp: Timestamp, pending: Boolean, val exchangeBaseUrl: String, + error: TransactionError? = null, amountRaw: Amount, amountEffective: Amount -) : Transaction(transactionId, timestamp, pending, amountRaw, amountEffective) { +) : Transaction(transactionId, timestamp, pending, error, amountRaw, amountEffective) { override val icon = R.drawable.transaction_refresh override val detailPageLayout = R.layout.fragment_transaction_payment override val amountType = AmountType.Negative override fun getTitle(context: Context): String { return context.getString(R.string.transaction_refresh) } + override val generalTitleRes = R.string.transaction_refresh } diff --git a/wallet/src/main/res/values/strings.xml b/wallet/src/main/res/values/strings.xml index e815e9b..7d76806 100644 --- a/wallet/src/main/res/values/strings.xml +++ b/wallet/src/main/res/values/strings.xml @@ -87,6 +87,8 @@ GNU Taler is immune against many types of fraud, such as phishing of credit card Balance insufficient! Show Details Hide Details + Aborted + Failed Payment initiated Already paid You\'ve already paid for this purchase. -- cgit v1.2.3