summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Pratyush More <pratyushmore@google.com> 2022-02-07 15:47:33 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2022-02-07 15:47:33 +0000
commitd478d792e05919c1e046ee40cb3c2391ff83ad88 (patch)
tree83c3929d9060a885fc57b9142c526cd1e41dcf0c
parente6094a9e9aa4897b5bac7ab9db053e148044ea3c (diff)
parent0b74d6bce3ab52e35f19ae6dd5cf50df4770c11d (diff)
Merge "Fix per-app locale updates for apps with shared processes."
-rw-r--r--services/core/java/com/android/server/wm/PackageConfigurationUpdaterImpl.java16
-rw-r--r--services/core/java/com/android/server/wm/WindowProcessController.java9
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/WindowProcessControllerTests.java15
3 files changed, 30 insertions, 10 deletions
diff --git a/services/core/java/com/android/server/wm/PackageConfigurationUpdaterImpl.java b/services/core/java/com/android/server/wm/PackageConfigurationUpdaterImpl.java
index 0cd36808f8de..f3be66c5e6da 100644
--- a/services/core/java/com/android/server/wm/PackageConfigurationUpdaterImpl.java
+++ b/services/core/java/com/android/server/wm/PackageConfigurationUpdaterImpl.java
@@ -106,14 +106,18 @@ final class PackageConfigurationUpdaterImpl implements
private void updateConfig(int uid, String packageName) {
final ArraySet<WindowProcessController> processes = mAtm.mProcessMap.getProcesses(uid);
- if (processes == null) return;
+ if (processes == null || processes.isEmpty()) return;
+ LocaleList localesOverride = LocaleOverlayHelper.combineLocalesIfOverlayExists(
+ mLocales, mAtm.getGlobalConfiguration().getLocales());
for (int i = processes.size() - 1; i >= 0; i--) {
final WindowProcessController wpc = processes.valueAt(i);
- if (!wpc.mInfo.packageName.equals(packageName)) continue;
- LocaleList localesOverride = LocaleOverlayHelper.combineLocalesIfOverlayExists(
- mLocales, mAtm.getGlobalConfiguration().getLocales());
- wpc.applyAppSpecificConfig(mNightMode, localesOverride);
- wpc.updateAppSpecificSettingsForAllActivities(mNightMode, localesOverride);
+ if (wpc.mInfo.packageName.equals(packageName)) {
+ wpc.applyAppSpecificConfig(mNightMode, localesOverride);
+ }
+ // Always inform individual activities about the update, since activities from other
+ // packages may be sharing this process
+ wpc.updateAppSpecificSettingsForAllActivitiesInPackage(packageName, mNightMode,
+ localesOverride);
}
}
diff --git a/services/core/java/com/android/server/wm/WindowProcessController.java b/services/core/java/com/android/server/wm/WindowProcessController.java
index 3ccb06ccef15..ac9fbdedf43e 100644
--- a/services/core/java/com/android/server/wm/WindowProcessController.java
+++ b/services/core/java/com/android/server/wm/WindowProcessController.java
@@ -821,10 +821,15 @@ public class WindowProcessController extends ConfigurationContainer<Configuratio
// TODO(b/199277065): Re-assess how app-specific locales are applied based on UXR
// TODO(b/199277729): Consider whether we need to add special casing for edge cases like
// activity-embeddings etc.
- void updateAppSpecificSettingsForAllActivities(Integer nightMode, LocaleList localesOverride) {
+ void updateAppSpecificSettingsForAllActivitiesInPackage(String packageName, Integer nightMode,
+ LocaleList localesOverride) {
for (int i = mActivities.size() - 1; i >= 0; --i) {
final ActivityRecord r = mActivities.get(i);
- if (r.applyAppSpecificConfig(nightMode, localesOverride) && r.mVisibleRequested) {
+ // Activities from other packages could be sharing this process. Only propagate updates
+ // to those activities that are part of the package whose app-specific settings changed
+ if (packageName.equals(r.packageName)
+ && r.applyAppSpecificConfig(nightMode, localesOverride)
+ && r.mVisibleRequested) {
r.ensureActivityConfiguration(0 /* globalChanges */, true /* preserveWindow */);
}
}
diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowProcessControllerTests.java b/services/tests/wmtests/src/com/android/server/wm/WindowProcessControllerTests.java
index c56b6141a652..746f2b50ac3a 100644
--- a/services/tests/wmtests/src/com/android/server/wm/WindowProcessControllerTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/WindowProcessControllerTests.java
@@ -21,6 +21,7 @@ import static android.app.WindowConfiguration.ACTIVITY_TYPE_UNDEFINED;
import static android.content.res.Configuration.ORIENTATION_LANDSCAPE;
import static android.content.res.Configuration.ORIENTATION_PORTRAIT;
+import static com.android.dx.mockito.inline.extended.ExtendedMockito.never;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.verify;
import static com.android.server.wm.ActivityRecord.State.PAUSED;
@@ -374,12 +375,22 @@ public class WindowProcessControllerTests extends WindowTestsBase {
final ActivityRecord activity = createActivityRecord(mWpc);
activity.mVisibleRequested = true;
doReturn(true).when(activity).applyAppSpecificConfig(anyInt(), any());
- mWpc.updateAppSpecificSettingsForAllActivities(Configuration.UI_MODE_NIGHT_YES,
- LocaleList.forLanguageTags("en-XA"));
+ mWpc.updateAppSpecificSettingsForAllActivitiesInPackage(DEFAULT_COMPONENT_PACKAGE_NAME,
+ Configuration.UI_MODE_NIGHT_YES, LocaleList.forLanguageTags("en-XA"));
verify(activity).ensureActivityConfiguration(anyInt(), anyBoolean());
}
@Test
+ public void testTopActivityUiModeChangeForDifferentPackage_noScheduledConfigChange() {
+ final ActivityRecord activity = createActivityRecord(mWpc);
+ activity.mVisibleRequested = true;
+ mWpc.updateAppSpecificSettingsForAllActivitiesInPackage("com.different.package",
+ Configuration.UI_MODE_NIGHT_YES, LocaleList.forLanguageTags("en-XA"));
+ verify(activity, never()).applyAppSpecificConfig(anyInt(), any());
+ verify(activity, never()).ensureActivityConfiguration(anyInt(), anyBoolean());
+ }
+
+ @Test
public void testTopActivityDisplayAreaMatchesTopMostActivity_noActivities() {
assertNull(mWpc.getTopActivityDisplayArea());
}