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

Commit 8b5a7340 authored by Daniel Chapin's avatar Daniel Chapin Committed by Android (Google) Code Review
Browse files

Merge "Revert "KUM directly uses AuthController.isFaceEnrolled and...

Merge "Revert "KUM directly uses AuthController.isFaceEnrolled and isFingerprintEnrolled"" into udc-dev
parents 4b084316 3d285adb
Loading
Loading
Loading
Loading
+35 −19
Original line number Diff line number Diff line
@@ -396,6 +396,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab
    private int mFaceRunningState = BIOMETRIC_STATE_STOPPED;
    private boolean mIsDreaming;
    private boolean mLogoutEnabled;
    private boolean mIsFaceEnrolled;
    private int mActiveMobileDataSubscription = SubscriptionManager.INVALID_SUBSCRIPTION_ID;
    private int mPostureState = DEVICE_POSTURE_UNKNOWN;
    private FingerprintInteractiveToAuthProvider mFingerprintInteractiveToAuthProvider;
@@ -2572,6 +2573,16 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab
        }
    }

    private void updateFaceEnrolled(int userId) {
        final Boolean isFaceEnrolled = isFaceSupported()
                && mBiometricEnabledForUser.get(userId)
                && mAuthController.isFaceAuthEnrolled(userId);
        if (mIsFaceEnrolled != isFaceEnrolled) {
            mLogger.logFaceEnrolledUpdated(mIsFaceEnrolled, isFaceEnrolled);
        }
        mIsFaceEnrolled = isFaceEnrolled;
    }

    private boolean isFaceSupported() {
        return mFaceManager != null && !mFaceSensorProperties.isEmpty();
    }
@@ -2611,17 +2622,10 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab
    }

    /**
     * @return true if there's at least one face enrolled for the given user
     */
    private boolean isFaceEnrolled(int userId) {
        return mAuthController.isFaceAuthEnrolled(userId);
    }

    /**
     * @return true if there's at least one face enrolled for the current user
     * @return true if there's at least one face enrolled
     */
    public boolean isFaceEnrolled() {
        return isFaceEnrolled(getCurrentUser());
        return mIsFaceEnrolled;
    }

    private final UserTracker.Callback mUserChangedCallback = new UserTracker.Callback() {
@@ -3280,13 +3284,14 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab
    @SuppressLint("MissingPermission")
    @VisibleForTesting
    boolean isUnlockWithFingerprintPossible(int userId) {
        boolean newFpPossible = isFingerprintSupported()
                && !isFingerprintDisabled(userId) && mAuthController.isFingerprintEnrolled(userId);
        Boolean oldFpPossible = mIsUnlockWithFingerprintPossible.getOrDefault(userId, false);
        if (oldFpPossible != newFpPossible) {
            mLogger.logFpPossibleUpdated(userId, oldFpPossible, newFpPossible);
        }
        mIsUnlockWithFingerprintPossible.put(userId, newFpPossible);
        // TODO (b/242022358), make this rely on onEnrollmentChanged event and update it only once.
        boolean newFpEnrolled = isFingerprintSupported()
                && !isFingerprintDisabled(userId) && mFpm.hasEnrolledTemplates(userId);
        Boolean oldFpEnrolled = mIsUnlockWithFingerprintPossible.getOrDefault(userId, false);
        if (oldFpEnrolled != newFpEnrolled) {
            mLogger.logFpEnrolledUpdated(userId, oldFpEnrolled, newFpEnrolled);
        }
        mIsUnlockWithFingerprintPossible.put(userId, newFpEnrolled);
        return mIsUnlockWithFingerprintPossible.get(userId);
    }

@@ -3301,13 +3306,24 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab
    /**
     * @deprecated This is being migrated to use modern architecture.
     */
    @VisibleForTesting
    @Deprecated
    public boolean isUnlockWithFacePossible(int userId) {
    private boolean isUnlockWithFacePossible(int userId) {
        if (isFaceAuthInteractorEnabled()) {
            return getFaceAuthInteractor().canFaceAuthRun();
        }
        return isFaceSupported() && isFaceEnrolled(userId) && !isFaceDisabled(userId);
        return isFaceAuthEnabledForUser(userId) && !isFaceDisabled(userId);
    }

    /**
     * If face hardware is available, user has enrolled and enabled auth via setting.
     *
     * @deprecated This is being migrated to use modern architecture.
     */
    @Deprecated
    public boolean isFaceAuthEnabledForUser(int userId) {
        // TODO (b/242022358), make this rely on onEnrollmentChanged event and update it only once.
        updateFaceEnrolled(userId);
        return mIsFaceEnrolled;
    }

    private void stopListeningForFingerprint() {
+2 −2
Original line number Diff line number Diff line
@@ -630,7 +630,7 @@ constructor(@KeyguardUpdateMonitorLog private val logBuffer: LogBuffer) {
        )
    }

    fun logFpPossibleUpdated(userId: Int, oldValue: Boolean, newValue: Boolean) {
    fun logFpEnrolledUpdated(userId: Int, oldValue: Boolean, newValue: Boolean) {
        logBuffer.log(
            TAG,
            DEBUG,
@@ -639,7 +639,7 @@ constructor(@KeyguardUpdateMonitorLog private val logBuffer: LogBuffer) {
                bool1 = oldValue
                bool2 = newValue
            },
            { "Fp possible state changed for userId: $int1 old: $bool1, new: $bool2" }
            { "Fp enrolled state changed for userId: $int1 old: $bool1, new: $bool2" }
        )
    }

+3 −1
Original line number Diff line number Diff line
@@ -115,7 +115,9 @@ class KeyguardLiftController @Inject constructor(
        val onKeyguard = keyguardUpdateMonitor.isKeyguardVisible &&
                !statusBarStateController.isDozing

        val shouldListen = (onKeyguard || bouncerVisible) && keyguardUpdateMonitor.isFaceEnrolled
        val userId = KeyguardUpdateMonitor.getCurrentUser()
        val isFaceEnabled = keyguardUpdateMonitor.isFaceAuthEnabledForUser(userId)
        val shouldListen = (onKeyguard || bouncerVisible) && isFaceEnabled
        if (shouldListen != isListening) {
            isListening = shouldListen

+1 −1
Original line number Diff line number Diff line
@@ -240,7 +240,7 @@ public class KeyguardStateControllerImpl implements KeyguardStateController, Dum
                || (Build.IS_DEBUGGABLE && DEBUG_AUTH_WITH_ADB && mDebugUnlocked);
        boolean trustManaged = mKeyguardUpdateMonitor.getUserTrustIsManaged(user);
        boolean trusted = mKeyguardUpdateMonitor.getUserHasTrust(user);
        boolean faceAuthEnabled = mKeyguardUpdateMonitor.isFaceEnrolled();
        boolean faceAuthEnabled = mKeyguardUpdateMonitor.isFaceAuthEnabledForUser(user);
        boolean changed = secure != mSecure || canDismissLockScreen != mCanDismissLockScreen
                || trustManaged != mTrustManaged || mTrusted != trusted
                || mFaceAuthEnabled != faceAuthEnabled;
+8 −15
Original line number Diff line number Diff line
@@ -383,7 +383,6 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase {
    }

    private void setupFingerprintAuth(boolean isClass3) throws RemoteException {
        when(mAuthController.isFingerprintEnrolled(anyInt())).thenReturn(true);
        when(mFingerprintManager.isHardwareDetected()).thenReturn(true);
        when(mFingerprintManager.hasEnrolledTemplates(anyInt())).thenReturn(true);
        mFingerprintSensorProperties = List.of(
@@ -2693,42 +2692,33 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase {
    }
    @Test
    public void testFingerprintSensorProperties() throws RemoteException {
        // GIVEN no fingerprint sensor properties
        when(mAuthController.isFingerprintEnrolled(anyInt())).thenReturn(true);
        mFingerprintAuthenticatorsRegisteredCallback.onAllAuthenticatorsRegistered(
                new ArrayList<>());

        // THEN fingerprint is not possible
        assertThat(mKeyguardUpdateMonitor.isUnlockWithFingerprintPossible(
                KeyguardUpdateMonitor.getCurrentUser())).isFalse();

        // WHEN there are fingerprint sensor properties
        mFingerprintAuthenticatorsRegisteredCallback
                .onAllAuthenticatorsRegistered(mFingerprintSensorProperties);

        // THEN unlock with fp is possible & fingerprint starts listening
        verifyFingerprintAuthenticateCall();
        assertThat(mKeyguardUpdateMonitor.isUnlockWithFingerprintPossible(
                KeyguardUpdateMonitor.getCurrentUser())).isTrue();
        verifyFingerprintAuthenticateCall();
    }
    @Test
    public void testFaceSensorProperties() throws RemoteException {
        // GIVEN no face sensor properties
        when(mAuthController.isFaceAuthEnrolled(anyInt())).thenReturn(true);
        mFaceAuthenticatorsRegisteredCallback.onAllAuthenticatorsRegistered(new ArrayList<>());

        // THEN face is not possible
        assertThat(mKeyguardUpdateMonitor.isUnlockWithFacePossible(
        assertThat(mKeyguardUpdateMonitor.isFaceAuthEnabledForUser(
                KeyguardUpdateMonitor.getCurrentUser())).isFalse();

        // WHEN there are face sensor properties
        mFaceAuthenticatorsRegisteredCallback.onAllAuthenticatorsRegistered(mFaceSensorProperties);
        biometricsEnabledForCurrentUser();

        // THEN face is possible but face does NOT start listening immediately
        assertThat(mKeyguardUpdateMonitor.isUnlockWithFacePossible(
                KeyguardUpdateMonitor.getCurrentUser())).isTrue();
        verifyFaceAuthenticateNeverCalled();
        verifyFaceDetectNeverCalled();
        assertThat(mKeyguardUpdateMonitor.isFaceAuthEnabledForUser(
                KeyguardUpdateMonitor.getCurrentUser())).isTrue();
    }

    @Test
@@ -2801,6 +2791,9 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase {
    }

    private void mockCanBypassLockscreen(boolean canBypass) {
        // force update the isFaceEnrolled cache:
        mKeyguardUpdateMonitor.isFaceAuthEnabledForUser(getCurrentUser());

        mKeyguardUpdateMonitor.setKeyguardBypassController(mKeyguardBypassController);
        when(mKeyguardBypassController.canBypass()).thenReturn(canBypass);
    }