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:
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>