taler-android

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

commit 4941acfd0e449bc131635129d91cd3947129feb1
parent ffec242ff44967ce545e2c08443c8e0f97b9300c
Author: Iván Ávalos <avalos@disroot.org>
Date:   Wed, 14 May 2025 14:00:22 +0200

[wallet] fix cancel payment button not clickable

Diffstat:
Mwallet/src/main/java/net/taler/wallet/payment/PayTemplateComposable.kt | 1+
Mwallet/src/main/java/net/taler/wallet/payment/PaymentManager.kt | 4++++
Mwallet/src/main/java/net/taler/wallet/payment/PaymentResponses.kt | 1+
Mwallet/src/main/java/net/taler/wallet/payment/PromptPaymentFragment.kt | 60++++++++++++++++++++++++++++++++++++------------------------
4 files changed, 42 insertions(+), 24 deletions(-)

diff --git a/wallet/src/main/java/net/taler/wallet/payment/PayTemplateComposable.kt b/wallet/src/main/java/net/taler/wallet/payment/PayTemplateComposable.kt @@ -138,6 +138,7 @@ fun PayTemplateInsufficientBalancePreview() { TalerSurface { PayTemplateComposable( payStatus = PayStatus.InsufficientBalance( + "txn:3409F039F09", ContractTerms( "test", amount = Amount.zero("TESTKUDOS"), diff --git a/wallet/src/main/java/net/taler/wallet/payment/PaymentManager.kt b/wallet/src/main/java/net/taler/wallet/payment/PaymentManager.kt @@ -57,6 +57,7 @@ sealed class PayStatus { ) : PayStatus() data class InsufficientBalance( + val transactionId: String, val contractTerms: ContractTerms, val amountRaw: Amount, val balanceDetails: PaymentInsufficientBalanceDetails, @@ -126,6 +127,7 @@ class PaymentManager( mPayStatus.value = when (response) { is PaymentPossibleResponse -> response.toPayStatusPrepared() is InsufficientBalanceResponse -> InsufficientBalance( + transactionId = response.transactionId, contractTerms = response.contractTerms, amountRaw = response.amountRaw, balanceDetails = response.balanceDetails, @@ -161,6 +163,7 @@ class PaymentManager( is GetChoicesForPaymentResponse.ChoiceSelectionDetail.InsufficientBalance -> { if (choice.balanceDetails != null) { mPayStatus.value = InsufficientBalance( + transactionId = tx.transactionId, amountRaw = choice.amountRaw, contractTerms = res.contractData, balanceDetails = choice.balanceDetails, @@ -219,6 +222,7 @@ class PaymentManager( mPayStatus.value = when (response) { is PaymentPossibleResponse -> response.toPayStatusPrepared() is InsufficientBalanceResponse -> InsufficientBalance( + transactionId = response.transactionId, contractTerms = response.contractTerms, amountRaw = response.amountRaw, balanceDetails = response.balanceDetails, diff --git a/wallet/src/main/java/net/taler/wallet/payment/PaymentResponses.kt b/wallet/src/main/java/net/taler/wallet/payment/PaymentResponses.kt @@ -58,6 +58,7 @@ sealed class PreparePayResponse { @Serializable @SerialName("insufficient-balance") data class InsufficientBalanceResponse( + val transactionId: String, val amountRaw: Amount, val contractTerms: ContractTerms, val balanceDetails: PaymentInsufficientBalanceDetails, diff --git a/wallet/src/main/java/net/taler/wallet/payment/PromptPaymentFragment.kt b/wallet/src/main/java/net/taler/wallet/payment/PromptPaymentFragment.kt @@ -22,10 +22,12 @@ import android.util.Log import android.view.LayoutInflater import android.view.View import android.view.View.GONE +import android.view.View.VISIBLE import android.view.ViewGroup import android.view.ViewGroup.MarginLayoutParams import androidx.core.view.ViewCompat import androidx.core.view.WindowInsetsCompat +import androidx.core.view.isVisible import androidx.core.view.updateLayoutParams import androidx.fragment.app.Fragment import androidx.fragment.app.activityViewModels @@ -97,10 +99,12 @@ class PromptPaymentFragment : Fragment(), ProductImageClickListener { } private fun onPaymentStatusChanged(payStatus: PayStatus?) { + var transactionId: String? = null when (payStatus) { null -> {} is PayStatus.Checked -> {} // does not apply, only used for templates is PayStatus.Prepared -> { + transactionId = payStatus.transactionId showLoading(false) val fees = payStatus.amountEffective - payStatus.amountRaw showOrder(payStatus.contractTerms, payStatus.amountRaw, fees) @@ -115,32 +119,9 @@ class PromptPaymentFragment : Fragment(), ProductImageClickListener { ui.bottom.cancelButton.fadeOut() ui.bottom.confirmProgressBar.fadeIn() } - ui.bottom.cancelButton.isEnabled = true - ui.bottom.cancelButton.setOnClickListener { - MaterialAlertDialogBuilder(requireContext()) - .setTitle(R.string.payment_cancel_dialog_title) - .setMessage(R.string.payment_cancel_dialog_message) - .setNeutralButton(R.string.button_back) { dialog, _ -> dialog.dismiss() } - .setNegativeButton(R.string.payment_cancel_dialog_title) { _, _ -> - transactionManager.abortTransaction( - payStatus.transactionId, - onSuccess = { - Snackbar.make(requireView(), getString(R.string.payment_aborted), LENGTH_LONG).show() - findNavController().popBackStack() - }, - onError = { error -> - Log.e(TAG, "Error abortTransaction $error") - if (model.devMode.value == false) { - showError(error.userFacingMsg) - } else { - showError(error) - } - } - ) - }.show() - } } is PayStatus.InsufficientBalance -> { + transactionId = payStatus.transactionId showLoading(false) showOrder(payStatus.contractTerms, payStatus.amountRaw) ui.details.errorView.text = getString( @@ -185,6 +166,37 @@ class PromptPaymentFragment : Fragment(), ProductImageClickListener { showLoading(true) } } + + ui.bottom.cancelButton.isEnabled = transactionId != null + if (transactionId != null) { + ui.bottom.cancelButton.setOnClickListener { + MaterialAlertDialogBuilder(requireContext()) + .setTitle(R.string.payment_cancel_dialog_title) + .setMessage(R.string.payment_cancel_dialog_message) + .setNeutralButton(R.string.button_back) { dialog, _ -> dialog.dismiss() } + .setNegativeButton(R.string.payment_cancel_dialog_title) { _, _ -> + transactionManager.abortTransaction( + transactionId, + onSuccess = { + Snackbar.make( + requireView(), + getString(R.string.payment_aborted), + LENGTH_LONG + ).show() + findNavController().popBackStack() + }, + onError = { error -> + Log.e(TAG, "Error abortTransaction $error") + if (model.devMode.value == false) { + showError(error.userFacingMsg) + } else { + showError(error) + } + } + ) + }.show() + } + } } private fun showOrder(