taler-android

Android apps for GNU Taler (wallet, PoS, cashier)
Log | Files | Refs | README | LICENSE

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:
Mwallet/src/main/java/net/taler/wallet/deposit/TransactionDepositComposable.kt | 10+++++++++-
Mwallet/src/main/java/net/taler/wallet/transactions/ActionButtonComposable.kt | 8+++++---
Mwallet/src/main/java/net/taler/wallet/transactions/TransactionDepositFragment.kt | 1+
Mwallet/src/main/java/net/taler/wallet/transactions/TransactionDetailFragment.kt | 57++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
Mwallet/src/main/java/net/taler/wallet/transactions/TransactionPeerFragment.kt | 17-----------------
Mwallet/src/main/java/net/taler/wallet/transactions/TransactionWithdrawalFragment.kt | 56--------------------------------------------------------
Mwallet/src/main/java/net/taler/wallet/transactions/Transactions.kt | 1+
Mwallet/src/main/java/net/taler/wallet/transactions/TransactionsComposable.kt | 8++++++--
Mwallet/src/main/res/values/strings.xml | 5++---
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>