From 56909420256bff6f70559834520de19d8a94dec4 Mon Sep 17 00:00:00 2001 From: Mincheng Date: Tue, 15 Oct 2024 16:57:13 +1100 Subject: [PATCH] Fix: Handle system-level language management for Android 13+ (API 33) - Added a check in `prepareAppLanguages()` to skip manual UI language selection for Android 13+ where the system manages app language. - Updated logic to ensure that the language selection dialog is shown only for devices running Android versions below API 33. - Retained existing logic for description and secondary language preferences. --- .../commons/settings/SettingsFragment.java | 35 ++++++++++++++++++- app/src/main/res/values/strings.xml | 1 + app/src/main/res/xml/preferences.xml | 4 ++- 3 files changed, 38 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/fr/free/nrw/commons/settings/SettingsFragment.java b/app/src/main/java/fr/free/nrw/commons/settings/SettingsFragment.java index fee322644..0a024f740 100644 --- a/app/src/main/java/fr/free/nrw/commons/settings/SettingsFragment.java +++ b/app/src/main/java/fr/free/nrw/commons/settings/SettingsFragment.java @@ -136,7 +136,33 @@ public class SettingsFragment extends PreferenceFragmentCompat { // Gets current language code from shared preferences String languageCode; - + if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.TIRAMISU) { + // **Added:** Disable the app's UI language preference for Android 13 and above + appUiLanguageListPreference.setEnabled(false); + appUiLanguageListPreference.setSummary(getString(R.string.use_system_language)); + } else { + // **Existing code remains for older Android versions** + keyLanguageListPreference = appUiLanguageListPreference.getKey(); + languageCode = getCurrentLanguageCode(keyLanguageListPreference); + assert languageCode != null; + if (languageCode.equals("")) { + // If current language code is empty, means none selected by user yet so use phone local + appUiLanguageListPreference.setSummary(Locale.getDefault().getDisplayLanguage()); + } else { + // If any language is selected by user previously, use it + Locale defLocale = createLocale(languageCode); + appUiLanguageListPreference.setSummary(defLocale.getDisplayLanguage(defLocale)); + } + appUiLanguageListPreference.setOnPreferenceClickListener(new OnPreferenceClickListener() { + @Override + public boolean onPreferenceClick(Preference preference) { + // **No change:** Existing method call + prepareAppLanguages(appUiLanguageListPreference.getKey()); + return true; + } + }); + } +/* appUiLanguageListPreference = findPreference("appUiDefaultLanguagePref"); assert appUiLanguageListPreference != null; keyLanguageListPreference = appUiLanguageListPreference.getKey(); @@ -159,6 +185,9 @@ public class SettingsFragment extends PreferenceFragmentCompat { } }); + */ + + // Continue with other preferences descriptionLanguageListPreference = findPreference("descriptionDefaultLanguagePref"); assert descriptionLanguageListPreference != null; keyLanguageListPreference = descriptionLanguageListPreference.getKey(); @@ -311,6 +340,10 @@ public class SettingsFragment extends PreferenceFragmentCompat { HashMap selectedLanguages = new HashMap<>(); if (keyListPreference.equals("appUiDefaultLanguagePref")) { + if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.TIRAMISU) { + // For Android 13+, the system manages language, so we skip manual selection + return; + } assert languageCode != null; if (languageCode.equals("")) { diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 9cf667e46..54ed52652 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -22,6 +22,7 @@ Search View Place State Pic of the Day + Using system language diff --git a/app/src/main/res/xml/preferences.xml b/app/src/main/res/xml/preferences.xml index aeca0d45c..868d26d81 100644 --- a/app/src/main/res/xml/preferences.xml +++ b/app/src/main/res/xml/preferences.xml @@ -12,7 +12,9 @@ android:entries="@array/pref_theme_entries" android:entryValues="@array/pref_theme_entries_values" app:useSimpleSummaryProvider="true" - android:defaultValue="0" /> + android:dependency="is_below_android_13" + android:defaultValue="0" /> +