taler-android

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

commit d72e5d20bc014e63f92d87c1e4348c5d65283d1f
parent 5bd7a283d3d223d5b4a8db45e62e88c362490287
Author: Iván Ávalos <avalos@disroot.org>
Date:   Sat, 25 Jul 2026 18:55:30 +0200

[wallet] allow force delete exchange

Diffstat:
Mwallet/src/main/java/net/taler/wallet/exchanges/ExchangeListScreen.kt | 62++++++++++++++++++++++++++++++++++++++++++++++++++++++--------
1 file changed, 54 insertions(+), 8 deletions(-)

diff --git a/wallet/src/main/java/net/taler/wallet/exchanges/ExchangeListScreen.kt b/wallet/src/main/java/net/taler/wallet/exchanges/ExchangeListScreen.kt @@ -30,6 +30,7 @@ import androidx.compose.material.icons.filled.AccountBalance import androidx.compose.material.icons.filled.Add import androidx.compose.material.icons.filled.MoreVert import androidx.compose.material3.AlertDialog +import androidx.compose.material3.Checkbox import androidx.compose.material3.DropdownMenu import androidx.compose.material3.DropdownMenuItem import androidx.compose.material3.ExperimentalMaterial3Api @@ -79,6 +80,7 @@ fun ExchangeListScreen( val devMode by model.devMode.observeAsState(false) val scope = rememberCoroutineScope() var showAddDialog by remember { mutableStateOf(false) } + var exchangeToDelete by remember { mutableStateOf<ExchangeItem?>(null) } GlobalScaffold( model = model, @@ -106,14 +108,18 @@ fun ExchangeListScreen( exchange = exchange, devMode = devMode, onAction = { action -> - handleExchangeAction( - scope = scope, - exchangeManager = exchangeManager, - balanceManager = balanceManager, - exchange = exchange, - action = action, - onNavigate = onNavigate, - ) + if (action == ExchangeAction.Delete) { + exchangeToDelete = exchange + } else { + handleExchangeAction( + scope = scope, + exchangeManager = exchangeManager, + balanceManager = balanceManager, + exchange = exchange, + action = action, + onNavigate = onNavigate, + ) + } } ) HorizontalDivider() @@ -131,6 +137,18 @@ fun ExchangeListScreen( } ) } + + if (exchangeToDelete != null) { + DeleteExchangeDialog( + onDismiss = { + exchangeToDelete = null + }, + onConfirm = { purge -> + exchangeManager.delete(exchangeToDelete!!.exchangeBaseUrl, purge) + exchangeToDelete = null + } + ) + } } @Composable @@ -266,6 +284,34 @@ fun AddExchangeDialog( } } +@Composable +fun DeleteExchangeDialog( + onDismiss: () -> Unit, + onConfirm: (purge: Boolean) -> Unit, +) { + var purge by remember { mutableStateOf(false) } + AlertDialog( + onDismissRequest = onDismiss, + title = { Text(stringResource(R.string.exchange_delete)) }, + text = { + Row(verticalAlignment = Alignment.CenterVertically) { + Checkbox(checked = purge, onCheckedChange = { purge = it }) + Text(stringResource(R.string.exchange_delete_force)) + } + }, + confirmButton = { + TextButton(onClick = { onConfirm(purge) }) { + Text(stringResource(R.string.transactions_delete)) + } + }, + dismissButton = { + TextButton(onClick = onDismiss) { + Text(stringResource(R.string.cancel)) + } + } + ) +} + enum class ExchangeAction { Reload, ViewTos,