taler-android

Android apps for GNU Taler (wallet, PoS, cashier)
Log | Files | Refs | README | LICENSE

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:
Mwallet/src/main/java/net/taler/wallet/transactions/TransactionState.kt | 109+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--------
Mwallet/src/main/java/net/taler/wallet/transactions/TransitionsComposable.kt | 64++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
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)) + } } }