From cf2dfc3e29be449078439fdc6a7317cf1944ce8a Mon Sep 17 00:00:00 2001 From: Winson Chung Date: Fri, 14 Jul 2023 18:15:22 +0000 Subject: [PATCH] Defer ending launcher power mode hint until after transient transition Because transient launch will resume the target activity, the power mode will be cleared after the activity reported idle. But the animation may be still running that causes some frame drops by lower cpu frequency. So defer it until the transition is finished. The power mode will be cleared from: Transition#finishTransition > scheduleProcessStoppingAndFinishingActivitiesIfNeeded > allResumedActivitiesIdle > endLaunchPowerMode Bug: 291284150 Test: atest TransitionTests#testTransientLaunch Change-Id: If664fbc58554d7cfabae86c9ec282f3f7cf50526 --- .../com/android/server/wm/RootWindowContainer.java | 4 ++++ .../src/com/android/server/wm/TransitionTests.java | 10 ++++++++++ 2 files changed, 14 insertions(+) diff --git a/services/core/java/com/android/server/wm/RootWindowContainer.java b/services/core/java/com/android/server/wm/RootWindowContainer.java index d9a954f1973b2..05f95f813e55e 100644 --- a/services/core/java/com/android/server/wm/RootWindowContainer.java +++ b/services/core/java/com/android/server/wm/RootWindowContainer.java @@ -3212,6 +3212,10 @@ class RootWindowContainer extends WindowContainer + "not idle", rootTask.getRootTaskId(), resumedActivity); return false; } + if (mTransitionController.isTransientLaunch(resumedActivity)) { + // Not idle if the transient transition animation is running. + return false; + } } // End power mode launch when idle. mService.endLaunchPowerMode(ActivityTaskManagerService.POWER_MODE_REASON_START_ACTIVITY); 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 ed0c8ef489e5d..d4fabf40d5d59 100644 --- a/services/tests/wmtests/src/com/android/server/wm/TransitionTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/TransitionTests.java @@ -61,6 +61,7 @@ import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.times; @@ -1425,6 +1426,15 @@ public class TransitionTests extends WindowTestsBase { // No need to wait for the activity in transient hide task. assertEquals(WindowContainer.SYNC_STATE_NONE, activity1.mSyncState); + // 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()); + activity1.setVisibleRequested(false); activity2.setVisibleRequested(true); activity2.setVisible(true);