From 151be9dcd487f8da2558f032d8e875b0f5460416 Mon Sep 17 00:00:00 2001 From: Lucas Dupin Date: Tue, 18 Jun 2019 17:45:09 -0700 Subject: [PATCH] Fix camera race condition Centralize deffered camera launch on wakefulness events since there aren't any guarantees that screen and wakefulness will happen in order. Fixes: 123762288 Test: double tap power multiple times (from LS and AOD) Change-Id: I031802877953d9c77fc17118612d0b26fca387b5 --- .../systemui/statusbar/phone/StatusBar.java | 28 +++++++++---------- 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java index 80fbda0809ba3..dd897ed862cd9 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java @@ -504,7 +504,7 @@ public class StatusBar extends SystemUI implements DemoMode, private Runnable mLaunchTransitionEndRunnable; private NotificationEntry mDraggedDownEntry; - private boolean mLaunchCameraOnScreenTurningOn; + private boolean mLaunchCameraWhenFinishedWaking; private boolean mLaunchCameraOnFinishedGoingToSleep; private int mLastCameraLaunchSource; protected PowerManager.WakeLock mGestureWakeLock; @@ -3606,7 +3606,7 @@ public class StatusBar extends SystemUI implements DemoMode, public void onFinishedGoingToSleep() { mNotificationPanel.onAffordanceLaunchEnded(); releaseGestureWakeLock(); - mLaunchCameraOnScreenTurningOn = false; + mLaunchCameraWhenFinishedWaking = false; mDeviceInteractive = false; mWakeUpComingFromTouch = false; mWakeUpTouchLocation = null; @@ -3651,6 +3651,11 @@ public class StatusBar extends SystemUI implements DemoMode, @Override public void onFinishedWakingUp() { mWakeUpCoordinator.setWakingUp(false); + if (mLaunchCameraWhenFinishedWaking) { + mNotificationPanel.launchCamera(false /* animate */, mLastCameraLaunchSource); + mLaunchCameraWhenFinishedWaking = false; + } + updateScrimController(); } }; @@ -3671,13 +3676,6 @@ public class StatusBar extends SystemUI implements DemoMode, public void onScreenTurningOn() { mFalsingManager.onScreenTurningOn(); mNotificationPanel.onScreenTurningOn(); - - if (mLaunchCameraOnScreenTurningOn) { - mNotificationPanel.launchCamera(false, mLastCameraLaunchSource); - mLaunchCameraOnScreenTurningOn = false; - } - - updateScrimController(); } @Override @@ -3772,7 +3770,7 @@ public class StatusBar extends SystemUI implements DemoMode, // comes on. mGestureWakeLock.acquire(LAUNCH_TRANSITION_TIMEOUT_MS + 1000L); } - if (isScreenTurningOnOrOn()) { + if (isWakingUpOrAwake()) { if (DEBUG_CAMERA_LIFT) Slog.d(TAG, "Launching camera"); if (mStatusBarKeyguardViewManager.isBouncerShowing()) { mStatusBarKeyguardViewManager.reset(true /* hide */); @@ -3785,7 +3783,7 @@ public class StatusBar extends SystemUI implements DemoMode, // incorrectly get notified because of the screen on event (which resumes and pauses // some activities) if (DEBUG_CAMERA_LIFT) Slog.d(TAG, "Deferring until screen turns on"); - mLaunchCameraOnScreenTurningOn = true; + mLaunchCameraWhenFinishedWaking = true; } } } @@ -3810,9 +3808,9 @@ public class StatusBar extends SystemUI implements DemoMode, == WakefulnessLifecycle.WAKEFULNESS_GOING_TO_SLEEP; } - private boolean isScreenTurningOnOrOn() { - return mScreenLifecycle.getScreenState() == ScreenLifecycle.SCREEN_TURNING_ON - || mScreenLifecycle.getScreenState() == ScreenLifecycle.SCREEN_ON; + private boolean isWakingUpOrAwake() { + return mWakefulnessLifecycle.getWakefulness() == WAKEFULNESS_AWAKE + || mWakefulnessLifecycle.getWakefulness() == WAKEFULNESS_WAKING; } public void notifyBiometricAuthModeChanged() { @@ -3844,7 +3842,7 @@ public class StatusBar extends SystemUI implements DemoMode, ScrimState state = mStatusBarKeyguardViewManager.bouncerNeedsScrimming() ? ScrimState.BOUNCER_SCRIMMED : ScrimState.BOUNCER; mScrimController.transitionTo(state); - } else if (isInLaunchTransition() || mLaunchCameraOnScreenTurningOn + } else if (isInLaunchTransition() || mLaunchCameraWhenFinishedWaking || launchingAffordanceWithPreview) { mScrimController.transitionTo(ScrimState.UNLOCKED, mUnlockScrimCallback); } else if (mBrightnessMirrorVisible) {