diff options
| author | 2024-08-19 08:17:33 +0000 | |
|---|---|---|
| committer | 2024-08-19 08:17:33 +0000 | |
| commit | bd8c7d46316ef44e4ec182362ea25e01c951c5ac (patch) | |
| tree | 5604b4d1025e34ab718f5fe545c5335a8a3edb26 | |
| parent | 1d3c59545732907115a38e316ab9a1eb857cc9b3 (diff) | |
| parent | cd7d9512269630c3d14eab6b50b30ae8d66aa11f (diff) | |
Merge "Check idle activity from all visible task fragment" into main
3 files changed, 38 insertions, 16 deletions
diff --git a/services/core/java/com/android/server/wm/RootWindowContainer.java b/services/core/java/com/android/server/wm/RootWindowContainer.java index 401354c2193a..4ca4730923f5 100644 --- a/services/core/java/com/android/server/wm/RootWindowContainer.java +++ b/services/core/java/com/android/server/wm/RootWindowContainer.java @@ -3428,26 +3428,30 @@ class RootWindowContainer extends WindowContainer<DisplayContent> boolean allResumedActivitiesIdle() { for (int displayNdx = getChildCount() - 1; displayNdx >= 0; --displayNdx) { - // TODO(b/117135575): Check resumed activities on all visible root tasks. final DisplayContent display = getChildAt(displayNdx); if (display.isSleeping()) { // No resumed activities while display is sleeping. continue; } - // If the focused root task is not null or not empty, there should have some activities - // resuming or resumed. Make sure these activities are idle. - final Task rootTask = display.getFocusedRootTask(); - if (rootTask == null || !rootTask.hasActivity()) { - continue; - } - final ActivityRecord resumedActivity = rootTask.getTopResumedActivity(); - if (resumedActivity == null || !resumedActivity.idle) { - ProtoLog.d(WM_DEBUG_STATES, "allResumedActivitiesIdle: rootTask=%d %s " - + "not idle", rootTask.getRootTaskId(), resumedActivity); + final boolean foundNotIdle = display.forAllLeafTaskFragments(tf -> { + if (!tf.isVisibleRequested()) { + return false; + } + // Note that only activities that will be resumed can report idle. + final ActivityRecord r = tf.topRunningActivity(); + if (r != null && !r.idle && (r.isState(RESUMED) + // Its process is not attached yet and it may resume later. + || (r.app == null && r.isFocusable()))) { + ProtoLog.d(WM_DEBUG_STATES, "allResumedActivitiesIdle: %s not idle", r); + return true; + } + return false; + }); + if (foundNotIdle) { return false; } - if (mTransitionController.isTransientLaunch(resumedActivity)) { + if (mTransitionController.hasTransientLaunch(display)) { // Not idle if the transient transition animation is running. return false; } diff --git a/services/tests/wmtests/src/com/android/server/wm/RootWindowContainerTests.java b/services/tests/wmtests/src/com/android/server/wm/RootWindowContainerTests.java index 84c2c32054d8..4ab2fcf095d1 100644 --- a/services/tests/wmtests/src/com/android/server/wm/RootWindowContainerTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/RootWindowContainerTests.java @@ -205,6 +205,28 @@ public class RootWindowContainerTests extends WindowTestsBase { } @Test + public void testAllResumedActivitiesIdle() { + final ActivityRecord activity1 = new ActivityBuilder(mAtm).setCreateTask(true).build(); + final ActivityRecord activity2 = new ActivityBuilder(mAtm).setCreateTask(true).build(); + final WindowProcessController proc2 = activity2.app; + activity1.setState(RESUMED, "test"); + activity2.detachFromProcess(); + assertThat(mWm.mRoot.allResumedActivitiesIdle()).isFalse(); + + activity1.idle = true; + assertThat(mWm.mRoot.allResumedActivitiesIdle()).isFalse(); + + activity2.setProcess(proc2); + activity2.setState(RESUMED, "test"); + activity2.idle = true; + assertThat(mWm.mRoot.allResumedActivitiesIdle()).isTrue(); + + activity1.idle = false; + activity1.setVisibleRequested(false); + assertThat(mWm.mRoot.allResumedActivitiesIdle()).isTrue(); + } + + @Test public void testTaskLayerRank() { final Task rootTask = new TaskBuilder(mSupervisor).build(); final Task task1 = new TaskBuilder(mSupervisor).setParentTask(rootTask).build(); diff --git a/services/tests/wmtests/src/com/android/server/wm/TransitionTests.java b/services/tests/wmtests/src/com/android/server/wm/TransitionTests.java index 49e349caa379..56fca31afa37 100644 --- a/services/tests/wmtests/src/com/android/server/wm/TransitionTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/TransitionTests.java @@ -1550,10 +1550,6 @@ public class TransitionTests extends WindowTestsBase { // An active transient launch overrides idle state to avoid clearing power mode before the // transition is finished. - spyOn(mRootWindowContainer.mTransitionController); - doAnswer(invocation -> controller.isTransientLaunch(invocation.getArgument(0))).when( - mRootWindowContainer.mTransitionController).isTransientLaunch(any()); - activity2.getTask().setResumedActivity(activity2, "test"); activity2.idle = true; assertFalse(mRootWindowContainer.allResumedActivitiesIdle()); |