diff options
author | Iván Ávalos <avalos@disroot.org> | 2023-06-20 11:35:26 -0600 |
---|---|---|
committer | Torsten Grote <t@grobox.de> | 2023-07-11 10:31:26 -0300 |
commit | b62bd90f86f6fc4ba9e1971df4818a65c9eedada (patch) | |
tree | 84b7106ecb044dd30603242a1fd24e5225aab24c | |
parent | 58f5dc13d51eef09463e215af0ac526216531074 (diff) | |
download | taler-android-b62bd90f86f6fc4ba9e1971df4818a65c9eedada.tar.gz taler-android-b62bd90f86f6fc4ba9e1971df4818a65c9eedada.tar.bz2 taler-android-b62bd90f86f6fc4ba9e1971df4818a65c9eedada.zip |
[wallet] Handle "fail" DD37 action and prevent non-deletable transactions from being deleted.
5 files changed, 36 insertions, 11 deletions
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 1a709b0..b0f5e1b 100644 --- a/wallet/src/main/java/net/taler/wallet/transactions/TransactionDetailFragment.kt +++ b/wallet/src/main/java/net/taler/wallet/transactions/TransactionDetailFragment.kt @@ -83,7 +83,7 @@ abstract class TransactionDetailFragment : Fragment() { protected fun onTransitionButton(t: Transaction, tt: TransactionAction) { when (tt) { - Delete, Abort -> { + Delete, Abort, Fail -> { MaterialAlertDialogBuilder(requireContext(), R.style.MaterialAlertDialog_Material3) .setTitle(dialogTitle(tt)!!) .setMessage(dialogMessage(tt)!!) @@ -94,6 +94,7 @@ abstract class TransactionDetailFragment : Fragment() { when (tt) { Delete -> deleteTransaction(t) Abort -> abortTransaction(t) + Fail -> failTransaction(t) else -> {} } dialog.dismiss() @@ -122,6 +123,10 @@ abstract class TransactionDetailFragment : Fragment() { transactionManager.abortTransaction(t.transactionId) } + private fun failTransaction(t: Transaction) { + transactionManager.failTransaction(t.transactionId) + } + private fun suspendTransaction(t: Transaction) { transactionManager.suspendTransaction(t.transactionId) } diff --git a/wallet/src/main/java/net/taler/wallet/transactions/TransactionManager.kt b/wallet/src/main/java/net/taler/wallet/transactions/TransactionManager.kt index dfe25ad..725f2c5 100644 --- a/wallet/src/main/java/net/taler/wallet/transactions/TransactionManager.kt +++ b/wallet/src/main/java/net/taler/wallet/transactions/TransactionManager.kt @@ -26,6 +26,7 @@ import kotlinx.coroutines.launch import net.taler.wallet.TAG import net.taler.wallet.backend.TalerErrorInfo import net.taler.wallet.backend.WalletBackendApi +import net.taler.wallet.transactions.TransactionAction.Delete import net.taler.wallet.transactions.TransactionMajorState.Pending import java.util.LinkedList @@ -158,6 +159,16 @@ class TransactionManager( } } + fun failTransaction(transactionId: String) = scope.launch { + api.request<Unit>("failTransaction") { + put("transactionId", transactionId) + }.onError { + Log.e(TAG, "Error failTransaction $it") + }.onSuccess { + loadTransactions() + } + } + fun suspendTransaction(transactionId: String) = scope.launch { api.request<Unit>("suspendTransaction") { put("transactionId", transactionId) @@ -179,9 +190,12 @@ class TransactionManager( } fun deleteTransactions(transactionIds: List<String>) { - // TODO: do NOT delete non-deletable transactions - transactionIds.forEach { id -> - deleteTransaction(id) + allTransactions[selectedCurrency]?.filter { transaction -> + transaction.transactionId in transactionIds + }?.forEach { toBeDeletedTx -> + if (Delete in toBeDeletedTx.txActions) { + deleteTransaction(toBeDeletedTx.transactionId) + } } } diff --git a/wallet/src/main/java/net/taler/wallet/transactions/TransitionsComposable.kt b/wallet/src/main/java/net/taler/wallet/transactions/TransitionsComposable.kt index e66de47..3fb43fe 100644 --- a/wallet/src/main/java/net/taler/wallet/transactions/TransitionsComposable.kt +++ b/wallet/src/main/java/net/taler/wallet/transactions/TransitionsComposable.kt @@ -37,7 +37,7 @@ import net.taler.wallet.transactions.TransactionAction.* @OptIn(ExperimentalLayoutApi::class) @Composable fun TransitionsComposable(t: Transaction, onTransition: (t: TransactionAction) -> Unit) { - FlowRow { + FlowRow { t.txActions.forEach { TransitionComposable(it, onTransition) } @@ -47,16 +47,16 @@ fun TransitionsComposable(t: Transaction, onTransition: (t: TransactionAction) - @Composable fun TransitionComposable(t: TransactionAction, onClick: (t: TransactionAction) -> Unit) { // TODO: handle more transitions! - if (t !in arrayOf(Delete, Retry, Abort, Resume, Suspend)) return + if (t !in arrayOf(Delete, Retry, Abort, Fail, Resume, Suspend)) return Button( modifier = Modifier.padding(16.dp), colors = ButtonDefaults.buttonColors(containerColor = when(t) { Delete -> MaterialTheme.colorScheme.error Retry -> MaterialTheme.colorScheme.primary Abort -> MaterialTheme.colorScheme.error + Fail -> MaterialTheme.colorScheme.error Resume -> MaterialTheme.colorScheme.primary Suspend -> MaterialTheme.colorScheme.primary - else -> error("Unsupported") }), onClick = { onClick(t) }, ) { @@ -66,18 +66,18 @@ fun TransitionComposable(t: TransactionAction, onClick: (t: TransactionAction) - Delete -> painterResource(id = R.drawable.ic_delete) Retry -> painterResource(id = R.drawable.ic_retry) Abort -> painterResource(id = R.drawable.ic_cancel) + Fail -> painterResource(id = R.drawable.ic_fail) Resume -> painterResource(id = R.drawable.ic_resume) Suspend -> painterResource(id = R.drawable.ic_suspend) - else -> error("Unsupported") }, contentDescription = null, tint = when (t) { Delete -> MaterialTheme.colorScheme.onError Retry -> MaterialTheme.colorScheme.onPrimary Abort -> MaterialTheme.colorScheme.onError + Fail -> MaterialTheme.colorScheme.onError Resume -> MaterialTheme.colorScheme.onPrimary Suspend -> MaterialTheme.colorScheme.onPrimary - else -> error("Unsupported") }, ) Text( @@ -86,17 +86,17 @@ fun TransitionComposable(t: TransactionAction, onClick: (t: TransactionAction) - Delete -> stringResource(R.string.transactions_delete) Retry -> stringResource(R.string.transactions_retry) Abort -> stringResource(R.string.transactions_abort) + Fail -> stringResource(id = R.string.transactions_fail) Resume -> stringResource(R.string.transactions_resume) Suspend -> stringResource(R.string.transactions_suspend) - else -> error("Unsupported") }, color = when (t) { Delete -> MaterialTheme.colorScheme.onError Retry -> MaterialTheme.colorScheme.onPrimary Abort -> MaterialTheme.colorScheme.onError + Fail -> MaterialTheme.colorScheme.onError Resume -> MaterialTheme.colorScheme.onPrimary Suspend -> MaterialTheme.colorScheme.onPrimary - else -> error("Unsupported") }, ) } diff --git a/wallet/src/main/res/drawable/ic_fail.xml b/wallet/src/main/res/drawable/ic_fail.xml new file mode 100644 index 0000000..a25c5ed --- /dev/null +++ b/wallet/src/main/res/drawable/ic_fail.xml @@ -0,0 +1,5 @@ +<vector android:height="24dp" android:tint="#000000" + android:viewportHeight="24" android:viewportWidth="24" + android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android"> + <path android:fillColor="@android:color/white" android:pathData="M14.69,2.21L4.33,11.49c-0.64,0.58 -0.28,1.65 0.58,1.73L13,14l-4.85,6.76c-0.22,0.31 -0.19,0.74 0.08,1.01h0c0.3,0.3 0.77,0.31 1.08,0.02l10.36,-9.28c0.64,-0.58 0.28,-1.65 -0.58,-1.73L11,10l4.85,-6.76c0.22,-0.31 0.19,-0.74 -0.08,-1.01l0,0C15.47,1.93 15,1.92 14.69,2.21z"/> +</vector> diff --git a/wallet/src/main/res/values/strings.xml b/wallet/src/main/res/values/strings.xml index 716d537..4facfc8 100644 --- a/wallet/src/main/res/values/strings.xml +++ b/wallet/src/main/res/values/strings.xml @@ -87,6 +87,7 @@ GNU Taler is immune against many types of fraud, such as phishing of credit card <string name="transactions_delete">Delete</string> <string name="transactions_retry">Retry</string> <string name="transactions_abort">Abort</string> + <string name="transactions_fail">Fail</string> <string name="transactions_suspend">Suspend</string> <string name="transactions_resume">Resume</string> <string name="transactions_select_all">Select All</string> |