taler-android

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

commit 9c4e20e8dea37ffe833076d3de6720faf88a597d
parent 0ef34dbdcfecfb7ab9ae92896d8e10f6047905fa
Author: Iván Ávalos <avalos@disroot.org>
Date:   Thu, 14 Nov 2024 18:20:42 +0100

[wallet] QC: rearranged fields in deposit screen, only allow currency input when filled

Diffstat:
Mwallet/src/main/java/net/taler/wallet/compose/AmountInputFIeld.kt | 8++++++--
Mwallet/src/main/java/net/taler/wallet/deposit/MakeDepositComposable.kt | 44++++++++++++++++++++++----------------------
Mwallet/src/main/java/net/taler/wallet/deposit/MakeDepositTaler.kt | 49+++++++++++++++++++++++++------------------------
3 files changed, 53 insertions(+), 48 deletions(-)

diff --git a/wallet/src/main/java/net/taler/wallet/compose/AmountInputFIeld.kt b/wallet/src/main/java/net/taler/wallet/compose/AmountInputFIeld.kt @@ -67,6 +67,7 @@ fun AmountCurrencyField( supportingText: @Composable (() -> Unit)? = null, isError: Boolean = false, readOnly: Boolean = false, + enabled: Boolean = true, ) { Row(modifier = modifier) { AmountInputFieldBase( @@ -79,6 +80,7 @@ fun AmountCurrencyField( isError = isError, supportingText = supportingText, readOnly = readOnly, + enabled = enabled, ) if (editableCurrency) { @@ -87,7 +89,7 @@ fun AmountCurrencyField( currencies = currencies, onCurrencyChanged = { onAmountChanged(amount.copy(currency = it)) }, initialCurrency = amount.currency, - readOnly = false, + readOnly = readOnly || !enabled, ) } } @@ -102,6 +104,7 @@ private fun AmountInputFieldBase( supportingText: @Composable (() -> Unit)? = null, isError: Boolean = false, readOnly: Boolean = false, + enabled: Boolean = true, ) { val inputService = LocalTextInputService.current val interactionSource = remember { MutableInteractionSource() } @@ -124,7 +127,7 @@ private fun AmountInputFieldBase( } LaunchedEffect(isFocused, isClicked) { - if (readOnly) return@LaunchedEffect + if (readOnly && !enabled) return@LaunchedEffect if (isFocused || isClicked) { session = startSession(inputService) { commands -> commands.forEach { cmd -> @@ -161,6 +164,7 @@ private fun AmountInputFieldBase( singleLine = true, maxLines = 1, interactionSource = interactionSource, + enabled = enabled, ) } diff --git a/wallet/src/main/java/net/taler/wallet/deposit/MakeDepositComposable.kt b/wallet/src/main/java/net/taler/wallet/deposit/MakeDepositComposable.kt @@ -19,6 +19,7 @@ package net.taler.wallet.deposit import androidx.compose.animation.AnimatedVisibility import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.imePadding import androidx.compose.foundation.layout.padding import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.verticalScroll @@ -77,7 +78,8 @@ fun MakeDepositComposable( Column( modifier = Modifier .fillMaxWidth() - .verticalScroll(scrollState), + .verticalScroll(scrollState) + .imePadding(), horizontalAlignment = CenterHorizontally, ) { // Amount/currency stuff @@ -156,27 +158,6 @@ fun MakeDepositComposable( ) } - AmountCurrencyField( - modifier = Modifier - .padding( - top = 16.dp, - start = 16.dp, - end = 16.dp, - ).fillMaxWidth(), - amount = amount.withSpec(currencySpec), - onAmountChanged = { amount = it }, - editableCurrency = true, - currencies = currencies, - isError = checkResult !is CheckDepositResult.Success, - label = { Text(stringResource(R.string.amount_deposit)) }, - supportingText = { - val res = checkResult - if (res is CheckDepositResult.InsufficientBalance && res.maxAmountEffective != null) { - Text(stringResource(R.string.payment_balance_insufficient_max, res.maxAmountEffective)) - } - } - ) - when(selectedWireType) { WireType.IBAN -> { var ibanError by rememberSaveable { mutableStateOf(false) } @@ -216,6 +197,25 @@ fun MakeDepositComposable( else -> {} } + AmountCurrencyField( + modifier = Modifier + .padding(horizontal = 16.dp) + .fillMaxWidth(), + amount = amount.withSpec(currencySpec), + onAmountChanged = { amount = it }, + editableCurrency = true, + currencies = currencies, + isError = checkResult !is CheckDepositResult.Success, + label = { Text(stringResource(R.string.amount_deposit)) }, + enabled = !formError, + supportingText = { + val res = checkResult + if (res is CheckDepositResult.InsufficientBalance && res.maxAmountEffective != null) { + Text(stringResource(R.string.payment_balance_insufficient_max, res.maxAmountEffective)) + } + } + ) + AnimatedVisibility(visible = checkResult is CheckDepositResult.Success) { val res = checkResult as? CheckDepositResult.Success ?: return@AnimatedVisibility diff --git a/wallet/src/main/java/net/taler/wallet/deposit/MakeDepositTaler.kt b/wallet/src/main/java/net/taler/wallet/deposit/MakeDepositTaler.kt @@ -45,29 +45,6 @@ fun MakeDepositTaler( account: String, onFormEdited: (name: String, host: String, account: String) -> Unit ) { - OutlinedTextField( - modifier = Modifier - .padding( - bottom = 16.dp, - start = 16.dp, - end = 16.dp, - ).fillMaxWidth(), - value = name, - onValueChange = { input -> - onFormEdited(input, host, account) - }, - singleLine = true, - isError = name.isBlank(), - label = { - Text( - stringResource(R.string.send_deposit_name), - color = if (name.isBlank()) { - MaterialTheme.colorScheme.error - } else Color.Unspecified, - ) - } - ) - var expanded by remember { mutableStateOf(false) } ExposedDropdownMenuBox( expanded = expanded, @@ -75,7 +52,11 @@ fun MakeDepositTaler( ) { OutlinedTextField( modifier = Modifier - .padding(horizontal = 16.dp) + .padding( + bottom = 16.dp, + start = 16.dp, + end = 16.dp, + ) .fillMaxWidth() .menuAnchor(), readOnly = true, @@ -110,6 +91,26 @@ fun MakeDepositTaler( OutlinedTextField( modifier = Modifier + .padding(horizontal = 16.dp) + .fillMaxWidth(), + value = name, + onValueChange = { input -> + onFormEdited(input, host, account) + }, + singleLine = true, + isError = name.isBlank(), + label = { + Text( + stringResource(R.string.send_deposit_name), + color = if (name.isBlank()) { + MaterialTheme.colorScheme.error + } else Color.Unspecified, + ) + } + ) + + OutlinedTextField( + modifier = Modifier .padding(16.dp) .fillMaxWidth(), value = account,