diff options
| author | 2022-11-09 22:54:26 +0800 | |
|---|---|---|
| committer | 2022-11-11 06:34:50 +0000 | |
| commit | 37ff5d90c18a6ce5f65d421c1e1b7f340aa4feff (patch) | |
| tree | e437a06cbc709c83ab6957c0c3117498907aa16d | |
| parent | 8d6647d4735e47305ed4db54e405071097a27da1 (diff) | |
Wake up dream after resuming the moving to front task
Otherwise an activity with turn-screen-on flag cannot take effect
and receive new intent when launching it under dreaming. It will
become normal after the second try.
Because currentLaunchCanTurnScreenOn will be false after relayout
(WS#prepareWindowToDisplayDuringRelayout), then canTurnScreenOn()
will be false before calling resumeTargetRootTaskIfNeeded(), then
wakeUp is not called so the screen doesn't turn on and the dream
activity is still on top.
Fixes: 257533814
Test: ActivityStarterTests#testRecycleTaskWakeUpWhenDreaming
Change-Id: I457a7104068a57b010507a776094b2f354b6450a
| -rw-r--r-- | services/core/java/com/android/server/wm/ActivityStarter.java | 12 | ||||
| -rw-r--r-- | services/tests/wmtests/src/com/android/server/wm/ActivityStarterTests.java | 20 |
2 files changed, 26 insertions, 6 deletions
diff --git a/services/core/java/com/android/server/wm/ActivityStarter.java b/services/core/java/com/android/server/wm/ActivityStarter.java index dc69ca6bc0cf..2387e25c270c 100644 --- a/services/core/java/com/android/server/wm/ActivityStarter.java +++ b/services/core/java/com/android/server/wm/ActivityStarter.java @@ -2247,12 +2247,6 @@ class ActivityStarter { ? targetTask.getTopNonFinishingActivity() : targetTaskTop; - // At this point we are certain we want the task moved to the front. If we need to dismiss - // any other always-on-top root tasks, now is the time to do it. - if (targetTaskTop.canTurnScreenOn() && mService.isDreaming()) { - targetTaskTop.mTaskSupervisor.wakeUp("recycleTask#turnScreenOnFlag"); - } - if (mMovedToFront) { // We moved the task to front, use starting window to hide initial drawn delay. targetTaskTop.showStartingWindow(true /* taskSwitch */); @@ -2264,6 +2258,12 @@ class ActivityStarter { // And for paranoia, make sure we have correctly resumed the top activity. resumeTargetRootTaskIfNeeded(); + // This is moving an existing task to front. But since dream activity has a higher z-order + // to cover normal activities, it needs the awakening event to be dismissed. + if (mService.isDreaming() && targetTaskTop.canTurnScreenOn()) { + targetTaskTop.mTaskSupervisor.wakeUp("recycleTask#turnScreenOnFlag"); + } + mLastStartActivityRecord = targetTaskTop; return mMovedToFront ? START_TASK_TO_FRONT : START_DELIVERED_TO_TOP; } diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityStarterTests.java b/services/tests/wmtests/src/com/android/server/wm/ActivityStarterTests.java index 496f6817bb08..6fe2d2cbe9d4 100644 --- a/services/tests/wmtests/src/com/android/server/wm/ActivityStarterTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/ActivityStarterTests.java @@ -1131,6 +1131,26 @@ public class ActivityStarterTests extends WindowTestsBase { } @Test + public void testRecycleTaskWakeUpWhenDreaming() { + doNothing().when(mWm.mAtmService.mTaskSupervisor).wakeUp(anyString()); + doReturn(true).when(mWm.mAtmService).isDreaming(); + final ActivityStarter starter = prepareStarter(0 /* flags */); + final ActivityRecord target = new ActivityBuilder(mAtm).setCreateTask(true).build(); + starter.mStartActivity = target; + target.mVisibleRequested = false; + target.setTurnScreenOn(true); + // Assume the flag was consumed by relayout. + target.setCurrentLaunchCanTurnScreenOn(false); + startActivityInner(starter, target, null /* source */, null /* options */, + null /* inTask */, null /* inTaskFragment */); + // The flag should be set again when resuming (from recycleTask) the target as top. + assertTrue(target.currentLaunchCanTurnScreenOn()); + // In real case, dream activity has a higher priority (TaskDisplayArea#getPriority) that + // will be put at a higher z-order. So it relies on wakeUp() to be dismissed. + verify(mWm.mAtmService.mTaskSupervisor).wakeUp(anyString()); + } + + @Test public void testTargetTaskInSplitScreen() { final ActivityStarter starter = prepareStarter(FLAG_ACTIVITY_LAUNCH_ADJACENT, false /* mockGetRootTask */); |