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..9e918c4d 100644 --- a/wallet/src/main/java/net/taler/wallet/exchanges/Exchanges.kt +++ b/wallet/src/main/java/net/taler/wallet/exchanges/Exchanges.kt @@ -61,6 +61,8 @@ enum class ExchangeTosStatus { @Serializable data class TosResponse( + // wallet-core's GetExchangeTosResult calls it "tosStatus" + @SerialName("tosStatus") val status: ExchangeTosStatus = ExchangeTosStatus.Unknown, val content: String, val currentEtag: String, diff --git a/wallet/src/main/java/net/taler/wallet/exchanges/ReviewExchangeTosScreen.kt b/wallet/src/main/java/net/taler/wallet/exchanges/ReviewExchangeTosScreen.kt index 34701d08..444b0a81 100644 --- a/wallet/src/main/java/net/taler/wallet/exchanges/ReviewExchangeTosScreen.kt +++ b/wallet/src/main/java/net/taler/wallet/exchanges/ReviewExchangeTosScreen.kt @@ -156,11 +156,7 @@ fun ReviewExchangeTosComposable( onNavigateBack: () -> Unit, model: MainViewModel? = null, ) { - if (tos.status == ExchangeTosStatus.MissingTos) { - EmptyComposable(message = stringResource(R.string.exchange_tos_missing)) - return - } - + val missingTos = tos.status == ExchangeTosStatus.MissingTos var expanded by remember { mutableStateOf(false) } GlobalScaffold( @@ -168,7 +164,8 @@ fun ReviewExchangeTosComposable( title = { Text(stringResource(R.string.nav_exchange_tos)) }, onNavigateBack = onNavigateBack, bottomBar = { - if (!readOnly) BottomButtonBox { + // nothing to accept when the exchange publishes no terms + if (!readOnly && !missingTos) BottomButtonBox { Button( modifier = Modifier .systemBarsPaddingBottom(), @@ -179,7 +176,10 @@ fun ReviewExchangeTosComposable( } }, ) { innerPadding -> - LazyColumn(Modifier.padding(innerPadding)) { + if (missingTos) EmptyComposable( + modifier = Modifier.padding(innerPadding), + message = stringResource(R.string.exchange_tos_missing), + ) else LazyColumn(Modifier.padding(innerPadding)) { if (tos.tosAvailableLanguages.size > 1) item { ExposedDropdownMenuBox( expanded = expanded, diff --git a/wallet/src/test/java/net/taler/wallet/exchanges/TosResponseTest.kt b/wallet/src/test/java/net/taler/wallet/exchanges/TosResponseTest.kt new file mode 100644 index 00000000..dd9e52b3 --- /dev/null +++ b/wallet/src/test/java/net/taler/wallet/exchanges/TosResponseTest.kt @@ -0,0 +1,43 @@ +/* + * This file is part of GNU Taler + * (C) 2026 Taler Systems S.A. + * + * GNU Taler is free software; you can redistribute it and/or modify it under the + * terms of the GNU General Public License as published by the Free Software + * Foundation; either version 3, or (at your option) any later version. + * + * GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with + * GNU Taler; see the file COPYING. If not, see + */ + +package net.taler.wallet.exchanges + +import net.taler.wallet.backend.BackendManager +import org.junit.Assert.assertEquals +import org.junit.Test + +class TosResponseTest { + + private fun decode(s: String): TosResponse = + BackendManager.json.decodeFromString(TosResponse.serializer(), s) + + /** wallet-core's answer for an exchange that publishes no terms (GET /terms -> 404) */ + @Test + fun testMissingTos() { + val tos = decode("""{"tosStatus":"missing-tos","contentType":"text/plain","content":"NULL",""" + + """"currentEtag":"NULL","tosAvailableLanguages":[]}""") + assertEquals(ExchangeTosStatus.MissingTos, tos.status) + } + + @Test + fun testProposedTos() { + val tos = decode("""{"tosStatus":"proposed","contentType":"text/markdown","content":"# Terms",""" + + """"currentEtag":"v1","contentLanguage":"en","tosAvailableLanguages":["en"]}""") + assertEquals(ExchangeTosStatus.Proposed, tos.status) + assertEquals("v1", tos.currentEtag) + } +}