summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIván Ávalos <avalos@disroot.org>2023-06-20 11:35:26 -0600
committerTorsten Grote <t@grobox.de>2023-07-11 10:31:26 -0300
commitb62bd90f86f6fc4ba9e1971df4818a65c9eedada (patch)
tree84b7106ecb044dd30603242a1fd24e5225aab24c
parent58f5dc13d51eef09463e215af0ac526216531074 (diff)
downloadtaler-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.
-rw-r--r--wallet/src/main/java/net/taler/wallet/transactions/TransactionDetailFragment.kt7
-rw-r--r--wallet/src/main/java/net/taler/wallet/transactions/TransactionManager.kt20
-rw-r--r--wallet/src/main/java/net/taler/wallet/transactions/TransitionsComposable.kt14
-rw-r--r--wallet/src/main/res/drawable/ic_fail.xml5
-rw-r--r--wallet/src/main/res/values/strings.xml1
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>