From 03f0f57e6b8c96b6bde4194feadf645ee8efb9ce Mon Sep 17 00:00:00 2001 From: Riddle Hsu Date: Thu, 20 Oct 2022 22:03:49 +0800 Subject: [PATCH] Only set locale in config for updating locale To update locale, it doesn't need a full configuration because system only applied the diff of config from non-undefined fields. IActivityManager#getConfiguration actually gets the configuration according to the pid, which is process configuration. And process configuration can be overridden by the activity running in its process. So the returned value shouldn't be used to update the system persistent configuration. Therefore it is enough to use a new Configuration instance with setting the necessary fields. This is also more efficient that saves a binder call to system. Bug: 253386061 Test: atest LocaleManagerTests Change-Id: Icdce437fcf1a3bef0562cfc4dd5ad3ba52ea08ef --- core/java/android/app/LocaleManager.java | 2 +- core/java/com/android/internal/app/LocalePicker.java | 3 +-- .../src/com/android/providers/settings/SettingsHelper.java | 2 +- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/core/java/android/app/LocaleManager.java b/core/java/android/app/LocaleManager.java index 794c6946f7a86..c5dedb33f9545 100644 --- a/core/java/android/app/LocaleManager.java +++ b/core/java/android/app/LocaleManager.java @@ -173,7 +173,7 @@ public class LocaleManager { @TestApi public void setSystemLocales(@NonNull LocaleList locales) { try { - Configuration conf = ActivityManager.getService().getConfiguration(); + Configuration conf = new Configuration(); conf.setLocales(locales); ActivityManager.getService().updatePersistentConfiguration(conf); } catch (RemoteException e) { diff --git a/core/java/com/android/internal/app/LocalePicker.java b/core/java/com/android/internal/app/LocalePicker.java index 3c53d07b61808..7dd1d2607149f 100644 --- a/core/java/com/android/internal/app/LocalePicker.java +++ b/core/java/com/android/internal/app/LocalePicker.java @@ -311,8 +311,7 @@ public class LocalePicker extends ListFragment { try { final IActivityManager am = ActivityManager.getService(); - final Configuration config = am.getConfiguration(); - + final Configuration config = new Configuration(); config.setLocales(locales); config.userSetLocale = true; diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsHelper.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsHelper.java index 808ea9ede9dce..6d375ac215a4a 100644 --- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsHelper.java +++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsHelper.java @@ -549,7 +549,7 @@ public class SettingsHelper { try { IActivityManager am = ActivityManager.getService(); - Configuration config = am.getConfiguration(); + final Configuration config = new Configuration(); config.setLocales(merged); // indicate this isn't some passing default - the user wants this remembered config.userSetLocale = true;