Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f2e79595 authored by Beverly's avatar Beverly Committed by Beverly Tai
Browse files

SysUI co-ex updates

- Attempt face auth again on udfps start if we're not already
running face auth
- Use udfps touch, as an intent for device entry - so if udfps fails,
but face auth succeeds, enter the device (even if face auth is
non-bypass)

Test: manual
Bug: 193089985
Fixes: 193554105
Change-Id: Ied977fec9009265dac89b7e24c1075ceb2905bfd
Merged-In: Ied977fec9009265dac89b7e24c1075ceb2905bfd
parent dea99bf5
Loading
Loading
Loading
Loading
+32 −22
Original line number Original line Diff line number Diff line
@@ -1431,6 +1431,9 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab
                @Override
                @Override
                public void onAuthenticationFailed() {
                public void onAuthenticationFailed() {
                    handleFaceAuthFailed();
                    handleFaceAuthFailed();
                    if (mKeyguardBypassController != null) {
                        mKeyguardBypassController.setUserHasDeviceEntryIntent(false);
                    }
                }
                }


                @Override
                @Override
@@ -1438,6 +1441,10 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab
                    Trace.beginSection("KeyguardUpdateMonitor#onAuthenticationSucceeded");
                    Trace.beginSection("KeyguardUpdateMonitor#onAuthenticationSucceeded");
                    handleFaceAuthenticated(result.getUserId(), result.isStrongBiometric());
                    handleFaceAuthenticated(result.getUserId(), result.isStrongBiometric());
                    Trace.endSection();
                    Trace.endSection();

                    if (mKeyguardBypassController != null) {
                        mKeyguardBypassController.setUserHasDeviceEntryIntent(false);
                    }
                }
                }


                @Override
                @Override
@@ -1448,6 +1455,9 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab
                @Override
                @Override
                public void onAuthenticationError(int errMsgId, CharSequence errString) {
                public void onAuthenticationError(int errMsgId, CharSequence errString) {
                    handleFaceError(errMsgId, errString.toString());
                    handleFaceError(errMsgId, errString.toString());
                    if (mKeyguardBypassController != null) {
                        mKeyguardBypassController.setUserHasDeviceEntryIntent(false);
                    }
                }
                }


                @Override
                @Override
+24 −8
Original line number Original line Diff line number Diff line
@@ -68,6 +68,7 @@ import com.android.systemui.keyguard.ScreenLifecycle;
import com.android.systemui.plugins.FalsingManager;
import com.android.systemui.plugins.FalsingManager;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.statusbar.LockscreenShadeTransitionController;
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.StatusBar;
import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager;
import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager;
import com.android.systemui.statusbar.policy.KeyguardStateController;
import com.android.systemui.statusbar.policy.KeyguardStateController;
@@ -120,6 +121,7 @@ public class UdfpsController implements DozeReceiver {
    @NonNull private final AccessibilityManager mAccessibilityManager;
    @NonNull private final AccessibilityManager mAccessibilityManager;
    @NonNull private final LockscreenShadeTransitionController mLockscreenShadeTransitionController;
    @NonNull private final LockscreenShadeTransitionController mLockscreenShadeTransitionController;
    @Nullable private final UdfpsHbmProvider mHbmProvider;
    @Nullable private final UdfpsHbmProvider mHbmProvider;
    @NonNull private final KeyguardBypassController mKeyguardBypassController;
    @VisibleForTesting @NonNull final BiometricOrientationEventListener mOrientationListener;
    @VisibleForTesting @NonNull final BiometricOrientationEventListener mOrientationListener;
    // Currently the UdfpsController supports a single UDFPS sensor. If devices have multiple
    // 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.
    // 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;
                    handled = true;
                }
                }
                if ((withinSensorArea || fromUdfpsView) && shouldTryToDismissKeyguard()) {
                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 */);
                    mKeyguardViewManager.notifyKeyguardAuthenticated(false /* strongAuth */);
                    mAttemptedToDismissKeyguard = true;
                    mAttemptedToDismissKeyguard = true;
                }
                }
@@ -414,6 +419,16 @@ public class UdfpsController implements DozeReceiver {
                    boolean actionMoveWithinSensorArea =
                    boolean actionMoveWithinSensorArea =
                            isWithinSensorArea(udfpsView, event.getX(idx), event.getY(idx),
                            isWithinSensorArea(udfpsView, event.getX(idx), event.getY(idx),
                                fromUdfpsView);
                                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 (actionMoveWithinSensorArea) {
                        if (mVelocityTracker == null) {
                        if (mVelocityTracker == null) {
                            // touches could be injected, so the velocity tracker may not have
                            // 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");
                        Log.v(TAG, "onTouch | finger outside");
                        onFingerUp();
                        onFingerUp();
                    }
                    }
                    if ((fromUdfpsView || actionMoveWithinSensorArea)
                            && shouldTryToDismissKeyguard()) {
                        Log.v(TAG, "onTouch | dismiss keyguard from ACTION_MOVE");
                        mKeyguardViewManager.notifyKeyguardAuthenticated(false /* strongAuth */);
                        mAttemptedToDismissKeyguard = true;
                    }
                }
                }
                Trace.endSection();
                Trace.endSection();
                break;
                break;
@@ -509,7 +518,8 @@ public class UdfpsController implements DozeReceiver {
            @Nullable Vibrator vibrator,
            @Nullable Vibrator vibrator,
            @NonNull UdfpsHapticsSimulator udfpsHapticsSimulator,
            @NonNull UdfpsHapticsSimulator udfpsHapticsSimulator,
            @NonNull Optional<UdfpsHbmProvider> hbmProvider,
            @NonNull Optional<UdfpsHbmProvider> hbmProvider,
            @NonNull KeyguardStateController keyguardStateController) {
            @NonNull KeyguardStateController keyguardStateController,
            @NonNull KeyguardBypassController keyguardBypassController) {
        mContext = context;
        mContext = context;
        mExecution = execution;
        mExecution = execution;
        // TODO (b/185124905): inject main handler and vibrator once done prototyping
        // TODO (b/185124905): inject main handler and vibrator once done prototyping
@@ -539,6 +549,7 @@ public class UdfpsController implements DozeReceiver {
            onOrientationChanged();
            onOrientationChanged();
            return Unit.INSTANCE;
            return Unit.INSTANCE;
        });
        });
        mKeyguardBypassController = keyguardBypassController;


        mSensorProps = findFirstUdfps();
        mSensorProps = findFirstUdfps();
        // At least one UDFPS sensor exists
        // 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) {
    private void onFingerDown(int x, int y, float minor, float major) {
        mExecution.assertIsMainThread();
        mExecution.assertIsMainThread();
        mKeyguardBypassController.setUserHasDeviceEntryIntent(true);
        if (mView == null) {
        if (mView == null) {
            Log.w(TAG, "Null view in onFingerDown");
            Log.w(TAG, "Null view in onFingerDown");
            return;
            return;
        }
        }
        if (!mOnFingerDown) {
        if (!mOnFingerDown) {
            playStartHaptic();
            playStartHaptic();

            if (!mKeyguardUpdateMonitor.isFaceDetectionRunning()) {
                mKeyguardUpdateMonitor.requestFaceAuth(/* userInitiatedRequest */ false);
            }
        }
        }
        mOnFingerDown = true;
        mOnFingerDown = true;
        mFingerprintManager.onPointerDown(mSensorProps.sensorId, x, y, minor, major);
        mFingerprintManager.onPointerDown(mSensorProps.sensorId, x, y, minor, major);
+2 −2
Original line number Original line Diff line number Diff line
@@ -564,8 +564,8 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback imp
        boolean unlockingAllowed =
        boolean unlockingAllowed =
                mUpdateMonitor.isUnlockingWithBiometricAllowed(isStrongBiometric);
                mUpdateMonitor.isUnlockingWithBiometricAllowed(isStrongBiometric);
        boolean deviceDreaming = mUpdateMonitor.isDreaming();
        boolean deviceDreaming = mUpdateMonitor.isDreaming();
        boolean bypass = mKeyguardBypassController.getBypassEnabled();
        boolean bypass = mKeyguardBypassController.getBypassEnabled()

                || mKeyguardBypassController.getUserHasDeviceEntryIntent();
        if (!mUpdateMonitor.isDeviceInteractive()) {
        if (!mUpdateMonitor.isDeviceInteractive()) {
            if (!mKeyguardViewController.isShowing()) {
            if (!mKeyguardViewController.isShowing()) {
                return bypass ? MODE_WAKE_AND_UNLOCK : MODE_ONLY_WAKE;
                return bypass ? MODE_WAKE_AND_UNLOCK : MODE_ONLY_WAKE;
+1 −0
Original line number Original line Diff line number Diff line
@@ -43,6 +43,7 @@ open class KeyguardBypassController : Dumpable, StackScrollAlgorithm.BypassContr
    @BypassOverride private val bypassOverride: Int
    @BypassOverride private val bypassOverride: Int
    private var hasFaceFeature: Boolean
    private var hasFaceFeature: Boolean
    private var pendingUnlock: PendingUnlock? = null
    private var pendingUnlock: PendingUnlock? = null
    var userHasDeviceEntryIntent: Boolean = false // ie: attempted udfps auth


    @IntDef(
    @IntDef(
        FACE_UNLOCK_BYPASS_NO_OVERRIDE,
        FACE_UNLOCK_BYPASS_NO_OVERRIDE,
+5 −1
Original line number Original line Diff line number Diff line
@@ -59,6 +59,7 @@ import com.android.systemui.keyguard.ScreenLifecycle;
import com.android.systemui.plugins.FalsingManager;
import com.android.systemui.plugins.FalsingManager;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.statusbar.LockscreenShadeTransitionController;
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.StatusBar;
import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager;
import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager;
import com.android.systemui.statusbar.policy.KeyguardStateController;
import com.android.systemui.statusbar.policy.KeyguardStateController;
@@ -136,6 +137,8 @@ public class UdfpsControllerTest extends SysuiTestCase {
    private UdfpsHapticsSimulator mUdfpsHapticsSimulator;
    private UdfpsHapticsSimulator mUdfpsHapticsSimulator;
    @Mock
    @Mock
    private KeyguardStateController mKeyguardStateController;
    private KeyguardStateController mKeyguardStateController;
    @Mock
    private KeyguardBypassController mKeyguardBypassController;


    private FakeExecutor mFgExecutor;
    private FakeExecutor mFgExecutor;


@@ -204,7 +207,8 @@ public class UdfpsControllerTest extends SysuiTestCase {
                mVibrator,
                mVibrator,
                mUdfpsHapticsSimulator,
                mUdfpsHapticsSimulator,
                Optional.of(mHbmProvider),
                Optional.of(mHbmProvider),
                mKeyguardStateController);
                mKeyguardStateController,
                mKeyguardBypassController);
        verify(mFingerprintManager).setUdfpsOverlayController(mOverlayCaptor.capture());
        verify(mFingerprintManager).setUdfpsOverlayController(mOverlayCaptor.capture());
        mOverlayController = mOverlayCaptor.getValue();
        mOverlayController = mOverlayCaptor.getValue();
        verify(mScreenLifecycle).addObserver(mScreenObserverCaptor.capture());
        verify(mScreenLifecycle).addObserver(mScreenObserverCaptor.capture());