diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 27d5d9d..dfa201d 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -69,8 +69,10 @@ android:parentActivityName=".ui.main.ComposeMainActivity" /> + diff --git a/android/app/src/main/java/dev/dettmer/simplenotes/ui/settings/ComposeSettingsActivity.kt b/android/app/src/main/java/dev/dettmer/simplenotes/ui/settings/ComposeSettingsActivity.kt index cb13ed2..bac97b7 100644 --- a/android/app/src/main/java/dev/dettmer/simplenotes/ui/settings/ComposeSettingsActivity.kt +++ b/android/app/src/main/java/dev/dettmer/simplenotes/ui/settings/ComposeSettingsActivity.kt @@ -189,4 +189,16 @@ class ComposeSettingsActivity : AppCompatActivity() { Logger.e(TAG, "❌ Failed to restart NetworkMonitor: ${e.message}") } } + + /** + * Handle configuration changes (e.g., locale) without recreating activity + * v1.8.0: Prevents flickering during language changes by avoiding full recreate + * Compose automatically recomposes when configuration changes + */ + override fun onConfigurationChanged(newConfig: android.content.res.Configuration) { + super.onConfigurationChanged(newConfig) + Logger.d(TAG, "📱 Configuration changed (likely locale switch) - Compose will recompose") + // Compose handles UI updates automatically via recomposition + // No manual action needed - stringResource() etc. will pick up new locale + } } diff --git a/android/app/src/main/java/dev/dettmer/simplenotes/ui/settings/screens/LanguageSettingsScreen.kt b/android/app/src/main/java/dev/dettmer/simplenotes/ui/settings/screens/LanguageSettingsScreen.kt index f47d9f2..b239b31 100644 --- a/android/app/src/main/java/dev/dettmer/simplenotes/ui/settings/screens/LanguageSettingsScreen.kt +++ b/android/app/src/main/java/dev/dettmer/simplenotes/ui/settings/screens/LanguageSettingsScreen.kt @@ -1,6 +1,5 @@ package dev.dettmer.simplenotes.ui.settings.screens -import android.app.Activity import androidx.appcompat.app.AppCompatDelegate import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Spacer @@ -15,7 +14,6 @@ import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier -import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import androidx.core.os.LocaleListCompat @@ -35,8 +33,6 @@ import dev.dettmer.simplenotes.ui.settings.components.SettingsScaffold fun LanguageSettingsScreen( onBack: () -> Unit ) { - val context = LocalContext.current - // Get current app locale - fresh value each time (no remember, always reads current state) val currentLocale = AppCompatDelegate.getApplicationLocales() val currentLanguageCode = if (currentLocale.isEmpty) { @@ -92,7 +88,7 @@ fun LanguageSettingsScreen( onValueSelected = { newLanguage -> if (newLanguage != selectedLanguage) { selectedLanguage = newLanguage - setAppLanguage(newLanguage, context as Activity) + setAppLanguage(newLanguage) } } ) @@ -102,19 +98,19 @@ fun LanguageSettingsScreen( /** * Set app language using AppCompatDelegate - * Works on Android 13+ natively, falls back to AppCompat on older versions + * v1.8.0: Smooth language change without activity recreate + * + * ComposeSettingsActivity handles locale changes via android:configChanges="locale" + * in AndroidManifest.xml, preventing full activity recreate and eliminating flicker. + * Compose automatically recomposes when the configuration changes. */ -private fun setAppLanguage(languageCode: String, activity: Activity) { +private fun setAppLanguage(languageCode: String) { val localeList = if (languageCode.isEmpty()) { LocaleListCompat.getEmptyLocaleList() } else { LocaleListCompat.forLanguageTags(languageCode) } + // Sets the app locale - triggers onConfigurationChanged() instead of recreate() AppCompatDelegate.setApplicationLocales(localeList) - - // Restart the activity to apply the change - // On Android 13+ the system handles this automatically for some apps, - // but we need to recreate to ensure our Compose UI recomposes with new locale - activity.recreate() } diff --git a/android/app/src/main/res/values-de/strings.xml b/android/app/src/main/res/values-de/strings.xml index c47d215..eedde88 100644 --- a/android/app/src/main/res/values-de/strings.xml +++ b/android/app/src/main/res/values-de/strings.xml @@ -409,7 +409,7 @@ Systemstandard English Deutsch - ℹ️ Wähle deine bevorzugte Sprache. Die App wird neu gestartet, um die Änderung anzuwenden. + ℹ️ Wähle deine bevorzugte Sprache. Die Ansicht wird kurz aktualisiert, um die Änderung anzuwenden. Sprache geändert. Neustart… diff --git a/android/app/src/main/res/values/strings.xml b/android/app/src/main/res/values/strings.xml index a099149..c0f27e8 100644 --- a/android/app/src/main/res/values/strings.xml +++ b/android/app/src/main/res/values/strings.xml @@ -409,7 +409,7 @@ System Default English Deutsch - ℹ️ Choose your preferred language. The app will restart to apply the change. + ℹ️ Choose your preferred language. The view will briefly refresh to apply the change. Language changed. Restarting…