Merge "Support LocaleLists in ActivityManagerService."
diff --git a/api/current.txt b/api/current.txt
index a5b7fa8..fd2e038 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -34445,6 +34445,7 @@
ctor public LocaleList(java.util.Locale[]);
method public static android.util.LocaleList forLanguageTags(java.lang.String);
method public java.util.Locale get(int);
+ method public java.util.Locale getBestMatch(java.lang.String[]);
method public static android.util.LocaleList getDefault();
method public static android.util.LocaleList getEmptyLocaleList();
method public java.util.Locale getPrimary();
diff --git a/api/system-current.txt b/api/system-current.txt
index ac13222..0d5cde4 100644
--- a/api/system-current.txt
+++ b/api/system-current.txt
@@ -36768,6 +36768,7 @@
ctor public LocaleList(java.util.Locale[]);
method public static android.util.LocaleList forLanguageTags(java.lang.String);
method public java.util.Locale get(int);
+ method public java.util.Locale getBestMatch(java.lang.String[]);
method public static android.util.LocaleList getDefault();
method public static android.util.LocaleList getEmptyLocaleList();
method public java.util.Locale getPrimary();
diff --git a/core/java/android/util/LocaleList.java b/core/java/android/util/LocaleList.java
index 0d5c135..c1d23bb 100644
--- a/core/java/android/util/LocaleList.java
+++ b/core/java/android/util/LocaleList.java
@@ -49,6 +49,7 @@
return location < mList.length ? mList[location] : null;
}
+ @Nullable
public Locale getPrimary() {
return mList.length == 0 ? null : get(0);
}
@@ -179,6 +180,12 @@
}
}
+ @Nullable
+ public Locale getBestMatch(String[] locales) {
+ // TODO: Fix this to actually do locale negotiation and choose the best match
+ return getPrimary();
+ }
+
private final static Object sLock = new Object();
@GuardedBy("sLock")
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index 3a0d80b..0a67f2b 100644
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -192,6 +192,7 @@
import android.util.AtomicFile;
import android.util.DebugUtils;
import android.util.EventLog;
+import android.util.LocaleList;
import android.util.Log;
import android.util.Pair;
import android.util.PrintWriterPrinter;
@@ -2445,7 +2446,7 @@
mTrackingAssociations = "1".equals(SystemProperties.get("debug.track-associations"));
mConfiguration.setToDefaults();
- mConfiguration.setLocale(Locale.getDefault());
+ mConfiguration.setLocales(LocaleList.getDefault());
mConfigurationSeq = mConfiguration.seq = 1;
mProcessCpuTracker.init();
@@ -17709,6 +17710,9 @@
UserHandle.USER_NULL);
}
+ // To cache the list of supported system locales
+ private String[] mSupportedSystemLocales = null;
+
/**
* Do either or both things: (1) change the current configuration, and (2)
* make sure the given activity is running with the (now) current
@@ -17732,11 +17736,14 @@
EventLog.writeEvent(EventLogTags.CONFIGURATION_CHANGED, changes);
- if (!initLocale && values.locale != null && values.userSetLocale) {
- final String languageTag = values.locale.toLanguageTag();
- SystemProperties.set("persist.sys.locale", languageTag);
+ if (!initLocale && !values.getLocales().isEmpty() && values.userSetLocale) {
+ if (mSupportedSystemLocales == null) {
+ mSupportedSystemLocales = Resources.getSystem().getAssets().getLocales();
+ }
+ final Locale locale = values.getLocales().getBestMatch(mSupportedSystemLocales);
+ SystemProperties.set("persist.sys.locale", locale.toLanguageTag());
mHandler.sendMessage(mHandler.obtainMessage(SEND_LOCALE_TO_MOUNT_DAEMON_MSG,
- values.locale));
+ locale));
}
mConfigurationSeq++;