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
This commit is contained in:
Lucas Dupin
2019-06-18 17:45:09 -07:00
parent 04cb6d1ccc
commit 151be9dcd4

View File

@@ -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) {