OSDN Git Service

Support LocaleLists in ActivityManagerService.
authorRoozbeh Pournader <roozbeh@google.com>
Thu, 19 Nov 2015 01:41:24 +0000 (17:41 -0800)
committerRoozbeh Pournader <roozbeh@google.com>
Thu, 19 Nov 2015 22:30:05 +0000 (14:30 -0800)
Also add a placeholder method for locale negotiation to LocaleList,
to be filled later.

There is no change in behavior expected by this CL yet. But once we
support setting the first locale to something the system doesn't
support, and implement the locale negotiation, this will cause the
system locale to be set to the first supported locale, instead of
just the default from Settings.

Change-Id: Iec983a5707daffb5bf54eac79ff0856a96631960

api/current.txt
api/system-current.txt
core/java/android/util/LocaleList.java
services/core/java/com/android/server/am/ActivityManagerService.java

index 1a7139c..807a38e 100644 (file)
@@ -34407,6 +34407,7 @@ package android.util {
     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();
index f278441..004e340 100644 (file)
@@ -36728,6 +36728,7 @@ package android.util {
     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();
index 0d5c135..c1d23bb 100644 (file)
@@ -49,6 +49,7 @@ public final class LocaleList {
         return location < mList.length ? mList[location] : null;
     }
 
+    @Nullable
     public Locale getPrimary() {
         return mList.length == 0 ? null : get(0);
     }
@@ -179,6 +180,12 @@ public final class LocaleList {
         }
     }
 
+    @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")
index 6e6bfb7..935578e 100644 (file)
@@ -226,6 +226,7 @@ import android.text.format.DateUtils;
 import android.text.format.Time;
 import android.util.AtomicFile;
 import android.util.EventLog;
+import android.util.LocaleList;
 import android.util.Log;
 import android.util.Pair;
 import android.util.PrintWriterPrinter;
@@ -2385,7 +2386,7 @@ public final class ActivityManagerService extends ActivityManagerNative
         mTrackingAssociations = "1".equals(SystemProperties.get("debug.track-associations"));
 
         mConfiguration.setToDefaults();
-        mConfiguration.setLocale(Locale.getDefault());
+        mConfiguration.setLocales(LocaleList.getDefault());
 
         mConfigurationSeq = mConfiguration.seq = 1;
         mProcessCpuTracker.init();
@@ -17641,6 +17642,9 @@ public final class ActivityManagerService extends ActivityManagerNative
                 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
@@ -17664,11 +17668,14 @@ public final class ActivityManagerService extends ActivityManagerNative
 
                 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++;