From 75d370fdef3d37290a98b2344e53831c68e44bd1 Mon Sep 17 00:00:00 2001 From: Torsten Grote Date: Tue, 11 Jul 2023 11:19:48 -0300 Subject: [wallet] some dd37 fixes after merging --- .../wallet/deposit/TransactionDepositComposable.kt | 10 +- .../wallet/transactions/TransactionAdapter.kt | 46 ++++----- .../transactions/TransactionDepositFragment.kt | 5 +- .../transactions/TransactionDetailFragment.kt | 92 ++++++++---------- .../wallet/transactions/TransactionManager.kt | 104 +++++++++++---------- .../transactions/TransactionPaymentFragment.kt | 1 - .../wallet/transactions/TransactionPeerFragment.kt | 12 ++- .../transactions/TransactionRefreshFragment.kt | 1 - .../transactions/TransactionRefundFragment.kt | 1 - .../wallet/transactions/TransactionTipFragment.kt | 8 +- .../transactions/TransactionWithdrawalFragment.kt | 6 +- .../net/taler/wallet/transactions/Transactions.kt | 10 +- .../wallet/transactions/TransactionsFragment.kt | 17 +++- .../wallet/transactions/TransitionsComposable.kt | 29 +++--- .../manual/ManualWithdrawSuccessFragment.kt | 3 + 15 files changed, 180 insertions(+), 165 deletions(-) (limited to 'wallet/src/main/java/net/taler/wallet') diff --git a/wallet/src/main/java/net/taler/wallet/deposit/TransactionDepositComposable.kt b/wallet/src/main/java/net/taler/wallet/deposit/TransactionDepositComposable.kt index 39235a4..1d5c91e 100644 --- a/wallet/src/main/java/net/taler/wallet/deposit/TransactionDepositComposable.kt +++ b/wallet/src/main/java/net/taler/wallet/deposit/TransactionDepositComposable.kt @@ -50,7 +50,11 @@ import net.taler.wallet.transactions.TransactionState import net.taler.wallet.transactions.TransitionsComposable @Composable -fun TransactionDepositComposable(t: TransactionDeposit, devMode: Boolean?, onTransition: (t: TransactionAction) -> Unit) { +fun TransactionDepositComposable( + t: TransactionDeposit, + devMode: Boolean, + onTransition: (t: TransactionAction) -> Unit, +) { val scrollState = rememberScrollState() Column( modifier = Modifier @@ -82,8 +86,8 @@ fun TransactionDepositComposable(t: TransactionDeposit, devMode: Boolean?, onTra amountType = AmountType.Negative, ) } - TransitionsComposable(t, devMode == true, onTransition) - if (devMode == true && t.error != null) { + TransitionsComposable(t, devMode, onTransition) + if (devMode && t.error != null) { ErrorTransactionButton(error = t.error) } } diff --git a/wallet/src/main/java/net/taler/wallet/transactions/TransactionAdapter.kt b/wallet/src/main/java/net/taler/wallet/transactions/TransactionAdapter.kt index 958ba0c..676a425 100644 --- a/wallet/src/main/java/net/taler/wallet/transactions/TransactionAdapter.kt +++ b/wallet/src/main/java/net/taler/wallet/transactions/TransactionAdapter.kt @@ -37,19 +37,11 @@ import net.taler.common.toRelativeTime import net.taler.wallet.R import net.taler.wallet.transactions.TransactionAdapter.TransactionViewHolder import net.taler.wallet.transactions.TransactionMajorState.Aborted -import net.taler.wallet.transactions.TransactionMajorState.Aborting -import net.taler.wallet.transactions.TransactionMajorState.Deleted -import net.taler.wallet.transactions.TransactionMajorState.Dialog -import net.taler.wallet.transactions.TransactionMajorState.Done import net.taler.wallet.transactions.TransactionMajorState.Failed -import net.taler.wallet.transactions.TransactionMajorState.None import net.taler.wallet.transactions.TransactionMajorState.Pending -import net.taler.wallet.transactions.TransactionMajorState.Suspended -import net.taler.wallet.transactions.TransactionMajorState.SuspendedAborting -import net.taler.wallet.transactions.TransactionMajorState.Unknown internal class TransactionAdapter( - private val listener: OnTransactionClickListener + private val listener: OnTransactionClickListener, ) : Adapter() { private var transactions: List = ArrayList() @@ -109,9 +101,11 @@ internal class TransactionAdapter( time.text = transaction.timestamp.ms.toRelativeTime(context) bindAmount(transaction) pendingView.visibility = if (transaction.txState.major == Pending) VISIBLE else GONE - val bgColor = getColor(context, + val bgColor = getColor( + context, if (selected) R.color.selectedBackground - else android.R.color.transparent) + else android.R.color.transparent + ) root.setBackgroundColor(bgColor) } @@ -127,21 +121,17 @@ internal class TransactionAdapter( extraInfoView.visibility = VISIBLE } else { when (transaction.txState.major) { - Aborted -> R.string.payment_aborted - Failed -> R.string.payment_failed - None -> null - Pending -> null - Done -> null - Aborting -> null - Suspended -> null - Dialog -> null - SuspendedAborting -> null - Deleted -> null - Unknown -> null - }?.let { - extraInfoView.setText(it) - } ?: { - extraInfoView.visibility = GONE + Aborted -> { + extraInfoView.setText(R.string.payment_aborted) + extraInfoView.visibility = VISIBLE + } + + Failed -> { + extraInfoView.setText(R.string.payment_failed) + extraInfoView.visibility = VISIBLE + } + + else -> extraInfoView.visibility = GONE } } } @@ -153,10 +143,12 @@ internal class TransactionAdapter( amount.text = context.getString(R.string.amount_positive, amountStr) amount.setTextColor(if (transaction.txState.major == Pending) amountColor else green) } + AmountType.Negative -> { amount.text = context.getString(R.string.amount_negative, amountStr) amount.setTextColor(if (transaction.txState.major == Pending) amountColor else red) } + AmountType.Neutral -> { amount.text = amountStr amount.setTextColor(amountColor) @@ -176,7 +168,7 @@ internal class TransactionAdapter( internal class TransactionLookup( private val list: RecyclerView, - private val adapter: TransactionAdapter + private val adapter: TransactionAdapter, ) : ItemDetailsLookup() { override fun getItemDetails(e: MotionEvent): ItemDetails? { list.findChildViewUnder(e.x, e.y)?.let { view -> 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 59bcb9b..f23b8d7 100644 --- a/wallet/src/main/java/net/taler/wallet/transactions/TransactionDepositFragment.kt +++ b/wallet/src/main/java/net/taler/wallet/transactions/TransactionDepositFragment.kt @@ -35,7 +35,10 @@ class TransactionDepositFragment : TransactionDetailFragment() { setContent { TalerSurface { val t = transactionManager.selectedTransaction.observeAsState().value - if (t is TransactionDeposit) TransactionDepositComposable(t, devMode.value) { + if (t is TransactionDeposit) TransactionDepositComposable( + t = t, + devMode = devMode, + ) { onTransitionButtonClicked(t, it) } } 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 103d8e6..d799b8e 100644 --- a/wallet/src/main/java/net/taler/wallet/transactions/TransactionDetailFragment.kt +++ b/wallet/src/main/java/net/taler/wallet/transactions/TransactionDetailFragment.kt @@ -18,9 +18,7 @@ package net.taler.wallet.transactions import android.os.Bundle import android.util.Log -import android.view.Menu -import android.view.MenuInflater -import android.view.MenuItem +import android.view.View import androidx.fragment.app.Fragment import androidx.fragment.app.activityViewModels import androidx.navigation.fragment.findNavController @@ -28,22 +26,22 @@ import com.google.android.material.dialog.MaterialAlertDialogBuilder import net.taler.wallet.MainViewModel import net.taler.wallet.R import net.taler.wallet.TAG -import net.taler.wallet.transactions.TransactionAction.* +import net.taler.wallet.showError +import net.taler.wallet.transactions.TransactionAction.Abort +import net.taler.wallet.transactions.TransactionAction.Delete +import net.taler.wallet.transactions.TransactionAction.Fail +import net.taler.wallet.transactions.TransactionAction.Resume +import net.taler.wallet.transactions.TransactionAction.Retry +import net.taler.wallet.transactions.TransactionAction.Suspend abstract class TransactionDetailFragment : Fragment() { private val model: MainViewModel by activityViewModels() - val transactionManager by lazy { model.transactionManager } - val devMode by lazy { model.devMode } + protected val transactionManager by lazy { model.transactionManager } + protected val devMode get() = model.devMode.value == true - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setHasOptionsMenu(model.devMode.value == true) - } - - @Deprecated("Deprecated in Java") - override fun onActivityCreated(savedInstanceState: Bundle?) { - super.onActivityCreated(savedInstanceState) + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) transactionManager.selectedTransaction.observe(viewLifecycleOwner) { requireActivity().apply { it?.generalTitleRes?.let { @@ -53,30 +51,18 @@ abstract class TransactionDetailFragment : Fragment() { } } - @Deprecated("Deprecated in Java") - override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) { - inflater.inflate(R.menu.transactions_detail, menu) - } - - @Deprecated("Deprecated in Java") - override fun onOptionsItemSelected(item: MenuItem): Boolean { - return when (item.itemId) { - else -> super.onOptionsItemSelected(item) - } - } - private fun dialogTitle(t: TransactionAction): Int = when (t) { Delete -> R.string.transactions_delete_dialog_title Abort -> R.string.transactions_abort_dialog_title Fail -> R.string.transactions_fail_dialog_title - else -> error("unsupported") + else -> error("unsupported action: $t") } private fun dialogMessage(t: TransactionAction): Int = when (t) { Delete -> R.string.transactions_delete_dialog_message Abort -> R.string.transactions_abort_dialog_message Fail -> R.string.transactions_fail_dialog_message - else -> error("unsupported") + else -> error("unsupported action: $t") } private fun dialogButton(t: TransactionAction): Int = when (t) { @@ -86,38 +72,33 @@ abstract class TransactionDetailFragment : Fragment() { else -> error("unsupported") } - protected fun onTransitionButtonClicked(t: Transaction, tt: TransactionAction) { - when (tt) { - Delete, Abort, Fail -> { - MaterialAlertDialogBuilder(requireContext(), R.style.MaterialAlertDialog_Material3) - .setTitle(dialogTitle(tt)) - .setMessage(dialogMessage(tt)) - .setNeutralButton(R.string.cancel) { dialog, _ -> - dialog.cancel() - } - .setNegativeButton(dialogButton(tt)) { dialog, _ -> - when (tt) { - Delete -> deleteTransaction(t) - Abort -> abortTransaction(t) - Fail -> failTransaction(t) - else -> {} - } - dialog.dismiss() - } - .show() + protected fun onTransitionButtonClicked(t: Transaction, ta: TransactionAction) = when (ta) { + Delete -> showDialog(ta) { deleteTransaction(t) } + Abort -> showDialog(ta) { abortTransaction(t) } + Fail -> showDialog(ta) { failTransaction(t) } + Retry -> retryTransaction(t) + Suspend -> suspendTransaction(t) + Resume -> resumeTransaction(t) + } + + private fun showDialog(tt: TransactionAction, onAction: () -> Unit) { + MaterialAlertDialogBuilder(requireContext(), R.style.MaterialAlertDialog_Material3) + .setTitle(dialogTitle(tt)) + .setMessage(dialogMessage(tt)) + .setNeutralButton(R.string.cancel) { dialog, _ -> + dialog.cancel() } - else -> when (tt) { - Retry -> retryTransaction(t) - Suspend -> suspendTransaction(t) - Resume -> resumeTransaction(t) - else -> {} + .setNegativeButton(dialogButton(tt)) { dialog, _ -> + onAction() + dialog.dismiss() } - } + .show() } private fun deleteTransaction(t: Transaction) { transactionManager.deleteTransaction(t.transactionId) { Log.e(TAG, "Error deleteTransaction $it") + showError(it) } findNavController().popBackStack() } @@ -125,30 +106,35 @@ abstract class TransactionDetailFragment : Fragment() { private fun retryTransaction(t: Transaction) { transactionManager.retryTransaction(t.transactionId) { Log.e(TAG, "Error retryTransaction $it") + showError(it) } } private fun abortTransaction(t: Transaction) { transactionManager.abortTransaction(t.transactionId) { Log.e(TAG, "Error abortTransaction $it") + showError(it) } } private fun failTransaction(t: Transaction) { transactionManager.failTransaction(t.transactionId) { Log.e(TAG, "Error failTransaction $it") + showError(it) } } private fun suspendTransaction(t: Transaction) { transactionManager.suspendTransaction(t.transactionId) { Log.e(TAG, "Error suspendTransaction $it") + showError(it) } } private fun resumeTransaction(t: Transaction) { transactionManager.resumeTransaction(t.transactionId) { Log.e(TAG, "Error resumeTransaction $it") + showError(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 ffaccc6..df62f31 100644 --- a/wallet/src/main/java/net/taler/wallet/transactions/TransactionManager.kt +++ b/wallet/src/main/java/net/taler/wallet/transactions/TransactionManager.kt @@ -128,66 +128,72 @@ class TransactionManager( mSelectedTransaction.postValue(transaction) } - fun deleteTransaction(transactionId: String, onError: (it: TalerErrorInfo) -> Unit) = scope.launch { - api.request("deleteTransaction") { - put("transactionId", transactionId) - }.onError { - onError(it) - }.onSuccess { - // re-load transactions as our list is stale otherwise - loadTransactions() + fun deleteTransaction(transactionId: String, onError: (it: TalerErrorInfo) -> Unit) = + scope.launch { + api.request("deleteTransaction") { + put("transactionId", transactionId) + }.onError { + onError(it) + }.onSuccess { + // re-load transactions as our list is stale otherwise + loadTransactions() + } } - } - fun retryTransaction(transactionId: String, onError: (it: TalerErrorInfo) -> Unit) = scope.launch { - api.request("retryTransaction") { - put("transactionId", transactionId) - }.onError { - onError(it) - }.onSuccess { - loadTransactions() + fun retryTransaction(transactionId: String, onError: (it: TalerErrorInfo) -> Unit) = + scope.launch { + api.request("retryTransaction") { + put("transactionId", transactionId) + }.onError { + onError(it) + }.onSuccess { + loadTransactions() + } } - } - fun abortTransaction(transactionId: String, onError: (it: TalerErrorInfo) -> Unit) = scope.launch { - api.request("abortTransaction") { - put("transactionId", transactionId) - }.onError { - onError(it) - }.onSuccess { - loadTransactions() + fun abortTransaction(transactionId: String, onError: (it: TalerErrorInfo) -> Unit) = + scope.launch { + api.request("abortTransaction") { + put("transactionId", transactionId) + }.onError { + onError(it) + }.onSuccess { + loadTransactions() + } } - } - fun failTransaction(transactionId: String, onError: (it: TalerErrorInfo) -> Unit) = scope.launch { - api.request("failTransaction") { - put("transactionId", transactionId) - }.onError { - onError(it) - }.onSuccess { - loadTransactions() + fun failTransaction(transactionId: String, onError: (it: TalerErrorInfo) -> Unit) = + scope.launch { + api.request("failTransaction") { + put("transactionId", transactionId) + }.onError { + onError(it) + }.onSuccess { + loadTransactions() + } } - } - fun suspendTransaction(transactionId: String, onError: (it: TalerErrorInfo) -> Unit) = scope.launch { - api.request("suspendTransaction") { - put("transactionId", transactionId) - }.onError { - onError(it) - }.onSuccess { - loadTransactions() + fun suspendTransaction(transactionId: String, onError: (it: TalerErrorInfo) -> Unit) = + scope.launch { + api.request("suspendTransaction") { + put("transactionId", transactionId) + }.onError { + onError(it) + }.onSuccess { + loadTransactions() + } } - } - fun resumeTransaction(transactionId: String, onError: (it: TalerErrorInfo) -> Unit) = scope.launch { - api.request("resumeTransaction") { - put("transactionId", transactionId) - }.onError { - onError(it) - }.onSuccess { - loadTransactions() + fun resumeTransaction(transactionId: String, onError: (it: TalerErrorInfo) -> Unit) = + scope.launch { + api.request("resumeTransaction") { + put("transactionId", transactionId) + }.onError { + onError(it) + }.onSuccess { + loadTransactions() + } } - } fun deleteTransactions(transactionIds: List, onError: (it: TalerErrorInfo) -> Unit) { allTransactions[selectedCurrency]?.filter { transaction -> 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 65cc0f4..27598ab 100644 --- a/wallet/src/main/java/net/taler/wallet/transactions/TransactionPaymentFragment.kt +++ b/wallet/src/main/java/net/taler/wallet/transactions/TransactionPaymentFragment.kt @@ -36,7 +36,6 @@ class TransactionPaymentFragment : TransactionDetailFragment() { setContent { TalerSurface { val t = transactionManager.selectedTransaction.observeAsState().value - val devMode = devMode.observeAsState().value ?: false if (t is TransactionPayment) TransactionPaymentComposable(t, devMode, onFulfill = { url -> launchInAppBrowser(requireContext(), url) 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 2d79d77..c934d89 100644 --- a/wallet/src/main/java/net/taler/wallet/transactions/TransactionPeerFragment.kt +++ b/wallet/src/main/java/net/taler/wallet/transactions/TransactionPeerFragment.kt @@ -56,7 +56,7 @@ class TransactionPeerFragment : TransactionDetailFragment() { setContent { TalerSurface { val t = transactionManager.selectedTransaction.observeAsState(null).value - if (t != null) TransactionPeerComposable(t, devMode.value) { + if (t != null) TransactionPeerComposable(t, devMode) { onTransitionButtonClicked(t, it) } } @@ -65,7 +65,11 @@ class TransactionPeerFragment : TransactionDetailFragment() { } @Composable -fun TransactionPeerComposable(t: Transaction, devMode: Boolean?, onTransition: (t: TransactionAction) -> Unit) { +fun TransactionPeerComposable( + t: Transaction, + devMode: Boolean, + onTransition: (t: TransactionAction) -> Unit, +) { val scrollState = rememberScrollState() Column( modifier = Modifier @@ -86,8 +90,8 @@ fun TransactionPeerComposable(t: Transaction, devMode: Boolean?, onTransition: ( is TransactionPeerPushDebit -> TransactionPeerPushDebitComposable(t) else -> error("unexpected transaction: ${t::class.simpleName}") } - TransitionsComposable(t, devMode == true, onTransition) - if (devMode == true && t.error != null) { + TransitionsComposable(t, devMode, onTransition) + if (devMode && t.error != null) { ErrorTransactionButton(error = t.error!!) } } 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 f1f1ad7..da4b14d 100644 --- a/wallet/src/main/java/net/taler/wallet/transactions/TransactionRefreshFragment.kt +++ b/wallet/src/main/java/net/taler/wallet/transactions/TransactionRefreshFragment.kt @@ -59,7 +59,6 @@ class TransactionRefreshFragment : TransactionDetailFragment() { setContent { TalerSurface { val t = transactionManager.selectedTransaction.observeAsState().value - val devMode = devMode.observeAsState().value ?: false if (t is TransactionRefresh) TransactionRefreshComposable(t, devMode) { onTransitionButtonClicked(t, it) } 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 a2fe223..306febc 100644 --- a/wallet/src/main/java/net/taler/wallet/transactions/TransactionRefundFragment.kt +++ b/wallet/src/main/java/net/taler/wallet/transactions/TransactionRefundFragment.kt @@ -36,7 +36,6 @@ class TransactionRefundFragment : TransactionDetailFragment() { setContent { TalerSurface { val t = transactionManager.selectedTransaction.observeAsState().value - val devMode = devMode.observeAsState().value ?: false if (t is TransactionRefund) TransactionRefundComposable(t, devMode, onFulfill = { url -> launchInAppBrowser(requireContext(), url) 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 0870281..c15f931 100644 --- a/wallet/src/main/java/net/taler/wallet/transactions/TransactionTipFragment.kt +++ b/wallet/src/main/java/net/taler/wallet/transactions/TransactionTipFragment.kt @@ -59,7 +59,7 @@ class TransactionTipFragment : TransactionDetailFragment() { setContent { TalerSurface { val t = transactionManager.selectedTransaction.observeAsState(null).value - if (t is TransactionTip) TransactionTipComposable(t, devMode.value) { + if (t is TransactionTip) TransactionTipComposable(t, devMode) { onTransitionButtonClicked(t, it) } } @@ -68,7 +68,11 @@ class TransactionTipFragment : TransactionDetailFragment() { } @Composable -fun TransactionTipComposable(t: TransactionTip, devMode: Boolean?, onTransition: (t: TransactionAction) -> Unit) { +fun TransactionTipComposable( + t: TransactionTip, + devMode: Boolean?, + onTransition: (t: TransactionAction) -> Unit, +) { val scrollState = rememberScrollState() Column( modifier = Modifier 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 35207fa..52bd998 100644 --- a/wallet/src/main/java/net/taler/wallet/transactions/TransactionWithdrawalFragment.kt +++ b/wallet/src/main/java/net/taler/wallet/transactions/TransactionWithdrawalFragment.kt @@ -28,6 +28,7 @@ import net.taler.wallet.MainViewModel import net.taler.wallet.R import net.taler.wallet.compose.TalerSurface import net.taler.wallet.launchInAppBrowser +import net.taler.wallet.showError import net.taler.wallet.transactions.WithdrawalDetails.ManualTransfer import net.taler.wallet.transactions.WithdrawalDetails.TalerBankIntegrationApi import net.taler.wallet.withdraw.TransactionWithdrawalComposable @@ -46,7 +47,6 @@ class TransactionWithdrawalFragment : TransactionDetailFragment(), ActionListene setContent { TalerSurface { val t = transactionManager.selectedTransaction.observeAsState().value - val devMode = devMode.observeAsState().value ?: false if (t is TransactionWithdrawal) TransactionWithdrawalComposable( t = t, devMode = devMode, @@ -63,8 +63,9 @@ class TransactionWithdrawalFragment : TransactionDetailFragment(), ActionListene ActionListener.Type.COMPLETE_KYC -> { tx.error?.getStringExtra("kycUrl")?.let { kycUrl -> launchInAppBrowser(requireContext(), kycUrl) - } + } ?: tx.error?.let { showError(it) } } + ActionListener.Type.CONFIRM_WITH_BANK -> { if (tx !is TransactionWithdrawal) return if (tx.withdrawalDetails !is TalerBankIntegrationApi) return @@ -72,6 +73,7 @@ class TransactionWithdrawalFragment : TransactionDetailFragment(), ActionListene launchInAppBrowser(requireContext(), url) } } + ActionListener.Type.CONFIRM_MANUAL -> { if (tx !is TransactionWithdrawal) return if (tx.withdrawalDetails !is ManualTransfer) return diff --git a/wallet/src/main/java/net/taler/wallet/transactions/Transactions.kt b/wallet/src/main/java/net/taler/wallet/transactions/Transactions.kt index 62e458b..b6b3587 100644 --- a/wallet/src/main/java/net/taler/wallet/transactions/Transactions.kt +++ b/wallet/src/main/java/net/taler/wallet/transactions/Transactions.kt @@ -42,7 +42,7 @@ import net.taler.wallet.TAG import net.taler.wallet.backend.TalerErrorCode import net.taler.wallet.backend.TalerErrorInfo import net.taler.wallet.cleanExchange -import net.taler.wallet.transactions.TransactionMajorState.Failed +import net.taler.wallet.transactions.TransactionMajorState.None import net.taler.wallet.transactions.TransactionMajorState.Pending import net.taler.wallet.transactions.WithdrawalDetails.ManualTransfer import net.taler.wallet.transactions.WithdrawalDetails.TalerBankIntegrationApi @@ -255,10 +255,6 @@ class TransactionRefund( override val txActions: List, val refundedTransactionId: String, val info: TransactionInfo, - /** - * Part of the refund that couldn't be applied because the refund permissions were expired - */ - val amountInvalid: Amount? = null, override val error: TalerErrorInfo? = null, override val amountRaw: Amount, override val amountEffective: Amount, @@ -476,8 +472,8 @@ class DummyTransaction( override val timestamp: Timestamp, override val error: TalerErrorInfo, ) : Transaction() { - override val txState: TransactionState = TransactionState(Failed) - override val txActions: List = listOf(TransactionAction.Delete) + override val txState: TransactionState = TransactionState(None) + override val txActions: List = emptyList() override val amountRaw: Amount = Amount.zero("TESTKUDOS") override val amountEffective: Amount = Amount.zero("TESTKUDOS") override val icon: Int = R.drawable.ic_bug_report 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 4ed5c57..032f2de 100644 --- a/wallet/src/main/java/net/taler/wallet/transactions/TransactionsFragment.kt +++ b/wallet/src/main/java/net/taler/wallet/transactions/TransactionsFragment.kt @@ -46,6 +46,7 @@ import net.taler.wallet.TAG import net.taler.wallet.databinding.FragmentTransactionsBinding import net.taler.wallet.handleKyc import net.taler.wallet.launchInAppBrowser +import net.taler.wallet.showError interface OnTransactionClickListener { fun onTransactionClicked(transaction: Transaction) @@ -191,8 +192,12 @@ class TransactionsFragment : Fragment(), OnTransactionClickListener, ActionMode. } } else if (transaction is TransactionWithdrawal && !transaction.confirmed) { if (transaction.withdrawalDetails is WithdrawalDetails.TalerBankIntegrationApi && - transaction.withdrawalDetails.bankConfirmationUrl != null) { - launchInAppBrowser(requireContext(), transaction.withdrawalDetails.bankConfirmationUrl) + transaction.withdrawalDetails.bankConfirmationUrl != null + ) { + launchInAppBrowser( + context = requireContext(), + url = transaction.withdrawalDetails.bankConfirmationUrl, + ) } } } @@ -203,6 +208,7 @@ class TransactionsFragment : Fragment(), OnTransactionClickListener, ActionMode. ui.emptyState.text = getString(R.string.transactions_error, result.error.userFacingMsg) ui.emptyState.fadeIn() } + is TransactionsResult.Success -> { if (result.transactions.isEmpty()) { val isSearch = transactionManager.searchQuery.value != null @@ -241,7 +247,10 @@ class TransactionsFragment : Fragment(), OnTransactionClickListener, ActionMode. when (item.itemId) { R.id.transaction_delete -> { tracker?.selection?.toList()?.let { transactionIds -> - MaterialAlertDialogBuilder(requireContext(), R.style.MaterialAlertDialog_Material3) + MaterialAlertDialogBuilder( + requireContext(), + R.style.MaterialAlertDialog_Material3, + ) .setTitle(R.string.transactions_delete) .setMessage(R.string.transactions_delete_selected_dialog_message) .setNeutralButton(R.string.cancel) { dialog, _ -> @@ -250,6 +259,7 @@ class TransactionsFragment : Fragment(), OnTransactionClickListener, ActionMode. .setNegativeButton(R.string.transactions_delete) { dialog, _ -> transactionManager.deleteTransactions(transactionIds) { Log.e(TAG, "Error deleteTransaction $it") + showError(it) } dialog.dismiss() } @@ -257,6 +267,7 @@ class TransactionsFragment : Fragment(), OnTransactionClickListener, ActionMode. } mode.finish() } + R.id.transaction_select_all -> transactionAdapter.selectAll() } return true diff --git a/wallet/src/main/java/net/taler/wallet/transactions/TransitionsComposable.kt b/wallet/src/main/java/net/taler/wallet/transactions/TransitionsComposable.kt index cead75d..424cc2a 100644 --- a/wallet/src/main/java/net/taler/wallet/transactions/TransitionsComposable.kt +++ b/wallet/src/main/java/net/taler/wallet/transactions/TransitionsComposable.kt @@ -16,6 +16,7 @@ package net.taler.wallet.transactions +import androidx.compose.foundation.layout.Arrangement.Center import androidx.compose.foundation.layout.ExperimentalLayoutApi import androidx.compose.foundation.layout.FlowRow import androidx.compose.foundation.layout.Row @@ -36,11 +37,15 @@ import net.taler.wallet.transactions.TransactionAction.* @OptIn(ExperimentalLayoutApi::class) @Composable -fun TransitionsComposable(t: Transaction, devMode: Boolean, onTransition: (t: TransactionAction) -> Unit) { - FlowRow { +fun TransitionsComposable( + t: Transaction, + devMode: Boolean, + onTransition: (t: TransactionAction) -> Unit, +) { + FlowRow(horizontalArrangement = Center) { t.txActions.forEach { if (it in arrayOf(Resume, Suspend)) { - if(devMode) TransitionComposable(it, onTransition) + if (devMode) TransitionComposable(it, onTransition) } else { TransitionComposable(it, onTransition) } @@ -52,14 +57,16 @@ fun TransitionsComposable(t: Transaction, devMode: Boolean, onTransition: (t: Tr fun TransitionComposable(t: TransactionAction, onClick: (t: TransactionAction) -> Unit) { Button( modifier = Modifier.padding(16.dp), - colors = ButtonDefaults.buttonColors(containerColor = when(t) { - Delete -> MaterialTheme.colorScheme.error - Retry -> MaterialTheme.colorScheme.primary - Abort -> MaterialTheme.colorScheme.error - Fail -> MaterialTheme.colorScheme.error - Resume -> MaterialTheme.colorScheme.primary - Suspend -> MaterialTheme.colorScheme.primary - }), + colors = ButtonDefaults.buttonColors( + containerColor = when (t) { + Delete -> MaterialTheme.colorScheme.error + Retry -> MaterialTheme.colorScheme.primary + Abort -> MaterialTheme.colorScheme.error + Fail -> MaterialTheme.colorScheme.error + Resume -> MaterialTheme.colorScheme.primary + Suspend -> MaterialTheme.colorScheme.primary + } + ), onClick = { onClick(t) }, ) { Row(verticalAlignment = Alignment.CenterVertically) { diff --git a/wallet/src/main/java/net/taler/wallet/withdraw/manual/ManualWithdrawSuccessFragment.kt b/wallet/src/main/java/net/taler/wallet/withdraw/manual/ManualWithdrawSuccessFragment.kt index 3b9b4a5..fa3f38b 100644 --- a/wallet/src/main/java/net/taler/wallet/withdraw/manual/ManualWithdrawSuccessFragment.kt +++ b/wallet/src/main/java/net/taler/wallet/withdraw/manual/ManualWithdrawSuccessFragment.kt @@ -31,6 +31,7 @@ import net.taler.wallet.MainViewModel import net.taler.wallet.R import net.taler.wallet.TAG import net.taler.wallet.compose.TalerSurface +import net.taler.wallet.showError import net.taler.wallet.withdraw.WithdrawStatus class ManualWithdrawSuccessFragment : Fragment() { @@ -55,6 +56,7 @@ class ManualWithdrawSuccessFragment : Fragment() { { transactionManager.deleteTransaction(tid) { Log.e(TAG, "Error deleteTransaction $it") + showError(it) } findNavController().navigate(R.id.action_nav_exchange_manual_withdrawal_success_to_nav_main) } @@ -65,6 +67,7 @@ class ManualWithdrawSuccessFragment : Fragment() { is WithdrawStatus.ManualTransferRequiredBitcoin -> { ScreenBitcoin(status, onBankAppClick, onCancelClick) } + is WithdrawStatus.ManualTransferRequiredIBAN -> { ScreenIBAN(status, onBankAppClick, onCancelClick) } -- cgit v1.2.3