From c0853ecac096a1e5155dbef7e39da9328f1cdff6 Mon Sep 17 00:00:00 2001 From: Peter Kalauskas Date: Tue, 16 May 2023 17:09:24 -0700 Subject: [PATCH] Move doze animation until finished waking up Move the start of the LOCKSCREEN_TRANSITION_FROM_AOD animation from onStartedWakingUp() to onFinishedWakingUp(). This mitigates against dropped frames in sysui due to the animation running while HWC is chaniging the power mode (see: IComposerClient.setPowerMode). Test: wake up with/without power button, with/without touch to unlock anytime enabled Bug: 285570694 Bug: 193615254 Change-Id: Iea0ee65b2e20b092914d997e948568e5a37c2e0b Merged-In: Iea0ee65b2e20b092914d997e948568e5a37c2e0b --- .../statusbar/phone/CentralSurfacesImpl.java | 51 ++++++++++++++----- .../phone/CentralSurfacesImplTest.java | 7 ++- 2 files changed, 43 insertions(+), 15 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java index 096f73f80165d..1cd0f081a7446 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java @@ -2836,7 +2836,11 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces { } private void updateDozingState() { - Trace.traceCounter(Trace.TRACE_TAG_APP, "dozing", mDozing ? 1 : 0); + if (Trace.isTagEnabled(Trace.TRACE_TAG_APP)) { + Trace.asyncTraceForTrackEnd(Trace.TRACE_TAG_APP, "Dozing", 0); + Trace.asyncTraceForTrackBegin(Trace.TRACE_TAG_APP, "Dozing", String.valueOf(mDozing), + 0); + } Trace.beginSection("CentralSurfaces#updateDozingState"); boolean keyguardVisible = mKeyguardStateController.isVisible(); @@ -3190,6 +3194,10 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces { @Override public void onStartedWakingUp() { + // Between onStartedWakingUp() and onFinishedWakingUp(), the system is changing the + // display power mode. To avoid jank, animations should NOT run during these power + // mode transitions, which means that whenever possible, animations should + // start running during the onFinishedWakingUp() callback instead of this callback. String tag = "CentralSurfaces#onStartedWakingUp"; DejankUtils.startDetectingBlockingIpcs(tag); mNotificationShadeWindowController.batchApplyWindowLayoutParams(()-> { @@ -3234,26 +3242,41 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces { updateVisibleToUser(); updateIsKeyguard(); - mDozeServiceHost.stopDozing(); - // This is intentionally below the stopDozing call above, since it avoids that we're - // unnecessarily animating the wakeUp transition. Animations should only be enabled - // once we fully woke up. - updateRevealEffect(true /* wakingUp */); - updateNotificationPanelTouchState(); - mStatusBarTouchableRegionManager.updateTouchableRegion(); - - // If we are waking up during the screen off animation, we should undo making the - // expanded visible (we did that so the LightRevealScrim would be visible). - if (mScreenOffAnimationController.shouldHideLightRevealScrimOnWakeUp()) { - mShadeController.makeExpandedInvisible(); + if (!mFeatureFlags.isEnabled(Flags.ZJ_285570694_LOCKSCREEN_TRANSITION_FROM_AOD)) { + startLockscreenTransitionFromAod(); } - }); DejankUtils.stopDetectingBlockingIpcs(tag); } + /** + * Private helper for starting the LOCKSCREEN_TRANSITION_FROM_AOD animation - only necessary + * so we can start it from either onFinishedWakingUp() or onFinishedWakingUp() depending + * on a flag value. + */ + private void startLockscreenTransitionFromAod() { + // stopDozing() starts the LOCKSCREEN_TRANSITION_FROM_AOD animation. + mDozeServiceHost.stopDozing(); + // This is intentionally below the stopDozing call above, since it avoids that we're + // unnecessarily animating the wakeUp transition. Animations should only be enabled + // once we fully woke up. + updateRevealEffect(true /* wakingUp */); + updateNotificationPanelTouchState(); + mStatusBarTouchableRegionManager.updateTouchableRegion(); + + // If we are waking up during the screen off animation, we should undo making the + // expanded visible (we did that so the LightRevealScrim would be visible). + if (mScreenOffAnimationController.shouldHideLightRevealScrimOnWakeUp()) { + mShadeController.makeExpandedInvisible(); + } + } + @Override public void onFinishedWakingUp() { + if (mFeatureFlags.isEnabled(Flags.ZJ_285570694_LOCKSCREEN_TRANSITION_FROM_AOD)) { + mNotificationShadeWindowController.batchApplyWindowLayoutParams( + this::startLockscreenTransitionFromAod); + } mWakeUpCoordinator.setFullyAwake(true); mWakeUpCoordinator.setWakingUp(false, false); if (mKeyguardStateController.isOccluded() diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CentralSurfacesImplTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CentralSurfacesImplTest.java index fd9f6a73aee4b..8062272a00425 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CentralSurfacesImplTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CentralSurfacesImplTest.java @@ -350,6 +350,7 @@ public class CentralSurfacesImplTest extends SysuiTestCase { // For the Shade to animate during the Back gesture, we must enable the animation flag. mFeatureFlags.set(Flags.WM_SHADE_ANIMATE_BACK_GESTURE, true); mFeatureFlags.set(Flags.LIGHT_REVEAL_MIGRATION, true); + mFeatureFlags.set(Flags.ZJ_285570694_LOCKSCREEN_TRANSITION_FROM_AOD, true); IThermalService thermalService = mock(IThermalService.class); mPowerManager = new PowerManager(mContext, mPowerManagerService, thermalService, @@ -1103,8 +1104,10 @@ public class CentralSurfacesImplTest extends SysuiTestCase { clearInvocations(mNotificationPanelViewController); mCentralSurfaces.mWakefulnessObserver.onStartedWakingUp(); - verify(mDozeServiceHost).stopDozing(); + verify(mDozeServiceHost, never()).stopDozing(); verify(mNotificationPanelViewController).expand(eq(false)); + mCentralSurfaces.mWakefulnessObserver.onFinishedWakingUp(); + verify(mDozeServiceHost).stopDozing(); } @Test @@ -1118,6 +1121,8 @@ public class CentralSurfacesImplTest extends SysuiTestCase { mCentralSurfaces.setBouncerShowing(true); mCentralSurfaces.mWakefulnessObserver.onStartedWakingUp(); verify(mNotificationPanelViewController, never()).expand(anyBoolean()); + mCentralSurfaces.mWakefulnessObserver.onFinishedWakingUp(); + verify(mDozeServiceHost).stopDozing(); } @Test