summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Calvin <calvinpan@google.com> 2025-03-18 23:37:33 +0800
committer Calvin Pan <calvinpan@google.com> 2025-03-19 01:56:27 -0700
commit71b36a040ca016908cb114badc11397c81f8a660 (patch)
tree86a162dd95a5a7dcbbfcefd1cc7ae62de973acc2
parentd244a4f570db6764a4e2a3cafd07b06172ba3ef8 (diff)
Fix missing to check the existing locale in system language restoration
- Apply new system language logic to deduplicate language codes in the existing locale - Fix false positive test cases Bug: 404447248 Test: test on device and pass the test cases Flag: EXEMPT bugfix Change-Id: I677ccc832f9a512a8517ce0964770143d41a0b16
-rw-r--r--packages/SettingsProvider/src/com/android/providers/settings/SettingsHelper.java39
-rw-r--r--packages/SettingsProvider/test/src/com/android/providers/settings/SettingsHelperTest.java15
2 files changed, 34 insertions, 20 deletions
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsHelper.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsHelper.java
index 527a1f16a84f..5bbfdf7bab81 100644
--- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsHelper.java
+++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsHelper.java
@@ -672,6 +672,7 @@ public class SettingsHelper {
public static LocaleList resolveLocales(LocaleList restore, LocaleList current,
String[] supportedLocales) {
final HashMap<Locale, Locale> allLocales = new HashMap<>(supportedLocales.length);
+ final HashSet<String> existingLanguageAndScript = new HashSet<>();
for (String supportedLocaleStr : supportedLocales) {
final Locale locale = Locale.forLanguageTag(supportedLocaleStr);
allLocales.put(toFullLocale(locale), locale);
@@ -679,30 +680,26 @@ public class SettingsHelper {
// After restoring to reset locales, need to get extensions from restored locale. Get the
// first restored locale to check its extension.
- final Locale restoredLocale = restore.isEmpty()
+ final Locale firstRestoredLocale = restore.isEmpty()
? Locale.ROOT
: restore.get(0);
final ArrayList<Locale> filtered = new ArrayList<>(current.size());
for (int i = 0; i < current.size(); i++) {
- Locale locale = copyExtensionToTargetLocale(restoredLocale, current.get(i));
- allLocales.remove(toFullLocale(locale));
- filtered.add(locale);
+ Locale locale = copyExtensionToTargetLocale(firstRestoredLocale, current.get(i));
+
+ if (locale != null && existingLanguageAndScript.add(getLanguageAndScript(locale))) {
+ allLocales.remove(toFullLocale(locale));
+ filtered.add(locale);
+ }
}
- final HashSet<String> existingLanguageAndScript = new HashSet<>();
for (int i = 0; i < restore.size(); i++) {
- final Locale restoredLocaleWithExtension = copyExtensionToTargetLocale(restoredLocale,
- getFilteredLocale(restore.get(i), allLocales));
-
- if (restoredLocaleWithExtension != null) {
- String language = restoredLocaleWithExtension.getLanguage();
- String script = restoredLocaleWithExtension.getScript();
+ final Locale restoredLocaleWithExtension = copyExtensionToTargetLocale(
+ firstRestoredLocale, getFilteredLocale(restore.get(i), allLocales));
- String restoredLanguageAndScript =
- script == null ? language : language + "-" + script;
- if (existingLanguageAndScript.add(restoredLanguageAndScript)) {
- filtered.add(restoredLocaleWithExtension);
- }
+ if (restoredLocaleWithExtension != null && existingLanguageAndScript.add(
+ getLanguageAndScript(restoredLocaleWithExtension))) {
+ filtered.add(restoredLocaleWithExtension);
}
}
@@ -713,6 +710,16 @@ public class SettingsHelper {
return new LocaleList(filtered.toArray(new Locale[filtered.size()]));
}
+ private static String getLanguageAndScript(Locale locale) {
+ if (locale == null) {
+ return "";
+ }
+
+ String language = locale.getLanguage();
+ String script = locale.getScript();
+ return script == null ? language : String.join("-", language, script);
+ }
+
private static Locale copyExtensionToTargetLocale(Locale restoredLocale,
Locale targetLocale) {
if (!restoredLocale.hasExtensions()) {
diff --git a/packages/SettingsProvider/test/src/com/android/providers/settings/SettingsHelperTest.java b/packages/SettingsProvider/test/src/com/android/providers/settings/SettingsHelperTest.java
index 48c778542d66..2160d3164b17 100644
--- a/packages/SettingsProvider/test/src/com/android/providers/settings/SettingsHelperTest.java
+++ b/packages/SettingsProvider/test/src/com/android/providers/settings/SettingsHelperTest.java
@@ -388,11 +388,18 @@ public class SettingsHelperTest {
LocaleList.forLanguageTags("zh-Hant-TW"), // current
new String[] { "fa-Arab-AF-u-nu-latn", "zh-Hant-TW" })); // supported
- assertEquals(LocaleList.forLanguageTags("en-US,zh-Hans-TW"),
+ assertEquals(LocaleList.forLanguageTags("en-US,zh-Hans-TW,fr-FR"),
SettingsHelper.resolveLocales(
- LocaleList.forLanguageTags("en-UK,en-GB,zh-Hans-HK"), // restore
- LocaleList.forLanguageTags("en-US,zh-Hans-TW"), // current
- new String[] { "en-US,zh-Hans-TW,en-UK,en-GB,zh-Hans-HK" })); // supported
+ // restore
+ LocaleList.forLanguageTags("en-UK,en-GB,zh-Hans-HK,fr-FR"),
+
+ // current
+ LocaleList.forLanguageTags("en-US,zh-Hans-TW"),
+
+ // supported
+ new String[] {
+ "en-US" , "zh-Hans-TW" , "en-UK", "en-GB", "zh-Hans-HK", "fr-FR"
+ }));
}
@Test