From ceed94b2538a75e82bed238e977c7fdf646a059b Mon Sep 17 00:00:00 2001 From: rasputin Date: Mon, 8 Jun 2026 18:49:05 +0200 Subject: [PATCH] localisation: onboarding --- .../gudariwallet/i18n/EnStrings.kt | 1 + .../gudariwallet/i18n/EsStrings.kt | 1 + .../gudariwallet/i18n/EuStrings.kt | 1 + .../bitcointxoko/gudariwallet/i18n/Strings.kt | 1 + .../ui/onboarding/OnboardingPages.kt | 54 +++++++++++++------ 5 files changed, 43 insertions(+), 15 deletions(-) diff --git a/app/src/main/java/com/bitcointxoko/gudariwallet/i18n/EnStrings.kt b/app/src/main/java/com/bitcointxoko/gudariwallet/i18n/EnStrings.kt index 3c44a4a..be3a3ca 100644 --- a/app/src/main/java/com/bitcointxoko/gudariwallet/i18n/EnStrings.kt +++ b/app/src/main/java/com/bitcointxoko/gudariwallet/i18n/EnStrings.kt @@ -328,6 +328,7 @@ val EnHomeStrings = AppStrings( connect = "Connect", notificationsTitle = "Stay in the loop", notificationsSubtitle = "Get notified instantly when you receive a payment.", + notificationsAlreadyGranted = "You're all set - permissions have been granted.", allowNotifications = "Allow Notifications", notificationsNote = "You can change this later in system Settings.", notificationsAutoGranted = "Notifications are enabled automatically on your device.", diff --git a/app/src/main/java/com/bitcointxoko/gudariwallet/i18n/EsStrings.kt b/app/src/main/java/com/bitcointxoko/gudariwallet/i18n/EsStrings.kt index 6a1e813..cd0aea2 100644 --- a/app/src/main/java/com/bitcointxoko/gudariwallet/i18n/EsStrings.kt +++ b/app/src/main/java/com/bitcointxoko/gudariwallet/i18n/EsStrings.kt @@ -328,6 +328,7 @@ val EsHomeStrings = AppStrings( connect = "Conectar", notificationsTitle = "Mantente al día", notificationsSubtitle = "Recibe notificaciones al instante cuando recibas un pago.", + notificationsAlreadyGranted = "Todo listo — los permisos han sido concedidos.", allowNotifications = "Permitir notificaciones", notificationsNote = "Puedes cambiar esto más tarde en los Ajustes del sistema.", notificationsAutoGranted = "Las notificaciones se activan automáticamente en tu dispositivo.", diff --git a/app/src/main/java/com/bitcointxoko/gudariwallet/i18n/EuStrings.kt b/app/src/main/java/com/bitcointxoko/gudariwallet/i18n/EuStrings.kt index 40133ad..70f9c6d 100644 --- a/app/src/main/java/com/bitcointxoko/gudariwallet/i18n/EuStrings.kt +++ b/app/src/main/java/com/bitcointxoko/gudariwallet/i18n/EuStrings.kt @@ -328,6 +328,7 @@ val EuStrings = AppStrings( connect = "Konektatu", notificationsTitle = "Egon eguneratuta", notificationsSubtitle = "Jaso jakinarazpenak berehala transakzio bat jasotzen duzunean.", + notificationsAlreadyGranted = "Dena prest dago — baimenak emanda daude.", allowNotifications = "Baimendu jakinarazpenak", notificationsNote = "Hau geroago alda dezakezu sistemaren Ezarpenetan.", notificationsAutoGranted = "Jakinarazpenak automatikoki gaituta daude zure gailuan.", diff --git a/app/src/main/java/com/bitcointxoko/gudariwallet/i18n/Strings.kt b/app/src/main/java/com/bitcointxoko/gudariwallet/i18n/Strings.kt index 4db3d79..c1efe44 100644 --- a/app/src/main/java/com/bitcointxoko/gudariwallet/i18n/Strings.kt +++ b/app/src/main/java/com/bitcointxoko/gudariwallet/i18n/Strings.kt @@ -327,6 +327,7 @@ data class OnboardingStrings( val done: String, val notificationsTitle: String, val notificationsSubtitle: String, + val notificationsAlreadyGranted: String, val allowNotifications: String, val notificationsNote: String, val notificationsAutoGranted: String, diff --git a/app/src/main/java/com/bitcointxoko/gudariwallet/ui/onboarding/OnboardingPages.kt b/app/src/main/java/com/bitcointxoko/gudariwallet/ui/onboarding/OnboardingPages.kt index 3171b90..0f9d34e 100644 --- a/app/src/main/java/com/bitcointxoko/gudariwallet/ui/onboarding/OnboardingPages.kt +++ b/app/src/main/java/com/bitcointxoko/gudariwallet/ui/onboarding/OnboardingPages.kt @@ -1,8 +1,10 @@ package com.bitcointxoko.gudariwallet.ui.onboarding +import android.Manifest import android.content.ActivityNotFoundException import android.content.Context import android.content.Intent +import android.content.pm.PackageManager import android.os.Build import android.os.PowerManager import android.provider.Settings @@ -51,7 +53,10 @@ import androidx.compose.ui.text.input.PasswordVisualTransformation import androidx.compose.ui.text.input.VisualTransformation import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp +import androidx.core.content.ContextCompat import androidx.core.net.toUri +import androidx.lifecycle.Lifecycle +import androidx.lifecycle.compose.LifecycleEventEffect import androidx.work.WorkInfo import com.bitcointxoko.gudariwallet.i18n.AppStrings import com.bitcointxoko.gudariwallet.sync.HistoricalSyncWorker @@ -233,9 +238,25 @@ fun NotificationsPage( strings: AppStrings, onRequestNotificationPermission: () -> Unit ) { - // On API < 33, the permission doesn't exist — show a reduced UI + val context = LocalContext.current + + // On API < 33, POST_NOTIFICATIONS doesn't exist — it's implicitly granted val needsPermission = Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU + // Helper to do the actual check + fun checkGranted(): Boolean = !needsPermission || ContextCompat.checkSelfPermission( + context, + Manifest.permission.POST_NOTIFICATIONS + ) == PackageManager.PERMISSION_GRANTED + + // Reactive state — re-evaluated on every resume (e.g. returning from the + // system permission dialog), mirroring how BatteryPage re-checks on recompose + var alreadyGranted by remember { mutableStateOf(checkGranted()) } + + LifecycleEventEffect(Lifecycle.Event.ON_RESUME) { + alreadyGranted = checkGranted() + } + OnboardingPageScaffold( title = strings.onboarding.notificationsTitle, // ← "Stay in the loop" subtitle = strings.onboarding.notificationsSubtitle // ← "Get notified instantly when you receive a payment." @@ -244,11 +265,23 @@ fun NotificationsPage( imageVector = Icons.Default.Notifications, contentDescription = null, modifier = Modifier.size(72.dp), - tint = MaterialTheme.colorScheme.primary + // Mirror the BatteryPage tint behaviour + tint = if (alreadyGranted) + MaterialTheme.colorScheme.primary + else + MaterialTheme.colorScheme.onSurfaceVariant ) Spacer(Modifier.height(32.dp)) - if (needsPermission) { + if (alreadyGranted) { + Text( + text = strings.onboarding.notificationsAutoGranted, + // ← reuse existing string, or add a new "notificationsAlreadyGranted" + style = MaterialTheme.typography.bodyMedium, + color = MaterialTheme.colorScheme.primary, + textAlign = TextAlign.Center + ) + } else { Button( onClick = onRequestNotificationPermission, modifier = Modifier.fillMaxWidth() @@ -257,19 +290,10 @@ fun NotificationsPage( } Spacer(Modifier.height(8.dp)) Text( - text = strings.onboarding.notificationsNote, + text = strings.onboarding.notificationsNote, // ← "You can change this later in system Settings." - style = MaterialTheme.typography.bodySmall, - color = MaterialTheme.colorScheme.onSurfaceVariant, - textAlign = TextAlign.Center - ) - } else { - // API < 33: permission granted implicitly, nothing to request - Text( - text = strings.onboarding.notificationsAutoGranted, - // ← "Notifications are enabled automatically on your device." - style = MaterialTheme.typography.bodyMedium, - color = MaterialTheme.colorScheme.onSurfaceVariant, + style = MaterialTheme.typography.bodySmall, + color = MaterialTheme.colorScheme.onSurfaceVariant, textAlign = TextAlign.Center ) }