taler-android

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

commit 072a442328104377688eebaf4c7d7700696514e5
parent a5d8244a8eb6fd2469007d3bb889259c17dccedb
Author: Iván Ávalos <avalos@disroot.org>
Date:   Sun, 26 Jul 2026 22:08:46 +0200

[wallet] fix bug that prevents second deposit

Diffstat:
Mwallet/src/main/java/net/taler/wallet/deposit/DepositAmountComposable.kt | 15+++++++++++++--
Mwallet/src/main/java/net/taler/wallet/deposit/DepositManager.kt | 6+++---
Mwallet/src/main/java/net/taler/wallet/deposit/DepositScreen.kt | 13+++++++++++--
Mwallet/src/main/java/net/taler/wallet/deposit/DepositState.kt | 2+-
4 files changed, 28 insertions(+), 8 deletions(-)

diff --git a/wallet/src/main/java/net/taler/wallet/deposit/DepositAmountComposable.kt b/wallet/src/main/java/net/taler/wallet/deposit/DepositAmountComposable.kt @@ -22,9 +22,11 @@ import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.imePadding import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.verticalScroll import androidx.compose.material3.Button +import androidx.compose.material3.CircularProgressIndicator import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.Text import androidx.compose.runtime.Composable @@ -70,6 +72,7 @@ fun DepositAmountComposable( .fillMaxSize() .imePadding(), ) { + var loading by remember { mutableStateOf(false) } var checkResult by remember { mutableStateOf<CheckDepositResult>(CheckDepositResult.None) } // TODO: handle unavailable scopes in UI (i.e. explain restrictions) // if currencies is null, we assume any (known) currency is supported @@ -109,7 +112,9 @@ fun DepositAmountComposable( val maxDepositable = remember(amount) { state.maxDepositable[amount!!.currency] } amount.useDebounce { + loading = true checkResult = checkDeposit(amount!!) + loading = false } AnimatedVisibility(maxDepositable?.rawAmount != null) { @@ -192,13 +197,19 @@ fun DepositAmountComposable( Button( modifier = Modifier .systemBarsPaddingBottom(), - enabled = checkResult is CheckDepositResult.Success && amount != null, + enabled = !loading + && amount != null + && checkResult is CheckDepositResult.Success, onClick = { focusManager.clearFocus() onMakeDeposit(amount!!) }, ) { - Text(stringResource(R.string.send_deposit_create_button)) + if (loading) { + CircularProgressIndicator(Modifier.size(15.dp)) + } else { + Text(stringResource(R.string.send_deposit_create_button)) + } } } } diff --git a/wallet/src/main/java/net/taler/wallet/deposit/DepositManager.kt b/wallet/src/main/java/net/taler/wallet/deposit/DepositManager.kt @@ -138,7 +138,7 @@ class DepositManager( Log.e(TAG, "Error createDepositGroup $it") mDepositState.value = DepositState.Error(it) }.onSuccess { - mDepositState.value = DepositState.Success + mDepositState.value = DepositState.Success(it.transactionId) } } } @@ -274,7 +274,7 @@ data class GetDepositWireTypesResponse( val hostNames: List<String> get() = wireTypeDetails - .flatMap { it.talerBankHostnames } + .flatMap { it.talerBankHostnames ?: emptyList() } .distinct() } @@ -307,5 +307,5 @@ enum class WireType { @Serializable data class WireTypeDetails( val paymentTargetType: WireType, - val talerBankHostnames: List<String>, + val talerBankHostnames: List<String>? = null, ) \ No newline at end of file diff --git a/wallet/src/main/java/net/taler/wallet/deposit/DepositScreen.kt b/wallet/src/main/java/net/taler/wallet/deposit/DepositScreen.kt @@ -23,6 +23,7 @@ import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.verticalScroll import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.DisposableEffect import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue import androidx.compose.runtime.livedata.observeAsState @@ -68,8 +69,16 @@ fun DepositScreen( val state by depositManager.depositState.collectAsStateLifecycleAware() LaunchedEffect(state) { - if (state is DepositState.Success) { - onNavigateBack() + (state as? DepositState.Success)?.let { + if (model.transactionManager.selectTransaction(it.transactionId)) { + onNavigate(WalletDestination.TransactionDeposit, true) + } + } + } + + DisposableEffect(Unit) { + onDispose { + model.depositManager.resetDepositState() } } diff --git a/wallet/src/main/java/net/taler/wallet/deposit/DepositState.kt b/wallet/src/main/java/net/taler/wallet/deposit/DepositState.kt @@ -29,7 +29,7 @@ sealed class DepositState { data object MakingDeposit : DepositState() - data object Success : DepositState() + data class Success(val transactionId: String) : DepositState() data class Error(val error: TalerErrorInfo) : DepositState() }