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

Commit 4356302a authored by Chandru S's avatar Chandru S Committed by Chandru
Browse files

Revert "Stop running face detection on bouncer if both face and fp are enrolled."

This reverts commit eabd9100.

Reason for revert: UX concerns that this might affect existing unlock
behavior

Bug: 247966043
Change-Id: I55efa4e7d8ffac5fd57c1e7558b5a99ae8abb4db
Test: atest KeyguardUpdateMonitorTest
parent 89bef839
Loading
Loading
Loading
Loading
+1 −2
Original line number Diff line number Diff line
@@ -57,11 +57,10 @@ data class KeyguardFaceListenModel(
    val faceLockedOut: Boolean,
    val fpLockedOut: Boolean,
    val goingToSleep: Boolean,
    val keyguardAwakeExcludingBouncerShowing: Boolean,
    val keyguardAwake: Boolean,
    val keyguardGoingAway: Boolean,
    val listeningForFaceAssistant: Boolean,
    val occludingAppRequestingFaceAuth: Boolean,
    val onlyFaceEnrolled: Boolean,
    val primaryUser: Boolean,
    val scanningAllowedByStrongAuth: Boolean,
    val secureCameraLaunched: Boolean,
+5 −15
Original line number Diff line number Diff line
@@ -2593,11 +2593,8 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab
        }

        final boolean statusBarShadeLocked = mStatusBarState == StatusBarState.SHADE_LOCKED;
        // mKeyguardIsVisible is true even when the bouncer is shown, we don't want to run face auth
        // on bouncer if both fp and fingerprint are enrolled.
        final boolean awakeKeyguardExcludingBouncerShowing = mKeyguardIsVisible
                && mDeviceInteractive && !mGoingToSleep
                && !statusBarShadeLocked && !mBouncerFullyShown;
        final boolean awakeKeyguard = mKeyguardIsVisible && mDeviceInteractive && !mGoingToSleep
                && !statusBarShadeLocked;
        final int user = getCurrentUser();
        final int strongAuth = mStrongAuthTracker.getStrongAuthForUser(user);
        final boolean isLockDown =
@@ -2637,16 +2634,15 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab
        final boolean faceDisabledForUser = isFaceDisabled(user);
        final boolean biometricEnabledForUser = mBiometricEnabledForUser.get(user);
        final boolean shouldListenForFaceAssistant = shouldListenForFaceAssistant();
        final boolean onlyFaceEnrolled = isOnlyFaceEnrolled();
        final boolean fpOrFaceIsLockedOut = isFaceLockedOut() || fpLockedout;

        // Only listen if this KeyguardUpdateMonitor belongs to the primary user. There is an
        // instance of KeyguardUpdateMonitor for each user but KeyguardUpdateMonitor is user-aware.
        final boolean shouldListen =
                ((mBouncerFullyShown && !mGoingToSleep && onlyFaceEnrolled)
                (mBouncerFullyShown && !mGoingToSleep
                        || mAuthInterruptActive
                        || mOccludingAppRequestingFace
                        || awakeKeyguardExcludingBouncerShowing
                        || awakeKeyguard
                        || shouldListenForFaceAssistant
                        || mAuthController.isUdfpsFingerDown()
                        || mUdfpsBouncerShowing)
@@ -2672,11 +2668,10 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab
                    isFaceLockedOut(),
                    fpLockedout,
                    mGoingToSleep,
                    awakeKeyguardExcludingBouncerShowing,
                    awakeKeyguard,
                    mKeyguardGoingAway,
                    shouldListenForFaceAssistant,
                    mOccludingAppRequestingFace,
                    onlyFaceEnrolled,
                    mIsPrimaryUser,
                    strongAuthAllowsScanning,
                    mSecureCameraLaunched,
@@ -2686,11 +2681,6 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab
        return shouldListen;
    }

    private boolean isOnlyFaceEnrolled() {
        return isFaceEnrolled()
                && !getCachedIsUnlockWithFingerprintPossible(sCurrentUser);
    }

    private void maybeLogListenerModelData(KeyguardListenModel model) {
        mLogger.logKeyguardListenerModel(model);

+1 −2
Original line number Diff line number Diff line
@@ -86,13 +86,12 @@ private fun faceModel(user: Int) = KeyguardFaceListenModel(
    becauseCannotSkipBouncer = false,
    biometricSettingEnabledForUser = false,
    bouncerFullyShown = false,
    onlyFaceEnrolled = false,
    faceAuthenticated = false,
    faceDisabled = false,
    faceLockedOut = false,
    fpLockedOut = false,
    goingToSleep = false,
    keyguardAwakeExcludingBouncerShowing = false,
    keyguardAwake = false,
    keyguardGoingAway = false,
    listeningForFaceAssistant = false,
    occludingAppRequestingFaceAuth = false,
+8 −85
Original line number Diff line number Diff line
@@ -212,8 +212,6 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase {
            mBiometricEnabledCallbackArgCaptor;
    @Captor
    private ArgumentCaptor<FaceManager.AuthenticationCallback> mAuthenticationCallbackCaptor;
    @Captor
    private ArgumentCaptor<CancellationSignal> mCancellationSignalCaptor;

    // Direct executor
    private final Executor mBackgroundExecutor = Runnable::run;
@@ -596,13 +594,11 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase {

    @Test
    public void testTriesToAuthenticate_whenBouncer() {
        fingerprintIsNotEnrolled();
        faceAuthEnabled();
        setKeyguardBouncerVisibility(true);

        verify(mFaceManager).authenticate(any(), any(), any(), any(), anyInt(), anyBoolean());
        verify(mFaceManager, atLeastOnce()).isHardwareDetected();
        verify(mFaceManager, atLeastOnce()).hasEnrolledTemplates(anyInt());
        verify(mFaceManager).isHardwareDetected();
        verify(mFaceManager).hasEnrolledTemplates(anyInt());
    }

    @Test
@@ -1237,9 +1233,7 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase {
    public void testShouldListenForFace_whenFaceIsAlreadyAuthenticated_returnsFalse()
            throws RemoteException {
        // Face auth should run when the following is true.
        faceAuthEnabled();
        bouncerFullyVisibleAndNotGoingToSleep();
        fingerprintIsNotEnrolled();
        keyguardNotGoingAway();
        currentUserIsPrimary();
        strongAuthNotRequired();
@@ -1266,7 +1260,7 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase {
        mKeyguardUpdateMonitor =
                new TestableKeyguardUpdateMonitor(mSpiedContext);

        // Preconditions for face auth to run
        // Face auth should run when the following is true.
        keyguardNotGoingAway();
        bouncerFullyVisibleAndNotGoingToSleep();
        strongAuthNotRequired();
@@ -1283,7 +1277,7 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase {
    @Test
    public void testShouldListenForFace_whenStrongAuthDoesNotAllowScanning_returnsFalse()
            throws RemoteException {
        // Preconditions for face auth to run
        // Face auth should run when the following is true.
        keyguardNotGoingAway();
        bouncerFullyVisibleAndNotGoingToSleep();
        currentUserIsPrimary();
@@ -1304,11 +1298,8 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase {
    @Test
    public void testShouldListenForFace_whenBiometricsDisabledForUser_returnsFalse()
            throws RemoteException {
        // Preconditions for face auth to run
        faceAuthEnabled();
        keyguardNotGoingAway();
        bouncerFullyVisibleAndNotGoingToSleep();
        fingerprintIsNotEnrolled();
        currentUserIsPrimary();
        currentUserDoesNotHaveTrust();
        biometricsNotDisabledThroughDevicePolicyManager();
@@ -1328,11 +1319,9 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase {
    @Test
    public void testShouldListenForFace_whenUserCurrentlySwitching_returnsFalse()
            throws RemoteException {
        // Preconditions for face auth to run
        faceAuthEnabled();
        // Face auth should run when the following is true.
        keyguardNotGoingAway();
        bouncerFullyVisibleAndNotGoingToSleep();
        fingerprintIsNotEnrolled();
        currentUserIsPrimary();
        currentUserDoesNotHaveTrust();
        biometricsNotDisabledThroughDevicePolicyManager();
@@ -1351,11 +1340,8 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase {
    @Test
    public void testShouldListenForFace_whenSecureCameraLaunched_returnsFalse()
            throws RemoteException {
        // Preconditions for face auth to run
        faceAuthEnabled();
        keyguardNotGoingAway();
        bouncerFullyVisibleAndNotGoingToSleep();
        fingerprintIsNotEnrolled();
        currentUserIsPrimary();
        currentUserDoesNotHaveTrust();
        biometricsNotDisabledThroughDevicePolicyManager();
@@ -1374,7 +1360,7 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase {
    @Test
    public void testShouldListenForFace_whenOccludingAppRequestsFaceAuth_returnsTrue()
            throws RemoteException {
        // Preconditions for face auth to run
        // Face auth should run when the following is true.
        keyguardNotGoingAway();
        bouncerFullyVisibleAndNotGoingToSleep();
        currentUserIsPrimary();
@@ -1397,8 +1383,7 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase {
    @Test
    public void testShouldListenForFace_whenBouncerShowingAndDeviceIsAwake_returnsTrue()
            throws RemoteException {
        // Preconditions for face auth to run
        faceAuthEnabled();
        // Face auth should run when the following is true.
        keyguardNotGoingAway();
        currentUserIsPrimary();
        currentUserDoesNotHaveTrust();
@@ -1410,7 +1395,6 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase {
        assertThat(mKeyguardUpdateMonitor.shouldListenForFace()).isFalse();

        bouncerFullyVisibleAndNotGoingToSleep();
        fingerprintIsNotEnrolled();
        mTestableLooper.processAllMessages();

        assertThat(mKeyguardUpdateMonitor.shouldListenForFace()).isTrue();
@@ -1419,7 +1403,7 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase {
    @Test
    public void testShouldListenForFace_whenAuthInterruptIsActive_returnsTrue()
            throws RemoteException {
        // Preconditions for face auth to run
        // Face auth should run when the following is true.
        keyguardNotGoingAway();
        currentUserIsPrimary();
        currentUserDoesNotHaveTrust();
@@ -1445,7 +1429,6 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase {
        biometricsNotDisabledThroughDevicePolicyManager();
        biometricsEnabledForCurrentUser();
        userNotCurrentlySwitching();
        bouncerFullyVisible();

        statusBarShadeIsLocked();
        mTestableLooper.processAllMessages();
@@ -1459,9 +1442,6 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase {
        keyguardIsVisible();
        assertThat(mKeyguardUpdateMonitor.shouldListenForFace()).isFalse();
        statusBarShadeIsNotLocked();
        assertThat(mKeyguardUpdateMonitor.shouldListenForFace()).isFalse();
        bouncerNotFullyVisible();

        assertThat(mKeyguardUpdateMonitor.shouldListenForFace()).isTrue();
    }

@@ -1522,44 +1502,6 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase {
        assertThat(mKeyguardUpdateMonitor.shouldListenForFace()).isFalse();
    }

    @Test
    public void testBouncerVisibility_whenBothFingerprintAndFaceIsEnrolled_stopsFaceAuth()
            throws RemoteException {
        // Both fingerprint and face are enrolled by default
        // Preconditions for face auth to run
        keyguardNotGoingAway();
        currentUserIsPrimary();
        currentUserDoesNotHaveTrust();
        biometricsNotDisabledThroughDevicePolicyManager();
        biometricsEnabledForCurrentUser();
        userNotCurrentlySwitching();
        deviceNotGoingToSleep();
        deviceIsInteractive();
        statusBarShadeIsNotLocked();
        keyguardIsVisible();

        mTestableLooper.processAllMessages();
        clearInvocations(mUiEventLogger);

        assertThat(mKeyguardUpdateMonitor.shouldListenForFace()).isTrue();

        mKeyguardUpdateMonitor.requestFaceAuth(true,
                FaceAuthApiRequestReason.UDFPS_POINTER_DOWN);

        verify(mFaceManager).authenticate(any(),
                mCancellationSignalCaptor.capture(),
                mAuthenticationCallbackCaptor.capture(),
                any(),
                anyInt(),
                anyBoolean());
        CancellationSignal cancelSignal = mCancellationSignalCaptor.getValue();

        bouncerFullyVisible();
        mTestableLooper.processAllMessages();

        assertThat(cancelSignal.isCanceled()).isTrue();
    }

    @Test
    public void testFingerprintCanAuth_whenCancellationNotReceivedAndAuthFailed() {
        mKeyguardUpdateMonitor.dispatchStartedWakingUp();
@@ -1623,21 +1565,6 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase {
                .onAuthenticationError(FaceManager.FACE_ERROR_LOCKOUT_PERMANENT, "");
    }

    private void faceAuthEnabled() {
        // this ensures KeyguardUpdateMonitor updates the cached mIsFaceEnrolled flag using the
        // face manager mock wire-up in setup()
        mKeyguardUpdateMonitor.isFaceAuthEnabledForUser(mCurrentUserId);
    }

    private void fingerprintIsNotEnrolled() {
        when(mFingerprintManager.hasEnrolledTemplates(mCurrentUserId)).thenReturn(false);
        // This updates the cached fingerprint state.
        // There is no straightforward API to update the fingerprint state.
        // It currently works updates after enrollment changes because something else invokes
        // startListeningForFingerprint(), which internally calls this method.
        mKeyguardUpdateMonitor.isUnlockWithFingerprintPossible(mCurrentUserId);
    }

    private void statusBarShadeIsNotLocked() {
        mStatusBarStateListener.onStateChanged(StatusBarState.KEYGUARD);
    }
@@ -1744,10 +1671,6 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase {
        mKeyguardUpdateMonitor.dispatchStartedWakingUp();
    }

    private void bouncerNotFullyVisible() {
        setKeyguardBouncerVisibility(false);
    }

    private void bouncerFullyVisible() {
        setKeyguardBouncerVisibility(true);
    }