diff options
5 files changed, 64 insertions, 33 deletions
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java index e6e2ac980889..3412c18e3103 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java @@ -1428,32 +1428,42 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab final FaceManager.AuthenticationCallback mFaceAuthenticationCallback = new FaceManager.AuthenticationCallback() { - @Override - public void onAuthenticationFailed() { - handleFaceAuthFailed(); - } + @Override + public void onAuthenticationFailed() { + handleFaceAuthFailed(); + if (mKeyguardBypassController != null) { + mKeyguardBypassController.setUserHasDeviceEntryIntent(false); + } + } - @Override - public void onAuthenticationSucceeded(FaceManager.AuthenticationResult result) { - Trace.beginSection("KeyguardUpdateMonitor#onAuthenticationSucceeded"); - handleFaceAuthenticated(result.getUserId(), result.isStrongBiometric()); - Trace.endSection(); - } + @Override + public void onAuthenticationSucceeded(FaceManager.AuthenticationResult result) { + Trace.beginSection("KeyguardUpdateMonitor#onAuthenticationSucceeded"); + handleFaceAuthenticated(result.getUserId(), result.isStrongBiometric()); + Trace.endSection(); - @Override - public void onAuthenticationHelp(int helpMsgId, CharSequence helpString) { - handleFaceHelp(helpMsgId, helpString.toString()); - } + if (mKeyguardBypassController != null) { + mKeyguardBypassController.setUserHasDeviceEntryIntent(false); + } + } - @Override - public void onAuthenticationError(int errMsgId, CharSequence errString) { - handleFaceError(errMsgId, errString.toString()); - } + @Override + public void onAuthenticationHelp(int helpMsgId, CharSequence helpString) { + handleFaceHelp(helpMsgId, helpString.toString()); + } - @Override - public void onAuthenticationAcquired(int acquireInfo) { - handleFaceAcquired(acquireInfo); - } + @Override + public void onAuthenticationError(int errMsgId, CharSequence errString) { + handleFaceError(errMsgId, errString.toString()); + if (mKeyguardBypassController != null) { + mKeyguardBypassController.setUserHasDeviceEntryIntent(false); + } + } + + @Override + public void onAuthenticationAcquired(int acquireInfo) { + handleFaceAcquired(acquireInfo); + } }; private CancellationSignal mFingerprintCancelSignal; diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java index 6ddf24875000..3c3dfec42b4b 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java +++ b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java @@ -68,6 +68,7 @@ import com.android.systemui.keyguard.ScreenLifecycle; import com.android.systemui.plugins.FalsingManager; import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.statusbar.LockscreenShadeTransitionController; +import com.android.systemui.statusbar.phone.KeyguardBypassController; import com.android.systemui.statusbar.phone.StatusBar; import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager; import com.android.systemui.statusbar.policy.KeyguardStateController; @@ -120,6 +121,7 @@ public class UdfpsController implements DozeReceiver { @NonNull private final AccessibilityManager mAccessibilityManager; @NonNull private final LockscreenShadeTransitionController mLockscreenShadeTransitionController; @Nullable private final UdfpsHbmProvider mHbmProvider; + @NonNull private final KeyguardBypassController mKeyguardBypassController; @VisibleForTesting @NonNull final BiometricOrientationEventListener mOrientationListener; // Currently the UdfpsController supports a single UDFPS sensor. If devices have multiple // sensors, this, in addition to a lot of the code here, will be updated. @@ -397,7 +399,10 @@ public class UdfpsController implements DozeReceiver { handled = true; } if ((withinSensorArea || fromUdfpsView) && shouldTryToDismissKeyguard()) { - Log.v(TAG, "onTouch | dismiss keyguard from ACTION_DOWN"); + Log.v(TAG, "onTouch | dismiss keyguard ACTION_DOWN"); + if (!mOnFingerDown) { + playStartHaptic(); + } mKeyguardViewManager.notifyKeyguardAuthenticated(false /* strongAuth */); mAttemptedToDismissKeyguard = true; } @@ -414,6 +419,16 @@ public class UdfpsController implements DozeReceiver { boolean actionMoveWithinSensorArea = isWithinSensorArea(udfpsView, event.getX(idx), event.getY(idx), fromUdfpsView); + if ((fromUdfpsView || actionMoveWithinSensorArea) + && shouldTryToDismissKeyguard()) { + Log.v(TAG, "onTouch | dismiss keyguard ACTION_MOVE"); + if (!mOnFingerDown) { + playStartHaptic(); + } + mKeyguardViewManager.notifyKeyguardAuthenticated(false /* strongAuth */); + mAttemptedToDismissKeyguard = true; + break; + } if (actionMoveWithinSensorArea) { if (mVelocityTracker == null) { // touches could be injected, so the velocity tracker may not have @@ -449,12 +464,6 @@ public class UdfpsController implements DozeReceiver { Log.v(TAG, "onTouch | finger outside"); onFingerUp(); } - if ((fromUdfpsView || actionMoveWithinSensorArea) - && shouldTryToDismissKeyguard()) { - Log.v(TAG, "onTouch | dismiss keyguard from ACTION_MOVE"); - mKeyguardViewManager.notifyKeyguardAuthenticated(false /* strongAuth */); - mAttemptedToDismissKeyguard = true; - } } Trace.endSection(); break; @@ -509,7 +518,8 @@ public class UdfpsController implements DozeReceiver { @Nullable Vibrator vibrator, @NonNull UdfpsHapticsSimulator udfpsHapticsSimulator, @NonNull Optional<UdfpsHbmProvider> hbmProvider, - @NonNull KeyguardStateController keyguardStateController) { + @NonNull KeyguardStateController keyguardStateController, + @NonNull KeyguardBypassController keyguardBypassController) { mContext = context; mExecution = execution; // TODO (b/185124905): inject main handler and vibrator once done prototyping @@ -539,6 +549,7 @@ public class UdfpsController implements DozeReceiver { onOrientationChanged(); return Unit.INSTANCE; }); + mKeyguardBypassController = keyguardBypassController; mSensorProps = findFirstUdfps(); // At least one UDFPS sensor exists @@ -863,12 +874,17 @@ public class UdfpsController implements DozeReceiver { private void onFingerDown(int x, int y, float minor, float major) { mExecution.assertIsMainThread(); + mKeyguardBypassController.setUserHasDeviceEntryIntent(true); if (mView == null) { Log.w(TAG, "Null view in onFingerDown"); return; } if (!mOnFingerDown) { playStartHaptic(); + + if (!mKeyguardUpdateMonitor.isFaceDetectionRunning()) { + mKeyguardUpdateMonitor.requestFaceAuth(/* userInitiatedRequest */ false); + } } mOnFingerDown = true; mFingerprintManager.onPointerDown(mSensorProps.sensorId, x, y, minor, major); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java index 6d5c53609f81..6e201048abdb 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java @@ -564,8 +564,8 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback imp boolean unlockingAllowed = mUpdateMonitor.isUnlockingWithBiometricAllowed(isStrongBiometric); boolean deviceDreaming = mUpdateMonitor.isDreaming(); - boolean bypass = mKeyguardBypassController.getBypassEnabled(); - + boolean bypass = mKeyguardBypassController.getBypassEnabled() + || mKeyguardBypassController.getUserHasDeviceEntryIntent(); if (!mUpdateMonitor.isDeviceInteractive()) { if (!mKeyguardViewController.isShowing()) { return bypass ? MODE_WAKE_AND_UNLOCK : MODE_ONLY_WAKE; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBypassController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBypassController.kt index 2cb0a3a28901..ec669711e2db 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBypassController.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBypassController.kt @@ -43,6 +43,7 @@ open class KeyguardBypassController : Dumpable, StackScrollAlgorithm.BypassContr @BypassOverride private val bypassOverride: Int private var hasFaceFeature: Boolean private var pendingUnlock: PendingUnlock? = null + var userHasDeviceEntryIntent: Boolean = false // ie: attempted udfps auth @IntDef( FACE_UNLOCK_BYPASS_NO_OVERRIDE, diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsControllerTest.java index 397341b197ee..36ca6642d9c0 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsControllerTest.java @@ -59,6 +59,7 @@ import com.android.systemui.keyguard.ScreenLifecycle; import com.android.systemui.plugins.FalsingManager; import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.statusbar.LockscreenShadeTransitionController; +import com.android.systemui.statusbar.phone.KeyguardBypassController; import com.android.systemui.statusbar.phone.StatusBar; import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager; import com.android.systemui.statusbar.policy.KeyguardStateController; @@ -136,6 +137,8 @@ public class UdfpsControllerTest extends SysuiTestCase { private UdfpsHapticsSimulator mUdfpsHapticsSimulator; @Mock private KeyguardStateController mKeyguardStateController; + @Mock + private KeyguardBypassController mKeyguardBypassController; private FakeExecutor mFgExecutor; @@ -204,7 +207,8 @@ public class UdfpsControllerTest extends SysuiTestCase { mVibrator, mUdfpsHapticsSimulator, Optional.of(mHbmProvider), - mKeyguardStateController); + mKeyguardStateController, + mKeyguardBypassController); verify(mFingerprintManager).setUdfpsOverlayController(mOverlayCaptor.capture()); mOverlayController = mOverlayCaptor.getValue(); verify(mScreenLifecycle).addObserver(mScreenObserverCaptor.capture()); |