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…