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

Commit 4befb749 authored by Lucas Dupin's avatar Lucas Dupin
Browse files

Do not try to bypass when triaging notifications

We should not try to authenticate on the background after the
user pulls down the notification shade, since we'll be stuck
on a loop, always requesting new auth.

Fixes: 136291835
Test: atest KeyguardUpdateMonitorTest
Test: pull down shade with bypass and notice no repeated auth
Test: bypass from lock screen
Change-Id: Ic850f223bcfe548acd70c1a9c68c2cfead30662d
parent 4ef09fd4
Loading
Loading
Loading
Loading
+3 −3
Original line number Diff line number Diff line
@@ -1683,12 +1683,12 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
                strongAuth == StrongAuthTracker.STRONG_AUTH_REQUIRED_AFTER_LOCKOUT
                        || strongAuth == StrongAuthTracker.STRONG_AUTH_REQUIRED_AFTER_USER_LOCKDOWN;

        boolean canBypass = mKeyguardBypassController != null
                && mKeyguardBypassController.canBypass();
        // There's no reason to ask the HAL for authentication when the user can dismiss the
        // bouncer, unless we're bypassing and need to auto-dismiss the lock screen even when
        // TrustAgents or biometrics are keeping the device unlocked.
        boolean bypassEnabled = mKeyguardBypassController != null
                && mKeyguardBypassController.getBypassEnabled();
        boolean becauseCannotSkipBouncer = !getUserCanSkipBouncer(user) || bypassEnabled;
        boolean becauseCannotSkipBouncer = !getUserCanSkipBouncer(user) || canBypass;

        // Only listen if this KeyguardUpdateMonitor belongs to the primary user. There is an
        // instance of KeyguardUpdateMonitor for each user but KeyguardUpdateMonitor is user-aware.
+19 −15
Original line number Diff line number Diff line
@@ -104,23 +104,11 @@ class KeyguardBypassController {
     */
    fun onBiometricAuthenticated(biometricSourceType: BiometricSourceType): Boolean {
        if (bypassEnabled) {
            if (bouncerShowing) {
                // Whenever the bouncer is showing, we want to unlock. Otherwise we can get stuck
                // in the shade locked where the bouncer wouldn't unlock
                return true
            }
            if (statusBarStateController.state != StatusBarState.KEYGUARD) {
                // We're bypassing but not actually on the lockscreen, the user should decide when
                // to unlock
                return false
            }
            if (launchingAffordance) {
                return false
            }
            if (isPulseExpanding || qSExpanded) {
            val can = canBypass()
            if (!can && (isPulseExpanding || qSExpanded)) {
                pendingUnlockType = biometricSourceType
                return false
            }
            return can
        }
        return true
    }
@@ -134,6 +122,22 @@ class KeyguardBypassController {
        }
    }

    /**
     * If keyguard can be dismissed because of bypass.
     */
    fun canBypass(): Boolean {
        if (bypassEnabled) {
            return when {
                bouncerShowing -> true
                statusBarStateController.state != StatusBarState.KEYGUARD -> false
                launchingAffordance -> false
                isPulseExpanding || qSExpanded -> false
                else -> true
            }
        }
        return false
    }

    fun onStartedGoingToSleep() {
        pendingUnlockType = null
    }
+25 −0
Original line number Diff line number Diff line
@@ -52,6 +52,7 @@ import com.android.internal.telephony.IccCardConstants;
import com.android.internal.telephony.PhoneConstants;
import com.android.internal.telephony.TelephonyIntents;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.statusbar.phone.KeyguardBypassController;

import org.junit.Assert;
import org.junit.Before;
@@ -88,6 +89,8 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase {
    private UserManager mUserManager;
    @Mock
    private DevicePolicyManager mDevicePolicyManager;
    @Mock
    private KeyguardBypassController mKeyguardBypassController;
    private TestableLooper mTestableLooper;
    private TestableKeyguardUpdateMonitor mKeyguardUpdateMonitor;

@@ -331,6 +334,28 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase {
        verify(mFaceManager).authenticate(any(), any(), anyInt(), any(), any(), anyInt());
    }

    @Test
    public void testTriesToAuthenticate_whenTrustOnAgentKeyguard_ifBypass() {
        mKeyguardUpdateMonitor.setKeyguardBypassController(mKeyguardBypassController);
        mKeyguardUpdateMonitor.dispatchStartedWakingUp();
        mTestableLooper.processAllMessages();
        when(mKeyguardBypassController.canBypass()).thenReturn(true);
        mKeyguardUpdateMonitor.onTrustChanged(true /* enabled */,
                KeyguardUpdateMonitor.getCurrentUser(), 0 /* flags */);
        mKeyguardUpdateMonitor.onKeyguardVisibilityChanged(true);
        verify(mFaceManager).authenticate(any(), any(), anyInt(), any(), any(), anyInt());
    }

    @Test
    public void testIgnoresAuth_whenTrustAgentOnKeyguard_withoutBypass() {
        mKeyguardUpdateMonitor.dispatchStartedWakingUp();
        mTestableLooper.processAllMessages();
        mKeyguardUpdateMonitor.onTrustChanged(true /* enabled */,
                KeyguardUpdateMonitor.getCurrentUser(), 0 /* flags */);
        mKeyguardUpdateMonitor.onKeyguardVisibilityChanged(true);
        verify(mFaceManager, never()).authenticate(any(), any(), anyInt(), any(), any(), anyInt());
    }

    @Test
    public void testOnFaceAuthenticated_skipsFaceWhenAuthenticated() {
        mKeyguardUpdateMonitor.onFaceAuthenticated(KeyguardUpdateMonitor.getCurrentUser());