taler-android

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

commit 0e4ae9635d12ca36a791cf54d9686fb07047e769
parent 7ab101b0a5db61403d95d2c0271cd634e4722f44
Author: Iván Ávalos <avalos@disroot.org>
Date:   Wed, 22 Jul 2026 22:30:52 +0200

[wallet] implement preparePayForTemplateV2

Diffstat:
Mwallet/src/main/java/net/taler/wallet/payment/PayTemplateScreen.kt | 16++++++++++++++--
Mwallet/src/main/java/net/taler/wallet/payment/PaymentManager.kt | 24+++++-------------------
2 files changed, 19 insertions(+), 21 deletions(-)

diff --git a/wallet/src/main/java/net/taler/wallet/payment/PayTemplateScreen.kt b/wallet/src/main/java/net/taler/wallet/payment/PayTemplateScreen.kt @@ -24,9 +24,11 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue import androidx.compose.runtime.livedata.observeAsState +import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource import androidx.lifecycle.asFlow +import kotlinx.coroutines.launch import net.taler.wallet.NavigateCallback import net.taler.wallet.R import net.taler.wallet.WalletDestination @@ -55,6 +57,16 @@ fun PayTemplateScreen( val payStatus by paymentManager.payStatus.asFlow().collectAsStateLifecycleAware(PayStatus.None) val balanceState by balanceManager.state.observeAsState(BalanceState.None) val devMode by model.devMode.observeAsState(false) + val scope = rememberCoroutineScope() + + suspend fun prepareTemplate(uri: String, params: TemplateParams) { + model.paymentManager.preparePayForTemplate(uri, params) + ?.let { transactionId -> + if (model.transactionManager.selectTransaction(transactionId)) { + onNavigate(WalletDestination.TransactionPayment, true) + } + } + } LaunchedEffect(Unit) { balanceManager.loadAssets() @@ -78,7 +90,7 @@ fun PayTemplateScreen( .intersect(s.supportedCurrencies.toSet()) .toList() if (!s.details.isTemplateEditable(usableCurrencies)) { - paymentManager.preparePayForTemplate(uri, s.details.toTemplateParams()) + prepareTemplate(uri, s.details.toTemplateParams()) } } @@ -102,7 +114,7 @@ fun PayTemplateScreen( payStatus = payStatus, onCreateAmount = model::createAmount, onSubmit = { params -> - paymentManager.preparePayForTemplate(uri, params) + scope.launch { prepareTemplate(uri, params) } }, onError = { errorMsg -> onShowError(TalerErrorInfo.makeCustomError(errorMsg)) diff --git a/wallet/src/main/java/net/taler/wallet/payment/PaymentManager.kt b/wallet/src/main/java/net/taler/wallet/payment/PaymentManager.kt @@ -117,7 +117,6 @@ class PaymentManager( suspend fun preparePay(url: String): String? { var transactionId: String? = null - mPayStatus.value = PayStatus.Loading api.request("preparePayForUriV2", PreparePayV2Response.serializer()) { put("talerPayUri", url) }.onError { @@ -269,30 +268,17 @@ class PaymentManager( } } - fun preparePayForTemplate(url: String, params: TemplateParams) = scope.launch { - mPayStatus.value = PayStatus.Loading - api.request("preparePayForTemplate", PreparePayResponse.serializer()) { + suspend fun preparePayForTemplate(url: String, params: TemplateParams): String? { + var transactionId: String? = null + api.request("preparePayForTemplateV2", PreparePayV2Response.serializer()) { put("talerPayTemplateUri", url) put("templateParams", JSONObject(BackendManager.json.encodeToString(params))) }.onError { handleError("preparePayForTemplate", it) }.onSuccess { response -> - mPayStatus.value = when (response) { - is PaymentPossibleResponse -> response.toPayStatusPrepared() - is PreparePayResponse.ChoiceSelection -> response.toPayStatusPrepared() - - is InsufficientBalanceResponse -> InsufficientBalance( - transactionId = response.transactionId, - contractTerms = response.contractTerms, - amountRaw = response.amountRaw, - balanceDetails = response.balanceDetails, - ) - - is AlreadyConfirmedResponse -> AlreadyPaid( - transactionId = response.transactionId, - ) - } + transactionId = response.transactionId } + return transactionId } @UiThread