summaryrefslogtreecommitdiff
path: root/wallet/src/main/java/net/taler/wallet/transactions
diff options
context:
space:
mode:
authorTorsten Grote <t@grobox.de>2023-07-11 11:19:48 -0300
committerTorsten Grote <t@grobox.de>2023-07-11 11:19:48 -0300
commit75d370fdef3d37290a98b2344e53831c68e44bd1 (patch)
tree77f61aee885235ef75b3f0eb4c6148ca3228f4be /wallet/src/main/java/net/taler/wallet/transactions
parent13c4700300ff83a88d0f2eabbdb306e94c78c4cc (diff)
downloadtaler-android-75d370fdef3d37290a98b2344e53831c68e44bd1.tar.gz
taler-android-75d370fdef3d37290a98b2344e53831c68e44bd1.tar.bz2
taler-android-75d370fdef3d37290a98b2344e53831c68e44bd1.zip
[wallet] some dd37 fixes after merging
Diffstat (limited to 'wallet/src/main/java/net/taler/wallet/transactions')
-rw-r--r--wallet/src/main/java/net/taler/wallet/transactions/TransactionAdapter.kt46
-rw-r--r--wallet/src/main/java/net/taler/wallet/transactions/TransactionDepositFragment.kt5
-rw-r--r--wallet/src/main/java/net/taler/wallet/transactions/TransactionDetailFragment.kt92
-rw-r--r--wallet/src/main/java/net/taler/wallet/transactions/TransactionManager.kt104
-rw-r--r--wallet/src/main/java/net/taler/wallet/transactions/TransactionPaymentFragment.kt1
-rw-r--r--wallet/src/main/java/net/taler/wallet/transactions/TransactionPeerFragment.kt12
-rw-r--r--wallet/src/main/java/net/taler/wallet/transactions/TransactionRefreshFragment.kt1
-rw-r--r--wallet/src/main/java/net/taler/wallet/transactions/TransactionRefundFragment.kt1
-rw-r--r--wallet/src/main/java/net/taler/wallet/transactions/TransactionTipFragment.kt8
-rw-r--r--wallet/src/main/java/net/taler/wallet/transactions/TransactionWithdrawalFragment.kt6
-rw-r--r--wallet/src/main/java/net/taler/wallet/transactions/Transactions.kt10
-rw-r--r--wallet/src/main/java/net/taler/wallet/transactions/TransactionsFragment.kt17
-rw-r--r--wallet/src/main/java/net/taler/wallet/transactions/TransitionsComposable.kt29
13 files changed, 170 insertions, 162 deletions
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<TransactionViewHolder>() {
private var transactions: List<Transaction> = 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<String>() {
override fun getItemDetails(e: MotionEvent): ItemDetails<String>? {
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<Unit>("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<Unit>("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<Unit>("retryTransaction") {
- put("transactionId", transactionId)
- }.onError {
- onError(it)
- }.onSuccess {
- loadTransactions()
+ fun retryTransaction(transactionId: String, onError: (it: TalerErrorInfo) -> Unit) =
+ scope.launch {
+ api.request<Unit>("retryTransaction") {
+ put("transactionId", transactionId)
+ }.onError {
+ onError(it)
+ }.onSuccess {
+ loadTransactions()
+ }
}
- }
- fun abortTransaction(transactionId: String, onError: (it: TalerErrorInfo) -> Unit) = scope.launch {
- api.request<Unit>("abortTransaction") {
- put("transactionId", transactionId)
- }.onError {
- onError(it)
- }.onSuccess {
- loadTransactions()
+ fun abortTransaction(transactionId: String, onError: (it: TalerErrorInfo) -> Unit) =
+ scope.launch {
+ api.request<Unit>("abortTransaction") {
+ put("transactionId", transactionId)
+ }.onError {
+ onError(it)
+ }.onSuccess {
+ loadTransactions()
+ }
}
- }
- fun failTransaction(transactionId: String, onError: (it: TalerErrorInfo) -> Unit) = scope.launch {
- api.request<Unit>("failTransaction") {
- put("transactionId", transactionId)
- }.onError {
- onError(it)
- }.onSuccess {
- loadTransactions()
+ fun failTransaction(transactionId: String, onError: (it: TalerErrorInfo) -> Unit) =
+ scope.launch {
+ api.request<Unit>("failTransaction") {
+ put("transactionId", transactionId)
+ }.onError {
+ onError(it)
+ }.onSuccess {
+ loadTransactions()
+ }
}
- }
- fun suspendTransaction(transactionId: String, onError: (it: TalerErrorInfo) -> Unit) = scope.launch {
- api.request<Unit>("suspendTransaction") {
- put("transactionId", transactionId)
- }.onError {
- onError(it)
- }.onSuccess {
- loadTransactions()
+ fun suspendTransaction(transactionId: String, onError: (it: TalerErrorInfo) -> Unit) =
+ scope.launch {
+ api.request<Unit>("suspendTransaction") {
+ put("transactionId", transactionId)
+ }.onError {
+ onError(it)
+ }.onSuccess {
+ loadTransactions()
+ }
}
- }
- fun resumeTransaction(transactionId: String, onError: (it: TalerErrorInfo) -> Unit) = scope.launch {
- api.request<Unit>("resumeTransaction") {
- put("transactionId", transactionId)
- }.onError {
- onError(it)
- }.onSuccess {
- loadTransactions()
+ fun resumeTransaction(transactionId: String, onError: (it: TalerErrorInfo) -> Unit) =
+ scope.launch {
+ api.request<Unit>("resumeTransaction") {
+ put("transactionId", transactionId)
+ }.onError {
+ onError(it)
+ }.onSuccess {
+ loadTransactions()
+ }
}
- }
fun deleteTransactions(transactionIds: List<String>, 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<TransactionAction>,
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<TransactionAction> = listOf(TransactionAction.Delete)
+ override val txState: TransactionState = TransactionState(None)
+ override val txActions: List<TransactionAction> = 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) {