From 8a26ba2c23c51972dad471dca15e9b0273a850fc Mon Sep 17 00:00:00 2001 From: Syer10 Date: Fri, 11 Mar 2022 15:20:43 -0500 Subject: [PATCH] Set android app language on startup --- android/build.gradle.kts | 5 +++ .../main/java/ca/gosyer/jui/android/App.kt | 33 +++++++++++++++++++ gradle/libs.versions.toml | 4 +-- 3 files changed, 40 insertions(+), 2 deletions(-) diff --git a/android/build.gradle.kts b/android/build.gradle.kts index 5fd3c7ba..4120d12c 100644 --- a/android/build.gradle.kts +++ b/android/build.gradle.kts @@ -10,6 +10,11 @@ plugins { } dependencies { + modules { + module("androidx.lifecycle:lifecycle-viewmodel-ktx") { + replacedBy("androidx.lifecycle:lifecycle-viewmodel") + } + } implementation(projects.core) implementation(projects.i18n) implementation(projects.data) diff --git a/android/src/main/java/ca/gosyer/jui/android/App.kt b/android/src/main/java/ca/gosyer/jui/android/App.kt index 06ca0aaf..76b59881 100644 --- a/android/src/main/java/ca/gosyer/jui/android/App.kt +++ b/android/src/main/java/ca/gosyer/jui/android/App.kt @@ -8,14 +8,18 @@ package ca.gosyer.jui.android import android.app.Application import androidx.appcompat.app.AppCompatDelegate +import androidx.core.os.LocaleListCompat import androidx.lifecycle.DefaultLifecycleObserver import androidx.lifecycle.ProcessLifecycleOwner import androidx.lifecycle.lifecycleScope import ca.gosyer.core.logging.CKLogger +import ca.gosyer.core.prefs.Preference import ca.gosyer.core.prefs.getAsFlow import ca.gosyer.data.ui.model.ThemeMode import ca.gosyer.jui.android.data.notification.Notifications import kotlinx.coroutines.flow.launchIn +import kotlinx.coroutines.flow.onEach +import java.util.Locale class App : Application(), DefaultLifecycleObserver { @@ -43,6 +47,8 @@ class App : Application(), DefaultLifecycleObserver { ) } .launchIn(ProcessLifecycleOwner.get().lifecycleScope) + + setupAppLanguage(appComponent.dataComponent.uiPreferences.language()) } private fun setupNotificationChannels() { @@ -53,5 +59,32 @@ class App : Application(), DefaultLifecycleObserver { } } + private fun setupAppLanguage(languagePref: Preference) { + val defaultLocaleList = AppCompatDelegate.getApplicationLocales() + if (languagePref.isSet() && languagePref.defaultValue() != languagePref.get()) { + AppCompatDelegate.setApplicationLocales( + LocaleListCompat.create( + Locale.forLanguageTag(languagePref.get()), + Locale.forLanguageTag("en") + ) + ) + } + languagePref + .changes() + .onEach { + if (languagePref.isSet() && languagePref.defaultValue() != it) { + AppCompatDelegate.setApplicationLocales( + LocaleListCompat.create( + Locale.forLanguageTag(it), + Locale.forLanguageTag("en") + ) + ) + } else if (languagePref.isSet() && it == languagePref.defaultValue()) { + AppCompatDelegate.setApplicationLocales(defaultLocaleList) + } + } + .launchIn(ProcessLifecycleOwner.get().lifecycleScope) + } + protected companion object : CKLogger({}) } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index ee327ac3..682d99e3 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -15,12 +15,12 @@ materialDialogs = "0.6.6" # Android core = "1.7.0" -appCompat = "1.4.1" +appCompat = "1.6.0-alpha01" activityCompose = "1.4.0" work = "2.6.0" # Android Lifecycle -lifecycle = "2.4.1" +lifecycle = "2.5.0-alpha03" # Swing darklaf = "2.7.3"