33
44package features.settings.locale
55
6+ import android.app.Activity
67import android.content.Context
8+ import android.content.ContextWrapper
79import android.content.res.Configuration
810import android.os.LocaleList
911import androidx.compose.runtime.Composable
1012import androidx.compose.runtime.CompositionLocalProvider
13+ import androidx.compose.runtime.LaunchedEffect
1114import androidx.compose.runtime.SideEffect
15+ import androidx.compose.runtime.getValue
16+ import androidx.compose.runtime.mutableIntStateOf
1217import androidx.compose.runtime.remember
18+ import androidx.compose.runtime.setValue
1319import androidx.compose.ui.platform.LocalConfiguration
1420import androidx.compose.ui.platform.LocalContext
1521import app.modes.LanguageModeEnglish
@@ -49,6 +55,20 @@ fun ProvideAppLanguage(
4955 )
5056}
5157
58+ @Composable
59+ fun RecreateActivityOnAppLanguageChange (languageMode : Int ) {
60+ val activity = LocalContext .current.findActivity()
61+ var previousLanguageMode by remember { mutableIntStateOf(languageMode) }
62+
63+ LaunchedEffect (activity, languageMode) {
64+ if (previousLanguageMode == languageMode) {
65+ return @LaunchedEffect
66+ }
67+ previousLanguageMode = languageMode
68+ activity?.recreate()
69+ }
70+ }
71+
5272private fun String?.toAppLocale (systemLocale : Locale ): Locale {
5373 return this ?.let (Locale ::forLanguageTag) ? : systemLocale
5474}
@@ -68,3 +88,11 @@ private fun Context.localizedConfiguration(locale: Locale): Configuration {
6888 setLayoutDirection(locale)
6989 }
7090}
91+
92+ private tailrec fun Context.findActivity (): Activity ? {
93+ return when (this ) {
94+ is Activity -> this
95+ is ContextWrapper -> baseContext.findActivity()
96+ else -> null
97+ }
98+ }
0 commit comments