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

Commit 002a8542 authored by Beverly's avatar Beverly Committed by Beverly Tai
Browse files

Update FP listening state on keyguardGoingAway

And handleFinishedGoingToSleep. This goes back to earlier behavior when
we used to always update the fingerprint listening states when
keyguardGoingAway and finishedGoingToSleep signals were sent.

A bug was introduced when ensuring face auth would only STOP when
keyguardGoingAway & finishedGoingToSleep signals were sent. Since
face and fingerprint are different, we separate their logic in this CL.

Also fixes test failure (b/264953793).

Test: atest KeyguardUpdateMonitorTest
Test: manually see that fingerprint listening state starts quickly
after pressing the power button to screen off
Bug: 261025550
Fixes: 264953793

Change-Id: If5e5d2132640d77a5eaa5765d932c6509f8d7bc8
parent eca628a7
Loading
Loading
Loading
Loading
+8 −5
Original line number Original line Diff line number Diff line
@@ -696,8 +696,11 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab
     */
     */
    public void setKeyguardGoingAway(boolean goingAway) {
    public void setKeyguardGoingAway(boolean goingAway) {
        mKeyguardGoingAway = goingAway;
        mKeyguardGoingAway = goingAway;
        // This is set specifically to stop face authentication from running.
        if (mKeyguardGoingAway) {
        updateBiometricListeningState(BIOMETRIC_ACTION_STOP, FACE_AUTH_STOPPED_KEYGUARD_GOING_AWAY);
            updateFaceListeningState(BIOMETRIC_ACTION_STOP,
                    FACE_AUTH_STOPPED_KEYGUARD_GOING_AWAY);
        }
        updateFingerprintListeningState(BIOMETRIC_ACTION_UPDATE);
    }
    }


    /**
    /**
@@ -1935,9 +1938,9 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab
                cb.onFinishedGoingToSleep(arg1);
                cb.onFinishedGoingToSleep(arg1);
            }
            }
        }
        }
        // This is set specifically to stop face authentication from running.
        updateFaceListeningState(BIOMETRIC_ACTION_STOP,
        updateBiometricListeningState(BIOMETRIC_ACTION_STOP,
                FACE_AUTH_STOPPED_FINISHED_GOING_TO_SLEEP);
                FACE_AUTH_STOPPED_FINISHED_GOING_TO_SLEEP);
        updateFingerprintListeningState(BIOMETRIC_ACTION_UPDATE);
    }
    }


    private void handleScreenTurnedOff() {
    private void handleScreenTurnedOff() {
@@ -2704,7 +2707,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab
                    mFingerprintInteractiveToAuthProvider != null &&
                    mFingerprintInteractiveToAuthProvider != null &&
                            mFingerprintInteractiveToAuthProvider.isEnabled(getCurrentUser());
                            mFingerprintInteractiveToAuthProvider.isEnabled(getCurrentUser());
            shouldListenSideFpsState =
            shouldListenSideFpsState =
                    interactiveToAuthEnabled ? isDeviceInteractive() : true;
                    interactiveToAuthEnabled ? isDeviceInteractive() && !mGoingToSleep : true;
        }
        }


        boolean shouldListen = shouldListenKeyguardState && shouldListenUserState
        boolean shouldListen = shouldListenKeyguardState && shouldListenUserState
+61 −7
Original line number Original line Diff line number Diff line
@@ -93,6 +93,7 @@ import android.os.PowerManager;
import android.os.RemoteException;
import android.os.RemoteException;
import android.os.UserHandle;
import android.os.UserHandle;
import android.os.UserManager;
import android.os.UserManager;
import android.provider.Settings;
import android.service.dreams.IDreamManager;
import android.service.dreams.IDreamManager;
import android.service.trust.TrustAgentService;
import android.service.trust.TrustAgentService;
import android.telephony.ServiceState;
import android.telephony.ServiceState;
@@ -1254,7 +1255,7 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase {
    }
    }


    @Test
    @Test
    public void testStartsListeningForSfps_whenKeyguardIsVisible_ifRequireScreenOnToAuthEnabled()
    public void startsListeningForSfps_whenKeyguardIsVisible_ifRequireInteractiveToAuthEnabled()
            throws RemoteException {
            throws RemoteException {
        // SFPS supported and enrolled
        // SFPS supported and enrolled
        final ArrayList<FingerprintSensorPropertiesInternal> props = new ArrayList<>();
        final ArrayList<FingerprintSensorPropertiesInternal> props = new ArrayList<>();
@@ -1262,12 +1263,9 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase {
        when(mAuthController.getSfpsProps()).thenReturn(props);
        when(mAuthController.getSfpsProps()).thenReturn(props);
        when(mAuthController.isSfpsEnrolled(anyInt())).thenReturn(true);
        when(mAuthController.isSfpsEnrolled(anyInt())).thenReturn(true);


        // WHEN require screen on to auth is disabled, and keyguard is not awake
        // WHEN require interactive to auth is disabled, and keyguard is not awake
        when(mInteractiveToAuthProvider.isEnabled(anyInt())).thenReturn(false);
        when(mInteractiveToAuthProvider.isEnabled(anyInt())).thenReturn(false);


        mContext.getOrCreateTestableResources().addOverride(
                com.android.internal.R.bool.config_requireScreenOnToAuthEnabled, true);

        // Preconditions for sfps auth to run
        // Preconditions for sfps auth to run
        keyguardNotGoingAway();
        keyguardNotGoingAway();
        currentUserIsPrimary();
        currentUserIsPrimary();
@@ -1282,8 +1280,8 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase {
        // THEN we should listen for sfps when screen off, because require screen on is disabled
        // THEN we should listen for sfps when screen off, because require screen on is disabled
        assertThat(mKeyguardUpdateMonitor.shouldListenForFingerprint(false)).isTrue();
        assertThat(mKeyguardUpdateMonitor.shouldListenForFingerprint(false)).isTrue();


        // WHEN require screen on to auth is enabled, and keyguard is not awake
        // WHEN require interactive to auth is enabled, and keyguard is not awake
        when(mInteractiveToAuthProvider.isEnabled(anyInt())).thenReturn(false);
        when(mInteractiveToAuthProvider.isEnabled(anyInt())).thenReturn(true);


        // THEN we shouldn't listen for sfps when screen off, because require screen on is enabled
        // THEN we shouldn't listen for sfps when screen off, because require screen on is enabled
        assertThat(mKeyguardUpdateMonitor.shouldListenForFingerprint(false)).isFalse();
        assertThat(mKeyguardUpdateMonitor.shouldListenForFingerprint(false)).isFalse();
@@ -1297,6 +1295,62 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase {
        assertThat(mKeyguardUpdateMonitor.shouldListenForFingerprint(false)).isTrue();
        assertThat(mKeyguardUpdateMonitor.shouldListenForFingerprint(false)).isTrue();
    }
    }


    @Test
    public void notListeningForSfps_whenGoingToSleep_ifRequireInteractiveToAuthEnabled()
            throws RemoteException {
        // GIVEN SFPS supported and enrolled
        final ArrayList<FingerprintSensorPropertiesInternal> props = new ArrayList<>();
        props.add(newFingerprintSensorPropertiesInternal(TYPE_POWER_BUTTON));
        when(mAuthController.getSfpsProps()).thenReturn(props);
        when(mAuthController.isSfpsEnrolled(anyInt())).thenReturn(true);

        // GIVEN Preconditions for sfps auth to run
        keyguardNotGoingAway();
        currentUserIsPrimary();
        currentUserDoesNotHaveTrust();
        biometricsNotDisabledThroughDevicePolicyManager();
        biometricsEnabledForCurrentUser();
        userNotCurrentlySwitching();
        statusBarShadeIsLocked();

        // WHEN require interactive to auth is enabled & keyguard is going to sleep
        when(mInteractiveToAuthProvider.isEnabled(anyInt())).thenReturn(true);
        deviceGoingToSleep();

        mTestableLooper.processAllMessages();

        // THEN we should NOT listen for sfps because device is going to sleep
        assertThat(mKeyguardUpdateMonitor.shouldListenForFingerprint(false)).isFalse();
    }

    @Test
    public void listeningForSfps_whenGoingToSleep_ifRequireInteractiveToAuthDisabled()
            throws RemoteException {
        // GIVEN SFPS supported and enrolled
        final ArrayList<FingerprintSensorPropertiesInternal> props = new ArrayList<>();
        props.add(newFingerprintSensorPropertiesInternal(TYPE_POWER_BUTTON));
        when(mAuthController.getSfpsProps()).thenReturn(props);
        when(mAuthController.isSfpsEnrolled(anyInt())).thenReturn(true);

        // GIVEN Preconditions for sfps auth to run
        keyguardNotGoingAway();
        currentUserIsPrimary();
        currentUserDoesNotHaveTrust();
        biometricsNotDisabledThroughDevicePolicyManager();
        biometricsEnabledForCurrentUser();
        userNotCurrentlySwitching();
        statusBarShadeIsLocked();

        // WHEN require interactive to auth is disabled & keyguard is going to sleep
        when(mInteractiveToAuthProvider.isEnabled(anyInt())).thenReturn(false);
        deviceGoingToSleep();

        mTestableLooper.processAllMessages();

        // THEN we should listen for sfps because screen on to auth is  disabled
        assertThat(mKeyguardUpdateMonitor.shouldListenForFingerprint(false)).isTrue();
    }

    private FingerprintSensorPropertiesInternal newFingerprintSensorPropertiesInternal(
    private FingerprintSensorPropertiesInternal newFingerprintSensorPropertiesInternal(
            @FingerprintSensorProperties.SensorType int sensorType) {
            @FingerprintSensorProperties.SensorType int sensorType) {
        return new FingerprintSensorPropertiesInternal(
        return new FingerprintSensorPropertiesInternal(