commit b39a9e606a566e1267c5e75e8f2fe9ea06c6bd14
parent cd9fc8e81f5e9e735861b2a5daf1cc859d0f7f3f
Author: Iván Ávalos <avalos@disroot.org>
Date: Mon, 26 May 2025 20:49:42 +0200
[wallet] unify KYC strings and show KYC action on deposits
bug 0010016
Diffstat:
9 files changed, 80 insertions(+), 83 deletions(-)
diff --git a/wallet/src/main/java/net/taler/wallet/deposit/TransactionDepositComposable.kt b/wallet/src/main/java/net/taler/wallet/deposit/TransactionDepositComposable.kt
@@ -40,8 +40,11 @@ import net.taler.wallet.R
import net.taler.wallet.backend.TalerErrorCode.EXCHANGE_GENERIC_KYC_REQUIRED
import net.taler.wallet.backend.TalerErrorInfo
import net.taler.wallet.balances.ScopeInfo
+import net.taler.wallet.transactions.ActionButton
+import net.taler.wallet.transactions.ActionListener
import net.taler.wallet.transactions.AmountType
import net.taler.wallet.transactions.ErrorTransactionButton
+import net.taler.wallet.transactions.Transaction
import net.taler.wallet.transactions.TransactionAction
import net.taler.wallet.transactions.TransactionAction.Abort
import net.taler.wallet.transactions.TransactionAction.Retry
@@ -58,6 +61,7 @@ fun TransactionDepositComposable(
t: TransactionDeposit,
devMode: Boolean,
spec: CurrencySpecification?,
+ actionListener: ActionListener,
onTransition: (t: TransactionAction) -> Unit,
) {
val scrollState = rememberScrollState()
@@ -77,6 +81,8 @@ fun TransactionDepositComposable(
style = MaterialTheme.typography.bodyLarge,
)
+ ActionButton(tx = t, listener = actionListener)
+
TransactionAmountComposable(
label = stringResource(id = R.string.amount_chosen),
amount = t.amountRaw.withSpec(spec),
@@ -126,6 +132,8 @@ fun TransactionDepositComposablePreview() {
))
)
Surface {
- TransactionDepositComposable(t, true, null) {}
+ TransactionDepositComposable(t, true, null, object : ActionListener {
+ override fun onActionButtonClicked(tx: Transaction, type: ActionListener.Type) {}
+ }) {}
}
}
diff --git a/wallet/src/main/java/net/taler/wallet/transactions/ActionButtonComposable.kt b/wallet/src/main/java/net/taler/wallet/transactions/ActionButtonComposable.kt
@@ -36,6 +36,7 @@ import net.taler.wallet.transactions.TransactionMajorState.Pending
import net.taler.wallet.transactions.TransactionMinorState.BalanceKycRequired
import net.taler.wallet.transactions.TransactionMinorState.BankConfirmTransfer
import net.taler.wallet.transactions.TransactionMinorState.ExchangeWaitReserve
+import net.taler.wallet.transactions.TransactionMinorState.KycAuthRequired
import net.taler.wallet.transactions.TransactionMinorState.KycRequired
import net.taler.wallet.transactions.TransactionMinorState.MergeKycRequired
@@ -77,9 +78,10 @@ private fun KycButton(
modifier = modifier,
) {
val label = when (tx.txState.minor) {
- KycRequired -> stringResource(R.string.transaction_action_kyc_balance)
- BalanceKycRequired -> stringResource(R.string.transaction_action_kyc_bank)
- MergeKycRequired -> stringResource(R.string.transaction_action_kyc_merge)
+ KycRequired,
+ KycAuthRequired,
+ BalanceKycRequired,
+ MergeKycRequired -> stringResource(R.string.transaction_action_kyc)
else -> return@Button
}
diff --git a/wallet/src/main/java/net/taler/wallet/transactions/TransactionDepositFragment.kt b/wallet/src/main/java/net/taler/wallet/transactions/TransactionDepositFragment.kt
@@ -42,6 +42,7 @@ class TransactionDepositFragment : TransactionDetailFragment() {
t = tx,
devMode = devMode,
spec = balanceManager.getSpecForCurrency(tx.amountRaw.currency, tx.scopes),
+ actionListener = this@TransactionDepositFragment,
) {
onTransitionButtonClicked(tx, 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
@@ -19,6 +19,7 @@ package net.taler.wallet.transactions
import android.os.Bundle
import android.util.Log
import android.view.View
+import androidx.core.os.bundleOf
import androidx.fragment.app.Fragment
import androidx.fragment.app.activityViewModels
import androidx.lifecycle.Lifecycle
@@ -31,6 +32,8 @@ import net.taler.common.showError
import net.taler.wallet.MainViewModel
import net.taler.wallet.R
import net.taler.wallet.TAG
+import net.taler.wallet.balances.ScopeInfo
+import net.taler.wallet.launchInAppBrowser
import net.taler.wallet.showError
import net.taler.wallet.transactions.TransactionAction.Abort
import net.taler.wallet.transactions.TransactionAction.Delete
@@ -38,12 +41,15 @@ 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
+import net.taler.wallet.transactions.WithdrawalDetails.ManualTransfer
+import net.taler.wallet.transactions.WithdrawalDetails.TalerBankIntegrationApi
-abstract class TransactionDetailFragment : Fragment() {
+abstract class TransactionDetailFragment : Fragment(), ActionListener {
private val model: MainViewModel by activityViewModels()
protected val transactionManager by lazy { model.transactionManager }
protected val balanceManager by lazy { model.balanceManager }
+ protected val withdrawManager by lazy { model.withdrawManager }
protected val devMode get() = model.devMode.value == true
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
@@ -96,6 +102,55 @@ abstract class TransactionDetailFragment : Fragment() {
Resume -> resumeTransaction(t)
}
+ override fun onActionButtonClicked(tx: Transaction, type: ActionListener.Type) {
+ when (type) {
+ ActionListener.Type.COMPLETE_KYC -> {
+ when (tx) {
+ is TransactionWithdrawal -> tx.kycUrl
+ is TransactionDeposit -> tx.kycUrl
+ is TransactionPeerPullCredit -> tx.kycUrl
+ is TransactionPeerPushCredit -> tx.kycUrl
+ else -> null
+ }?.let { kycUrl ->
+ launchInAppBrowser(requireContext(), kycUrl)
+ }
+ }
+
+ ActionListener.Type.CONFIRM_WITH_BANK -> {
+ if (tx !is TransactionWithdrawal) return
+ if (tx.withdrawalDetails !is TalerBankIntegrationApi) return
+ tx.withdrawalDetails.bankConfirmationUrl?.let { url ->
+ launchInAppBrowser(requireContext(), url)
+ }
+ }
+
+ ActionListener.Type.CONFIRM_MANUAL,
+ ActionListener.Type.SHOW_WIRE_QR -> {
+ if (tx !is TransactionWithdrawal) return
+ if (tx.withdrawalDetails !is ManualTransfer) return
+ if (tx.withdrawalDetails.exchangeCreditAccountDetails.isNullOrEmpty()) return
+ if (tx.exchangeBaseUrl == null) return
+
+ withdrawManager.viewManualWithdrawal(
+ transactionId = tx.transactionId,
+ exchangeBaseUrl = tx.exchangeBaseUrl,
+ amountRaw = tx.amountRaw,
+ amountEffective = tx.amountEffective,
+ withdrawalAccountList = tx.withdrawalDetails.exchangeCreditAccountDetails,
+ scopeInfo = transactionManager.selectedScope.value
+ ?: tx.exchangeBaseUrl.let {
+ ScopeInfo.Exchange(currency = tx.amountRaw.currency, url = it)
+ },
+ )
+
+ findNavController().navigate(
+ R.id.action_nav_transactions_detail_withdrawal_to_nav_exchange_manual_withdrawal_success,
+ bundleOf("showQrCodes" to (type == ActionListener.Type.SHOW_WIRE_QR))
+ )
+ }
+ }
+ }
+
private fun showDialog(tt: TransactionAction, onAction: () -> Unit) {
MaterialAlertDialogBuilder(requireContext(), R.style.MaterialAlertDialog_Material3)
.setTitle(dialogTitle(tt))
diff --git a/wallet/src/main/java/net/taler/wallet/transactions/TransactionPeerFragment.kt b/wallet/src/main/java/net/taler/wallet/transactions/TransactionPeerFragment.kt
@@ -62,7 +62,6 @@ import net.taler.wallet.BottomInsetsSpacer
import net.taler.wallet.R
import net.taler.wallet.compose.TalerSurface
import net.taler.wallet.compose.collectAsStateLifecycleAware
-import net.taler.wallet.launchInAppBrowser
import net.taler.wallet.peer.TransactionPeerPullCreditComposable
import net.taler.wallet.peer.TransactionPeerPullDebitComposable
import net.taler.wallet.peer.TransactionPeerPushCreditComposable
@@ -104,22 +103,6 @@ class TransactionPeerFragment : TransactionDetailFragment(), ActionListener {
}
}
}
-
- override fun onActionButtonClicked(tx: Transaction, type: ActionListener.Type) {
- when (type) {
- ActionListener.Type.COMPLETE_KYC -> {
- val kycUrl = when (tx) {
- is TransactionPeerPullCredit -> tx.kycUrl
- is TransactionPeerPushCredit -> tx.kycUrl
- else -> return
- } ?: return
-
- launchInAppBrowser(requireContext(), kycUrl)
- }
-
- else -> {} // does not apply
- }
- }
}
@Composable
diff --git a/wallet/src/main/java/net/taler/wallet/transactions/TransactionWithdrawalFragment.kt b/wallet/src/main/java/net/taler/wallet/transactions/TransactionWithdrawalFragment.kt
@@ -22,24 +22,12 @@ import android.view.View
import android.view.ViewGroup
import androidx.compose.runtime.getValue
import androidx.compose.ui.platform.ComposeView
-import androidx.core.os.bundleOf
-import androidx.fragment.app.activityViewModels
-import androidx.navigation.fragment.findNavController
-import net.taler.wallet.MainViewModel
-import net.taler.wallet.R
-import net.taler.wallet.balances.ScopeInfo
import net.taler.wallet.compose.TalerSurface
import net.taler.wallet.compose.collectAsStateLifecycleAware
-import net.taler.wallet.launchInAppBrowser
-import net.taler.wallet.transactions.WithdrawalDetails.ManualTransfer
-import net.taler.wallet.transactions.WithdrawalDetails.TalerBankIntegrationApi
import net.taler.wallet.withdraw.TransactionWithdrawalComposable
class TransactionWithdrawalFragment : TransactionDetailFragment(), ActionListener {
- private val model: MainViewModel by activityViewModels()
- private val withdrawManager by lazy { model.withdrawManager }
-
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
@@ -61,48 +49,4 @@ class TransactionWithdrawalFragment : TransactionDetailFragment(), ActionListene
}
}
}
-
- override fun onActionButtonClicked(tx: Transaction, type: ActionListener.Type) {
- when (type) {
- ActionListener.Type.COMPLETE_KYC -> {
- if (tx !is TransactionWithdrawal) return
- tx.kycUrl?.let {
- launchInAppBrowser(requireContext(), it)
- }
- }
-
- ActionListener.Type.CONFIRM_WITH_BANK -> {
- if (tx !is TransactionWithdrawal) return
- if (tx.withdrawalDetails !is TalerBankIntegrationApi) return
- tx.withdrawalDetails.bankConfirmationUrl?.let { url ->
- launchInAppBrowser(requireContext(), url)
- }
- }
-
- ActionListener.Type.CONFIRM_MANUAL,
- ActionListener.Type.SHOW_WIRE_QR -> {
- if (tx !is TransactionWithdrawal) return
- if (tx.withdrawalDetails !is ManualTransfer) return
- if (tx.withdrawalDetails.exchangeCreditAccountDetails.isNullOrEmpty()) return
- if (tx.exchangeBaseUrl == null) return
-
- withdrawManager.viewManualWithdrawal(
- transactionId = tx.transactionId,
- exchangeBaseUrl = tx.exchangeBaseUrl,
- amountRaw = tx.amountRaw,
- amountEffective = tx.amountEffective,
- withdrawalAccountList = tx.withdrawalDetails.exchangeCreditAccountDetails,
- scopeInfo = transactionManager.selectedScope.value
- ?: tx.exchangeBaseUrl.let {
- ScopeInfo.Exchange(currency = tx.amountRaw.currency, url = it)
- },
- )
-
- findNavController().navigate(
- R.id.action_nav_transactions_detail_withdrawal_to_nav_exchange_manual_withdrawal_success,
- bundleOf("showQrCodes" to (type == ActionListener.Type.SHOW_WIRE_QR))
- )
- }
- }
- }
}
diff --git a/wallet/src/main/java/net/taler/wallet/transactions/Transactions.kt b/wallet/src/main/java/net/taler/wallet/transactions/Transactions.kt
@@ -400,6 +400,7 @@ class TransactionDeposit(
override val timestamp: Timestamp,
override val txState: TransactionState,
override val txActions: List<TransactionAction>,
+ val kycUrl: String? = null,
override val error: TalerErrorInfo? = null,
override val amountRaw: Amount,
override val amountEffective: Amount,
diff --git a/wallet/src/main/java/net/taler/wallet/transactions/TransactionsComposable.kt b/wallet/src/main/java/net/taler/wallet/transactions/TransactionsComposable.kt
@@ -98,6 +98,8 @@ import net.taler.wallet.transactions.TransactionMinorState.BalanceKycInit
import net.taler.wallet.transactions.TransactionMinorState.BalanceKycRequired
import net.taler.wallet.transactions.TransactionMinorState.BankConfirmTransfer
import net.taler.wallet.transactions.TransactionMinorState.KycRequired
+import net.taler.wallet.transactions.TransactionMinorState.KycAuthRequired
+import net.taler.wallet.transactions.TransactionMinorState.MergeKycRequired
import net.taler.wallet.transactions.TransactionMinorState.Repurchase
import net.taler.wallet.transactions.TransactionsResult.Error
import net.taler.wallet.transactions.TransactionsResult.None
@@ -469,8 +471,10 @@ fun TransactionExtraInfo(tx: Transaction) {
tx.txState.major == Pending -> when(tx.txState.minor) {
BankConfirmTransfer -> Text(stringResource(R.string.withdraw_waiting_confirm))
BalanceKycInit -> Text(stringResource(R.string.transaction_preparing_kyc))
- KycRequired -> Text(stringResource(R.string.transaction_action_kyc_bank))
- BalanceKycRequired -> Text(stringResource(R.string.transaction_action_kyc_balance))
+ KycRequired,
+ KycAuthRequired,
+ BalanceKycRequired,
+ MergeKycRequired -> Text(stringResource(R.string.transactions_required_kyc))
else -> Text(stringResource(R.string.transaction_pending))
}
diff --git a/wallet/src/main/res/values/strings.xml b/wallet/src/main/res/values/strings.xml
@@ -126,9 +126,7 @@ GNU Taler is immune against many types of fraud, such as phishing of credit card
<!-- Transactions -->
- <string name="transaction_action_kyc_merge">Complete KYC</string>
- <string name="transaction_action_kyc_balance">Complete balance KYC</string>
- <string name="transaction_action_kyc_bank">Complete withdrawal KYC</string>
+ <string name="transaction_action_kyc">Complete KYC</string>
<string name="transaction_denom_loss">Loss of funds</string>
<string name="transaction_deposit">Deposit</string>
<string name="transaction_deposit_to">Deposit to %1$s</string>
@@ -182,6 +180,7 @@ GNU Taler is immune against many types of fraud, such as phishing of credit card
<string name="transactions_receive_funds">Receive</string>
<string name="transactions_resume">Resume</string>
<string name="transactions_retry">Retry</string>
+ <string name="transactions_required_kyc">KYC required to proceed</string>
<string name="transactions_select_all">Select All</string>
<string name="transactions_send_funds">Send</string>
<string name="transactions_suspend">Suspend</string>