diff --git a/wallet/src/main/java/net/taler/wallet/exchanges/ExchangeListScreen.kt b/wallet/src/main/java/net/taler/wallet/exchanges/ExchangeListScreen.kt index 7f64d6db..eeb12428 100644 --- a/wallet/src/main/java/net/taler/wallet/exchanges/ExchangeListScreen.kt +++ b/wallet/src/main/java/net/taler/wallet/exchanges/ExchangeListScreen.kt @@ -235,6 +235,20 @@ fun ExchangeItemComposable( stringResource(R.string.exchange_list_currency, it) } ?: stringResource(R.string.exchange_not_contacted) Text(text = currencyText, style = MaterialTheme.typography.bodyMedium) + if (exchange.isUnavailable) { + Text( + text = stringResource(R.string.exchange_status_unavailable), + style = MaterialTheme.typography.bodyMedium, + color = MaterialTheme.colorScheme.error, + ) + exchange.lastUpdateErrorInfo?.error?.userFacingMsg?.takeIf { it.isNotEmpty() }?.let { msg -> + Text( + text = stringResource(R.string.exchange_last_error, msg), + style = MaterialTheme.typography.bodySmall, + color = MaterialTheme.colorScheme.error, + ) + } + } } if (exchange.currency != null) { Box { diff --git a/wallet/src/main/java/net/taler/wallet/exchanges/Exchanges.kt b/wallet/src/main/java/net/taler/wallet/exchanges/Exchanges.kt index d110f044..fe721c07 100644 --- a/wallet/src/main/java/net/taler/wallet/exchanges/Exchanges.kt +++ b/wallet/src/main/java/net/taler/wallet/exchanges/Exchanges.kt @@ -18,6 +18,7 @@ package net.taler.wallet.exchanges import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable +import net.taler.wallet.backend.TalerErrorInfo import net.taler.wallet.balances.ScopeInfo import net.taler.wallet.cleanExchange @@ -36,10 +37,23 @@ data class ExchangeItem( val paytoUris: List, val scopeInfo: ScopeInfo? = null, val tosStatus: ExchangeTosStatus = ExchangeTosStatus.Unknown, + val exchangeUpdateStatus: String? = null, + val lastUpdateErrorInfo: ExchangeUpdateErrorInfo? = null, ) { val name: String get() = cleanExchange(exchangeBaseUrl) + + /** wallet-core could not update this exchange (unreachable, bad response, …) */ + val isUnavailable: Boolean + get() = exchangeUpdateStatus == "unavailable" + || exchangeUpdateStatus == "unavailable-update" + || lastUpdateErrorInfo != null } +@Serializable +data class ExchangeUpdateErrorInfo( + val error: TalerErrorInfo, +) + @Serializable enum class ExchangeTosStatus { Unknown, diff --git a/wallet/src/main/res/values/strings.xml b/wallet/src/main/res/values/strings.xml index 89750709..3fe10021 100644 --- a/wallet/src/main/res/values/strings.xml +++ b/wallet/src/main/res/values/strings.xml @@ -470,6 +470,8 @@ GNU Taler is immune to many types of fraud such as credit card data theft, phish Payment services Withdraw Payment service not contacted + Payment service currently unavailable + Last update failed: %1$s Reload information Manage the payment services known to this wallet Payment services