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

Commit 12b171ee authored by Beverly's avatar Beverly
Browse files

KUM directly uses AuthController.isFaceEnrolled and isFingerprintEnrolled

Instead of locally caching the information.

Test: atest KeyguardUpdateMonitorTest
Fixes: 242022358
Change-Id: I5c55d7613e24173df8ab6c1207f47e383dc589d7
parent e691f596
Loading
Loading
Loading
Loading
+19 −35
Original line number Diff line number Diff line
@@ -396,7 +396,6 @@ 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;
@@ -2573,16 +2572,6 @@ 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();
    }
@@ -2622,10 +2611,17 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab
    }

    /**
     * @return true if there's at least one face enrolled
     * @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
     */
    public boolean isFaceEnrolled() {
        return mIsFaceEnrolled;
        return isFaceEnrolled(getCurrentUser());
    }

    private final UserTracker.Callback mUserChangedCallback = new UserTracker.Callback() {
@@ -3284,14 +3280,13 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab
    @SuppressLint("MissingPermission")
    @VisibleForTesting
    boolean isUnlockWithFingerprintPossible(int userId) {
        // 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);
        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);
        return mIsUnlockWithFingerprintPossible.get(userId);
    }

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

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

    fun logFpEnrolledUpdated(userId: Int, oldValue: Boolean, newValue: Boolean) {
    fun logFpPossibleUpdated(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 enrolled state changed for userId: $int1 old: $bool1, new: $bool2" }
            { "Fp possible state changed for userId: $int1 old: $bool1, new: $bool2" }
        )
    }

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

        val userId = KeyguardUpdateMonitor.getCurrentUser()
        val isFaceEnabled = keyguardUpdateMonitor.isFaceAuthEnabledForUser(userId)
        val shouldListen = (onKeyguard || bouncerVisible) && isFaceEnabled
        val shouldListen = (onKeyguard || bouncerVisible) && keyguardUpdateMonitor.isFaceEnrolled
        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.isFaceAuthEnabledForUser(user);
        boolean faceAuthEnabled = mKeyguardUpdateMonitor.isFaceEnrolled();
        boolean changed = secure != mSecure || canDismissLockScreen != mCanDismissLockScreen
                || trustManaged != mTrustManaged || mTrusted != trusted
                || mFaceAuthEnabled != faceAuthEnabled;
+15 −8
Original line number Diff line number Diff line
@@ -383,6 +383,7 @@ 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(
@@ -2692,33 +2693,42 @@ 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);

        verifyFingerprintAuthenticateCall();
        // THEN unlock with fp is possible & fingerprint starts listening
        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<>());

        assertThat(mKeyguardUpdateMonitor.isFaceAuthEnabledForUser(
        // THEN face is not possible
        assertThat(mKeyguardUpdateMonitor.isUnlockWithFacePossible(
                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
@@ -2791,9 +2801,6 @@ 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);
    }