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
This commit is contained in:
Chandru
2022-10-20 10:29:23 +00:00
committed by Chandru S
parent 8e1af25720
commit 1b45430325
6 changed files with 112 additions and 16 deletions

View File

@@ -219,13 +219,16 @@ 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();
showMessage(null, null);
if (didFaceAuthRun) {
showMessage(null, null);
}
}
if (mUpdateMonitor.isFaceEnrolled()) {
mUpdateMonitor.requestActiveUnlock(
@@ -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() {

View File

@@ -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();
}
/**

View File

@@ -3933,20 +3933,19 @@ 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);
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()) {
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);
startUnlockHintAnimation();
}
}
return true;

View File

@@ -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);

View File

@@ -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);

View File

@@ -18,6 +18,7 @@ package com.android.systemui.shade;
import static android.content.res.Configuration.ORIENTATION_PORTRAIT;
import static com.android.keyguard.FaceAuthApiRequestReason.NOTIFICATION_PANEL_CLICKED;
import static com.android.keyguard.KeyguardClockSwitch.LARGE;
import static com.android.keyguard.KeyguardClockSwitch.SMALL;
import static com.android.systemui.shade.ShadeExpansionStateManagerKt.STATE_CLOSED;
@@ -1606,7 +1607,7 @@ public class NotificationPanelViewControllerTest extends SysuiTestCase {
mNotificationPanelViewController.mStatusBarStateListener;
statusBarStateListener.onStateChanged(KEYGUARD);
mNotificationPanelViewController.setDozing(false, false);
when(mUpdateMonitor.isFaceDetectionRunning()).thenReturn(false);
when(mUpdateMonitor.requestFaceAuth(true, NOTIFICATION_PANEL_CLICKED)).thenReturn(false);
// This sets the dozing state that is read when onMiddleClicked is eventually invoked.
mTouchHandler.onTouch(mock(View.class), mDownMotionEvent);
@@ -1621,7 +1622,7 @@ public class NotificationPanelViewControllerTest extends SysuiTestCase {
mNotificationPanelViewController.mStatusBarStateListener;
statusBarStateListener.onStateChanged(KEYGUARD);
mNotificationPanelViewController.setDozing(false, false);
when(mUpdateMonitor.isFaceDetectionRunning()).thenReturn(true);
when(mUpdateMonitor.requestFaceAuth(true, NOTIFICATION_PANEL_CLICKED)).thenReturn(true);
// This sets the dozing state that is read when onMiddleClicked is eventually invoked.
mTouchHandler.onTouch(mock(View.class), mDownMotionEvent);