From 2c8ae2d8357a3e62a9095112dbdc0beb2f70b13e Mon Sep 17 00:00:00 2001 From: Darryl L Johnson Date: Wed, 11 Mar 2020 15:25:28 -0700 Subject: [PATCH] Ensure process config override tracks the correct activity. WPC would change the activity used to override the process config or remove the override altogether if an activity that isn't the current activity is destroyed and removed from WPC. Test: ActivityRecordTests Fixes: 151186991 Change-Id: Ic5b12c796abcc16b0c205d83ab38c4e114f9ff81 --- .../server/wm/WindowProcessController.java | 4 +-- .../server/wm/ActivityRecordTests.java | 34 +++++++++++++++++++ 2 files changed, 36 insertions(+), 2 deletions(-) diff --git a/services/core/java/com/android/server/wm/WindowProcessController.java b/services/core/java/com/android/server/wm/WindowProcessController.java index 32eb932ea0ed4..f356329cbefb3 100644 --- a/services/core/java/com/android/server/wm/WindowProcessController.java +++ b/services/core/java/com/android/server/wm/WindowProcessController.java @@ -1058,7 +1058,7 @@ public class WindowProcessController extends ConfigurationContainer= 0; i--) { final ActivityRecord activityRecord = mActivities.get(i); - if (!activityRecord.finishing && !activityRecord.containsListener(this)) { + if (!activityRecord.finishing) { // Eligible activity is found, update listener. registerActivityConfigurationListener(activityRecord); return; diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java b/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java index c9c3649783b8a..9e874211fcb39 100644 --- a/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java @@ -1332,6 +1332,40 @@ public class ActivityRecordTests extends ActivityTestsBase { assertNotEquals(initialConf, wpc.getRequestedOverrideConfiguration()); } + @Test + public void testActivityDestroyDoesntChangeProcessOverride() { + final ActivityRecord firstActivity = + createActivityOnDisplay(true /* defaultDisplay */, null /* process */); + final WindowProcessController wpc = firstActivity.app; + assertTrue(wpc.registeredForActivityConfigChanges()); + assertEquals(0, firstActivity.getMergedOverrideConfiguration() + .diff(wpc.getRequestedOverrideConfiguration())); + + final ActivityRecord secondActivity = + createActivityOnDisplay(false /* defaultDisplay */, wpc); + assertTrue(wpc.registeredForActivityConfigChanges()); + assertEquals(0, secondActivity.getMergedOverrideConfiguration() + .diff(wpc.getRequestedOverrideConfiguration())); + + final ActivityRecord thirdActivity = + createActivityOnDisplay(false /* defaultDisplay */, wpc); + assertTrue(wpc.registeredForActivityConfigChanges()); + assertEquals(0, thirdActivity.getMergedOverrideConfiguration() + .diff(wpc.getRequestedOverrideConfiguration())); + + secondActivity.destroyImmediately(true, ""); + + assertTrue(wpc.registeredForActivityConfigChanges()); + assertEquals(0, thirdActivity.getMergedOverrideConfiguration() + .diff(wpc.getRequestedOverrideConfiguration())); + + firstActivity.destroyImmediately(true, ""); + + assertTrue(wpc.registeredForActivityConfigChanges()); + assertEquals(0, thirdActivity.getMergedOverrideConfiguration() + .diff(wpc.getRequestedOverrideConfiguration())); + } + /** * Creates an activity on display. For non-default display request it will also create a new * display with custom DisplayInfo.