taler-android

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

commit 558792bdef1db024daecc6019483d57984ea2122
parent a172a588e4af32138009a32176a1df0fde0d2494
Author: Bohdan Potuzhnyi <bohdan.potuzhnyi@gmail.com>
Date:   Mon, 31 Aug 2026 18:47:48 +0200

[merchant-terminal] adding no instance helper + version bump

Diffstat:
Mmerchant-terminal/build.gradle | 14+++++++-------
Mmerchant-terminal/src/main/java/net/taler/merchantpos/config/ConfigFragment.kt | 120+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Mmerchant-terminal/src/main/res/values-de/strings.xml | 6++++++
Mmerchant-terminal/src/main/res/values-es/strings.xml | 6++++++
Mmerchant-terminal/src/main/res/values-fi/strings.xml | 6++++++
Mmerchant-terminal/src/main/res/values-fr/strings.xml | 6++++++
Mmerchant-terminal/src/main/res/values-it/strings.xml | 6++++++
Mmerchant-terminal/src/main/res/values-iw/strings.xml | 6++++++
Mmerchant-terminal/src/main/res/values-ru/strings.xml | 6++++++
Mmerchant-terminal/src/main/res/values-sv/strings.xml | 6++++++
Mmerchant-terminal/src/main/res/values-tr/strings.xml | 6++++++
Mmerchant-terminal/src/main/res/values-uk/strings.xml | 6++++++
Mmerchant-terminal/src/main/res/values/strings.xml | 7+++++++
13 files changed, 194 insertions(+), 7 deletions(-)

diff --git a/merchant-terminal/build.gradle b/merchant-terminal/build.gradle @@ -13,8 +13,8 @@ android { applicationId "net.taler.merchantpos" minSdkVersion 23 targetSdkVersion 36 - versionCode 25 - versionName "1.6.2" + versionCode 26 + versionName "1.6.3" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" buildConfigField("String", "BACKEND_API_VERSION", "\"20:0:8\"") @@ -69,7 +69,7 @@ dependencies { implementation "com.google.android.material:material:$material_version" implementation "androidx.constraintlayout:constraintlayout:$constraintlayout_version" - implementation platform('androidx.compose:compose-bom:2026.02.01') + implementation platform('androidx.compose:compose-bom:2026.06.01') implementation 'androidx.compose.material3:material3' implementation 'androidx.compose.material:material-icons-extended' implementation 'androidx.compose.ui:ui' @@ -77,14 +77,14 @@ dependencies { implementation "androidx.compose.runtime:runtime-livedata" implementation 'androidx.activity:activity-compose:1.13.0' implementation "androidx.navigation:navigation-compose:$nav_version" - implementation "androidx.fragment:fragment-ktx:1.8.9" + implementation "androidx.fragment:fragment-ktx:1.9.0" implementation "androidx.recyclerview:recyclerview:1.4.0" implementation "androidx.recyclerview:recyclerview-selection:1.2.0" // CameraX - implementation "androidx.camera:camera-camera2:1.5.3" - implementation "androidx.camera:camera-lifecycle:1.5.3" - implementation "androidx.camera:camera-view:1.5.3" + implementation "androidx.camera:camera-camera2:1.6.2" + implementation "androidx.camera:camera-lifecycle:1.6.2" + implementation "androidx.camera:camera-view:1.6.2" // ZXING core – on-device barcode/QR detector implementation "com.google.zxing:core:3.5.4" diff --git a/merchant-terminal/src/main/java/net/taler/merchantpos/config/ConfigFragment.kt b/merchant-terminal/src/main/java/net/taler/merchantpos/config/ConfigFragment.kt @@ -31,6 +31,9 @@ import androidx.camera.core.ImageAnalysis import androidx.camera.core.Preview import androidx.camera.lifecycle.ProcessCameraProvider import androidx.camera.view.PreviewView +import androidx.compose.animation.AnimatedVisibility +import androidx.compose.foundation.BorderStroke +import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.BoxWithConstraints @@ -103,16 +106,27 @@ import androidx.compose.ui.text.input.KeyboardType import androidx.compose.ui.text.input.PasswordVisualTransformation import androidx.compose.ui.text.input.VisualTransformation import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.ExpandLess +import androidx.compose.material.icons.filled.ExpandMore import androidx.compose.material.icons.filled.Visibility import androidx.compose.material.icons.filled.VisibilityOff +import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.Icon import androidx.compose.material3.IconButton +import androidx.compose.material3.TextButton import androidx.compose.runtime.remember +import androidx.compose.runtime.saveable.rememberSaveable import io.ktor.client.plugins.ClientRequestException import io.ktor.http.HttpStatusCode.Companion.Unauthorized private enum class ConfigMode { Manual, Qr } +private const val DEMO_MERCHANT_HOST = "backend.demo.taler.net" +private const val DEMO_INSTANCE = "sandbox" +private const val DEMO_PASSWORD = "sandbox" +private const val INSTANCE_SETUP_TUTORIAL_URL = + "https://tutorials.taler.net/merchant/merchant-backoffice/obtain-instance/index" + class ConfigFragment : Fragment() { private val model: MainViewModel by activityViewModels() @@ -654,6 +668,112 @@ private fun ManualConfigScreen( } } } + item { + InstanceHelpCard( + onOpenTutorial = { + focusManager.clearFocus() + keyboardController?.hide() + }, + onFillDemoCredentials = { + focusManager.clearFocus() + keyboardController?.hide() + onMerchantUrlChanged(DEMO_MERCHANT_HOST) + onUsernameChanged(DEMO_INSTANCE) + onTokenChanged(DEMO_PASSWORD) + }, + onFillReviewUrl = { + focusManager.clearFocus() + keyboardController?.hide() + onMerchantUrlChanged(DEMO_MERCHANT_HOST) + onUsernameChanged("") + onTokenChanged("") + }, + ) + } + } +} + +@Composable +private fun InstanceHelpCard( + onOpenTutorial: () -> Unit, + onFillDemoCredentials: () -> Unit, + onFillReviewUrl: () -> Unit, +) { + var expanded by rememberSaveable { mutableStateOf(false) } + val uriHandler = androidx.compose.ui.platform.LocalUriHandler.current + + Surface( + modifier = Modifier.fillMaxWidth(), + shape = MaterialTheme.shapes.medium, + border = BorderStroke(1.dp, MaterialTheme.colorScheme.outline), + ) { + Column { + Row( + modifier = Modifier + .fillMaxWidth() + .clickable { expanded = !expanded } + .padding(12.dp), + verticalAlignment = Alignment.CenterVertically, + ) { + Text( + text = stringResource(R.string.config_no_instance), + modifier = Modifier.weight(1f), + style = MaterialTheme.typography.titleSmall, + ) + Icon( + imageVector = if (expanded) Icons.Filled.ExpandLess else Icons.Filled.ExpandMore, + contentDescription = null, + ) + } + + AnimatedVisibility(visible = expanded) { + Column { + HorizontalDivider() + Column( + modifier = Modifier.padding(12.dp), + verticalArrangement = Arrangement.spacedBy(16.dp), + ) { + Column { + Text( + text = stringResource(R.string.config_instance_tutorial_description), + style = MaterialTheme.typography.bodyMedium, + color = MaterialTheme.colorScheme.onSurfaceVariant, + ) + TextButton( + onClick = { + onOpenTutorial() + uriHandler.openUri(INSTANCE_SETUP_TUTORIAL_URL) + }, + ) { + Text(stringResource(R.string.config_instance_tutorial_link)) + } + } + + Column(verticalArrangement = Arrangement.spacedBy(8.dp)) { + Text( + text = stringResource(R.string.config_instance_demo_description), + style = MaterialTheme.typography.bodyMedium, + color = MaterialTheme.colorScheme.onSurfaceVariant, + ) + OutlinedButton(onClick = onFillDemoCredentials) { + Text(stringResource(R.string.config_fill_demo_credentials)) + } + } + + Column(verticalArrangement = Arrangement.spacedBy(8.dp)) { + Text( + text = stringResource(R.string.config_instance_review_description), + style = MaterialTheme.typography.bodyMedium, + color = MaterialTheme.colorScheme.onSurfaceVariant, + ) + OutlinedButton(onClick = onFillReviewUrl) { + Text(stringResource(R.string.config_fill_review_url)) + } + } + } + } + } + } } } diff --git a/merchant-terminal/src/main/res/values-de/strings.xml b/merchant-terminal/src/main/res/values-de/strings.xml @@ -56,6 +56,12 @@ <string name="config_error_malformed">Fehler: Die JSON-Konfiguration ist fehlerhaft</string> <string name="config_error_unknown">Fehler: Ungültige Konfiguration</string> <string name="config_docs">Informationen zum Konfigurationsformat finden Sie in <a href="https://docs.taler.net/taler-merchant-pos-terminal.html#apis-and-data-formats">der Dokumentation</a>.</string> + <string name="config_no_instance">Keine Instanz?</string> + <string name="config_instance_tutorial_description">1. Sehen Sie sich die Einrichtungsanleitungen an unter:</string> + <string name="config_instance_demo_description">2. Sie können die App mit der öffentlichen Demo-Instanz ausprobieren. Beachten Sie, dass diese Instanz gemeinsam genutzt wird—jeder kann ihre Daten jederzeit ändern. Verwenden Sie sie nur, um die App und ihre Funktionen kennenzulernen.</string> + <string name="config_fill_demo_credentials">Demo-Zugangsdaten einfügen</string> + <string name="config_instance_review_description">3. Wenn Sie diese App prüfen, haben Sie höchstwahrscheinlich bereits Zugriff auf einen kontrollierten Testbenutzer. Verwenden Sie die Schaltfläche unten, um die URL des Händlerportals einzufügen.</string> + <string name="config_fill_review_url">Prüf-URL einfügen</string> <string name="refund_error_max_amount">Größer als Bestellbetrag von %s</string> <string name="refund_error_backend">Fehler bei der Verarbeitung der Rückerstattung</string> <string name="refund_reason_wrong_order">Falsche Bestellung</string> diff --git a/merchant-terminal/src/main/res/values-es/strings.xml b/merchant-terminal/src/main/res/values-es/strings.xml @@ -75,6 +75,12 @@ <string name="config_error_currency">Error: Producto %1$s tiene una divisa %2$s, pero %3$s esperada</string> <string name="config_changed">Cambiado al nuevo comercio usando %s</string> <string name="config_docs">Por favor consulta <a href="https://docs.taler.net/taler-merchant-pos-terminal.html#apis-and-data-formats">la documentación</a> para la configuración del formato.</string> + <string name="config_no_instance">¿No tienes una instancia?</string> + <string name="config_instance_tutorial_description">1. Consulta los tutoriales de configuración en:</string> + <string name="config_instance_demo_description">2. Puedes probar la aplicación con la instancia pública de demostración. Ten en cuenta que esta instancia es compartida: cualquiera puede modificar sus datos en cualquier momento. Úsala únicamente para explorar la aplicación y sus funciones.</string> + <string name="config_fill_demo_credentials">Rellenar credenciales de demostración</string> + <string name="config_instance_review_description">3. Si estás revisando esta aplicación, probablemente ya tengas acceso a un usuario de prueba controlado. Usa el botón de abajo para rellenar la URL del portal del vendedor.</string> + <string name="config_fill_review_url">Rellenar URL de revisión</string> <string name="refund_error_max_amount">Mayor que la cantidad del pedido de %s</string> <string name="refund_intro_nfc">Por favor permite al cliente escanear el código QR o usar NFC para ofrecer un reembolso</string> <string name="payment_claimed">A la espera de que el cliente confirme el pago…</string> diff --git a/merchant-terminal/src/main/res/values-fi/strings.xml b/merchant-terminal/src/main/res/values-fi/strings.xml @@ -82,6 +82,12 @@ <string name="config_auth_error">Virhe: Virheellinen käyttäjätunnus tai salasana</string> <string name="config_fetching_label">Haetaan määritystä</string> <string name="config_docs">Katso määritysmuodon <a href="https://docs.taler.net/taler-merchant-pos-terminal.html#apis-and-data-formats">dokumentaatiosta</a>.</string> + <string name="config_no_instance">Ei instanssia?</string> + <string name="config_instance_tutorial_description">1. Tutustu käyttöönotto-ohjeisiin osoitteessa:</string> + <string name="config_instance_demo_description">2. Voit kokeilla sovellusta julkisella demoinstanssilla. Huomaa, että instanssi on yhteiskäytössä—kuka tahansa voi muuttaa sen tietoja milloin tahansa. Käytä sitä vain sovellukseen ja sen ominaisuuksiin tutustumiseen.</string> + <string name="config_fill_demo_credentials">Täytä demotunnukset</string> + <string name="config_instance_review_description">3. Jos arvioit tätä sovellusta, sinulla on todennäköisesti jo hallittu testikäyttäjä. Esitäytä kauppiasportaalin URL-osoite alla olevalla painikkeella.</string> + <string name="config_fill_review_url">Täytä arviointi-URL</string> <string name="refund_error_deadline">Palautusaika on umpeutunut</string> <string name="menu_amount_entry">Tilaus summan mukaan</string> <string name="product_category_all_objects">Kaikki</string> diff --git a/merchant-terminal/src/main/res/values-fr/strings.xml b/merchant-terminal/src/main/res/values-fr/strings.xml @@ -8,6 +8,12 @@ <string name="config_error_network">Erreur : impossible de se connecter au serveur de configuration</string> <string name="config_error_product_zero">Erreur : aucun produit valide trouvé</string> <string name="config_docs">Veuillez vous référer à <a href="https://docs.taler.net/taler-merchant-pos-terminal.html#apis-and-data-formats">la documentation</a> pour le format de configuration.</string> + <string name="config_no_instance">Pas d’instance ?</string> + <string name="config_instance_tutorial_description">1. Consultez les tutoriels de configuration à l’adresse :</string> + <string name="config_instance_demo_description">2. Vous pouvez essayer l’application avec l’instance de démonstration publique. Cette instance est partagée : n’importe qui peut modifier ses données à tout moment. Utilisez-la uniquement pour découvrir l’application et ses fonctionnalités.</string> + <string name="config_fill_demo_credentials">Renseigner les identifiants de démonstration</string> + <string name="config_instance_review_description">3. Si vous évaluez cette application, vous avez probablement déjà accès à un utilisateur de test contrôlé. Utilisez le bouton ci-dessous pour préremplir l’URL du portail commerçant.</string> + <string name="config_fill_review_url">Renseigner l’URL d’évaluation</string> <string name="refund_confirm">Approuver le remboursement</string> <string name="refund_error_backend">Erreur lors du traitement du remboursement</string> <string name="menu_settings">Paramètres</string> diff --git a/merchant-terminal/src/main/res/values-it/strings.xml b/merchant-terminal/src/main/res/values-it/strings.xml @@ -108,6 +108,12 @@ <string name="config_changed">Passato al nuovo commerciante con %s</string> <string name="config_fetching_label">Recupero configurazione</string> <string name="config_docs">Consulta <a href="https://docs.taler.net/taler-merchant-pos-terminal.html#apis-and-data-formats">la documentazione</a> per il formato della configurazione.</string> + <string name="config_no_instance">Nessuna istanza?</string> + <string name="config_instance_tutorial_description">1. Consulta i tutorial di configurazione su:</string> + <string name="config_instance_demo_description">2. Puoi provare l’app con l’istanza demo pubblica. Tieni presente che questa istanza è condivisa: chiunque può modificarne i dati in qualsiasi momento. Usala solo per esplorare l’app e le sue funzionalità.</string> + <string name="config_fill_demo_credentials">Inserisci credenziali demo</string> + <string name="config_instance_review_description">3. Se stai esaminando questa app, molto probabilmente hai già accesso a un utente di test controllato. Usa il pulsante qui sotto per precompilare l’URL del portale commerciante.</string> + <string name="config_fill_review_url">Inserisci URL per la revisione</string> <string name="config_qr_label">Configurazione QR</string> <string name="scan_qr_hint">Scansiona il codice QR dal backoffice commerciante</string> <string name="forever">Per sempre</string> diff --git a/merchant-terminal/src/main/res/values-iw/strings.xml b/merchant-terminal/src/main/res/values-iw/strings.xml @@ -71,6 +71,12 @@ <string name="config_changed">הוחלף לסוחר חדש עם %s</string> <string name="config_fetching_label">טוען תצורה</string> <string name="config_docs">עיינו ב<a href="https://docs.taler.net/taler-merchant-pos-terminal.html#apis-and-data-formats">תיעוד</a> עבור מבנה התצורה.</string> + <string name="config_no_instance">אין מופע?</string> + <string name="config_instance_tutorial_description">1. עיינו במדריכי ההגדרה בכתובת:</string> + <string name="config_instance_demo_description">2. אפשר לנסות את היישום באמצעות מופע ההדגמה הציבורי. שימו לב שזהו מופע משותף—כל אחד יכול לשנות את הנתונים שלו בכל עת. השתמשו בו רק כדי להכיר את היישום ואת התכונות שלו.</string> + <string name="config_fill_demo_credentials">מילוי פרטי התחברות להדגמה</string> + <string name="config_instance_review_description">3. אם אתם בודקים את היישום, סביר שכבר יש לכם גישה למשתמש בדיקה מבוקר. השתמשו בכפתור למטה כדי למלא מראש את כתובת פורטל הסוחר.</string> + <string name="config_fill_review_url">מילוי כתובת לבדיקה</string> <string name="config_qr_label">תצורת QR</string> <string name="scan_qr_hint">סרקו את קוד ה-QR ממשרד האחורי של הסוחר</string> <string name="forever">לתמיד</string> diff --git a/merchant-terminal/src/main/res/values-ru/strings.xml b/merchant-terminal/src/main/res/values-ru/strings.xml @@ -63,6 +63,12 @@ <string name="config_changed">Изменено на нового продавца используя %s</string> <string name="config_fetching_label">Получение конфигурации</string> <string name="config_docs">Пожалуйста перейдите к <a href="https://docs.taler.net/taler-merchant-pos-terminal.html#apis-and-data-formats">документации</a> по формату конфигурации</string> + <string name="config_no_instance">Нет экземпляра?</string> + <string name="config_instance_tutorial_description">1. Ознакомьтесь с инструкциями по настройке:</string> + <string name="config_instance_demo_description">2. Вы можете попробовать приложение с общедоступным демонстрационным экземпляром. Учтите, что этот экземпляр используется совместно—любой пользователь может изменить его данные в любое время. Используйте его только для знакомства с приложением и его возможностями.</string> + <string name="config_fill_demo_credentials">Заполнить демо-данные</string> + <string name="config_instance_review_description">3. Если вы проверяете это приложение, скорее всего, у вас уже есть доступ к контролируемому тестовому пользователю. Используйте кнопку ниже, чтобы заполнить URL портала продавца.</string> + <string name="config_fill_review_url">Заполнить URL для проверки</string> <string name="payment_claimed">Ожидание пока клиент подтвердит платёж…</string> <string name="payment_order_id">Чек №%s</string> <string name="refund_amount">Сумма</string> diff --git a/merchant-terminal/src/main/res/values-sv/strings.xml b/merchant-terminal/src/main/res/values-sv/strings.xml @@ -72,6 +72,12 @@ <string name="config_error_currency">Fel: Produkten %1$s har valutan %2$s, men %3$s förväntas</string> <string name="config_fetching_label">Hämtar konfiguration</string> <string name="config_docs">Se <a href="https://docs.taler.net/taler-merchant-pos-terminal.html#apis-and-data-formats">dokumentationen</a> för konfigurationsformat.</string> + <string name="config_no_instance">Ingen instans?</string> + <string name="config_instance_tutorial_description">1. Läs installationsguiderna på:</string> + <string name="config_instance_demo_description">2. Du kan prova appen med den offentliga demoinstansen. Observera att instansen delas—vem som helst kan ändra dess data när som helst. Använd den endast för att utforska appen och dess funktioner.</string> + <string name="config_fill_demo_credentials">Fyll i demouppgifter</string> + <string name="config_instance_review_description">3. Om du granskar appen har du troligen redan tillgång till en kontrollerad testanvändare. Använd knappen nedan för att fylla i handlarportalens URL.</string> + <string name="config_fill_review_url">Fyll i gransknings-URL</string> <string name="refund_error_zero">Måste vara positivt</string> <string name="refund_intro_nfc">Låt kunden skanna QR-kod eller använd NFC för att erbjuda återbetalning</string> <string name="refund_intro">Låt kunden skanna QR-koden för att erbjuda återbetalning</string> diff --git a/merchant-terminal/src/main/res/values-tr/strings.xml b/merchant-terminal/src/main/res/values-tr/strings.xml @@ -32,6 +32,12 @@ <string name="config_changed">%s kullanılarak yeni satıcı olarak değiştirildi</string> <string name="config_fetching_label">Kurulum getiriliyor</string> <string name="config_docs">Lütfen kurulum formatı için <a href="https://docs.taler.net/taler-merchant-pos-terminal.html#apis-and-data-formats">belgelere</a> bakın.</string> + <string name="config_no_instance">Örneğiniz yok mu?</string> + <string name="config_instance_tutorial_description">1. Kurulum eğitimlerine göz atın:</string> + <string name="config_instance_demo_description">2. Uygulamayı herkese açık demo örneğiyle deneyebilirsiniz. Bu örneğin paylaşıldığını ve herkesin verilerini istediği zaman değiştirebileceğini unutmayın. Yalnızca uygulamayı ve özelliklerini keşfetmek için kullanın.</string> + <string name="config_fill_demo_credentials">Demo bilgilerini doldur</string> + <string name="config_instance_review_description">3. Bu uygulamayı inceliyorsanız büyük olasılıkla kontrollü bir test kullanıcısına zaten erişiminiz vardır. Satıcı portalı URL’sini doldurmak için aşağıdaki düğmeyi kullanın.</string> + <string name="config_fill_review_url">İnceleme URL’sini doldur</string> <string name="payment_intro_nfc">Lütfen müşterinin QR Kodunu taramasına veya ödeme yapmak için NFC kullanmasına izin verin.</string> <string name="payment_intro">Lütfen müşterinin ödeme yapmak için QR Kodunu taramasına izin verin.</string> <string name="payment_claimed">Müşterinin ödemeyi onaylaması bekleniyor…</string> diff --git a/merchant-terminal/src/main/res/values-uk/strings.xml b/merchant-terminal/src/main/res/values-uk/strings.xml @@ -88,6 +88,12 @@ <string name="config_error_product_category_id">Помилка: продукт %1$s посилається на невідомий ідентифікатор категорії %2$d</string> <string name="config_changed">Змінено на нового продавця, використовуючи %s</string> <string name="config_docs">Будь ласка, зверніться до <a href="https://docs.taler.net/taler-merchant-pos-terminal.html#apis-and-data-formats">документації</a> для формату конфігурації.</string> + <string name="config_no_instance">Немає екземпляра?</string> + <string name="config_instance_tutorial_description">1. Ознайомтеся з інструкціями з налаштування:</string> + <string name="config_instance_demo_description">2. Ви можете спробувати застосунок із загальнодоступним демонстраційним екземпляром. Зверніть увагу, що цей екземпляр використовується спільно—будь-хто може змінити його дані в будь-який час. Використовуйте його лише для ознайомлення із застосунком та його можливостями.</string> + <string name="config_fill_demo_credentials">Заповнити демо-дані</string> + <string name="config_instance_review_description">3. Якщо ви перевіряєте цей застосунок, найімовірніше, у вас уже є доступ до контрольованого тестового користувача. Скористайтеся кнопкою нижче, щоб заповнити URL порталу продавця.</string> + <string name="config_fill_review_url">Заповнити URL для перевірки</string> <string name="refund_reason">Причина повернення</string> <string name="menu_amount_entry">Замовлення за сумою</string> <string name="product_category_all_objects">Усе</string> diff --git a/merchant-terminal/src/main/res/values/strings.xml b/merchant-terminal/src/main/res/values/strings.xml @@ -81,6 +81,13 @@ <string name="config_changed">Changed to new merchant using %s</string> <string name="config_fetching_label">Fetching configuration</string> <string name="config_docs">Please refer to <a href="https://docs.taler.net/taler-merchant-pos-terminal.html#apis-and-data-formats">the documentation</a> for the configuration format.</string> + <string name="config_no_instance">No instance?</string> + <string name="config_instance_tutorial_description">1. Check out the setup tutorials at:</string> + <string name="config_instance_tutorial_link" translatable="false">tutorials.taler.net</string> + <string name="config_instance_demo_description">2. You can try the app with the public demo instance. Note that this instance is shared—anyone can modify its data at any time. Use it only to explore the app and its features.</string> + <string name="config_fill_demo_credentials">Fill demo credentials</string> + <string name="config_instance_review_description">3. If you are reviewing this app, you most likely already have access to a controlled test user. Use the button below to prefill the merchant portal URL.</string> + <string name="config_fill_review_url">Fill review URL</string> <string name="payment_intro_nfc">Please let customer scan QR Code or use NFC to pay.</string> <string name="payment_intro">Please let customer scan QR Code to pay.</string>