#1738 Android OS language changes are ignored - add device default case to respect device settings

This commit is contained in:
Sean Mac Gillicuddy 2020-01-30 15:10:53 +00:00
parent d0f14172e6
commit 578f73a5d1
6 changed files with 36 additions and 24 deletions

View File

@ -28,7 +28,7 @@
<activity android:name=".intro.IntroActivity" /> <activity android:name=".intro.IntroActivity" />
<activity <activity
android:name=".main.KiwixMainActivity" android:name=".main.KiwixMainActivity"
android:configChanges="orientation|keyboardHidden|screenSize|locale" android:configChanges="orientation|keyboardHidden|screenSize"
android:label="@string/app_name" android:label="@string/app_name"
android:launchMode="singleTop" android:launchMode="singleTop"
android:windowSoftInputMode="adjustPan"> android:windowSoftInputMode="adjustPan">

View File

@ -1404,8 +1404,7 @@ public abstract class CoreMainActivity extends BaseActivity
break; break;
case REQUEST_PREFERENCES: case REQUEST_PREFERENCES:
if (resultCode == RESULT_RESTART) { if (resultCode == RESULT_RESTART) {
startActivity(Intents.internal(CoreMainActivity.class)); recreate();
finish();
} }
if (resultCode == RESULT_HISTORY_CLEARED) { if (resultCode == RESULT_HISTORY_CLEARED) {
webViewList.clear(); webViewList.clear();

View File

@ -44,6 +44,7 @@ import java.util.Locale;
import javax.inject.Inject; import javax.inject.Inject;
import kotlin.Unit; import kotlin.Unit;
import kotlin.io.FilesKt; import kotlin.io.FilesKt;
import org.jetbrains.annotations.NotNull;
import org.kiwix.kiwixmobile.core.CoreApp; import org.kiwix.kiwixmobile.core.CoreApp;
import org.kiwix.kiwixmobile.core.NightModeConfig; import org.kiwix.kiwixmobile.core.NightModeConfig;
import org.kiwix.kiwixmobile.core.R; import org.kiwix.kiwixmobile.core.R;
@ -119,25 +120,20 @@ public abstract class CorePrefsFragment extends PreferenceFragment implements
protected void setUpLanguageChooser(String preferenceId) { protected void setUpLanguageChooser(String preferenceId) {
ListPreference languagePref = (ListPreference) findPreference(preferenceId); ListPreference languagePref = (ListPreference) findPreference(preferenceId);
String selectedLang = sharedPreferenceUtil.getPrefLanguage(Locale.getDefault().toString());
List<String> languageCodeList = new LanguageUtils(getActivity()).getKeys(); List<String> languageCodeList = new LanguageUtils(getActivity()).getKeys();
selectedLang = languageCodeList.contains(selectedLang) ? selectedLang : "en"; languageCodeList.add(0, Locale.ROOT.getLanguage());
String code[] = languageCodeList.toArray(new String[0]); final String selectedLang =
String[] entries = new String[code.length]; selectedLanguage(languageCodeList, sharedPreferenceUtil.getPrefLanguage());
for (int index = 0; index < code.length; index++) { languagePref.setEntries(languageDisplayValues(languageCodeList));
Locale locale = new Locale(code[index]); languagePref.setEntryValues(languageCodeList.toArray(new String[0]));
entries[index] =
locale.getDisplayLanguage() + " (" + locale.getDisplayLanguage(locale) + ") ";
}
languagePref.setEntries(entries);
languagePref.setEntryValues(code);
languagePref.setDefaultValue(selectedLang); languagePref.setDefaultValue(selectedLang);
languagePref.setValue(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) -> { languagePref.setOnPreferenceChangeListener((preference, newValue) -> {
String languageCode = (String) newValue; String languageCode = (String) newValue;
LanguageUtils.handleLocaleChange(getActivity(), languageCode); LanguageUtils.handleLocaleChange(getActivity(), languageCode);
preference.setTitle(new Locale(languageCode).getLanguage());
sharedPreferenceUtil.putPrefLanguage(languageCode); sharedPreferenceUtil.putPrefLanguage(languageCode);
restartActivity(); restartActivity();
return true; return true;
@ -150,6 +146,20 @@ public abstract class CorePrefsFragment extends PreferenceFragment implements
getActivity().startActivity(new Intent(getActivity(), getActivity().getClass())); getActivity().startActivity(new Intent(getActivity(), getActivity().getClass()));
} }
@NotNull private String selectedLanguage(List<String> languageCodeList, String langPref) {
return languageCodeList.contains(langPref) ? langPref : "en";
}
@NotNull private String[] languageDisplayValues(List<String> 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() { private void setAppVersionNumber() {
EditTextPreference versionPref = (EditTextPreference) findPreference(PREF_VERSION); EditTextPreference versionPref = (EditTextPreference) findPreference(PREF_VERSION);
versionPref.setSummary(getVersionName() + " Build: " + getVersionCode()); versionPref.setSummary(getVersionName() + " Build: " + getVersionCode());

View File

@ -30,6 +30,7 @@ import android.view.InflateException
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.widget.TextView import android.widget.TextView
import androidx.core.os.ConfigurationCompat
import org.kiwix.kiwixmobile.core.extensions.locale import org.kiwix.kiwixmobile.core.extensions.locale
import org.kiwix.kiwixmobile.core.utils.Constants.TAG_KIWIX import org.kiwix.kiwixmobile.core.utils.Constants.TAG_KIWIX
import org.kiwix.kiwixmobile.core.utils.files.FileUtils import org.kiwix.kiwixmobile.core.utils.files.FileUtils
@ -65,7 +66,7 @@ class LanguageUtils(private val context: Context) {
} }
private fun haveToChangeFont(sharedPreferenceUtil: SharedPreferenceUtil): Boolean { private fun haveToChangeFont(sharedPreferenceUtil: SharedPreferenceUtil): Boolean {
if (sharedPreferenceUtil.getPrefLanguage("").isEmpty()) { if (sharedPreferenceUtil.prefLanguage == Locale.ROOT.toString()) {
return false return false
} }
return Locale.getAvailableLocales().firstOrNull { locale -> return Locale.getAvailableLocales().firstOrNull { locale ->
@ -183,16 +184,16 @@ class LanguageUtils(private val context: Context) {
context: Context, context: Context,
sharedPreferenceUtil: SharedPreferenceUtil sharedPreferenceUtil: SharedPreferenceUtil
) { ) {
val language = sharedPreferenceUtil.getPrefLanguage("") sharedPreferenceUtil.prefLanguage.takeIf { it != Locale.ROOT.toString() }?.let {
if (language.isEmpty()) { handleLocaleChange(context, it)
return
} }
handleLocaleChange(context, language)
} }
@JvmStatic @JvmStatic
fun handleLocaleChange(context: Context, language: String) { 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) Locale.setDefault(locale)
val config = Configuration() val config = Configuration()
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {

View File

@ -28,6 +28,7 @@ import io.reactivex.Flowable;
import io.reactivex.processors.PublishProcessor; import io.reactivex.processors.PublishProcessor;
import java.io.File; import java.io.File;
import java.util.HashSet; import java.util.HashSet;
import java.util.Locale;
import java.util.Set; import java.util.Set;
import javax.inject.Inject; import javax.inject.Inject;
import javax.inject.Singleton; import javax.inject.Singleton;
@ -104,8 +105,8 @@ public class SharedPreferenceUtil {
return sharedPreferences.getFloat(PREF_ZOOM, 100.0f); return sharedPreferences.getFloat(PREF_ZOOM, 100.0f);
} }
public String getPrefLanguage(String defaultLanguage) { public String getPrefLanguage() {
return sharedPreferences.getString(PREF_LANG, defaultLanguage); return sharedPreferences.getString(PREF_LANG, Locale.ROOT.toString());
} }
public String getPrefStorage() { public String getPrefStorage() {

View File

@ -295,6 +295,7 @@
<string name="no_results">No Results</string> <string name="no_results">No Results</string>
<string name="no_bookmarks">No Bookmarks</string> <string name="no_bookmarks">No Bookmarks</string>
<string name="no_history">No History</string> <string name="no_history">No History</string>
<string name="device_default">Device Default</string>
<string-array name="pref_night_modes_entries"> <string-array name="pref_night_modes_entries">
<item>On</item> <item>On</item>
<item>Off</item> <item>Off</item>