diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/FingerprintUnlockController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/FingerprintUnlockController.java index fdfd8e88b4465..cb96dea08ae0e 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/FingerprintUnlockController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/FingerprintUnlockController.java @@ -187,8 +187,12 @@ public class FingerprintUnlockController extends KeyguardUpdateMonitorCallback { Trace.endSection(); return; } + startWakeAndUnlock(calculateMode()); + } + + public void startWakeAndUnlock(int mode) { boolean wasDeviceInteractive = mUpdateMonitor.isDeviceInteractive(); - mMode = calculateMode(); + mMode = mode; mHasScreenTurnedOnSinceAuthenticating = false; if (mMode == MODE_WAKE_AND_UNLOCK_PULSING && pulsingOrAod()) { // If we are waking the device up while we are pulsing the clock and the 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 2a55e2ec22478..5d8d01ce08221 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java @@ -142,6 +142,7 @@ import android.widget.RemoteViews; import android.widget.TextView; import android.widget.Toast; +import com.android.internal.annotations.VisibleForTesting; import com.android.internal.colorextraction.ColorExtractor; import com.android.internal.graphics.ColorUtils; import com.android.internal.logging.MetricsLogger; @@ -749,7 +750,7 @@ public class StatusBar extends SystemUI implements DemoMode, private SysuiColorExtractor mColorExtractor; private ForegroundServiceController mForegroundServiceController; private ScreenLifecycle mScreenLifecycle; - private WakefulnessLifecycle mWakefulnessLifecycle; + @VisibleForTesting WakefulnessLifecycle mWakefulnessLifecycle; private void recycleAllVisibilityObjects(ArraySet array) { final int N = array.size(); @@ -3787,6 +3788,15 @@ public class StatusBar extends SystemUI implements DemoMode, private void dismissKeyguardThenExecute(OnDismissAction action, Runnable cancelAction, boolean afterKeyguardGone) { + if (mWakefulnessLifecycle.getWakefulness() == WAKEFULNESS_ASLEEP + && mUnlockMethodCache.canSkipBouncer() + && !mLeaveOpenOnKeyguardHide + && isPulsing()) { + // Reuse the fingerprint wake-and-unlock transition if we dismiss keyguard from a pulse. + // TODO: Factor this transition out of FingerprintUnlockController. + mFingerprintUnlockController.startWakeAndUnlock( + FingerprintUnlockController.MODE_WAKE_AND_UNLOCK_PULSING); + } if (mStatusBarKeyguardViewManager.isShowing()) { mStatusBarKeyguardViewManager.dismissWithAction(action, cancelAction, afterKeyguardGone); @@ -4223,6 +4233,8 @@ public class StatusBar extends SystemUI implements DemoMode, public void showKeyguard() { mKeyguardRequested = true; + mLeaveOpenOnKeyguardHide = false; + mPendingRemoteInputView = null; updateIsKeyguard(); mAssistManager.onLockscreenShown(); } @@ -4273,13 +4285,11 @@ public class StatusBar extends SystemUI implements DemoMode, } updateKeyguardState(false /* goingToFullShade */, false /* fromShadeLocked */); updatePanelExpansionForKeyguard(); - mLeaveOpenOnKeyguardHide = false; if (mDraggedDownRow != null) { mDraggedDownRow.setUserLocked(false); mDraggedDownRow.notifyHeightChanged(false /* needsAnimation */); mDraggedDownRow = null; } - mPendingRemoteInputView = null; } private void updatePanelExpansionForKeyguard() { @@ -4419,15 +4429,19 @@ public class StatusBar extends SystemUI implements DemoMode, setBarState(StatusBarState.SHADE); View viewToClick = null; if (mLeaveOpenOnKeyguardHide) { - mLeaveOpenOnKeyguardHide = false; + if (!mKeyguardRequested) { + mLeaveOpenOnKeyguardHide = false; + } long delay = calculateGoingToFullShadeDelay(); mNotificationPanel.animateToFullShade(delay); if (mDraggedDownRow != null) { mDraggedDownRow.setUserLocked(false); mDraggedDownRow = null; } - viewToClick = mPendingRemoteInputView; - mPendingRemoteInputView = null; + if (!mKeyguardRequested) { + viewToClick = mPendingRemoteInputView; + mPendingRemoteInputView = null; + } // Disable layout transitions in navbar for this transition because the load is just // too heavy for the CPU and GPU on any device. diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java index acf42785f8267..314700907f577 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java @@ -156,7 +156,6 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb */ protected void showBouncerOrKeyguard(boolean hideBouncerWhenShowing) { if (mBouncer.needsFullscreenBouncer() && !mDozing) { - // The keyguard might be showing (already). So we need to hide it. mStatusBar.hideKeyguard(); mBouncer.show(true /* resetSecuritySelection */); @@ -167,6 +166,7 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb mBouncer.prepare(); } } + updateStates(); } private void showBouncer() { @@ -250,7 +250,9 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb public void setDozing(boolean dozing) { if (mDozing != dozing) { mDozing = dozing; - reset(dozing /* hideBouncerWhenShowing */); + if (dozing || mBouncer.needsFullscreenBouncer() || mOccluded) { + reset(dozing /* hideBouncerWhenShowing */); + } updateStates(); } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java index c33897e6b3a11..a706368a0880d 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java @@ -65,6 +65,7 @@ import com.android.internal.logging.testing.FakeMetricsLogger; import com.android.internal.statusbar.IStatusBarService; import com.android.keyguard.KeyguardHostView.OnDismissAction; import com.android.systemui.SysuiTestCase; +import com.android.systemui.keyguard.WakefulnessLifecycle; import com.android.systemui.recents.misc.SystemServicesProxy; import com.android.systemui.statusbar.ActivatableNotificationView; import com.android.systemui.statusbar.CommandQueue; @@ -500,6 +501,14 @@ public class StatusBarTest extends SysuiTestCase { mSystemServicesProxy = ssp; mNotificationPanel = panelView; mBarService = barService; + mWakefulnessLifecycle = createAwakeWakefulnessLifecycle(); + } + + private WakefulnessLifecycle createAwakeWakefulnessLifecycle() { + WakefulnessLifecycle wakefulnessLifecycle = new WakefulnessLifecycle(); + wakefulnessLifecycle.dispatchStartedWakingUp(); + wakefulnessLifecycle.dispatchFinishedWakingUp(); + return wakefulnessLifecycle; } public void setBarStateForTest(int state) {