diff options
| author | 2022-02-07 15:47:33 +0000 | |
|---|---|---|
| committer | 2022-02-07 15:47:33 +0000 | |
| commit | d478d792e05919c1e046ee40cb3c2391ff83ad88 (patch) | |
| tree | 83c3929d9060a885fc57b9142c526cd1e41dcf0c | |
| parent | e6094a9e9aa4897b5bac7ab9db053e148044ea3c (diff) | |
| parent | 0b74d6bce3ab52e35f19ae6dd5cf50df4770c11d (diff) | |
Merge "Fix per-app locale updates for apps with shared processes."
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()); } |