diff options
| author | Roozbeh Pournader <roozbeh@google.com> | 2016-01-06 01:27:42 +0000 |
|---|---|---|
| committer | Android (Google) Code Review <android-gerrit@google.com> | 2016-01-06 01:27:42 +0000 |
| commit | 7eae10928a1ae522ad0317a3fff04d4e22b6c000 (patch) | |
| tree | cdbd5d0e0174d8abc0aec77d6349d6f1176c08b7 /core/java/android | |
| parent | f0ce621ceb326e2ea989b781b68cb3671cf8cd65 (diff) | |
| parent | fb9236cb0c7bdad05ad01b722806edde7385b296 (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.java | 4 | ||||
| -rw-r--r-- | core/java/android/util/LocaleList.java | 43 |
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} |
