taler-android

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

commit 64914df7efb40c215f165c93a4078786ece6b0a4
parent 4bbc0a9f207799b95a65b7bd7338112cfd65d420
Author: Iván Ávalos <avalos@disroot.org>
Date:   Thu, 10 Apr 2025 16:18:58 +0200

[wallet] prevent confirming already confirmed withdrawal

bug 0009683

Diffstat:
Mwallet/src/main/java/net/taler/wallet/withdraw/PromptWithdrawFragment.kt | 14++++++++++++++
Mwallet/src/main/java/net/taler/wallet/withdraw/WithdrawManager.kt | 22++++++++++++++++++++--
Mwallet/src/main/res/values/strings.xml | 1+
3 files changed, 35 insertions(+), 2 deletions(-)

diff --git a/wallet/src/main/java/net/taler/wallet/withdraw/PromptWithdrawFragment.kt b/wallet/src/main/java/net/taler/wallet/withdraw/PromptWithdrawFragment.kt @@ -65,6 +65,7 @@ import net.taler.wallet.withdraw.WithdrawStatus.Status.None import net.taler.wallet.withdraw.WithdrawStatus.Status.Success import net.taler.wallet.withdraw.WithdrawStatus.Status.TosReviewRequired import net.taler.wallet.withdraw.WithdrawStatus.Status.Updating +import net.taler.wallet.withdraw.WithdrawalOperationStatusFlag.* class PromptWithdrawFragment: Fragment() { private val model: MainViewModel by activityViewModels() @@ -138,6 +139,10 @@ class PromptWithdrawFragment: Fragment() { return@let } + if (s.uriInfo?.status == Confirmed) { + return@let + } + if (defaultCurrency == null) { LoadingScreen() return@let @@ -192,6 +197,14 @@ class PromptWithdrawFragment: Fragment() { showError(status.error) } + if (status.uriInfo?.status == Confirmed) { + Snackbar.make(requireView(), R.string.withdraw_error_already_confirmed, LENGTH_LONG).show() + if (!navigating) { + navigating = true + findNavController().navigate(R.id.action_promptWithdraw_to_nav_main) + } + } + if (status.exchangeBaseUrl == null && selectExchangeDialog.dialog?.isShowing != true) { selectExchange() @@ -281,6 +294,7 @@ fun WithdrawalShowInfoPreview() { amount = null, currency = "KUDOS", editableAmount = true, + status = Pending, maxAmount = Amount.fromJSONString("KUDOS:10"), wireFee = Amount.fromJSONString("KUDOS:0.2"), defaultExchangeBaseUrl = "exchange.head.taler.net", diff --git a/wallet/src/main/java/net/taler/wallet/withdraw/WithdrawManager.kt b/wallet/src/main/java/net/taler/wallet/withdraw/WithdrawManager.kt @@ -16,7 +16,6 @@ package net.taler.wallet.withdraw -import android.net.Uri import android.util.Log import androidx.annotation.UiThread import androidx.lifecycle.MutableLiveData @@ -42,6 +41,7 @@ import net.taler.wallet.exchanges.ExchangeManager import net.taler.wallet.exchanges.ExchangeTosStatus import net.taler.wallet.transactions.WithdrawalExchangeAccountDetails import net.taler.wallet.withdraw.WithdrawStatus.Status.* +import androidx.core.net.toUri sealed class TestWithdrawStatus { data object None : TestWithdrawStatus() @@ -121,6 +121,23 @@ sealed class TransferData { } @Serializable +enum class WithdrawalOperationStatusFlag { + Unknown, + + @SerialName("pending") + Pending, + + @SerialName("selected") + Selected, + + @SerialName("aborted") + Aborted, + + @SerialName("confirmed") + Confirmed, +} + +@Serializable data class WithdrawalDetailsForUri( val amount: Amount? = null, val currency: String, @@ -129,6 +146,7 @@ data class WithdrawalDetailsForUri( val wireFee: Amount? = null, val defaultExchangeBaseUrl: String? = null, val possibleExchanges: List<ExchangeItem> = emptyList(), + val status: WithdrawalOperationStatusFlag, ) @Serializable @@ -515,7 +533,7 @@ class WithdrawManager( transactionId = response.transactionId, withdrawalTransfers = response.withdrawalAccountsList.mapNotNull { val details = status.amountInfo ?: error("no amountInfo") - val uri = Uri.parse(it.paytoUri) + val uri = it.paytoUri.toUri() if ("bitcoin".equals(uri.authority, true)) { val msg = uri.getQueryParameter("message").orEmpty() val reg = "\\b([A-Z0-9]{52})\\b".toRegex().find(msg) diff --git a/wallet/src/main/res/values/strings.xml b/wallet/src/main/res/values/strings.xml @@ -274,6 +274,7 @@ GNU Taler is immune against many types of fraud, such as phishing of credit card <string name="withdraw_button_label">Withdraw</string> <string name="withdraw_button_tos">Review terms</string> <string name="withdraw_cash_acceptor">The amount to be withdrawn will be determined by the cash acceptor</string> + <string name="withdraw_error_already_confirmed">Withdrawal is already confirmed</string> <string name="withdraw_error_message">Withdrawing is currently not possible. Please try again later!</string> <string name="withdraw_error_test">Error withdrawing TESTKUDOS</string> <string name="withdraw_error_title">Withdrawal error</string>