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