diff options
| author | 2016-01-20 12:16:50 -0800 | |
|---|---|---|
| committer | 2016-01-20 20:18:57 +0000 | |
| commit | 1f0945e9f6fc81f5c58da24a29c86e1efa2714ef (patch) | |
| tree | 01e6aa85223a5642491f88a2960d887ff7bb72c5 | |
| parent | 770e437d30a5059cad3238d864ef016a04b23b33 (diff) | |
Update mResolvedLocale more aggressively
A client that mutates the locale of the Configuration being updated
can cause failure of the test that mResolvedLocale needs to be
recomputed. This patch stashes the previous locale list privately
so that updates can be detected even in this case.
Bug: 25993843
Change-Id: I1ea17dffd722177fb5b65ee77b9f5ce9a943f15b
| -rw-r--r-- | core/java/android/content/res/Resources.java | 11 |
1 files changed, 7 insertions, 4 deletions
diff --git a/core/java/android/content/res/Resources.java b/core/java/android/content/res/Resources.java index 7b56eebf34ac..ed64eade0351 100644 --- a/core/java/android/content/res/Resources.java +++ b/core/java/android/content/res/Resources.java @@ -161,7 +161,11 @@ public class Resources { final DisplayMetrics mMetrics = new DisplayMetrics(); private final Configuration mConfiguration = new Configuration(); + + // Invariant: mResolvedLocale is the resolved locale of mLocalesForResolved + private LocaleList mLocalesForResolved = null; private Locale mResolvedLocale = null; + private PluralRules mPluralRule; private CompatibilityInfo mCompatibilityInfo = CompatibilityInfo.DEFAULT_COMPATIBILITY_INFO; @@ -1950,8 +1954,7 @@ public class Resources { final int configChanges = calcConfigChanges(config); LocaleList locales = mConfiguration.getLocales(); - final boolean setLocalesToDefault = locales.isEmpty(); - if (setLocalesToDefault) { + if (locales.isEmpty()) { locales = LocaleList.getDefault(); mConfiguration.setLocales(locales); } @@ -1980,8 +1983,7 @@ public class Resources { keyboardHidden = mConfiguration.keyboardHidden; } - if (setLocalesToDefault || mResolvedLocale == null - || (configChanges & Configuration.NATIVE_CONFIG_LOCALE) != 0) { + if (locales != mLocalesForResolved) { if (locales.size() == 1) { // This is an optimization to avoid the JNI call(s) when the result of // getFirstMatchWithEnglishSupported() does not depend on the supported locales. @@ -1997,6 +1999,7 @@ public class Resources { } mResolvedLocale = locales.getFirstMatchWithEnglishSupported(supportedLocales); } + mLocalesForResolved = locales; } mAssets.setConfiguration(mConfiguration.mcc, mConfiguration.mnc, adjustLanguageTag(mResolvedLocale.toLanguageTag()), |