From 0b74d6bce3ab52e35f19ae6dd5cf50df4770c11d Mon Sep 17 00:00:00 2001 From: Pratyush More Date: Tue, 1 Feb 2022 17:54:35 +0000 Subject: [PATCH] Fix per-app locale updates for apps with shared processes. Test: atest WmTests:ActivityTaskManagerServiceTests Test: atest WmTests:WindowProcessControllerTests Bug: 216615115 Change-Id: I7f93b8f20bf0d44dac0615efc05a0509c17e84da --- .../wm/PackageConfigurationUpdaterImpl.java | 16 ++++++++++------ .../server/wm/WindowProcessController.java | 9 +++++++-- .../server/wm/WindowProcessControllerTests.java | 15 +++++++++++++-- 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 0cd36808f8de2..f3be66c5e6da3 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 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 3ccb06ccef15d..ac9fbdedf43ea 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= 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 c56b6141a6521..746f2b50ac3a5 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,11 +375,21 @@ 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());