diff options
author | Torsten Grote <t@grobox.de> | 2023-04-13 12:28:15 -0300 |
---|---|---|
committer | Torsten Grote <t@grobox.de> | 2023-04-13 12:28:15 -0300 |
commit | e90570d8f6095d69813f31444f2450193ce729ea (patch) | |
tree | 35d33a75fd534b778a703ea7dfebd7e7a222615e /wallet/src/main/java/net/taler/wallet/transactions/Transactions.kt | |
parent | 1a9de46a080ca83ad2fd2e951781cee57e15fe42 (diff) | |
download | taler-android-e90570d8f6095d69813f31444f2450193ce729ea.tar.gz taler-android-e90570d8f6095d69813f31444f2450193ce729ea.tar.bz2 taler-android-e90570d8f6095d69813f31444f2450193ce729ea.zip |
[wallet] Render dummy transactions whenever we can't parse a transaction
Diffstat (limited to 'wallet/src/main/java/net/taler/wallet/transactions/Transactions.kt')
-rw-r--r-- | wallet/src/main/java/net/taler/wallet/transactions/Transactions.kt | 79 |
1 files changed, 78 insertions, 1 deletions
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) + } +} |