From 578f73a5d166cdc935dce4bf2fdecaa9683eb714 Mon Sep 17 00:00:00 2001 From: Sean Mac Gillicuddy Date: Thu, 30 Jan 2020 15:10:53 +0000 Subject: [PATCH] #1738 Android OS language changes are ignored - add device default case to respect device settings --- app/src/main/AndroidManifest.xml | 2 +- .../core/main/CoreMainActivity.java | 3 +- .../core/settings/CorePrefsFragment.java | 36 ++++++++++++------- .../kiwixmobile/core/utils/LanguageUtils.kt | 13 +++---- .../core/utils/SharedPreferenceUtil.java | 5 +-- core/src/main/res/values/strings.xml | 1 + 6 files changed, 36 insertions(+), 24 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 5a085ddfa..64d5c1edd 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -28,7 +28,7 @@ diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/main/CoreMainActivity.java b/core/src/main/java/org/kiwix/kiwixmobile/core/main/CoreMainActivity.java index d6aefe78e..297261e9c 100644 --- a/core/src/main/java/org/kiwix/kiwixmobile/core/main/CoreMainActivity.java +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/main/CoreMainActivity.java @@ -1404,8 +1404,7 @@ public abstract class CoreMainActivity extends BaseActivity break; case REQUEST_PREFERENCES: if (resultCode == RESULT_RESTART) { - startActivity(Intents.internal(CoreMainActivity.class)); - finish(); + recreate(); } if (resultCode == RESULT_HISTORY_CLEARED) { webViewList.clear(); diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/settings/CorePrefsFragment.java b/core/src/main/java/org/kiwix/kiwixmobile/core/settings/CorePrefsFragment.java index 6f123ebee..fd9551a55 100644 --- a/core/src/main/java/org/kiwix/kiwixmobile/core/settings/CorePrefsFragment.java +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/settings/CorePrefsFragment.java @@ -44,6 +44,7 @@ import java.util.Locale; import javax.inject.Inject; import kotlin.Unit; import kotlin.io.FilesKt; +import org.jetbrains.annotations.NotNull; import org.kiwix.kiwixmobile.core.CoreApp; import org.kiwix.kiwixmobile.core.NightModeConfig; import org.kiwix.kiwixmobile.core.R; @@ -119,25 +120,20 @@ public abstract class CorePrefsFragment extends PreferenceFragment implements protected void setUpLanguageChooser(String preferenceId) { ListPreference languagePref = (ListPreference) findPreference(preferenceId); - String selectedLang = sharedPreferenceUtil.getPrefLanguage(Locale.getDefault().toString()); List languageCodeList = new LanguageUtils(getActivity()).getKeys(); - selectedLang = languageCodeList.contains(selectedLang) ? selectedLang : "en"; - String code[] = languageCodeList.toArray(new String[0]); - String[] entries = new String[code.length]; - for (int index = 0; index < code.length; index++) { - Locale locale = new Locale(code[index]); - entries[index] = - locale.getDisplayLanguage() + " (" + locale.getDisplayLanguage(locale) + ") "; - } - languagePref.setEntries(entries); - languagePref.setEntryValues(code); + languageCodeList.add(0, Locale.ROOT.getLanguage()); + final String selectedLang = + selectedLanguage(languageCodeList, sharedPreferenceUtil.getPrefLanguage()); + languagePref.setEntries(languageDisplayValues(languageCodeList)); + languagePref.setEntryValues(languageCodeList.toArray(new String[0])); languagePref.setDefaultValue(selectedLang); languagePref.setValue(selectedLang); - languagePref.setTitle(new Locale(selectedLang).getDisplayLanguage()); + languagePref.setTitle(selectedLang.equals(Locale.ROOT.toString()) + ? getString(R.string.device_default) + : new Locale(selectedLang).getDisplayLanguage()); languagePref.setOnPreferenceChangeListener((preference, newValue) -> { String languageCode = (String) newValue; LanguageUtils.handleLocaleChange(getActivity(), languageCode); - preference.setTitle(new Locale(languageCode).getLanguage()); sharedPreferenceUtil.putPrefLanguage(languageCode); restartActivity(); return true; @@ -150,6 +146,20 @@ public abstract class CorePrefsFragment extends PreferenceFragment implements getActivity().startActivity(new Intent(getActivity(), getActivity().getClass())); } + @NotNull private String selectedLanguage(List languageCodeList, String langPref) { + return languageCodeList.contains(langPref) ? langPref : "en"; + } + + @NotNull private String[] languageDisplayValues(List languageCodeList) { + String[] entries = new String[languageCodeList.size()]; + entries[0] = getString(R.string.device_default); + for (int i = 1; i < languageCodeList.size(); i++) { + Locale locale = new Locale(languageCodeList.get(i)); + entries[i] = locale.getDisplayLanguage() + " (" + locale.getDisplayLanguage(locale) + ") "; + } + return entries; + } + private void setAppVersionNumber() { EditTextPreference versionPref = (EditTextPreference) findPreference(PREF_VERSION); versionPref.setSummary(getVersionName() + " Build: " + getVersionCode()); diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/utils/LanguageUtils.kt b/core/src/main/java/org/kiwix/kiwixmobile/core/utils/LanguageUtils.kt index bea81d4ec..03f36d11d 100644 --- a/core/src/main/java/org/kiwix/kiwixmobile/core/utils/LanguageUtils.kt +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/utils/LanguageUtils.kt @@ -30,6 +30,7 @@ import android.view.InflateException import android.view.LayoutInflater import android.view.View import android.widget.TextView +import androidx.core.os.ConfigurationCompat import org.kiwix.kiwixmobile.core.extensions.locale import org.kiwix.kiwixmobile.core.utils.Constants.TAG_KIWIX import org.kiwix.kiwixmobile.core.utils.files.FileUtils @@ -65,7 +66,7 @@ class LanguageUtils(private val context: Context) { } private fun haveToChangeFont(sharedPreferenceUtil: SharedPreferenceUtil): Boolean { - if (sharedPreferenceUtil.getPrefLanguage("").isEmpty()) { + if (sharedPreferenceUtil.prefLanguage == Locale.ROOT.toString()) { return false } return Locale.getAvailableLocales().firstOrNull { locale -> @@ -183,16 +184,16 @@ class LanguageUtils(private val context: Context) { context: Context, sharedPreferenceUtil: SharedPreferenceUtil ) { - val language = sharedPreferenceUtil.getPrefLanguage("") - if (language.isEmpty()) { - return + sharedPreferenceUtil.prefLanguage.takeIf { it != Locale.ROOT.toString() }?.let { + handleLocaleChange(context, it) } - handleLocaleChange(context, language) } @JvmStatic fun handleLocaleChange(context: Context, language: String) { - val locale = Locale(language) + val locale = + if (language != Locale.ROOT.toString()) Locale(language) + else ConfigurationCompat.getLocales(context.applicationContext.resources.configuration)[0] Locale.setDefault(locale) val config = Configuration() if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/utils/SharedPreferenceUtil.java b/core/src/main/java/org/kiwix/kiwixmobile/core/utils/SharedPreferenceUtil.java index a53766282..b041e5d87 100644 --- a/core/src/main/java/org/kiwix/kiwixmobile/core/utils/SharedPreferenceUtil.java +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/utils/SharedPreferenceUtil.java @@ -28,6 +28,7 @@ import io.reactivex.Flowable; import io.reactivex.processors.PublishProcessor; import java.io.File; import java.util.HashSet; +import java.util.Locale; import java.util.Set; import javax.inject.Inject; import javax.inject.Singleton; @@ -104,8 +105,8 @@ public class SharedPreferenceUtil { return sharedPreferences.getFloat(PREF_ZOOM, 100.0f); } - public String getPrefLanguage(String defaultLanguage) { - return sharedPreferences.getString(PREF_LANG, defaultLanguage); + public String getPrefLanguage() { + return sharedPreferences.getString(PREF_LANG, Locale.ROOT.toString()); } public String getPrefStorage() { diff --git a/core/src/main/res/values/strings.xml b/core/src/main/res/values/strings.xml index da4cc7881..08d6f0e79 100644 --- a/core/src/main/res/values/strings.xml +++ b/core/src/main/res/values/strings.xml @@ -295,6 +295,7 @@ No Results No Bookmarks No History + Device Default On Off