taler-android

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

commit c1f58773f5201b3d88cc99856666f0a336ef1408
parent 778e73d385acb740d718567996f0665e29e8749d
Author: Iván Ávalos <avalos@disroot.org>
Date:   Tue, 18 Aug 2026 17:41:12 +0200

[wallet] do not let a stale provider list cancel a terms review

missing-tos is also what a provider list fetched before the provider was known
reports, and isAccepted() treats that as good enough (as wallet-core does), so
the refresh replaced the terms prompt with a confirm button that then failed
with WALLET_EXCHANGE_TOS_NOT_ACCEPTED.

Diffstat:
Mwallet/src/main/java/net/taler/wallet/peer/IncomingPushPaymentScreen.kt | 4+---
Mwallet/src/main/java/net/taler/wallet/peer/OutgoingPullComposable.kt | 2+-
Mwallet/src/main/java/net/taler/wallet/peer/PeerManager.kt | 6+++++-
Mwallet/src/main/java/net/taler/wallet/withdraw/PromptWithdrawScreen.kt | 5++---
Mwallet/src/main/java/net/taler/wallet/withdraw/WithdrawManager.kt | 4+++-
5 files changed, 12 insertions(+), 9 deletions(-)

diff --git a/wallet/src/main/java/net/taler/wallet/peer/IncomingPushPaymentScreen.kt b/wallet/src/main/java/net/taler/wallet/peer/IncomingPushPaymentScreen.kt @@ -48,9 +48,7 @@ fun IncomingPushPaymentScreen( val state = peerManager.incomingPushState.collectAsStateLifecycleAware() val exchanges by exchangeManager.exchanges.observeAsState() - // keyed on the state too: a list arriving while we are still IncomingChecking - // would otherwise be consumed for nothing and the ToS transition lost for good - LaunchedEffect(exchanges, state.value) { + LaunchedEffect(exchanges) { exchanges?.let { peerManager.refreshPeerPushCreditTos(it) } diff --git a/wallet/src/main/java/net/taler/wallet/peer/OutgoingPullComposable.kt b/wallet/src/main/java/net/taler/wallet/peer/OutgoingPullComposable.kt @@ -271,7 +271,7 @@ fun OutgoingPullComposable( } else onTosAccept(ex) }, ) { - if (checkResult != null && !checkResult!!.tosStatus!!.isAccepted()) { + if (tosReview) { Text(text = stringResource(R.string.exchange_tos_view)) } else { Text(text = stringResource(R.string.receive_peer_create_button_amount, diff --git a/wallet/src/main/java/net/taler/wallet/peer/PeerManager.kt b/wallet/src/main/java/net/taler/wallet/peer/PeerManager.kt @@ -37,6 +37,7 @@ import net.taler.wallet.balances.ScopeInfo import net.taler.wallet.cleanExchange import net.taler.wallet.exchanges.ExchangeItem import net.taler.wallet.exchanges.ExchangeManager +import net.taler.wallet.exchanges.ExchangeTosStatus import net.taler.wallet.payment.InsufficientBalanceHint import org.json.JSONObject import java.util.concurrent.TimeUnit.HOURS @@ -366,7 +367,10 @@ class PeerManager( var newState = state if (state is IncomingTosReview) { exchanges.find { it.exchangeBaseUrl == state.exchangeBaseUrl }?.let { exchange -> - if (exchange.tosStatus.isAccepted()) { + // only an actual acceptance may lift a review we asked for: a list + // fetched before the provider was known still says missing-tos, + // which isAccepted() treats as good enough + if (exchange.tosStatus == ExchangeTosStatus.Accepted) { newState = IncomingTerms( amountRaw = state.amountRaw, amountEffective = state.amountEffective, diff --git a/wallet/src/main/java/net/taler/wallet/withdraw/PromptWithdrawScreen.kt b/wallet/src/main/java/net/taler/wallet/withdraw/PromptWithdrawScreen.kt @@ -117,10 +117,9 @@ fun PromptWithdrawScreen( } } - // Detect ToS acceptance. Keyed on the status too: a list arriving before the - // status reaches TosReviewRequired would otherwise be consumed for nothing. + // Detect ToS acceptance val exchanges by exchangeManager.exchanges.observeAsState() - LaunchedEffect(exchanges, status.status) { + LaunchedEffect(exchanges) { exchanges?.let { withdrawManager.refreshTosStatus(it) } } diff --git a/wallet/src/main/java/net/taler/wallet/withdraw/WithdrawManager.kt b/wallet/src/main/java/net/taler/wallet/withdraw/WithdrawManager.kt @@ -36,6 +36,7 @@ import net.taler.wallet.balances.ScopeInfo import net.taler.wallet.exchanges.ExchangeFees import net.taler.wallet.exchanges.ExchangeItem import net.taler.wallet.exchanges.ExchangeManager +import net.taler.wallet.exchanges.ExchangeTosStatus import net.taler.wallet.transactions.TransferOption import net.taler.wallet.transactions.WithdrawalExchangeAccountDetails import net.taler.wallet.withdraw.WithdrawStatus.Status.* @@ -484,7 +485,8 @@ class WithdrawManager( var newStatus = status status.exchangeBaseUrl?.let { exchangeBaseUrl -> exchanges.find { it.exchangeBaseUrl == exchangeBaseUrl }?.let { exchange -> - if (exchange.tosStatus.isAccepted()) { + // see refreshPeerPushCreditTos: missing-tos may be stale + if (exchange.tosStatus == ExchangeTosStatus.Accepted) { newStatus = status.copy(status = InfoReceived) } }