Loading packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java +10 −6 Original line number Diff line number Diff line Loading @@ -43,7 +43,6 @@ import android.os.Looper; import android.os.PowerManager; import android.os.Process; import android.os.RemoteException; import android.os.SystemClock; import android.os.Trace; import android.os.VibrationEffect; import android.os.Vibrator; Loading Loading @@ -76,6 +75,7 @@ import com.android.systemui.statusbar.policy.ConfigurationController; import com.android.systemui.statusbar.policy.KeyguardStateController; import com.android.systemui.util.concurrency.DelayableExecutor; import com.android.systemui.util.concurrency.Execution; import com.android.systemui.util.time.SystemClock; import java.util.Optional; Loading Loading @@ -125,6 +125,7 @@ public class UdfpsController implements DozeReceiver { @Nullable private final UdfpsHbmProvider mHbmProvider; @NonNull private final KeyguardBypassController mKeyguardBypassController; @NonNull private final ConfigurationController mConfigurationController; @NonNull private final SystemClock mSystemClock; @VisibleForTesting @NonNull final BiometricOrientationEventListener mOrientationListener; // Currently the UdfpsController supports a single UDFPS sensor. If devices have multiple // sensors, this, in addition to a lot of the code here, will be updated. Loading Loading @@ -449,19 +450,19 @@ public class UdfpsController implements DozeReceiver { final String touchInfo = String.format( "minor: %.1f, major: %.1f, v: %.1f, exceedsVelocityThreshold: %b", minor, major, v, exceedsVelocityThreshold); final long sinceLastLog = SystemClock.elapsedRealtime() - mTouchLogTime; final long sinceLastLog = mSystemClock.elapsedRealtime() - mTouchLogTime; if (!isIlluminationRequested && !mGoodCaptureReceived && !exceedsVelocityThreshold) { onFingerDown((int) event.getRawX(), (int) event.getRawY(), minor, major); Log.v(TAG, "onTouch | finger down: " + touchInfo); mTouchLogTime = SystemClock.elapsedRealtime(); mPowerManager.userActivity(SystemClock.uptimeMillis(), mTouchLogTime = mSystemClock.elapsedRealtime(); mPowerManager.userActivity(mSystemClock.uptimeMillis(), PowerManager.USER_ACTIVITY_EVENT_TOUCH, 0); handled = true; } else if (sinceLastLog >= MIN_TOUCH_LOG_INTERVAL) { Log.v(TAG, "onTouch | finger move: " + touchInfo); mTouchLogTime = SystemClock.elapsedRealtime(); mTouchLogTime = mSystemClock.elapsedRealtime(); } } else { Log.v(TAG, "onTouch | finger outside"); Loading Loading @@ -525,7 +526,8 @@ public class UdfpsController implements DozeReceiver { @NonNull KeyguardBypassController keyguardBypassController, @NonNull DisplayManager displayManager, @Main Handler mainHandler, @NonNull ConfigurationController configurationController) { @NonNull ConfigurationController configurationController, @NonNull SystemClock systemClock) { mContext = context; mExecution = execution; // TODO (b/185124905): inject main handler and vibrator once done prototyping Loading Loading @@ -561,6 +563,7 @@ public class UdfpsController implements DozeReceiver { mainHandler); mKeyguardBypassController = keyguardBypassController; mConfigurationController = configurationController; mSystemClock = systemClock; mSensorProps = findFirstUdfps(); // At least one UDFPS sensor exists Loading Loading @@ -781,6 +784,7 @@ public class UdfpsController implements DozeReceiver { mKeyguardViewMediator, mLockscreenShadeTransitionController, mConfigurationController, mSystemClock, this ); case IUdfpsOverlayController.REASON_AUTH_BP: Loading packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardViewController.java +19 −2 Original line number Diff line number Diff line Loading @@ -35,6 +35,7 @@ import com.android.systemui.statusbar.phone.StatusBar; import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager; import com.android.systemui.statusbar.policy.ConfigurationController; import com.android.systemui.util.concurrency.DelayableExecutor; import com.android.systemui.util.time.SystemClock; import java.io.FileDescriptor; import java.io.PrintWriter; Loading @@ -50,6 +51,7 @@ public class UdfpsKeyguardViewController extends UdfpsAnimationViewController<Ud @NonNull private final KeyguardViewMediator mKeyguardViewMediator; @NonNull private final LockscreenShadeTransitionController mLockScreenShadeTransitionController; @NonNull private final ConfigurationController mConfigurationController; @NonNull private final SystemClock mSystemClock; @NonNull private final UdfpsController mUdfpsController; private boolean mShowingUdfpsBouncer; Loading @@ -59,6 +61,7 @@ public class UdfpsKeyguardViewController extends UdfpsAnimationViewController<Ud private int mStatusBarState; private float mTransitionToFullShadeProgress; private float mLastDozeAmount; private long mLastUdfpsBouncerShowTime = -1; /** * hidden amount of pin/pattern/password bouncer Loading @@ -79,6 +82,7 @@ public class UdfpsKeyguardViewController extends UdfpsAnimationViewController<Ud @NonNull KeyguardViewMediator keyguardViewMediator, @NonNull LockscreenShadeTransitionController transitionController, @NonNull ConfigurationController configurationController, @NonNull SystemClock systemClock, @NonNull UdfpsController udfpsController) { super(view, statusBarStateController, statusBar, dumpManager); mKeyguardViewManager = statusBarKeyguardViewManager; Loading @@ -87,6 +91,7 @@ public class UdfpsKeyguardViewController extends UdfpsAnimationViewController<Ud mKeyguardViewMediator = keyguardViewMediator; mLockScreenShadeTransitionController = transitionController; mConfigurationController = configurationController; mSystemClock = systemClock; mUdfpsController = udfpsController; } Loading Loading @@ -155,6 +160,9 @@ public class UdfpsKeyguardViewController extends UdfpsAnimationViewController<Ud } mShowingUdfpsBouncer = show; if (mShowingUdfpsBouncer) { mLastUdfpsBouncerShowTime = mSystemClock.uptimeMillis(); } updatePauseAuth(); if (mShowingUdfpsBouncer) { if (mStatusBarState == StatusBarState.SHADE_LOCKED) { Loading Loading @@ -218,15 +226,24 @@ public class UdfpsKeyguardViewController extends UdfpsAnimationViewController<Ud * If we were previously showing the udfps bouncer, hide it and instead show the regular * (pin/pattern/password) bouncer. * * Does nothing if we weren't previously showing the udfps bouncer. * Does nothing if we weren't previously showing the UDFPS bouncer. */ private void maybeShowInputBouncer() { if (mShowingUdfpsBouncer) { if (mShowingUdfpsBouncer && hasUdfpsBouncerShownWithMinTime()) { mKeyguardViewManager.showBouncer(true); mKeyguardViewManager.resetAlternateAuth(false); } } /** * Whether the udfps bouncer has shown for at least 200ms before allowing touches outside * of the udfps icon area to dismiss the udfps bouncer and show the pin/pattern/password * bouncer. */ private boolean hasUdfpsBouncerShownWithMinTime() { return (mSystemClock.uptimeMillis() - mLastUdfpsBouncerShowTime) > 200; } /** * Set the progress we're currently transitioning to the full shade. 0.0f means we're not * transitioning yet, while 1.0f means we've fully dragged down. Loading packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationShadeWindowViewController.java +12 −0 Original line number Diff line number Diff line Loading @@ -311,6 +311,12 @@ public class NotificationShadeWindowViewController { // Capture all touch events in always-on. return true; } if (mStatusBarKeyguardViewManager.isShowingAlternateAuthOrAnimating()) { // capture all touches if the alt auth bouncer is showing return true; } boolean intercept = false; if (mNotificationPanelViewController.isFullyExpanded() && mDragDownHelper.isDragDownEnabled() Loading Loading @@ -338,6 +344,12 @@ public class NotificationShadeWindowViewController { if (mStatusBarStateController.isDozing()) { handled = !mService.isPulsing(); } if (mStatusBarKeyguardViewManager.isShowingAlternateAuthOrAnimating()) { // eat the touch handled = true; } if ((mDragDownHelper.isDragDownEnabled() && !handled) || mDragDownHelper.isDraggingDown()) { // we still want to finish our drag down gesture when locking the screen Loading packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsControllerTest.java +5 −1 Original line number Diff line number Diff line Loading @@ -69,6 +69,7 @@ import com.android.systemui.util.concurrency.Execution; import com.android.systemui.util.concurrency.FakeExecution; import com.android.systemui.util.concurrency.FakeExecutor; import com.android.systemui.util.time.FakeSystemClock; import com.android.systemui.util.time.SystemClock; import org.junit.Before; import org.junit.Rule; Loading Loading @@ -147,6 +148,8 @@ public class UdfpsControllerTest extends SysuiTestCase { private Handler mHandler; @Mock private ConfigurationController mConfigurationController; @Mock private SystemClock mSystemClock; private FakeExecutor mFgExecutor; Loading Loading @@ -229,7 +232,8 @@ public class UdfpsControllerTest extends SysuiTestCase { mKeyguardBypassController, mDisplayManager, mHandler, mConfigurationController); mConfigurationController, mSystemClock); verify(mFingerprintManager).setUdfpsOverlayController(mOverlayCaptor.capture()); mOverlayController = mOverlayCaptor.getValue(); verify(mScreenLifecycle).addObserver(mScreenObserverCaptor.capture()); Loading packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsKeyguardViewControllerTest.java +59 −0 Original line number Diff line number Diff line Loading @@ -18,8 +18,11 @@ package com.android.systemui.biometrics; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.Mockito.atLeast; import static org.mockito.Mockito.eq; import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; Loading @@ -41,6 +44,7 @@ import com.android.systemui.statusbar.phone.StatusBar; import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager; import com.android.systemui.statusbar.policy.ConfigurationController; import com.android.systemui.util.concurrency.DelayableExecutor; import com.android.systemui.util.time.FakeSystemClock; import org.junit.Before; import org.junit.Test; Loading Loading @@ -80,6 +84,7 @@ public class UdfpsKeyguardViewControllerTest extends SysuiTestCase { private ConfigurationController mConfigurationController; @Mock private UdfpsController mUdfpsController; private FakeSystemClock mSystemClock = new FakeSystemClock(); private UdfpsKeyguardViewController mController; Loading Loading @@ -114,6 +119,7 @@ public class UdfpsKeyguardViewControllerTest extends SysuiTestCase { mKeyguardViewMediator, mLockscreenShadeTransitionController, mConfigurationController, mSystemClock, mUdfpsController); } Loading Loading @@ -273,6 +279,59 @@ public class UdfpsKeyguardViewControllerTest extends SysuiTestCase { verify(mStatusBarKeyguardViewManager).removeAlternateAuthInterceptor(mAltAuthInterceptor); } @Test public void testHiddenUdfpsBouncerOnTouchOutside_nothingHappens() { // GIVEN view is attached mController.onViewAttached(); captureAltAuthInterceptor(); // GIVEN udfps bouncer isn't showing mAltAuthInterceptor.hideAlternateAuthBouncer(); // WHEN touch is observed outside the view mController.onTouchOutsideView(); // THEN bouncer / alt auth methods are never called verify(mStatusBarKeyguardViewManager, never()).showBouncer(anyBoolean()); verify(mStatusBarKeyguardViewManager, never()).resetAlternateAuth(anyBoolean()); } @Test public void testShowingUdfpsBouncerOnTouchOutsideWithinThreshold_nothingHappens() { // GIVEN view is attached mController.onViewAttached(); captureAltAuthInterceptor(); // GIVEN udfps bouncer is showing mAltAuthInterceptor.showAlternateAuthBouncer(); // WHEN touch is observed outside the view 200ms later (just within threshold) mSystemClock.advanceTime(200); mController.onTouchOutsideView(); // THEN bouncer / alt auth methods are never called because not enough time has passed verify(mStatusBarKeyguardViewManager, never()).showBouncer(anyBoolean()); verify(mStatusBarKeyguardViewManager, never()).resetAlternateAuth(anyBoolean()); } @Test public void testShowingUdfpsBouncerOnTouchOutsideAboveThreshold_showInputBouncer() { // GIVEN view is attached mController.onViewAttached(); captureAltAuthInterceptor(); // GIVEN udfps bouncer is showing mAltAuthInterceptor.showAlternateAuthBouncer(); // WHEN touch is observed outside the view 205ms later mSystemClock.advanceTime(205); mController.onTouchOutsideView(); // THEN show the bouncer and reset alt auth verify(mStatusBarKeyguardViewManager).showBouncer(eq(true)); verify(mStatusBarKeyguardViewManager).resetAlternateAuth(anyBoolean()); } private void sendStatusBarStateChanged(int statusBarState) { mStatusBarStateListener.onStateChanged(statusBarState); } Loading Loading
packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java +10 −6 Original line number Diff line number Diff line Loading @@ -43,7 +43,6 @@ import android.os.Looper; import android.os.PowerManager; import android.os.Process; import android.os.RemoteException; import android.os.SystemClock; import android.os.Trace; import android.os.VibrationEffect; import android.os.Vibrator; Loading Loading @@ -76,6 +75,7 @@ import com.android.systemui.statusbar.policy.ConfigurationController; import com.android.systemui.statusbar.policy.KeyguardStateController; import com.android.systemui.util.concurrency.DelayableExecutor; import com.android.systemui.util.concurrency.Execution; import com.android.systemui.util.time.SystemClock; import java.util.Optional; Loading Loading @@ -125,6 +125,7 @@ public class UdfpsController implements DozeReceiver { @Nullable private final UdfpsHbmProvider mHbmProvider; @NonNull private final KeyguardBypassController mKeyguardBypassController; @NonNull private final ConfigurationController mConfigurationController; @NonNull private final SystemClock mSystemClock; @VisibleForTesting @NonNull final BiometricOrientationEventListener mOrientationListener; // Currently the UdfpsController supports a single UDFPS sensor. If devices have multiple // sensors, this, in addition to a lot of the code here, will be updated. Loading Loading @@ -449,19 +450,19 @@ public class UdfpsController implements DozeReceiver { final String touchInfo = String.format( "minor: %.1f, major: %.1f, v: %.1f, exceedsVelocityThreshold: %b", minor, major, v, exceedsVelocityThreshold); final long sinceLastLog = SystemClock.elapsedRealtime() - mTouchLogTime; final long sinceLastLog = mSystemClock.elapsedRealtime() - mTouchLogTime; if (!isIlluminationRequested && !mGoodCaptureReceived && !exceedsVelocityThreshold) { onFingerDown((int) event.getRawX(), (int) event.getRawY(), minor, major); Log.v(TAG, "onTouch | finger down: " + touchInfo); mTouchLogTime = SystemClock.elapsedRealtime(); mPowerManager.userActivity(SystemClock.uptimeMillis(), mTouchLogTime = mSystemClock.elapsedRealtime(); mPowerManager.userActivity(mSystemClock.uptimeMillis(), PowerManager.USER_ACTIVITY_EVENT_TOUCH, 0); handled = true; } else if (sinceLastLog >= MIN_TOUCH_LOG_INTERVAL) { Log.v(TAG, "onTouch | finger move: " + touchInfo); mTouchLogTime = SystemClock.elapsedRealtime(); mTouchLogTime = mSystemClock.elapsedRealtime(); } } else { Log.v(TAG, "onTouch | finger outside"); Loading Loading @@ -525,7 +526,8 @@ public class UdfpsController implements DozeReceiver { @NonNull KeyguardBypassController keyguardBypassController, @NonNull DisplayManager displayManager, @Main Handler mainHandler, @NonNull ConfigurationController configurationController) { @NonNull ConfigurationController configurationController, @NonNull SystemClock systemClock) { mContext = context; mExecution = execution; // TODO (b/185124905): inject main handler and vibrator once done prototyping Loading Loading @@ -561,6 +563,7 @@ public class UdfpsController implements DozeReceiver { mainHandler); mKeyguardBypassController = keyguardBypassController; mConfigurationController = configurationController; mSystemClock = systemClock; mSensorProps = findFirstUdfps(); // At least one UDFPS sensor exists Loading Loading @@ -781,6 +784,7 @@ public class UdfpsController implements DozeReceiver { mKeyguardViewMediator, mLockscreenShadeTransitionController, mConfigurationController, mSystemClock, this ); case IUdfpsOverlayController.REASON_AUTH_BP: Loading
packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardViewController.java +19 −2 Original line number Diff line number Diff line Loading @@ -35,6 +35,7 @@ import com.android.systemui.statusbar.phone.StatusBar; import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager; import com.android.systemui.statusbar.policy.ConfigurationController; import com.android.systemui.util.concurrency.DelayableExecutor; import com.android.systemui.util.time.SystemClock; import java.io.FileDescriptor; import java.io.PrintWriter; Loading @@ -50,6 +51,7 @@ public class UdfpsKeyguardViewController extends UdfpsAnimationViewController<Ud @NonNull private final KeyguardViewMediator mKeyguardViewMediator; @NonNull private final LockscreenShadeTransitionController mLockScreenShadeTransitionController; @NonNull private final ConfigurationController mConfigurationController; @NonNull private final SystemClock mSystemClock; @NonNull private final UdfpsController mUdfpsController; private boolean mShowingUdfpsBouncer; Loading @@ -59,6 +61,7 @@ public class UdfpsKeyguardViewController extends UdfpsAnimationViewController<Ud private int mStatusBarState; private float mTransitionToFullShadeProgress; private float mLastDozeAmount; private long mLastUdfpsBouncerShowTime = -1; /** * hidden amount of pin/pattern/password bouncer Loading @@ -79,6 +82,7 @@ public class UdfpsKeyguardViewController extends UdfpsAnimationViewController<Ud @NonNull KeyguardViewMediator keyguardViewMediator, @NonNull LockscreenShadeTransitionController transitionController, @NonNull ConfigurationController configurationController, @NonNull SystemClock systemClock, @NonNull UdfpsController udfpsController) { super(view, statusBarStateController, statusBar, dumpManager); mKeyguardViewManager = statusBarKeyguardViewManager; Loading @@ -87,6 +91,7 @@ public class UdfpsKeyguardViewController extends UdfpsAnimationViewController<Ud mKeyguardViewMediator = keyguardViewMediator; mLockScreenShadeTransitionController = transitionController; mConfigurationController = configurationController; mSystemClock = systemClock; mUdfpsController = udfpsController; } Loading Loading @@ -155,6 +160,9 @@ public class UdfpsKeyguardViewController extends UdfpsAnimationViewController<Ud } mShowingUdfpsBouncer = show; if (mShowingUdfpsBouncer) { mLastUdfpsBouncerShowTime = mSystemClock.uptimeMillis(); } updatePauseAuth(); if (mShowingUdfpsBouncer) { if (mStatusBarState == StatusBarState.SHADE_LOCKED) { Loading Loading @@ -218,15 +226,24 @@ public class UdfpsKeyguardViewController extends UdfpsAnimationViewController<Ud * If we were previously showing the udfps bouncer, hide it and instead show the regular * (pin/pattern/password) bouncer. * * Does nothing if we weren't previously showing the udfps bouncer. * Does nothing if we weren't previously showing the UDFPS bouncer. */ private void maybeShowInputBouncer() { if (mShowingUdfpsBouncer) { if (mShowingUdfpsBouncer && hasUdfpsBouncerShownWithMinTime()) { mKeyguardViewManager.showBouncer(true); mKeyguardViewManager.resetAlternateAuth(false); } } /** * Whether the udfps bouncer has shown for at least 200ms before allowing touches outside * of the udfps icon area to dismiss the udfps bouncer and show the pin/pattern/password * bouncer. */ private boolean hasUdfpsBouncerShownWithMinTime() { return (mSystemClock.uptimeMillis() - mLastUdfpsBouncerShowTime) > 200; } /** * Set the progress we're currently transitioning to the full shade. 0.0f means we're not * transitioning yet, while 1.0f means we've fully dragged down. Loading
packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationShadeWindowViewController.java +12 −0 Original line number Diff line number Diff line Loading @@ -311,6 +311,12 @@ public class NotificationShadeWindowViewController { // Capture all touch events in always-on. return true; } if (mStatusBarKeyguardViewManager.isShowingAlternateAuthOrAnimating()) { // capture all touches if the alt auth bouncer is showing return true; } boolean intercept = false; if (mNotificationPanelViewController.isFullyExpanded() && mDragDownHelper.isDragDownEnabled() Loading Loading @@ -338,6 +344,12 @@ public class NotificationShadeWindowViewController { if (mStatusBarStateController.isDozing()) { handled = !mService.isPulsing(); } if (mStatusBarKeyguardViewManager.isShowingAlternateAuthOrAnimating()) { // eat the touch handled = true; } if ((mDragDownHelper.isDragDownEnabled() && !handled) || mDragDownHelper.isDraggingDown()) { // we still want to finish our drag down gesture when locking the screen Loading
packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsControllerTest.java +5 −1 Original line number Diff line number Diff line Loading @@ -69,6 +69,7 @@ import com.android.systemui.util.concurrency.Execution; import com.android.systemui.util.concurrency.FakeExecution; import com.android.systemui.util.concurrency.FakeExecutor; import com.android.systemui.util.time.FakeSystemClock; import com.android.systemui.util.time.SystemClock; import org.junit.Before; import org.junit.Rule; Loading Loading @@ -147,6 +148,8 @@ public class UdfpsControllerTest extends SysuiTestCase { private Handler mHandler; @Mock private ConfigurationController mConfigurationController; @Mock private SystemClock mSystemClock; private FakeExecutor mFgExecutor; Loading Loading @@ -229,7 +232,8 @@ public class UdfpsControllerTest extends SysuiTestCase { mKeyguardBypassController, mDisplayManager, mHandler, mConfigurationController); mConfigurationController, mSystemClock); verify(mFingerprintManager).setUdfpsOverlayController(mOverlayCaptor.capture()); mOverlayController = mOverlayCaptor.getValue(); verify(mScreenLifecycle).addObserver(mScreenObserverCaptor.capture()); Loading
packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsKeyguardViewControllerTest.java +59 −0 Original line number Diff line number Diff line Loading @@ -18,8 +18,11 @@ package com.android.systemui.biometrics; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.Mockito.atLeast; import static org.mockito.Mockito.eq; import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; Loading @@ -41,6 +44,7 @@ import com.android.systemui.statusbar.phone.StatusBar; import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager; import com.android.systemui.statusbar.policy.ConfigurationController; import com.android.systemui.util.concurrency.DelayableExecutor; import com.android.systemui.util.time.FakeSystemClock; import org.junit.Before; import org.junit.Test; Loading Loading @@ -80,6 +84,7 @@ public class UdfpsKeyguardViewControllerTest extends SysuiTestCase { private ConfigurationController mConfigurationController; @Mock private UdfpsController mUdfpsController; private FakeSystemClock mSystemClock = new FakeSystemClock(); private UdfpsKeyguardViewController mController; Loading Loading @@ -114,6 +119,7 @@ public class UdfpsKeyguardViewControllerTest extends SysuiTestCase { mKeyguardViewMediator, mLockscreenShadeTransitionController, mConfigurationController, mSystemClock, mUdfpsController); } Loading Loading @@ -273,6 +279,59 @@ public class UdfpsKeyguardViewControllerTest extends SysuiTestCase { verify(mStatusBarKeyguardViewManager).removeAlternateAuthInterceptor(mAltAuthInterceptor); } @Test public void testHiddenUdfpsBouncerOnTouchOutside_nothingHappens() { // GIVEN view is attached mController.onViewAttached(); captureAltAuthInterceptor(); // GIVEN udfps bouncer isn't showing mAltAuthInterceptor.hideAlternateAuthBouncer(); // WHEN touch is observed outside the view mController.onTouchOutsideView(); // THEN bouncer / alt auth methods are never called verify(mStatusBarKeyguardViewManager, never()).showBouncer(anyBoolean()); verify(mStatusBarKeyguardViewManager, never()).resetAlternateAuth(anyBoolean()); } @Test public void testShowingUdfpsBouncerOnTouchOutsideWithinThreshold_nothingHappens() { // GIVEN view is attached mController.onViewAttached(); captureAltAuthInterceptor(); // GIVEN udfps bouncer is showing mAltAuthInterceptor.showAlternateAuthBouncer(); // WHEN touch is observed outside the view 200ms later (just within threshold) mSystemClock.advanceTime(200); mController.onTouchOutsideView(); // THEN bouncer / alt auth methods are never called because not enough time has passed verify(mStatusBarKeyguardViewManager, never()).showBouncer(anyBoolean()); verify(mStatusBarKeyguardViewManager, never()).resetAlternateAuth(anyBoolean()); } @Test public void testShowingUdfpsBouncerOnTouchOutsideAboveThreshold_showInputBouncer() { // GIVEN view is attached mController.onViewAttached(); captureAltAuthInterceptor(); // GIVEN udfps bouncer is showing mAltAuthInterceptor.showAlternateAuthBouncer(); // WHEN touch is observed outside the view 205ms later mSystemClock.advanceTime(205); mController.onTouchOutsideView(); // THEN show the bouncer and reset alt auth verify(mStatusBarKeyguardViewManager).showBouncer(eq(true)); verify(mStatusBarKeyguardViewManager).resetAlternateAuth(anyBoolean()); } private void sendStatusBarStateChanged(int statusBarState) { mStatusBarStateListener.onStateChanged(statusBarState); } Loading