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

Commit 1b454303 authored by Chandru's avatar Chandru Committed by Chandru S
Browse files

Hide message on bouncer only if face auth actually runs

Other changes:
 - Also change NotificationPanelViewController to use the same API.

Bug: 20164843
Fixes: 249475000
Test: atest NotificationPanelViewControllerTest
Test: atest KeyguardSecurityContainerControllerTest
Test: atest KeyguardUpdateMonitorTest

Change-Id: I90cc46f8bba03b9d34f96cf6b902180ac5e8f8be
parent 8e1af257
Loading
Loading
Loading
Loading
+7 −4
Original line number Diff line number Diff line
@@ -219,14 +219,17 @@ public class KeyguardSecurityContainerController extends ViewController<Keyguard
    };


    private SwipeListener mSwipeListener = new SwipeListener() {
    private final SwipeListener mSwipeListener = new SwipeListener() {
        @Override
        public void onSwipeUp() {
            if (!mUpdateMonitor.isFaceDetectionRunning()) {
                mUpdateMonitor.requestFaceAuth(true, FaceAuthApiRequestReason.SWIPE_UP_ON_BOUNCER);
                boolean didFaceAuthRun = mUpdateMonitor.requestFaceAuth(true,
                        FaceAuthApiRequestReason.SWIPE_UP_ON_BOUNCER);
                mKeyguardSecurityCallback.userActivity();
                if (didFaceAuthRun) {
                    showMessage(null, null);
                }
            }
            if (mUpdateMonitor.isFaceEnrolled()) {
                mUpdateMonitor.requestActiveUnlock(
                        ActiveUnlockConfig.ACTIVE_UNLOCK_REQUEST_ORIGIN.UNLOCK_INTENT,
@@ -234,7 +237,7 @@ public class KeyguardSecurityContainerController extends ViewController<Keyguard
            }
        }
    };
    private ConfigurationController.ConfigurationListener mConfigurationListener =
    private final ConfigurationController.ConfigurationListener mConfigurationListener =
            new ConfigurationController.ConfigurationListener() {
                @Override
                public void onThemeChanged() {
+3 −1
Original line number Diff line number Diff line
@@ -2366,11 +2366,13 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab
     * @param userInitiatedRequest true if the user explicitly requested face auth
     * @param reason One of the reasons {@link FaceAuthApiRequestReason} on why this API is being
     * invoked.
     * @return current face auth detection state, true if it is running.
     */
    public void requestFaceAuth(boolean userInitiatedRequest,
    public boolean requestFaceAuth(boolean userInitiatedRequest,
            @FaceAuthApiRequestReason String reason) {
        mLogger.logFaceAuthRequested(userInitiatedRequest, reason);
        updateFaceListeningState(BIOMETRIC_ACTION_START, apiRequestReasonToUiEvent(reason));
        return isFaceDetectionRunning();
    }

    /**
+8 −9
Original line number Diff line number Diff line
@@ -3933,21 +3933,20 @@ public final class NotificationPanelViewController {
                    mShadeLog.v("onMiddleClicked on Keyguard, mDozingOnDown: false");
                    // Try triggering face auth, this "might" run. Check
                    // KeyguardUpdateMonitor#shouldListenForFace to see when face auth won't run.
                    mUpdateMonitor.requestFaceAuth(true,
                    boolean didFaceAuthRun = mUpdateMonitor.requestFaceAuth(true,
                            FaceAuthApiRequestReason.NOTIFICATION_PANEL_CLICKED);

                    if (didFaceAuthRun) {
                        mUpdateMonitor.requestActiveUnlock(
                                ActiveUnlockConfig.ACTIVE_UNLOCK_REQUEST_ORIGIN.UNLOCK_INTENT,
                                "lockScreenEmptySpaceTap");
                    } else {
                        mLockscreenGestureLogger.write(MetricsEvent.ACTION_LS_HINT,
                                0 /* lengthDp - N/A */, 0 /* velocityDp - N/A */);
                        mLockscreenGestureLogger
                                .log(LockscreenUiEvent.LOCKSCREEN_LOCK_SHOW_HINT);
                    if (!mUpdateMonitor.isFaceDetectionRunning()) {
                        startUnlockHintAnimation();
                    }
                    if (mUpdateMonitor.isFaceEnrolled()) {
                        mUpdateMonitor.requestActiveUnlock(
                                ActiveUnlockConfig.ACTIVE_UNLOCK_REQUEST_ORIGIN.UNLOCK_INTENT,
                                "lockScreenEmptySpaceTap");
                    }
                }
                return true;
            case StatusBarState.SHADE_LOCKED:
+60 −0
Original line number Diff line number Diff line
@@ -146,6 +146,8 @@ public class KeyguardSecurityContainerControllerTest extends SysuiTestCase {

    @Captor
    private ArgumentCaptor<KeyguardUpdateMonitorCallback> mKeyguardUpdateMonitorCallback;
    @Captor
    private ArgumentCaptor<KeyguardSecurityContainer.SwipeListener> mSwipeListenerArgumentCaptor;

    private Configuration mConfiguration;

@@ -475,6 +477,64 @@ public class KeyguardSecurityContainerControllerTest extends SysuiTestCase {
        verify(mKeyguardUpdateMonitor, never()).getUserHasTrust(anyInt());
    }

    @Test
    public void onSwipeUp_whenFaceDetectionIsNotRunning_initiatesFaceAuth() {
        KeyguardSecurityContainer.SwipeListener registeredSwipeListener =
                getRegisteredSwipeListener();
        when(mKeyguardUpdateMonitor.isFaceDetectionRunning()).thenReturn(false);
        setupGetSecurityView();

        registeredSwipeListener.onSwipeUp();

        verify(mKeyguardUpdateMonitor).requestFaceAuth(true,
                FaceAuthApiRequestReason.SWIPE_UP_ON_BOUNCER);
    }

    @Test
    public void onSwipeUp_whenFaceDetectionIsRunning_doesNotInitiateFaceAuth() {
        KeyguardSecurityContainer.SwipeListener registeredSwipeListener =
                getRegisteredSwipeListener();
        when(mKeyguardUpdateMonitor.isFaceDetectionRunning()).thenReturn(true);

        registeredSwipeListener.onSwipeUp();

        verify(mKeyguardUpdateMonitor, never())
                .requestFaceAuth(true,
                        FaceAuthApiRequestReason.SWIPE_UP_ON_BOUNCER);
    }

    @Test
    public void onSwipeUp_whenFaceDetectionIsTriggered_hidesBouncerMessage() {
        KeyguardSecurityContainer.SwipeListener registeredSwipeListener =
                getRegisteredSwipeListener();
        when(mKeyguardUpdateMonitor.requestFaceAuth(true,
                FaceAuthApiRequestReason.SWIPE_UP_ON_BOUNCER)).thenReturn(true);
        setupGetSecurityView();

        registeredSwipeListener.onSwipeUp();

        verify(mKeyguardPasswordViewControllerMock).showMessage(null, null);
    }

    @Test
    public void onSwipeUp_whenFaceDetectionIsNotTriggered_retainsBouncerMessage() {
        KeyguardSecurityContainer.SwipeListener registeredSwipeListener =
                getRegisteredSwipeListener();
        when(mKeyguardUpdateMonitor.requestFaceAuth(true,
                FaceAuthApiRequestReason.SWIPE_UP_ON_BOUNCER)).thenReturn(false);
        setupGetSecurityView();

        registeredSwipeListener.onSwipeUp();

        verify(mKeyguardPasswordViewControllerMock, never()).showMessage(null, null);
    }

    private KeyguardSecurityContainer.SwipeListener getRegisteredSwipeListener() {
        mKeyguardSecurityContainerController.onViewAttached();
        verify(mView).setSwipeListener(mSwipeListenerArgumentCaptor.capture());
        return mSwipeListenerArgumentCaptor.getValue();
    }

    private void setupConditionsToEnableSideFpsHint() {
        attachView();
        setSideFpsHintEnabledFromResources(true);
+31 −0
Original line number Diff line number Diff line
@@ -25,6 +25,7 @@ import static android.telephony.SubscriptionManager.NAME_SOURCE_CARRIER_ID;

import static com.android.internal.widget.LockPatternUtils.StrongAuthTracker.SOME_AUTH_REQUIRED_AFTER_USER_REQUEST;
import static com.android.internal.widget.LockPatternUtils.StrongAuthTracker.STRONG_AUTH_REQUIRED_AFTER_BOOT;
import static com.android.keyguard.FaceAuthApiRequestReason.NOTIFICATION_PANEL_CLICKED;
import static com.android.keyguard.KeyguardUpdateMonitor.DEFAULT_CANCEL_SIGNAL_TIMEOUT;

import static com.google.common.truth.Truth.assertThat;
@@ -647,6 +648,36 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase {
                KeyguardUpdateMonitor.StrongAuthTracker.STRONG_AUTH_REQUIRED_AFTER_TIMEOUT);
    }

    @Test
    public void requestFaceAuth_whenFaceAuthWasStarted_returnsTrue() throws RemoteException {
        // This satisfies all the preconditions to run face auth.
        keyguardNotGoingAway();
        currentUserIsPrimary();
        currentUserDoesNotHaveTrust();
        biometricsNotDisabledThroughDevicePolicyManager();
        biometricsEnabledForCurrentUser();
        userNotCurrentlySwitching();
        bouncerFullyVisibleAndNotGoingToSleep();
        mTestableLooper.processAllMessages();

        boolean didFaceAuthRun = mKeyguardUpdateMonitor.requestFaceAuth(true,
                NOTIFICATION_PANEL_CLICKED);

        assertThat(didFaceAuthRun).isTrue();
    }

    @Test
    public void requestFaceAuth_whenFaceAuthWasNotStarted_returnsFalse() throws RemoteException {
        // This ensures face auth won't run.
        biometricsDisabledForCurrentUser();
        mTestableLooper.processAllMessages();

        boolean didFaceAuthRun = mKeyguardUpdateMonitor.requestFaceAuth(true,
                NOTIFICATION_PANEL_CLICKED);

        assertThat(didFaceAuthRun).isFalse();
    }

    private void testStrongAuthExceptOnBouncer(int strongAuth) {
        when(mKeyguardBypassController.canBypass()).thenReturn(true);
        mKeyguardUpdateMonitor.setKeyguardBypassController(mKeyguardBypassController);
Loading