gnunet-svn
[Top][All Lists]
Advanced

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

[taler-taler-android] 03/11: [wallet] Handle "fail" DD37 action and prev


From: gnunet
Subject: [taler-taler-android] 03/11: [wallet] Handle "fail" DD37 action and prevent non-deletable transactions from being deleted.
Date: Tue, 11 Jul 2023 16:23:31 +0200

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 b62bd90f86f6fc4ba9e1971df4818a65c9eedada
Author: Iván Ávalos <avalos@disroot.org>
AuthorDate: Tue Jun 20 11:35:26 2023 -0600

    [wallet] Handle "fail" DD37 action and prevent non-deletable transactions 
from being deleted.
---
 .../wallet/transactions/TransactionDetailFragment.kt |  7 ++++++-
 .../taler/wallet/transactions/TransactionManager.kt  | 20 +++++++++++++++++---
 .../wallet/transactions/TransitionsComposable.kt     | 14 +++++++-------
 wallet/src/main/res/drawable/ic_fail.xml             |  5 +++++
 wallet/src/main/res/values/strings.xml               |  1 +
 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>

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