diff options
author | Iván Ávalos <avalos@disroot.org> | 2023-03-04 02:56:23 -0300 |
---|---|---|
committer | Torsten Grote <t@grobox.de> | 2023-03-06 15:22:49 -0300 |
commit | 529478734944a60af428fa64e26001881afcf899 (patch) | |
tree | d385818490e6f2e3b5073caaf47b0af5f7215339 | |
parent | 9a30d3f0e7e5afb90593e9183acef99e4186e25e (diff) | |
download | taler-android-529478734944a60af428fa64e26001881afcf899.tar.gz taler-android-529478734944a60af428fa64e26001881afcf899.tar.bz2 taler-android-529478734944a60af428fa64e26001881afcf899.zip |
[wallet] Refresh withdrawal detail screen after confirmation
bug 0007727
11 files changed, 116 insertions, 77 deletions
diff --git a/wallet/build.gradle b/wallet/build.gradle index e4a3bf2..99889c0 100644 --- a/wallet/build.gradle +++ b/wallet/build.gradle @@ -126,6 +126,7 @@ dependencies { implementation "androidx.compose.material:material:1.3.1" implementation "androidx.compose.material3:material3:1.0.1" implementation "androidx.compose.material:material-icons-extended:1.3.1" + implementation "androidx.compose.runtime:runtime-livedata:$compose_version" implementation "androidx.lifecycle:lifecycle-viewmodel-compose:$lifecycle_version" implementation "com.google.accompanist:accompanist-themeadapter-material3:0.28.0" diff --git a/wallet/src/main/java/net/taler/wallet/transactions/TransactionDepositFragment.kt b/wallet/src/main/java/net/taler/wallet/transactions/TransactionDepositFragment.kt index 60f9b20..4ca20fd 100644 --- a/wallet/src/main/java/net/taler/wallet/transactions/TransactionDepositFragment.kt +++ b/wallet/src/main/java/net/taler/wallet/transactions/TransactionDepositFragment.kt @@ -20,6 +20,8 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import androidx.compose.runtime.getValue +import androidx.compose.runtime.livedata.observeAsState import androidx.compose.ui.platform.ComposeView import net.taler.wallet.compose.TalerSurface import net.taler.wallet.deposit.TransactionDepositComposable @@ -33,9 +35,13 @@ class TransactionDepositFragment : TransactionDetailFragment() { ): View = ComposeView(requireContext()).apply { setContent { TalerSurface { - val t = transaction ?: error("No transaction") - TransactionDepositComposable(t as TransactionDeposit) { - onDeleteButtonClicked(t) + val t: Transaction? by transactionManager.selectedTransaction.observeAsState() + if (t != null) { + TransactionDepositComposable(t as TransactionDeposit) { + onDeleteButtonClicked(t!!) + } + } else { + error("No transaction") } } } diff --git a/wallet/src/main/java/net/taler/wallet/transactions/TransactionDetailFragment.kt b/wallet/src/main/java/net/taler/wallet/transactions/TransactionDetailFragment.kt index b4008b0..1905a05 100644 --- a/wallet/src/main/java/net/taler/wallet/transactions/TransactionDetailFragment.kt +++ b/wallet/src/main/java/net/taler/wallet/transactions/TransactionDetailFragment.kt @@ -37,8 +37,7 @@ import net.taler.wallet.launchInAppBrowser abstract class TransactionDetailFragment : Fragment() { private val model: MainViewModel by activityViewModels() - private val transactionManager by lazy { model.transactionManager } - protected val transaction: Transaction? get() = transactionManager.selectedTransaction + val transactionManager by lazy { model.transactionManager } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -48,9 +47,11 @@ abstract class TransactionDetailFragment : Fragment() { @Deprecated("Deprecated in Java") override fun onActivityCreated(savedInstanceState: Bundle?) { super.onActivityCreated(savedInstanceState) - requireActivity().apply { - transaction?.generalTitleRes?.let { - title = getString(it) + transactionManager.selectedTransaction.observe(viewLifecycleOwner) { + requireActivity().apply { + it?.generalTitleRes?.let { + title = getString(it) + } } } } diff --git a/wallet/src/main/java/net/taler/wallet/transactions/TransactionManager.kt b/wallet/src/main/java/net/taler/wallet/transactions/TransactionManager.kt index 2da9ab4..8eac038 100644 --- a/wallet/src/main/java/net/taler/wallet/transactions/TransactionManager.kt +++ b/wallet/src/main/java/net/taler/wallet/transactions/TransactionManager.kt @@ -41,9 +41,9 @@ class TransactionManager( val progress: LiveData<Boolean> = mProgress var selectedCurrency: String? = null - var selectedTransaction: Transaction? = null val searchQuery = MutableLiveData<String>(null) + val selectedTransaction = MutableLiveData<Transaction?>(null) private val allTransactions = HashMap<String, List<Transaction>>() private val mTransactions = HashMap<String, MutableLiveData<TransactionsResult>>() val transactions: LiveData<TransactionsResult> @@ -84,6 +84,13 @@ class TransactionManager( mProgress.value = false liveData.value = TransactionsResult.Success(transactions) + // update selected transaction + transactions.find { + it.transactionId == selectedTransaction.value?.transactionId + }?.let { + selectedTransaction.postValue(it) + } + // update all transactions on UiThread if there was a currency if (searchQuery == null) allTransactions[currency] = transactions } @@ -102,13 +109,17 @@ class TransactionManager( transaction = result } return if (transaction != null) { - selectedTransaction = transaction + selectedTransaction.postValue(transaction) true } else { false } } + fun selectTransaction(transaction: Transaction) { + selectedTransaction.postValue(transaction) + } + fun deleteTransaction(transactionId: String) = scope.launch { api.request<Unit>("deleteTransaction") { put("transactionId", transactionId) diff --git a/wallet/src/main/java/net/taler/wallet/transactions/TransactionPaymentFragment.kt b/wallet/src/main/java/net/taler/wallet/transactions/TransactionPaymentFragment.kt index e2e4f9f..ec18c98 100644 --- a/wallet/src/main/java/net/taler/wallet/transactions/TransactionPaymentFragment.kt +++ b/wallet/src/main/java/net/taler/wallet/transactions/TransactionPaymentFragment.kt @@ -37,22 +37,24 @@ class TransactionPaymentFragment : TransactionDetailFragment() { } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - val t = transaction as TransactionPayment - ui.timeView.text = t.timestamp.ms.toAbsoluteTime(requireContext()) - - ui.amountPaidWithFeesView.text = t.amountEffective.toString() - val fee = t.amountEffective - t.amountRaw - bindOrderAndFee( - ui.orderSummaryView, - ui.orderAmountView, - ui.orderIdView, - ui.feeView, - t.info, - t.amountRaw, - fee - ) - ui.deleteButton.setOnClickListener { - onDeleteButtonClicked(t) + transactionManager.selectedTransaction.observe(viewLifecycleOwner) { t -> + if (t !is TransactionPayment) return@observe + ui.timeView.text = t.timestamp.ms.toAbsoluteTime(requireContext()) + + ui.amountPaidWithFeesView.text = t.amountEffective.toString() + val fee = t.amountEffective - t.amountRaw + bindOrderAndFee( + ui.orderSummaryView, + ui.orderAmountView, + ui.orderIdView, + ui.feeView, + t.info, + t.amountRaw, + fee + ) + ui.deleteButton.setOnClickListener { + onDeleteButtonClicked(t) + } } } diff --git a/wallet/src/main/java/net/taler/wallet/transactions/TransactionPeerFragment.kt b/wallet/src/main/java/net/taler/wallet/transactions/TransactionPeerFragment.kt index f6be5c8..58e8f31 100644 --- a/wallet/src/main/java/net/taler/wallet/transactions/TransactionPeerFragment.kt +++ b/wallet/src/main/java/net/taler/wallet/transactions/TransactionPeerFragment.kt @@ -28,6 +28,8 @@ import androidx.compose.foundation.verticalScroll import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.livedata.observeAsState import androidx.compose.ui.Alignment.Companion.CenterHorizontally import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color @@ -54,9 +56,13 @@ class TransactionPeerFragment : TransactionDetailFragment() { ): View = ComposeView(requireContext()).apply { setContent { TalerSurface { - val t = transaction ?: error("No transaction") - TransactionPeerComposable(t) { - onDeleteButtonClicked(t) + val t: Transaction? by transactionManager.selectedTransaction.observeAsState(null) + if (t != null) { + TransactionPeerComposable(t!!) { + onDeleteButtonClicked(t!!) + } + } else { + error("No transaction") } } } diff --git a/wallet/src/main/java/net/taler/wallet/transactions/TransactionRefreshFragment.kt b/wallet/src/main/java/net/taler/wallet/transactions/TransactionRefreshFragment.kt index d44db43..4c26449 100644 --- a/wallet/src/main/java/net/taler/wallet/transactions/TransactionRefreshFragment.kt +++ b/wallet/src/main/java/net/taler/wallet/transactions/TransactionRefreshFragment.kt @@ -40,19 +40,21 @@ class TransactionRefreshFragment : TransactionDetailFragment() { } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - val t = transaction as TransactionRefresh - ui.timeView.text = t.timestamp.ms.toAbsoluteTime(requireContext()) - - ui.effectiveAmountLabel.visibility = GONE - ui.effectiveAmountView.visibility = GONE - ui.confirmWithdrawalButton.visibility = GONE - ui.chosenAmountLabel.visibility = GONE - ui.chosenAmountView.visibility = GONE - val fee = t.amountEffective - ui.feeView.text = getString(R.string.amount_negative, fee.toString()) - ui.exchangeView.text = cleanExchange(t.exchangeBaseUrl) - ui.deleteButton.setOnClickListener { - onDeleteButtonClicked(t) + transactionManager.selectedTransaction.observe(viewLifecycleOwner) { t -> + if (t !is TransactionRefresh) return@observe + ui.timeView.text = t.timestamp.ms.toAbsoluteTime(requireContext()) + + ui.effectiveAmountLabel.visibility = GONE + ui.effectiveAmountView.visibility = GONE + ui.confirmWithdrawalButton.visibility = GONE + ui.chosenAmountLabel.visibility = GONE + ui.chosenAmountView.visibility = GONE + val fee = t.amountEffective + ui.feeView.text = getString(R.string.amount_negative, fee.toString()) + ui.exchangeView.text = cleanExchange(t.exchangeBaseUrl) + ui.deleteButton.setOnClickListener { + onDeleteButtonClicked(t) + } } } diff --git a/wallet/src/main/java/net/taler/wallet/transactions/TransactionRefundFragment.kt b/wallet/src/main/java/net/taler/wallet/transactions/TransactionRefundFragment.kt index 5e6eef4..125ae0c 100644 --- a/wallet/src/main/java/net/taler/wallet/transactions/TransactionRefundFragment.kt +++ b/wallet/src/main/java/net/taler/wallet/transactions/TransactionRefundFragment.kt @@ -39,25 +39,27 @@ class TransactionRefundFragment : TransactionDetailFragment() { } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - val t = transaction as TransactionRefund - ui.timeView.text = t.timestamp.ms.toAbsoluteTime(requireContext()) + transactionManager.selectedTransaction.observe(viewLifecycleOwner) { t -> + if (t !is TransactionRefund) return@observe + ui.timeView.text = t.timestamp.ms.toAbsoluteTime(requireContext()) - ui.amountPaidWithFeesLabel.text = getString(R.string.transaction_refund) - ui.amountPaidWithFeesView.setTextColor(getColor(requireContext(), R.color.green)) - ui.amountPaidWithFeesView.text = - getString(R.string.amount_positive, t.amountEffective.toString()) - val fee = t.amountRaw - t.amountEffective - bindOrderAndFee( - ui.orderSummaryView, - ui.orderAmountView, - ui.orderIdView, - ui.feeView, - t.info, - t.amountRaw, - fee - ) - ui.deleteButton.setOnClickListener { - onDeleteButtonClicked(t) + ui.amountPaidWithFeesLabel.text = getString(R.string.transaction_refund) + ui.amountPaidWithFeesView.setTextColor(getColor(requireContext(), R.color.green)) + ui.amountPaidWithFeesView.text = + getString(R.string.amount_positive, t.amountEffective.toString()) + val fee = t.amountRaw - t.amountEffective + bindOrderAndFee( + ui.orderSummaryView, + ui.orderAmountView, + ui.orderIdView, + ui.feeView, + t.info, + t.amountRaw, + fee + ) + ui.deleteButton.setOnClickListener { + onDeleteButtonClicked(t) + } } } diff --git a/wallet/src/main/java/net/taler/wallet/transactions/TransactionTipFragment.kt b/wallet/src/main/java/net/taler/wallet/transactions/TransactionTipFragment.kt index e8824ed..1eb7fea 100644 --- a/wallet/src/main/java/net/taler/wallet/transactions/TransactionTipFragment.kt +++ b/wallet/src/main/java/net/taler/wallet/transactions/TransactionTipFragment.kt @@ -29,6 +29,8 @@ import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Surface import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.livedata.observeAsState import androidx.compose.ui.Alignment.Companion.CenterHorizontally import androidx.compose.ui.Modifier import androidx.compose.ui.platform.ComposeView @@ -51,9 +53,13 @@ class TransactionTipFragment : TransactionDetailFragment() { ): View = ComposeView(requireContext()).apply { setContent { TalerSurface { - val t = transaction as? TransactionTip ?: error("No or wrong transaction") - TransactionTipComposable(t) { - onDeleteButtonClicked(t) + val t by transactionManager.selectedTransaction.observeAsState(null) + if (t != null && t is TransactionTip) { + TransactionTipComposable(t as TransactionTip) { + onDeleteButtonClicked(t!!) + } + } else { + error("No or wrong transaction") } } } diff --git a/wallet/src/main/java/net/taler/wallet/transactions/TransactionWithdrawalFragment.kt b/wallet/src/main/java/net/taler/wallet/transactions/TransactionWithdrawalFragment.kt index fe255ad..14b84b2 100644 --- a/wallet/src/main/java/net/taler/wallet/transactions/TransactionWithdrawalFragment.kt +++ b/wallet/src/main/java/net/taler/wallet/transactions/TransactionWithdrawalFragment.kt @@ -51,12 +51,13 @@ class TransactionWithdrawalFragment : TransactionDetailFragment() { } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - val t = transaction as TransactionWithdrawal - ui.timeView.text = t.timestamp.ms.toAbsoluteTime(requireContext()) + transactionManager.selectedTransaction.observe(viewLifecycleOwner) { t -> + if (t !is TransactionWithdrawal) return@observe + ui.timeView.text = t.timestamp.ms.toAbsoluteTime(requireContext()) - ui.effectiveAmountLabel.text = getString(R.string.withdraw_total) - ui.effectiveAmountView.text = t.amountEffective.toString() - setupConfirmWithdrawalButton(t) + ui.effectiveAmountLabel.text = getString(R.string.withdraw_total) + ui.effectiveAmountView.text = t.amountEffective.toString() + setupConfirmWithdrawalButton(t) setupActionButton(t) ui.chosenAmountLabel.text = getString(R.string.amount_chosen) ui.chosenAmountView.text = @@ -65,21 +66,22 @@ class TransactionWithdrawalFragment : TransactionDetailFragment() { ui.feeView.text = getString(R.string.amount_negative, fee.toString()) ui.exchangeView.text = cleanExchange(t.exchangeBaseUrl) if (t.pending) { - ui.deleteButton.setIconResource(R.drawable.ic_cancel) - ui.deleteButton.setText(R.string.cancel) - } - ui.deleteButton.setOnClickListener { - onDeleteButtonClicked(t) + ui.deleteButton.setIconResource(R.drawable.ic_cancel) + ui.deleteButton.setText(R.string.cancel) + } + ui.deleteButton.setOnClickListener { + onDeleteButtonClicked(t) + } } } override val deleteDialogTitle: Int - get() = if (transaction?.pending == true) R.string.cancel else super.deleteDialogTitle + get() = if (transactionManager.selectedTransaction.value?.pending == true) R.string.cancel else super.deleteDialogTitle override val deleteDialogMessage: Int - get() = if (transaction?.pending == true) R.string.transactions_cancel_dialog_message + get() = if (transactionManager.selectedTransaction.value?.pending == true) R.string.transactions_cancel_dialog_message else super.deleteDialogMessage override val deleteDialogButton: Int - get() = if (transaction?.pending == true) R.string.ok else super.deleteDialogButton + get() = if (transactionManager.selectedTransaction.value?.pending == true) R.string.ok else super.deleteDialogButton private fun setupConfirmWithdrawalButton(t: TransactionWithdrawal) { if (t.pending && !t.confirmed) { diff --git a/wallet/src/main/java/net/taler/wallet/transactions/TransactionsFragment.kt b/wallet/src/main/java/net/taler/wallet/transactions/TransactionsFragment.kt index cd66193..f2a74e2 100644 --- a/wallet/src/main/java/net/taler/wallet/transactions/TransactionsFragment.kt +++ b/wallet/src/main/java/net/taler/wallet/transactions/TransactionsFragment.kt @@ -175,7 +175,7 @@ class TransactionsFragment : Fragment(), OnTransactionClickListener, ActionMode. override fun onTransactionClicked(transaction: Transaction) { if (actionMode != null) return // don't react on clicks while in action mode if (transaction.detailPageNav != 0) { - transactionManager.selectedTransaction = transaction + transactionManager.selectTransaction(transaction) findNavController().navigate(transaction.detailPageNav) } } |