taler-android

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

commit 320c5ab7e566f3dfe939ed09cf41e12a08fffb2b
parent ce61eb24235f6e564c38d8c2fdcdb0a329710003
Author: Bohdan Potuzhnyi <bohdan.potuzhnyi@gmail.com>
Date:   Mon, 29 Jun 2026 16:13:32 +0200

[pos] mega bad bug fix + adding about section

Diffstat:
Mmerchant-terminal/src/main/java/net/taler/merchantpos/config/ConfigManager.kt | 7++++++-
Mmerchant-terminal/src/main/java/net/taler/merchantpos/config/GeneralSettingsFragment.kt | 46++++++++++++++++++++++++++++++++++++++++++++++
Mmerchant-terminal/src/main/res/values/strings.xml | 1+
3 files changed, 53 insertions(+), 1 deletion(-)

diff --git a/merchant-terminal/src/main/java/net/taler/merchantpos/config/ConfigManager.kt b/merchant-terminal/src/main/java/net/taler/merchantpos/config/ConfigManager.kt @@ -221,6 +221,10 @@ class ConfigManager( var currencySpec: CurrencySpecification? = null private set + @Volatile + var backendVersion: String? = null + private set + private val mInitialOrderScreen = MutableLiveData( InitialOrderScreen.fromPrefValue( prefs.getString(SETTINGS_INITIAL_ORDER_SCREEN, InitialOrderScreen.AmountEntry.prefValue), @@ -433,6 +437,7 @@ class ConfigManager( this@ConfigManager.merchantConfig = merchantConfig this@ConfigManager.currency = configResponse.currency this@ConfigManager.currencySpec = currencySpec + this@ConfigManager.backendVersion = configResponse.version saveCachedRuntimeConfig( CachedRuntimeConfig( posConfig = posConfigWithCachedStock, @@ -556,7 +561,7 @@ class ConfigManager( val resp: LimitedTokenResponse = response.body() - return resp.token.removePrefix("secret-token:") + return resp.token } suspend fun requestChallenge( diff --git a/merchant-terminal/src/main/java/net/taler/merchantpos/config/GeneralSettingsFragment.kt b/merchant-terminal/src/main/java/net/taler/merchantpos/config/GeneralSettingsFragment.kt @@ -54,12 +54,18 @@ import androidx.fragment.app.Fragment import androidx.fragment.app.activityViewModels import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Shape +import androidx.compose.ui.text.SpanStyle +import androidx.compose.ui.text.buildAnnotatedString +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.text.withStyle import androidx.compose.ui.platform.ComposeView import androidx.compose.ui.platform.ViewCompositionStrategy import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.ui.unit.dp +import androidx.core.net.toUri +import net.taler.merchantpos.BuildConfig import net.taler.merchantpos.compose.PosOutlinedCard import net.taler.merchantpos.compose.PosTheme import net.taler.merchantpos.R @@ -93,6 +99,11 @@ class GeneralSettingsFragment : Fragment() { val selectedTag = getCurrentLanguageTag() return ComposeView(requireContext()).apply { setViewCompositionStrategy(ViewCompositionStrategy.DisposeOnViewTreeLifecycleDestroyed) + val config = configManager.config + val username = if (config is Config.New && config.merchantUrl.isNotBlank()) { + config.merchantUrl.toUri().pathSegments + ?.lastOrNull { it.isNotBlank() } + } else null setContent { GeneralSettingsScreen( languageOptions = languageOptions, @@ -111,6 +122,9 @@ class GeneralSettingsFragment : Fragment() { clearBackStack = true, ) }, + backendVersion = configManager.backendVersion, + username = username, + merchantUrl = (config as? Config.New)?.merchantUrl?.takeIf { it.isNotBlank() }, ) } } @@ -172,6 +186,9 @@ private fun GeneralSettingsScreen( onInitialOrderSelected: (InitialOrderScreen) -> Unit, onInstanceSettingsClick: () -> Unit, onLogoutClick: () -> Unit, + backendVersion: String? = null, + username: String? = null, + merchantUrl: String? = null, ) { var languageExpanded by remember { mutableStateOf(false) } var selectedTag by rememberSaveable { mutableStateOf(initialSelectedTag) } @@ -263,6 +280,21 @@ private fun GeneralSettingsScreen( } } } + + item { + SettingsCard( + title = stringResource(R.string.settings_about_title), + ) { + AboutRow(stringResource(R.string.app_name), BuildConfig.VERSION_NAME) + if (username != null) { + AboutRow(stringResource(R.string.config_username), username) + } + if (merchantUrl != null) { + val suffix = if (backendVersion != null) " ($backendVersion)" else "" + AboutRow(stringResource(R.string.config_merchant_url), "$merchantUrl$suffix") + } + } + } } } } @@ -295,6 +327,20 @@ private fun SettingsCard( } } +@Composable +private fun AboutRow(label: String, value: String) { + Text( + text = buildAnnotatedString { + withStyle(SpanStyle(fontWeight = FontWeight.Bold)) { + append("$label: ") + } + append(value) + }, + style = MaterialTheme.typography.bodyMedium, + color = MaterialTheme.colorScheme.onSurfaceVariant, + ) +} + @OptIn(ExperimentalMaterial3Api::class) @Composable private fun <T> SettingsDropdown( diff --git a/merchant-terminal/src/main/res/values/strings.xml b/merchant-terminal/src/main/res/values/strings.xml @@ -54,6 +54,7 @@ <string name="settings_instance_description">Change merchant portal URL, username, password, and other settings.</string> <string name="settings_instance_button">Modify login settings</string> <string name="settings_logout_button">Log out</string> + <string name="settings_about_title">About</string> <string name="config_old_label">JSON file (old)</string> <string name="config_setup_password">Password</string> <string name="config_old_deprecation">This configuration method is deprecated, please use the new merchant API configuration.</string>