diff options
| author | 2020-07-13 12:04:10 +0800 | |
|---|---|---|
| committer | 2020-07-14 11:58:11 +0800 | |
| commit | 329c60d4af13d19799bca4a3029fea1279c93f88 (patch) | |
| tree | cc1157afb0c1af4c0804647e1f334719fd21f876 | |
| parent | 0d9def8faf84e12d1fcabd221fd45597d5840ec0 (diff) | |
Skip resuming activities on sleeping display
Bubble activity was resumed while the ActivityView was hidden after
device unlocked.
Also reduce always resuming activities from RWC since already looping
through all displays when applying sleep tokens.
Bug: 160338354
Test: atest RootActivityContainerTests
Change-Id: I7f08e09fb9273a3ae7855728ed6f4eb1b7fdb206
| -rw-r--r-- | services/core/java/com/android/server/wm/RootWindowContainer.java | 6 | ||||
| -rw-r--r-- | services/tests/wmtests/src/com/android/server/wm/RootActivityContainerTests.java | 18 |
2 files changed, 23 insertions, 1 deletions
diff --git a/services/core/java/com/android/server/wm/RootWindowContainer.java b/services/core/java/com/android/server/wm/RootWindowContainer.java index 40f8fab510ba..05238dde0edb 100644 --- a/services/core/java/com/android/server/wm/RootWindowContainer.java +++ b/services/core/java/com/android/server/wm/RootWindowContainer.java @@ -2269,6 +2269,10 @@ class RootWindowContainer extends WindowContainer<DisplayContent> for (int displayNdx = getChildCount() - 1; displayNdx >= 0; --displayNdx) { final DisplayContent display = getChildAt(displayNdx); + if (display.shouldSleep()) { + continue; + } + final boolean curResult = result; boolean resumedOnDisplay = display.reduceOnAllTaskDisplayAreas( (taskDisplayArea, resumed) -> { @@ -2360,7 +2364,7 @@ class RootWindowContainer extends WindowContainer<DisplayContent> // process the keyguard going away, which can happen before the sleep // token is released. As a result, it is important we resume the // activity here. - resumeFocusedStacksTopActivities(); + stack.resumeTopActivityUncheckedLocked(null, null); } // The visibility update must not be called before resuming the top, so the // display orientation can be updated first if needed. Otherwise there may diff --git a/services/tests/wmtests/src/com/android/server/wm/RootActivityContainerTests.java b/services/tests/wmtests/src/com/android/server/wm/RootActivityContainerTests.java index d9ec0b138552..eaaf6181daa9 100644 --- a/services/tests/wmtests/src/com/android/server/wm/RootActivityContainerTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/RootActivityContainerTests.java @@ -894,6 +894,24 @@ public class RootActivityContainerTests extends ActivityTestsBase { assertEquals(taskDisplayArea.getTopStack(), taskDisplayArea.getRootHomeTask()); } + @Test + public void testResumeFocusedStackOnSleepingDisplay() { + // Create an activity on secondary display. + final TestDisplayContent secondDisplay = addNewDisplayContentAt( + DisplayContent.POSITION_TOP); + final ActivityStack stack = secondDisplay.getDefaultTaskDisplayArea() + .createStack(WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */); + final ActivityRecord activity = new ActivityBuilder(mService).setStack(stack).build(); + spyOn(activity); + spyOn(stack); + + // Cannot resumed activities on secondary display if the display should sleep. + doReturn(true).when(secondDisplay).shouldSleep(); + mRootWindowContainer.resumeFocusedStacksTopActivities(); + verify(stack, never()).resumeTopActivityUncheckedLocked(any(), any()); + verify(activity, never()).makeActiveIfNeeded(any()); + } + /** * Mock {@link RootWindowContainer#resolveHomeActivity} for returning consistent activity * info for test cases. |