commit 2f4e8d6577c1cf3a8e00e9e43ac54e70c7c14b71
parent 02c9b6a89448dd36c1cc9a924c851f67d3c34cbd
Author: Iván Ávalos <avalos@disroot.org>
Date: Wed, 30 Apr 2025 20:50:34 +0200
[wallet] add "Show JSON" button in tx details in devMode
Diffstat:
2 files changed, 162 insertions(+), 11 deletions(-)
diff --git a/wallet/src/main/java/net/taler/wallet/transactions/TransactionState.kt b/wallet/src/main/java/net/taler/wallet/transactions/TransactionState.kt
@@ -40,6 +40,9 @@ data class TransactionState(
@Serializable
enum class TransactionMajorState {
+ @SerialName("unknown")
+ Unknown,
+
@SerialName("none")
None,
@@ -55,11 +58,17 @@ enum class TransactionMajorState {
@SerialName("aborted")
Aborted,
+ @SerialName("dialog")
+ Dialog,
+
+ @SerialName("finalizing")
+ Finalizing,
+
@SerialName("suspended")
Suspended,
- @SerialName("dialog")
- Dialog,
+ @SerialName("suspended-finalizing")
+ SuspendedFinalizing,
@SerialName("suspended-aborting")
SuspendedAborting,
@@ -67,45 +76,123 @@ enum class TransactionMajorState {
@SerialName("failed")
Failed,
- @SerialName("deleted")
- Deleted,
-
@SerialName("expired")
Expired,
- @SerialName("unknown")
- Unknown;
+ @SerialName("deleted")
+ Deleted,
}
@Serializable
enum class TransactionMinorState {
+ @SerialName("unknown")
+ Unknown,
+
+ @SerialName("deposit")
+ Deposit,
+
@SerialName("kyc")
KycRequired,
+ @SerialName("merge-kyc")
+ MergeKycRequired,
+
@SerialName("balance-kyc")
BalanceKycRequired,
@SerialName("balance-kyc-init")
BalanceKycInit,
+ @SerialName("kyc-auth")
+ KycAuthRequired,
+
+ @SerialName("track")
+ Track,
+
+ @SerialName("submit-payment")
+ SubmitPayment,
+
+ @SerialName("rebind-session")
+ RebindSession,
+
+ @SerialName("refresh")
+ Refresh,
+
+ @SerialName("pickup")
+ Pickup,
+
+ @SerialName("auto-refund")
+ AutoRefund,
+
+ @SerialName("user")
+ User,
+
+ @SerialName("bank")
+ Bank,
+
@SerialName("exchange")
Exchange,
+ @SerialName("claim-proposal")
+ ClaimProposal,
+
+ @SerialName("check-refund")
+ CheckRefund,
+
@SerialName("create-purse")
CreatePurse,
+ @SerialName("delete-purse")
+ DeletePurse,
+
+ @SerialName("refresh-expired")
+ RefreshExpired,
+
@SerialName("ready")
Ready,
+ @SerialName("merge")
+ Merge,
+
+ @SerialName("repurchase")
+ Repurchase,
+
+ @SerialName("bank-register-reserve")
+ BankRegisterReserve,
+
@SerialName("bank-confirm-transfer")
BankConfirmTransfer,
+ @SerialName("withdraw-coins")
+ WithdrawCoins,
+
@SerialName("exchange-wait-reserve")
ExchangeWaitReserve,
- @SerialName("repurchase")
- Repurchase,
+ @SerialName("aborting")
+ Aborting,
- @SerialName("unknown")
- Unknown;
+ @SerialName("refused")
+ Refused,
+
+ @SerialName("withdraw")
+ Withdraw,
+
+ @SerialName("merchant-order-proposed")
+ MerchantOrderProposed,
+
+ @SerialName("proposed")
+ Proposed,
+
+ @SerialName("refund-available")
+ RefundAvailable,
+
+ @SerialName("accept-refund")
+ AcceptRefund,
+
+ @SerialName("paid-by-other")
+ PaidByOther,
+
+ @SerialName("completed-by-other-wallet")
+ CompletedByOtherWallet,
}
diff --git a/wallet/src/main/java/net/taler/wallet/transactions/TransitionsComposable.kt b/wallet/src/main/java/net/taler/wallet/transactions/TransitionsComposable.kt
@@ -17,21 +17,36 @@
package net.taler.wallet.transactions
import androidx.compose.foundation.layout.Arrangement.Center
+import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.ExperimentalLayoutApi
import androidx.compose.foundation.layout.FlowRow
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.padding
+import androidx.compose.foundation.rememberScrollState
+import androidx.compose.foundation.verticalScroll
+import androidx.compose.material3.AlertDialog
import androidx.compose.material3.Button
import androidx.compose.material3.ButtonDefaults
import androidx.compose.material3.Icon
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
+import androidx.compose.material3.TextButton
import androidx.compose.runtime.Composable
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
+import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
+import androidx.compose.ui.text.font.FontFamily
import androidx.compose.ui.unit.dp
+import androidx.compose.ui.unit.sp
+import kotlinx.serialization.encodeToString
+import kotlinx.serialization.json.Json
+import net.taler.common.copyToClipBoard
import net.taler.wallet.R
import net.taler.wallet.transactions.TransactionAction.*
@@ -42,6 +57,48 @@ fun TransitionsComposable(
devMode: Boolean,
onTransition: (t: TransactionAction) -> Unit,
) {
+ var showDialog by remember { mutableStateOf(false) }
+
+ if (showDialog) {
+ @Suppress("OPT_IN_USAGE")
+ val json = Json {
+ prettyPrint = true
+ prettyPrintIndent = " "
+ }
+ val message = json.encodeToString(t)
+ AlertDialog(
+ onDismissRequest = {
+ showDialog = false
+ },
+ text = {
+ val scrollState = rememberScrollState()
+ Column(
+ modifier = Modifier.verticalScroll(scrollState),
+ ) {
+ Text(
+ fontFamily = FontFamily.Monospace,
+ fontSize = 10.sp,
+ text = message,
+ )
+ }
+ },
+ dismissButton = {
+ TextButton(onClick = {
+ showDialog = false
+ }) {
+ Text(stringResource(R.string.close))
+ }
+ },
+ confirmButton = {
+ val context = LocalContext.current
+ TextButton(onClick = {
+ copyToClipBoard(context, context.getString(R.string.nav_error), message)
+ }) {
+ Text(stringResource(R.string.copy))
+ }
+ })
+ }
+
FlowRow(horizontalArrangement = Center) {
t.txActions.forEach {
if (it in arrayOf(Resume, Suspend, Retry)) {
@@ -50,6 +107,13 @@ fun TransitionsComposable(
TransitionComposable(it, onTransition)
}
}
+
+ if (devMode) Button(
+ modifier = Modifier.padding(16.dp),
+ onClick = { showDialog = true },
+ ) {
+ Text(stringResource(R.string.observability_show_json))
+ }
}
}