summaryrefslogtreecommitdiff
path: root/core/java/android
diff options
context:
space:
mode:
authorRoozbeh Pournader <roozbeh@google.com>2016-01-06 01:27:42 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2016-01-06 01:27:42 +0000
commit7eae10928a1ae522ad0317a3fff04d4e22b6c000 (patch)
treecdbd5d0e0174d8abc0aec77d6349d6f1176c08b7 /core/java/android
parentf0ce621ceb326e2ea989b781b68cb3671cf8cd65 (diff)
parentfb9236cb0c7bdad05ad01b722806edde7385b296 (diff)
Merge "For locale negotiation, assume English is always supported"
Diffstat (limited to 'core/java/android')
-rw-r--r--core/java/android/content/res/Resources.java4
-rw-r--r--core/java/android/util/LocaleList.java43
2 files changed, 35 insertions, 12 deletions
diff --git a/core/java/android/content/res/Resources.java b/core/java/android/content/res/Resources.java
index c460746ba514..b01633e641f3 100644
--- a/core/java/android/content/res/Resources.java
+++ b/core/java/android/content/res/Resources.java
@@ -1978,7 +1978,7 @@ public class Resources {
|| (configChanges & Configuration.NATIVE_CONFIG_LOCALE) != 0) {
if (locales.size() == 1) {
// This is an optimization to avoid the JNI call(s) when the result of
- // getFirstMatch() does not depend on the supported locales.
+ // getFirstMatchWithEnglishSupported() does not depend on the supported locales.
mResolvedLocale = locales.getPrimary();
} else {
String[] supportedLocales = mAssets.getNonSystemLocales();
@@ -1989,7 +1989,7 @@ public class Resources {
// their own.
supportedLocales = mAssets.getLocales();
}
- mResolvedLocale = locales.getFirstMatch(supportedLocales);
+ mResolvedLocale = locales.getFirstMatchWithEnglishSupported(supportedLocales);
}
}
mAssets.setConfiguration(mConfiguration.mcc, mConfiguration.mnc,
diff --git a/core/java/android/util/LocaleList.java b/core/java/android/util/LocaleList.java
index 3d8e330334cd..f22cde0c1ca7 100644
--- a/core/java/android/util/LocaleList.java
+++ b/core/java/android/util/LocaleList.java
@@ -246,14 +246,9 @@ public final class LocaleList implements Parcelable {
return supportedScr.equals(desiredScr) ? 1 : 0;
}
- /**
- * Returns the first match in the locale list given an unordered array of supported locales
- * in BCP47 format.
- *
- * If the locale list is empty, null would be returned.
- */
- @Nullable
- public Locale getFirstMatch(String[] supportedLocales) {
+ private static final Locale EN_LATN = Locale.forLanguageTag("en-Latn");
+
+ private Locale computeFirstMatch(String[] supportedLocales, boolean assumeEnglishIsSupported) {
if (mList.length == 1) { // just one locale, perhaps the most common scenario
return mList[0];
}
@@ -261,8 +256,16 @@ public final class LocaleList implements Parcelable {
return null;
}
int bestIndex = Integer.MAX_VALUE;
- for (String tag : supportedLocales) {
- final Locale supportedLocale = Locale.forLanguageTag(tag);
+ final int numSupportedLocales =
+ supportedLocales.length + (assumeEnglishIsSupported ? 1 : 0);
+ for (int i = 0; i < numSupportedLocales; i++) {
+ final Locale supportedLocale;
+ if (assumeEnglishIsSupported) {
+ // Try English first, so we can return early if it's in the LocaleList
+ supportedLocale = (i == 0) ? EN_LATN : Locale.forLanguageTag(supportedLocales[i-1]);
+ } else {
+ supportedLocale = Locale.forLanguageTag(supportedLocales[i]);
+ }
// We expect the average length of locale lists used for locale resolution to be
// smaller than three, so it's OK to do this as an O(mn) algorithm.
for (int idx = 0; idx < mList.length; idx++) {
@@ -284,6 +287,26 @@ public final class LocaleList implements Parcelable {
}
/**
+ * Returns the first match in the locale list given an unordered array of supported locales
+ * in BCP47 format.
+ *
+ * If the locale list is empty, null would be returned.
+ */
+ @Nullable
+ public Locale getFirstMatch(String[] supportedLocales) {
+ return computeFirstMatch(supportedLocales, false /* assume English is not supported */);
+ }
+
+ /**
+ * Same as getFirstMatch(), but with English assumed to be supported, even if it's not.
+ * {@hide}
+ */
+ @Nullable
+ public Locale getFirstMatchWithEnglishSupported(String[] supportedLocales) {
+ return computeFirstMatch(supportedLocales, true /* assume English is supported */);
+ }
+
+ /**
* Returns true if the array of locale tags only contains empty locales and pseudolocales.
* Assumes that there is no repetition in the input.
* {@hide}