Revert "Stop running face detection on bouncer if both face and fp are enrolled."
This reverts commit eabd91006d.
Reason for revert: UX concerns that this might affect existing unlock
behavior
Bug: 247966043
Change-Id: I55efa4e7d8ffac5fd57c1e7558b5a99ae8abb4db
Test: atest KeyguardUpdateMonitorTest
This commit is contained in:
@@ -57,11 +57,10 @@ data class KeyguardFaceListenModel(
|
||||
val faceLockedOut: Boolean,
|
||||
val fpLockedOut: Boolean,
|
||||
val goingToSleep: Boolean,
|
||||
val keyguardAwakeExcludingBouncerShowing: Boolean,
|
||||
val keyguardAwake: Boolean,
|
||||
val keyguardGoingAway: Boolean,
|
||||
val listeningForFaceAssistant: Boolean,
|
||||
val occludingAppRequestingFaceAuth: Boolean,
|
||||
val onlyFaceEnrolled: Boolean,
|
||||
val primaryUser: Boolean,
|
||||
val scanningAllowedByStrongAuth: Boolean,
|
||||
val secureCameraLaunched: Boolean,
|
||||
|
||||
@@ -2593,11 +2593,8 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab
|
||||
}
|
||||
|
||||
final boolean statusBarShadeLocked = mStatusBarState == StatusBarState.SHADE_LOCKED;
|
||||
// mKeyguardIsVisible is true even when the bouncer is shown, we don't want to run face auth
|
||||
// on bouncer if both fp and fingerprint are enrolled.
|
||||
final boolean awakeKeyguardExcludingBouncerShowing = mKeyguardIsVisible
|
||||
&& mDeviceInteractive && !mGoingToSleep
|
||||
&& !statusBarShadeLocked && !mBouncerFullyShown;
|
||||
final boolean awakeKeyguard = mKeyguardIsVisible && mDeviceInteractive && !mGoingToSleep
|
||||
&& !statusBarShadeLocked;
|
||||
final int user = getCurrentUser();
|
||||
final int strongAuth = mStrongAuthTracker.getStrongAuthForUser(user);
|
||||
final boolean isLockDown =
|
||||
@@ -2637,16 +2634,15 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab
|
||||
final boolean faceDisabledForUser = isFaceDisabled(user);
|
||||
final boolean biometricEnabledForUser = mBiometricEnabledForUser.get(user);
|
||||
final boolean shouldListenForFaceAssistant = shouldListenForFaceAssistant();
|
||||
final boolean onlyFaceEnrolled = isOnlyFaceEnrolled();
|
||||
final boolean fpOrFaceIsLockedOut = isFaceLockedOut() || fpLockedout;
|
||||
|
||||
// Only listen if this KeyguardUpdateMonitor belongs to the primary user. There is an
|
||||
// instance of KeyguardUpdateMonitor for each user but KeyguardUpdateMonitor is user-aware.
|
||||
final boolean shouldListen =
|
||||
((mBouncerFullyShown && !mGoingToSleep && onlyFaceEnrolled)
|
||||
(mBouncerFullyShown && !mGoingToSleep
|
||||
|| mAuthInterruptActive
|
||||
|| mOccludingAppRequestingFace
|
||||
|| awakeKeyguardExcludingBouncerShowing
|
||||
|| awakeKeyguard
|
||||
|| shouldListenForFaceAssistant
|
||||
|| mAuthController.isUdfpsFingerDown()
|
||||
|| mUdfpsBouncerShowing)
|
||||
@@ -2672,11 +2668,10 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab
|
||||
isFaceLockedOut(),
|
||||
fpLockedout,
|
||||
mGoingToSleep,
|
||||
awakeKeyguardExcludingBouncerShowing,
|
||||
awakeKeyguard,
|
||||
mKeyguardGoingAway,
|
||||
shouldListenForFaceAssistant,
|
||||
mOccludingAppRequestingFace,
|
||||
onlyFaceEnrolled,
|
||||
mIsPrimaryUser,
|
||||
strongAuthAllowsScanning,
|
||||
mSecureCameraLaunched,
|
||||
@@ -2686,11 +2681,6 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab
|
||||
return shouldListen;
|
||||
}
|
||||
|
||||
private boolean isOnlyFaceEnrolled() {
|
||||
return isFaceEnrolled()
|
||||
&& !getCachedIsUnlockWithFingerprintPossible(sCurrentUser);
|
||||
}
|
||||
|
||||
private void maybeLogListenerModelData(KeyguardListenModel model) {
|
||||
mLogger.logKeyguardListenerModel(model);
|
||||
|
||||
|
||||
@@ -86,13 +86,12 @@ private fun faceModel(user: Int) = KeyguardFaceListenModel(
|
||||
becauseCannotSkipBouncer = false,
|
||||
biometricSettingEnabledForUser = false,
|
||||
bouncerFullyShown = false,
|
||||
onlyFaceEnrolled = false,
|
||||
faceAuthenticated = false,
|
||||
faceDisabled = false,
|
||||
faceLockedOut = false,
|
||||
fpLockedOut = false,
|
||||
goingToSleep = false,
|
||||
keyguardAwakeExcludingBouncerShowing = false,
|
||||
keyguardAwake = false,
|
||||
keyguardGoingAway = false,
|
||||
listeningForFaceAssistant = false,
|
||||
occludingAppRequestingFaceAuth = false,
|
||||
|
||||
@@ -212,8 +212,6 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase {
|
||||
mBiometricEnabledCallbackArgCaptor;
|
||||
@Captor
|
||||
private ArgumentCaptor<FaceManager.AuthenticationCallback> mAuthenticationCallbackCaptor;
|
||||
@Captor
|
||||
private ArgumentCaptor<CancellationSignal> mCancellationSignalCaptor;
|
||||
|
||||
// Direct executor
|
||||
private final Executor mBackgroundExecutor = Runnable::run;
|
||||
@@ -596,13 +594,11 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase {
|
||||
|
||||
@Test
|
||||
public void testTriesToAuthenticate_whenBouncer() {
|
||||
fingerprintIsNotEnrolled();
|
||||
faceAuthEnabled();
|
||||
setKeyguardBouncerVisibility(true);
|
||||
|
||||
verify(mFaceManager).authenticate(any(), any(), any(), any(), anyInt(), anyBoolean());
|
||||
verify(mFaceManager, atLeastOnce()).isHardwareDetected();
|
||||
verify(mFaceManager, atLeastOnce()).hasEnrolledTemplates(anyInt());
|
||||
verify(mFaceManager).isHardwareDetected();
|
||||
verify(mFaceManager).hasEnrolledTemplates(anyInt());
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -1237,9 +1233,7 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase {
|
||||
public void testShouldListenForFace_whenFaceIsAlreadyAuthenticated_returnsFalse()
|
||||
throws RemoteException {
|
||||
// Face auth should run when the following is true.
|
||||
faceAuthEnabled();
|
||||
bouncerFullyVisibleAndNotGoingToSleep();
|
||||
fingerprintIsNotEnrolled();
|
||||
keyguardNotGoingAway();
|
||||
currentUserIsPrimary();
|
||||
strongAuthNotRequired();
|
||||
@@ -1266,7 +1260,7 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase {
|
||||
mKeyguardUpdateMonitor =
|
||||
new TestableKeyguardUpdateMonitor(mSpiedContext);
|
||||
|
||||
// Preconditions for face auth to run
|
||||
// Face auth should run when the following is true.
|
||||
keyguardNotGoingAway();
|
||||
bouncerFullyVisibleAndNotGoingToSleep();
|
||||
strongAuthNotRequired();
|
||||
@@ -1283,7 +1277,7 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase {
|
||||
@Test
|
||||
public void testShouldListenForFace_whenStrongAuthDoesNotAllowScanning_returnsFalse()
|
||||
throws RemoteException {
|
||||
// Preconditions for face auth to run
|
||||
// Face auth should run when the following is true.
|
||||
keyguardNotGoingAway();
|
||||
bouncerFullyVisibleAndNotGoingToSleep();
|
||||
currentUserIsPrimary();
|
||||
@@ -1304,11 +1298,8 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase {
|
||||
@Test
|
||||
public void testShouldListenForFace_whenBiometricsDisabledForUser_returnsFalse()
|
||||
throws RemoteException {
|
||||
// Preconditions for face auth to run
|
||||
faceAuthEnabled();
|
||||
keyguardNotGoingAway();
|
||||
bouncerFullyVisibleAndNotGoingToSleep();
|
||||
fingerprintIsNotEnrolled();
|
||||
currentUserIsPrimary();
|
||||
currentUserDoesNotHaveTrust();
|
||||
biometricsNotDisabledThroughDevicePolicyManager();
|
||||
@@ -1328,11 +1319,9 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase {
|
||||
@Test
|
||||
public void testShouldListenForFace_whenUserCurrentlySwitching_returnsFalse()
|
||||
throws RemoteException {
|
||||
// Preconditions for face auth to run
|
||||
faceAuthEnabled();
|
||||
// Face auth should run when the following is true.
|
||||
keyguardNotGoingAway();
|
||||
bouncerFullyVisibleAndNotGoingToSleep();
|
||||
fingerprintIsNotEnrolled();
|
||||
currentUserIsPrimary();
|
||||
currentUserDoesNotHaveTrust();
|
||||
biometricsNotDisabledThroughDevicePolicyManager();
|
||||
@@ -1351,11 +1340,8 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase {
|
||||
@Test
|
||||
public void testShouldListenForFace_whenSecureCameraLaunched_returnsFalse()
|
||||
throws RemoteException {
|
||||
// Preconditions for face auth to run
|
||||
faceAuthEnabled();
|
||||
keyguardNotGoingAway();
|
||||
bouncerFullyVisibleAndNotGoingToSleep();
|
||||
fingerprintIsNotEnrolled();
|
||||
currentUserIsPrimary();
|
||||
currentUserDoesNotHaveTrust();
|
||||
biometricsNotDisabledThroughDevicePolicyManager();
|
||||
@@ -1374,7 +1360,7 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase {
|
||||
@Test
|
||||
public void testShouldListenForFace_whenOccludingAppRequestsFaceAuth_returnsTrue()
|
||||
throws RemoteException {
|
||||
// Preconditions for face auth to run
|
||||
// Face auth should run when the following is true.
|
||||
keyguardNotGoingAway();
|
||||
bouncerFullyVisibleAndNotGoingToSleep();
|
||||
currentUserIsPrimary();
|
||||
@@ -1397,8 +1383,7 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase {
|
||||
@Test
|
||||
public void testShouldListenForFace_whenBouncerShowingAndDeviceIsAwake_returnsTrue()
|
||||
throws RemoteException {
|
||||
// Preconditions for face auth to run
|
||||
faceAuthEnabled();
|
||||
// Face auth should run when the following is true.
|
||||
keyguardNotGoingAway();
|
||||
currentUserIsPrimary();
|
||||
currentUserDoesNotHaveTrust();
|
||||
@@ -1410,7 +1395,6 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase {
|
||||
assertThat(mKeyguardUpdateMonitor.shouldListenForFace()).isFalse();
|
||||
|
||||
bouncerFullyVisibleAndNotGoingToSleep();
|
||||
fingerprintIsNotEnrolled();
|
||||
mTestableLooper.processAllMessages();
|
||||
|
||||
assertThat(mKeyguardUpdateMonitor.shouldListenForFace()).isTrue();
|
||||
@@ -1419,7 +1403,7 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase {
|
||||
@Test
|
||||
public void testShouldListenForFace_whenAuthInterruptIsActive_returnsTrue()
|
||||
throws RemoteException {
|
||||
// Preconditions for face auth to run
|
||||
// Face auth should run when the following is true.
|
||||
keyguardNotGoingAway();
|
||||
currentUserIsPrimary();
|
||||
currentUserDoesNotHaveTrust();
|
||||
@@ -1445,7 +1429,6 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase {
|
||||
biometricsNotDisabledThroughDevicePolicyManager();
|
||||
biometricsEnabledForCurrentUser();
|
||||
userNotCurrentlySwitching();
|
||||
bouncerFullyVisible();
|
||||
|
||||
statusBarShadeIsLocked();
|
||||
mTestableLooper.processAllMessages();
|
||||
@@ -1459,9 +1442,6 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase {
|
||||
keyguardIsVisible();
|
||||
assertThat(mKeyguardUpdateMonitor.shouldListenForFace()).isFalse();
|
||||
statusBarShadeIsNotLocked();
|
||||
assertThat(mKeyguardUpdateMonitor.shouldListenForFace()).isFalse();
|
||||
bouncerNotFullyVisible();
|
||||
|
||||
assertThat(mKeyguardUpdateMonitor.shouldListenForFace()).isTrue();
|
||||
}
|
||||
|
||||
@@ -1522,44 +1502,6 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase {
|
||||
assertThat(mKeyguardUpdateMonitor.shouldListenForFace()).isFalse();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testBouncerVisibility_whenBothFingerprintAndFaceIsEnrolled_stopsFaceAuth()
|
||||
throws RemoteException {
|
||||
// Both fingerprint and face are enrolled by default
|
||||
// Preconditions for face auth to run
|
||||
keyguardNotGoingAway();
|
||||
currentUserIsPrimary();
|
||||
currentUserDoesNotHaveTrust();
|
||||
biometricsNotDisabledThroughDevicePolicyManager();
|
||||
biometricsEnabledForCurrentUser();
|
||||
userNotCurrentlySwitching();
|
||||
deviceNotGoingToSleep();
|
||||
deviceIsInteractive();
|
||||
statusBarShadeIsNotLocked();
|
||||
keyguardIsVisible();
|
||||
|
||||
mTestableLooper.processAllMessages();
|
||||
clearInvocations(mUiEventLogger);
|
||||
|
||||
assertThat(mKeyguardUpdateMonitor.shouldListenForFace()).isTrue();
|
||||
|
||||
mKeyguardUpdateMonitor.requestFaceAuth(true,
|
||||
FaceAuthApiRequestReason.UDFPS_POINTER_DOWN);
|
||||
|
||||
verify(mFaceManager).authenticate(any(),
|
||||
mCancellationSignalCaptor.capture(),
|
||||
mAuthenticationCallbackCaptor.capture(),
|
||||
any(),
|
||||
anyInt(),
|
||||
anyBoolean());
|
||||
CancellationSignal cancelSignal = mCancellationSignalCaptor.getValue();
|
||||
|
||||
bouncerFullyVisible();
|
||||
mTestableLooper.processAllMessages();
|
||||
|
||||
assertThat(cancelSignal.isCanceled()).isTrue();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testFingerprintCanAuth_whenCancellationNotReceivedAndAuthFailed() {
|
||||
mKeyguardUpdateMonitor.dispatchStartedWakingUp();
|
||||
@@ -1623,21 +1565,6 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase {
|
||||
.onAuthenticationError(FaceManager.FACE_ERROR_LOCKOUT_PERMANENT, "");
|
||||
}
|
||||
|
||||
private void faceAuthEnabled() {
|
||||
// this ensures KeyguardUpdateMonitor updates the cached mIsFaceEnrolled flag using the
|
||||
// face manager mock wire-up in setup()
|
||||
mKeyguardUpdateMonitor.isFaceAuthEnabledForUser(mCurrentUserId);
|
||||
}
|
||||
|
||||
private void fingerprintIsNotEnrolled() {
|
||||
when(mFingerprintManager.hasEnrolledTemplates(mCurrentUserId)).thenReturn(false);
|
||||
// This updates the cached fingerprint state.
|
||||
// There is no straightforward API to update the fingerprint state.
|
||||
// It currently works updates after enrollment changes because something else invokes
|
||||
// startListeningForFingerprint(), which internally calls this method.
|
||||
mKeyguardUpdateMonitor.isUnlockWithFingerprintPossible(mCurrentUserId);
|
||||
}
|
||||
|
||||
private void statusBarShadeIsNotLocked() {
|
||||
mStatusBarStateListener.onStateChanged(StatusBarState.KEYGUARD);
|
||||
}
|
||||
@@ -1744,10 +1671,6 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase {
|
||||
mKeyguardUpdateMonitor.dispatchStartedWakingUp();
|
||||
}
|
||||
|
||||
private void bouncerNotFullyVisible() {
|
||||
setKeyguardBouncerVisibility(false);
|
||||
}
|
||||
|
||||
private void bouncerFullyVisible() {
|
||||
setKeyguardBouncerVisibility(true);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user