taler-android

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

commit c51ad048efeaf9f2f9ae0a2975d05ce44144d4d4
parent 35eb0392bd913676fbb12b95388e5668a888325b
Author: Iván Ávalos <avalos@disroot.org>
Date:   Wed,  8 Jan 2025 21:49:44 +0100

[wallet] implement cash acceptor flow

Diffstat:
Mwallet/src/main/java/net/taler/wallet/withdraw/PromptWithdrawFragment.kt | 2+-
Mwallet/src/main/java/net/taler/wallet/withdraw/WithdrawManager.kt | 26++++++++++++++++----------
Mwallet/src/main/java/net/taler/wallet/withdraw/WithdrawalShowInfo.kt | 12++++++++++--
Mwallet/src/main/res/values/strings.xml | 1+
4 files changed, 28 insertions(+), 13 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 @@ -112,7 +112,7 @@ class PromptWithdrawFragment: Fragment() { } else if (withdrawExchangeUri != null) { // get withdrawal details for taler://withdraw-exchange URI withdrawManager.prepareManualWithdrawal(withdrawExchangeUri) - } else if (defaultCurrency != null) { + } else if (defaultCurrency != null && !status.isCashAcceptor) { // get withdrawal details for available data withdrawManager.getWithdrawalDetails( amount = amount ?: Amount.zero(defaultCurrency), diff --git a/wallet/src/main/java/net/taler/wallet/withdraw/WithdrawManager.kt b/wallet/src/main/java/net/taler/wallet/withdraw/WithdrawManager.kt @@ -78,6 +78,10 @@ data class WithdrawStatus( Success, Error, } + + val isCashAcceptor get() = uriInfo != null + && uriInfo.amount == null + && !uriInfo.editableAmount } sealed class TransferData { @@ -118,7 +122,7 @@ sealed class TransferData { @Serializable data class WithdrawalDetailsForUri( - val amount: Amount?, + val amount: Amount? = null, val currency: String, val editableAmount: Boolean = false, val maxAmount: Amount? = null, @@ -257,7 +261,7 @@ class WithdrawManager( handleError("getWithdrawalDetailsForUri", error) }.onSuccess { details -> Log.d(TAG, "Withdraw details: $details") - _withdrawStatus.update { value -> + val status = _withdrawStatus.updateAndGet { value -> value.copy( status = InfoReceived, uriInfo = details, @@ -266,12 +270,14 @@ class WithdrawManager( ) } - // then extend with amount details - getWithdrawalDetails( - amount = details.amount, - exchangeBaseUrl = details.defaultExchangeBaseUrl, - loading = loading, - ) + // then extend with amount details (not for cash acceptor) + if (!status.isCashAcceptor) { + getWithdrawalDetails( + amount = details.amount, + exchangeBaseUrl = details.defaultExchangeBaseUrl, + loading = loading, + ) + } } } @@ -404,13 +410,13 @@ class WithdrawManager( ) { val exchangeBaseUrl = status.exchangeBaseUrl ?: error("no exchangeBaseUrl") val talerWithdrawUri = status.talerWithdrawUri ?: error("no talerWithdrawUri") - val amountInfo = status.amountInfo ?: error("no amountInfo") + val amountInfo = status.amountInfo api.request("acceptBankIntegratedWithdrawal", AcceptWithdrawalResponse.serializer()) { restrictAge?.let { put("restrictAge", it) } + amountInfo?.let { put("amount", it.amountRaw.toJSONString()) } put("exchangeBaseUrl", exchangeBaseUrl) put("talerWithdrawUri", talerWithdrawUri) - put("amount", amountInfo.amountRaw.toJSONString()) }.onError { error -> handleError("acceptBankIntegratedWithdrawal", error) }.onSuccess { response -> diff --git a/wallet/src/main/java/net/taler/wallet/withdraw/WithdrawalShowInfo.kt b/wallet/src/main/java/net/taler/wallet/withdraw/WithdrawalShowInfo.kt @@ -49,6 +49,7 @@ import net.taler.wallet.R import net.taler.wallet.cleanExchange import net.taler.wallet.compose.AmountCurrencyField import net.taler.wallet.compose.BottomButtonBox +import net.taler.wallet.compose.WarningLabel import net.taler.wallet.systemBarsPaddingBottom import net.taler.wallet.transactions.AmountType import net.taler.wallet.transactions.TransactionAmountComposable @@ -108,7 +109,14 @@ fun WithdrawalShowInfo( .fillMaxWidth(), horizontalAlignment = Alignment.CenterHorizontally, ) { - if (editableAmount) { + if (status.isCashAcceptor) { + WarningLabel( + label = stringResource(R.string.withdraw_cash_acceptor), + modifier = Modifier + .padding(16.dp) + .fillMaxWidth(), + ) + } else if (editableAmount) { AmountCurrencyField( modifier = Modifier .padding(16.dp) @@ -231,7 +239,7 @@ fun WithdrawalShowInfo( .systemBarsPaddingBottom(), enabled = !error && status.status != Updating - && !selectedAmount.isZero(), + && (status.isCashAcceptor || !selectedAmount.isZero()), onClick = { if (status.status == TosReviewRequired) { onTosReview() diff --git a/wallet/src/main/res/values/strings.xml b/wallet/src/main/res/values/strings.xml @@ -264,6 +264,7 @@ GNU Taler is immune against many types of fraud, such as phishing of credit card <string name="withdraw_button_confirm_bank">Authorize in bank</string> <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_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>