gnunet-svn
[Top][All Lists]
Advanced

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

[taler-taler-android] 02/02: [wallet] Render dummy transactions whenever


From: gnunet
Subject: [taler-taler-android] 02/02: [wallet] Render dummy transactions whenever we can't parse a transaction
Date: Thu, 13 Apr 2023 17:33:20 +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 e90570d8f6095d69813f31444f2450193ce729ea
Author: Torsten Grote <t@grobox.de>
AuthorDate: Thu Apr 13 12:28:15 2023 -0300

    [wallet] Render dummy transactions whenever we can't parse a transaction
---
 .../transactions/TransactionDummyFragment.kt       | 64 ++++++++++++++++++
 .../net/taler/wallet/transactions/Transactions.kt  | 79 +++++++++++++++++++++-
 wallet/src/main/res/navigation/nav_graph.xml       |  5 ++
 wallet/src/main/res/values/strings.xml             |  1 +
 4 files changed, 148 insertions(+), 1 deletion(-)

diff --git 
a/wallet/src/main/java/net/taler/wallet/transactions/TransactionDummyFragment.kt
 
b/wallet/src/main/java/net/taler/wallet/transactions/TransactionDummyFragment.kt
new file mode 100644
index 0000000..ad5e19c
--- /dev/null
+++ 
b/wallet/src/main/java/net/taler/wallet/transactions/TransactionDummyFragment.kt
@@ -0,0 +1,64 @@
+/*
+ * This file is part of GNU Taler
+ * (C) 2022 Taler Systems S.A.
+ *
+ * GNU Taler is free software; you can redistribute it and/or modify it under 
the
+ * terms of the GNU General Public License as published by the Free Software
+ * Foundation; either version 3, or (at your option) any later version.
+ *
+ * GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 
FOR
+ * A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
+ */
+
+package net.taler.wallet.transactions
+
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.fillMaxWidth
+import androidx.compose.foundation.layout.padding
+import androidx.compose.foundation.rememberScrollState
+import androidx.compose.foundation.verticalScroll
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.livedata.observeAsState
+import androidx.compose.ui.Alignment.Companion.CenterHorizontally
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.platform.ComposeView
+import androidx.compose.ui.unit.dp
+import net.taler.wallet.compose.TalerSurface
+
+class TransactionDummyFragment : TransactionDetailFragment() {
+
+    override fun onCreateView(
+        inflater: LayoutInflater,
+        container: ViewGroup?,
+        savedInstanceState: Bundle?,
+    ): View = ComposeView(requireContext()).apply {
+        setContent {
+            TalerSurface {
+                val t = 
transactionManager.selectedTransaction.observeAsState(null).value
+                if (t is DummyTransaction) TransactionDummyComposable(t)
+            }
+        }
+    }
+}
+
+@Composable
+fun TransactionDummyComposable(t: DummyTransaction) {
+    val scrollState = rememberScrollState()
+    Column(
+        modifier = Modifier
+            .fillMaxWidth()
+            .padding(16.dp)
+            .verticalScroll(scrollState),
+        horizontalAlignment = CenterHorizontally,
+    ) {
+            ErrorTransactionButton(error = t.error)
+    }
+}
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 a306685..29c5717 100644
--- a/wallet/src/main/java/net/taler/wallet/transactions/Transactions.kt
+++ b/wallet/src/main/java/net/taler/wallet/transactions/Transactions.kt
@@ -17,24 +17,81 @@
 package net.taler.wallet.transactions
 
 import android.content.Context
+import android.util.Log
 import androidx.annotation.DrawableRes
 import androidx.annotation.IdRes
 import androidx.annotation.StringRes
+import kotlinx.serialization.KSerializer
 import kotlinx.serialization.SerialName
 import kotlinx.serialization.Serializable
+import kotlinx.serialization.SerializationException
 import kotlinx.serialization.Transient
+import kotlinx.serialization.builtins.ListSerializer
+import kotlinx.serialization.builtins.MapSerializer
+import kotlinx.serialization.builtins.serializer
+import kotlinx.serialization.descriptors.SerialDescriptor
+import kotlinx.serialization.encoding.Decoder
+import kotlinx.serialization.encoding.Encoder
+import kotlinx.serialization.json.JsonElement
 import net.taler.common.Amount
 import net.taler.common.ContractMerchant
 import net.taler.common.ContractProduct
 import net.taler.common.Timestamp
 import net.taler.wallet.R
+import net.taler.wallet.TAG
+import net.taler.wallet.backend.TalerErrorCode
 import net.taler.wallet.backend.TalerErrorInfo
 import net.taler.wallet.cleanExchange
 import net.taler.wallet.transactions.WithdrawalDetails.ManualTransfer
 import net.taler.wallet.transactions.WithdrawalDetails.TalerBankIntegrationApi
+import java.util.UUID
 
 @Serializable
-data class Transactions(val transactions: List<Transaction>)
+data class Transactions(
+    @Serializable(with = TransactionListSerializer::class)
+    val transactions: List<Transaction>,
+)
+
+class TransactionListSerializer : KSerializer<List<Transaction>> {
+    private val serializer = ListSerializer(TransactionSerializer())
+    override val descriptor: SerialDescriptor = serializer.descriptor
+
+    override fun deserialize(decoder: Decoder): List<Transaction> {
+        return decoder.decodeSerializableValue(serializer)
+    }
+
+    override fun serialize(encoder: Encoder, value: List<Transaction>) {
+        throw NotImplementedError()
+    }
+}
+
+class TransactionSerializer : KSerializer<Transaction> {
+
+    private val serializer = Transaction.serializer()
+    override val descriptor: SerialDescriptor = serializer.descriptor
+    private val jsonSerializer = MapSerializer(String.serializer(), 
JsonElement.serializer())
+
+    override fun deserialize(decoder: Decoder): Transaction {
+        return try {
+            decoder.decodeSerializableValue(serializer)
+        } catch (e: SerializationException) {
+            Log.e(TAG, "Error deserializing transaction.", e)
+            DummyTransaction(
+                transactionId = UUID.randomUUID().toString(),
+                timestamp = Timestamp.now(),
+                error = TalerErrorInfo(
+                    code = TalerErrorCode.UNKNOWN,
+                    message = e.message,
+                    extra = decoder.decodeSerializableValue(jsonSerializer)
+                ),
+            )
+        }
+    }
+
+    override fun serialize(encoder: Encoder, value: Transaction) {
+        throw NotImplementedError()
+    }
+}
 
 @Serializable
 sealed class Transaction {
@@ -420,3 +477,23 @@ class TransactionPeerPushCredit(
 
     override val generalTitleRes = R.string.transaction_peer_push_credit
 }
+
+/**
+ * This represents a transaction that we can not parse for some reason.
+ */
+class DummyTransaction(
+    override val transactionId: String,
+    override val timestamp: Timestamp,
+    override val error: TalerErrorInfo,
+) : Transaction() {
+    override val extendedStatus: ExtendedStatus = ExtendedStatus.Failed
+    override val amountRaw: Amount = Amount.zero("TESTKUDOS")
+    override val amountEffective: Amount = Amount.zero("TESTKUDOS")
+    override val icon: Int = R.drawable.ic_bug_report
+    override val detailPageNav: Int = R.id.nav_transactions_detail_dummy
+    override val amountType: AmountType = AmountType.Neutral
+    override val generalTitleRes: Int = R.string.transaction_dummy_title
+    override fun getTitle(context: Context): String {
+        return context.getString(R.string.transaction_dummy_title)
+    }
+}
diff --git a/wallet/src/main/res/navigation/nav_graph.xml 
b/wallet/src/main/res/navigation/nav_graph.xml
index 966afac..9fd6578 100644
--- a/wallet/src/main/res/navigation/nav_graph.xml
+++ b/wallet/src/main/res/navigation/nav_graph.xml
@@ -263,6 +263,11 @@
         android:name="net.taler.wallet.transactions.TransactionPeerFragment"
         android:label="@string/transactions_detail_title" />
 
+    <fragment
+        android:id="@+id/nav_transactions_detail_dummy"
+        android:name="net.taler.wallet.transactions.TransactionDummyFragment"
+        android:label="@string/transactions_detail_title" />
+
     <fragment
         android:id="@+id/alreadyAccepted"
         android:name="net.taler.wallet.tip.AlreadyAcceptedFragment"
diff --git a/wallet/src/main/res/values/strings.xml 
b/wallet/src/main/res/values/strings.xml
index 1a16a69..734a233 100644
--- a/wallet/src/main/res/values/strings.xml
+++ b/wallet/src/main/res/values/strings.xml
@@ -107,6 +107,7 @@ GNU Taler is immune against many types of fraud, such as 
phishing of credit card
     <string name="transaction_peer_pull_debit">Invoice paid</string>
     <string name="transaction_peer_push_credit">Push payment</string>
     <string name="transaction_action_kyc">Complete KYC</string>
+    <string name="transaction_dummy_title">Unknown Transaction</string>
 
     <string name="payment_title">Payment</string>
     <string name="payment_fee">+%s payment fee</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]