commit acdc361c6d0b6c53293e628f128db473cf9b86c1 parent 0c93bcaecd77facf65cbbf60f4eaf84573d86614 Author: Bohdan Potuzhnyi <bohdan.potuzhnyi@gmail.com> Date: Sun, 17 May 2026 12:59:05 +0200 [pos] adding log-out option Diffstat:
14 files changed, 77 insertions(+), 6 deletions(-)
diff --git a/merchant-terminal/src/main/java/net/taler/merchantpos/MainActivity.kt b/merchant-terminal/src/main/java/net/taler/merchantpos/MainActivity.kt @@ -31,6 +31,7 @@ import androidx.activity.viewModels import androidx.appcompat.app.AppCompatActivity import androidx.core.view.GravityCompat.START import androidx.navigation.NavController +import androidx.navigation.NavOptions import androidx.navigation.fragment.NavHostFragment import androidx.navigation.ui.AppBarConfiguration import androidx.navigation.ui.setupWithNavController @@ -53,6 +54,17 @@ class MainActivity : AppCompatActivity(), OnNavigationItemSelectedListener { const val TAG = "taler-pos" } + private fun navigateToInstanceSettings(resetBackStack: Boolean) { + if (nav.currentDestination?.id == R.id.nav_instanceSettings) return + val options = NavOptions.Builder() + .setLaunchSingleTop(true) + .apply { + if (resetBackStack) setPopUpTo(R.id.nav_graph, true) + } + .build() + nav.navigate(R.id.nav_instanceSettings, null, options) + } + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) ui = ActivityMainBinding.inflate(layoutInflater) @@ -68,12 +80,12 @@ class MainActivity : AppCompatActivity(), OnNavigationItemSelectedListener { } } - // new: if we ever see a 401, fire this and kick back to settings + // If the backend session expires, force the user back into instance setup. model.configManager.sessionExpired.observe(this) { Toast .makeText(this, R.string.session_expired_toast, Toast.LENGTH_LONG) .show() - nav.navigate(R.id.action_global_merchantSettings) + navigateToInstanceSettings(resetBackStack = true) } val navHostFragment = @@ -109,8 +121,7 @@ class MainActivity : AppCompatActivity(), OnNavigationItemSelectedListener { override fun onStart() { super.onStart() if (!model.configManager.config.isValid()) { - if (nav.currentDestination?.id != R.id.nav_settings) - nav.navigate(R.id.action_global_merchantSettings) + navigateToInstanceSettings(resetBackStack = true) } else if (model.configManager.merchantConfig == null && nav.currentDestination?.id != R.id.configFetcher) { nav.navigate(R.id.action_global_configFetcher) @@ -137,7 +148,13 @@ class MainActivity : AppCompatActivity(), OnNavigationItemSelectedListener { R.id.nav_order -> nav.navigate(R.id.action_global_order) R.id.nav_amountEntry -> nav.navigate(R.id.action_global_amountEntry) R.id.nav_history -> nav.navigate(R.id.action_global_merchantHistory) - R.id.nav_settings-> nav.navigate(R.id.action_global_merchantSettings) + R.id.nav_settings-> { + if (model.configManager.config.isValid()) { + nav.navigate(R.id.action_global_merchantSettings) + } else { + navigateToInstanceSettings(resetBackStack = true) + } + } } ui.drawerLayout.closeDrawer(START) return true 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 @@ -93,7 +93,7 @@ private const val SETTINGS_MERCHANT_URL = "merchantUrl" private const val SETTINGS_ACCESS_TOKEN = "accessToken" private const val SETTINGS_INITIAL_ORDER_SCREEN = "initialOrderScreen" -internal const val NEW_CONFIG_URL_DEMO = "https://my.taler-ops.ch" +internal const val NEW_CONFIG_URL_DEMO = "my.taler-ops.ch" private val VERSION = Version.parse(BuildConfig.BACKEND_API_VERSION)!! @@ -435,10 +435,27 @@ class ConfigManager( } saveConfig(config) merchantConfig = null + currency = null currencySpec = null } @UiThread + fun logout() { + inventoryRefreshJob?.cancel() + val savePassword = config.savePassword() + config = Config.New( + merchantUrl = "", + accessToken = "", + savePassword = savePassword, + ) + saveConfig(config) + merchantConfig = null + currency = null + currencySpec = null + mConfigUpdateResult.value = null + } + + @UiThread private fun saveConfig(config: Config) { when (val c = config) { // is Config.Old -> prefs.edit() 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 @@ -53,6 +53,7 @@ import androidx.compose.runtime.setValue import androidx.core.os.LocaleListCompat import androidx.fragment.app.Fragment import androidx.fragment.app.activityViewModels +import androidx.navigation.NavOptions import androidx.navigation.fragment.findNavController import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Shape @@ -105,6 +106,17 @@ class GeneralSettingsFragment : Fragment() { onInstanceSettingsClick = { findNavController().navigate(R.id.nav_instanceSettings) }, + onLogoutClick = { + configManager.logout() + findNavController().navigate( + R.id.nav_instanceSettings, + null, + NavOptions.Builder() + .setLaunchSingleTop(true) + .setPopUpTo(R.id.nav_graph, true) + .build(), + ) + }, ) } } @@ -165,6 +177,7 @@ private fun GeneralSettingsScreen( initialSelectedOrderScreen: InitialOrderScreen, onInitialOrderSelected: (InitialOrderScreen) -> Unit, onInstanceSettingsClick: () -> Unit, + onLogoutClick: () -> Unit, ) { var languageExpanded by remember { mutableStateOf(false) } var selectedTag by rememberSaveable { mutableStateOf(initialSelectedTag) } @@ -239,6 +252,19 @@ private fun GeneralSettingsScreen( text = stringResource(R.string.settings_instance_button), ) } + Button( + modifier = Modifier.fillMaxWidth(), + onClick = onLogoutClick, + shape = SettingsControlShape, + colors = ButtonDefaults.buttonColors( + containerColor = MaterialTheme.colorScheme.errorContainer, + contentColor = MaterialTheme.colorScheme.onErrorContainer, + ), + ) { + Text( + text = stringResource(R.string.settings_logout_button), + ) + } } } } diff --git a/merchant-terminal/src/main/res/values-de/strings.xml b/merchant-terminal/src/main/res/values-de/strings.xml @@ -112,6 +112,7 @@ <string name="settings_instance_title">Gespeicherte Instanz</string> <string name="settings_instance_description">Händlerportal-URL, Benutzername, Token und weitere instanzspezifische Einstellungen ändern.</string> <string name="settings_instance_button">Gespeicherte Instanz ändern</string> + <string name="settings_logout_button">Abmelden</string> <string name="amount_entry_charge">Berechnen</string> <string name="amount_entry_create_order_charge">Bestellung erstellen (Betrag berechnen)</string> <string name="amount_entry_backspace">Rücktaste</string> diff --git a/merchant-terminal/src/main/res/values-es/strings.xml b/merchant-terminal/src/main/res/values-es/strings.xml @@ -90,6 +90,7 @@ <string name="settings_instance_title">Instancia guardada</string> <string name="settings_instance_description">Cambia la URL del portal del comercio, el nombre de usuario, el token y otros ajustes de la instancia.</string> <string name="settings_instance_button">Modificar instancia guardada</string> + <string name="settings_logout_button">Cerrar sesión</string> <string name="amount_entry_label">Importe</string> <string name="amount_entry_charge">Cobrar</string> <string name="amount_entry_create_order_charge">Crear pedido (cobrar importe)</string> diff --git a/merchant-terminal/src/main/res/values-fi/strings.xml b/merchant-terminal/src/main/res/values-fi/strings.xml @@ -84,6 +84,7 @@ <string name="settings_instance_title">Tallennettu instanssi</string> <string name="settings_instance_description">Muuta kauppiasportaalin URL-osoitetta, käyttäjätunnusta, tokenia ja muita instanssin asetuksia.</string> <string name="settings_instance_button">Muokkaa tallennettua instanssia</string> + <string name="settings_logout_button">Kirjaudu ulos</string> <string name="config_merchant_url">Kauppiasportaalin URL</string> <string name="amount_entry_label">Summa</string> <string name="amount_entry_charge">Veloita</string> diff --git a/merchant-terminal/src/main/res/values-fr/strings.xml b/merchant-terminal/src/main/res/values-fr/strings.xml @@ -103,6 +103,7 @@ <string name="settings_instance_title">Instance enregistrée</string> <string name="settings_instance_description">Modifier l’URL du portail commerçant, le nom d’utilisateur, le jeton et les autres paramètres de l’instance.</string> <string name="settings_instance_button">Modifier l’instance enregistrée</string> + <string name="settings_logout_button">Se déconnecter</string> <string name="amount_entry_label">Montant</string> <string name="amount_entry_charge">Encaisser</string> <string name="amount_entry_create_order_charge">Créer une commande (encaisser le montant)</string> diff --git a/merchant-terminal/src/main/res/values-it/strings.xml b/merchant-terminal/src/main/res/values-it/strings.xml @@ -59,6 +59,7 @@ <string name="settings_instance_title">Istanza salvata</string> <string name="settings_instance_description">Modifica URL del portale commerciante, nome utente, token e altre impostazioni dell’istanza.</string> <string name="settings_instance_button">Modifica istanza salvata</string> + <string name="settings_logout_button">Disconnetti</string> <string name="config_label">Impostazioni commerciante</string> <string name="config_old_label">File JSON (vecchio)</string> <string name="config_setup_password">Password</string> diff --git a/merchant-terminal/src/main/res/values-iw/strings.xml b/merchant-terminal/src/main/res/values-iw/strings.xml @@ -45,6 +45,7 @@ <string name="settings_instance_title">מופע שמור</string> <string name="settings_instance_description">שינוי כתובת פורטל הסוחר, שם משתמש, אסימון והגדרות נוספות של המופע.</string> <string name="settings_instance_button">שינוי מופע שמור</string> + <string name="settings_logout_button">התנתק</string> <string name="config_old_label">קובץ JSON (ישן)</string> <string name="config_setup_password">סיסמה</string> <string name="config_old_deprecation">שיטת תצורה זו מיושנת, השתמשו בתצורת API הסוחר החדשה.</string> diff --git a/merchant-terminal/src/main/res/values-ru/strings.xml b/merchant-terminal/src/main/res/values-ru/strings.xml @@ -84,6 +84,7 @@ <string name="settings_instance_title">Сохраненный экземпляр</string> <string name="settings_instance_description">Изменить URL портала продавца, имя пользователя, токен и другие настройки экземпляра.</string> <string name="settings_instance_button">Изменить сохраненный экземпляр</string> + <string name="settings_logout_button">Выйти</string> <string name="config_merchant_url">URL портала продавца</string> <string name="amount_entry_label">Сумма</string> <string name="amount_entry_charge">Списать</string> diff --git a/merchant-terminal/src/main/res/values-sv/strings.xml b/merchant-terminal/src/main/res/values-sv/strings.xml @@ -80,6 +80,7 @@ <string name="settings_instance_title">Sparad instans</string> <string name="settings_instance_description">Ändra handlarportalens URL, användarnamn, token och andra instansspecifika inställningar.</string> <string name="settings_instance_button">Ändra sparad instans</string> + <string name="settings_logout_button">Logga ut</string> <string name="config_merchant_url">Handlarportalens URL</string> <string name="amount_entry_label">Belopp</string> <string name="amount_entry_charge">Debitera</string> diff --git a/merchant-terminal/src/main/res/values-tr/strings.xml b/merchant-terminal/src/main/res/values-tr/strings.xml @@ -91,6 +91,7 @@ <string name="settings_instance_title">Kayıtlı örnek</string> <string name="settings_instance_description">Satıcı portalı URL’sini, kullanıcı adını, tokeni ve diğer örneğe özel ayarları değiştirin.</string> <string name="settings_instance_button">Kayıtlı örneği değiştir</string> + <string name="settings_logout_button">Oturumu kapat</string> <string name="amount_entry_label">Tutar</string> <string name="amount_entry_charge">Ücret al</string> <string name="amount_entry_create_order_charge">Sipariş oluştur (tutarı ücretlendir)</string> diff --git a/merchant-terminal/src/main/res/values-uk/strings.xml b/merchant-terminal/src/main/res/values-uk/strings.xml @@ -90,6 +90,7 @@ <string name="settings_instance_title">Збережений екземпляр</string> <string name="settings_instance_description">Змінити URL порталу продавця, ім’я користувача, токен та інші налаштування екземпляра.</string> <string name="settings_instance_button">Змінити збережений екземпляр</string> + <string name="settings_logout_button">Вийти</string> <string name="amount_entry_label">Сума</string> <string name="amount_entry_charge">Стягнути</string> <string name="amount_entry_create_order_charge">Створити замовлення (стягнути суму)</string> diff --git a/merchant-terminal/src/main/res/values/strings.xml b/merchant-terminal/src/main/res/values/strings.xml @@ -52,6 +52,7 @@ <string name="settings_instance_title">Saved instance</string> <string name="settings_instance_description">Change merchant portal URL, username, token, and other instance-specific settings.</string> <string name="settings_instance_button">Modify saved instance</string> + <string name="settings_logout_button">Log out</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>