diff options
author | 2019-09-09 16:26:59 +0000 | |
---|---|---|
committer | 2019-09-09 16:26:59 +0000 | |
commit | 95eb6ea09788bd79c59a287bb860425a02de976e (patch) | |
tree | db3c31ae1a3ed24c2173035708d5433fc3a2f54a | |
parent | 589564ecfdb9107dd93aa740afdb3fe39fa974bc (diff) | |
parent | 4b75b192a8b0d2e78231abc8357e6ef0cfd990ee (diff) |
Merge "Do not show status bar on first bypass attempt"
3 files changed, 59 insertions, 9 deletions
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java index e4a8aab9045d..b964edf7fc44 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java @@ -1830,7 +1830,10 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { return shouldListen; } - private boolean shouldListenForFace() { + /** + * If face auth is allows to scan on this exact moment. + */ + public boolean shouldListenForFace() { final boolean awakeKeyguard = mKeyguardIsVisible && mDeviceInteractive && !mGoingToSleep; final int user = getCurrentUser(); final int strongAuth = mStrongAuthTracker.getStrongAuthForUser(user); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java index f91b03ed087d..a79ecd905403 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java @@ -39,6 +39,7 @@ import android.graphics.PorterDuff; import android.graphics.PorterDuffXfermode; import android.graphics.Rect; import android.graphics.Region; +import android.hardware.biometrics.BiometricSourceType; import android.os.PowerManager; import android.os.SystemClock; import android.provider.DeviceConfig; @@ -62,6 +63,7 @@ import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.keyguard.KeyguardClockSwitch; import com.android.keyguard.KeyguardStatusView; import com.android.keyguard.KeyguardUpdateMonitor; +import com.android.keyguard.KeyguardUpdateMonitorCallback; import com.android.systemui.DejankUtils; import com.android.systemui.Dependency; import com.android.systemui.Interpolators; @@ -172,6 +174,25 @@ public class NotificationPanelView extends PanelView implements R.id.keyguard_hun_animator_start_tag); private static final AnimationProperties KEYGUARD_HUN_PROPERTIES = new AnimationProperties().setDuration(StackStateAnimator.ANIMATION_DURATION_STANDARD); + @VisibleForTesting + final KeyguardUpdateMonitorCallback mKeyguardUpdateCallback = + new KeyguardUpdateMonitorCallback() { + @Override + public void onBiometricRunningStateChanged(boolean running, + BiometricSourceType biometricSourceType) { + boolean keyguardOrShadeLocked = mBarState == StatusBarState.KEYGUARD + || mBarState == StatusBarState.SHADE_LOCKED; + if (!running && mFirstBypassAttempt && keyguardOrShadeLocked && !mDozing) { + mFirstBypassAttempt = false; + animateKeyguardStatusBarIn(StackStateAnimator.ANIMATION_DURATION_STANDARD); + } + } + + @Override + public void onFinishedGoingToSleep(int why) { + mFirstBypassAttempt = mKeyguardBypassController.getBypassEnabled(); + } + }; private final InjectionInflationController mInjectionInflationController; private final PowerManager mPowerManager; @@ -392,6 +413,7 @@ public class NotificationPanelView extends PanelView implements private boolean mShowingKeyguardHeadsUp; private boolean mAllowExpandForSmallExpansion; private Runnable mExpandAfterLayoutRunnable; + private boolean mFirstBypassAttempt; private PluginManager mPluginManager; private FrameLayout mPluginFrame; @@ -427,6 +449,7 @@ public class NotificationPanelView extends PanelView implements mThemeResId = context.getThemeResId(); mKeyguardBypassController = bypassController; mUpdateMonitor = Dependency.get(KeyguardUpdateMonitor.class); + mFirstBypassAttempt = mKeyguardBypassController.getBypassEnabled(); dynamicPrivacyController.addListener(this); mBottomAreaShadeAlphaAnimator = ValueAnimator.ofFloat(1f, 0); @@ -519,6 +542,7 @@ public class NotificationPanelView extends PanelView implements Dependency.get(StatusBarStateController.class).addCallback(this); Dependency.get(ZenModeController.class).addCallback(this); Dependency.get(ConfigurationController.class).addCallback(this); + mUpdateMonitor.registerCallback(mKeyguardUpdateCallback); // Theme might have changed between inflating this view and attaching it to the window, so // force a call to onThemeChanged onThemeChanged(); @@ -531,6 +555,7 @@ public class NotificationPanelView extends PanelView implements Dependency.get(StatusBarStateController.class).removeCallback(this); Dependency.get(ZenModeController.class).removeCallback(this); Dependency.get(ConfigurationController.class).removeCallback(this); + mUpdateMonitor.removeCallback(mKeyguardUpdateCallback); } @Override @@ -2366,7 +2391,9 @@ public class NotificationPanelView extends PanelView implements * mKeyguardStatusBarAnimateAlpha; newAlpha *= 1.0f - mKeyguardHeadsUpShowingAmount; mKeyguardStatusBar.setAlpha(newAlpha); - mKeyguardStatusBar.setVisibility(newAlpha != 0f && !mDozing ? VISIBLE : INVISIBLE); + boolean hideForBypass = mFirstBypassAttempt && mUpdateMonitor.shouldListenForFace(); + mKeyguardStatusBar.setVisibility(newAlpha != 0f && !mDozing && !hideForBypass + ? VISIBLE : INVISIBLE); } private void updateKeyguardBottomAreaAlpha() { diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationPanelViewTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationPanelViewTest.java index 86ab3a70c3ac..2f2449473e1b 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationPanelViewTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationPanelViewTest.java @@ -21,19 +21,23 @@ import static com.google.common.truth.Truth.assertThat; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.inOrder; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.never; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.app.StatusBarManager; +import android.hardware.biometrics.BiometricSourceType; import android.testing.AndroidTestingRunner; import android.testing.TestableLooper; import android.view.MotionEvent; +import android.view.View; import android.view.ViewGroup; import androidx.test.filters.SmallTest; import com.android.keyguard.KeyguardStatusView; +import com.android.keyguard.KeyguardUpdateMonitor; import com.android.systemui.SystemUIFactory; import com.android.systemui.SysuiTestCase; import com.android.systemui.plugins.FalsingManager; @@ -51,7 +55,6 @@ import com.android.systemui.statusbar.notification.stack.NotificationRoundnessMa import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayout; import com.android.systemui.statusbar.policy.ConfigurationController; import com.android.systemui.statusbar.policy.ZenModeController; -import com.android.systemui.tuner.TunerService; import com.android.systemui.util.InjectionInflationController; import org.junit.Before; @@ -101,7 +104,11 @@ public class NotificationPanelViewTest extends SysuiTestCase { @Mock private KeyguardAffordanceHelper mAffordanceHelper; @Mock + private KeyguardUpdateMonitor mUpdateMonitor; + @Mock private FalsingManager mFalsingManager; + @Mock + private KeyguardBypassController mKeyguardBypassController; private NotificationPanelView mNotificationPanelView; @Before @@ -112,22 +119,21 @@ public class NotificationPanelViewTest extends SysuiTestCase { when(mHeadsUpCallback.getContext()).thenReturn(mContext); mDependency.injectTestDependency(StatusBarStateController.class, mStatusBarStateController); + mDependency.injectTestDependency(KeyguardUpdateMonitor.class, mUpdateMonitor); mDependency.injectMockDependency(ShadeController.class); mDependency.injectMockDependency(NotificationLockscreenUserManager.class); mDependency.injectMockDependency(ConfigurationController.class); mDependency.injectMockDependency(ZenModeController.class); - KeyguardBypassController bypassController = new KeyguardBypassController(mContext, - mock(TunerService.class), mStatusBarStateController, - mock(NotificationLockscreenUserManager.class)); NotificationWakeUpCoordinator coordinator = new NotificationWakeUpCoordinator(mContext, mock(HeadsUpManagerPhone.class), new StatusBarStateControllerImpl(), - bypassController); + mKeyguardBypassController); PulseExpansionHandler expansionHandler = new PulseExpansionHandler(mContext, coordinator, - bypassController, mHeadsUpManager, mock(NotificationRoundnessManager.class)); + mKeyguardBypassController, mHeadsUpManager, + mock(NotificationRoundnessManager.class)); mNotificationPanelView = new TestableNotificationPanelView(coordinator, expansionHandler, - bypassController); + mKeyguardBypassController); mNotificationPanelView.setHeadsUpManager(mHeadsUpManager); mNotificationPanelView.setBar(mPanelBar); @@ -187,6 +193,20 @@ public class NotificationPanelViewTest extends SysuiTestCase { assertThat(mNotificationPanelView.isTrackingBlocked()).isFalse(); } + @Test + public void testKeyguardStatusBarVisibility_hiddenForBypass() { + when(mUpdateMonitor.shouldListenForFace()).thenReturn(true); + mNotificationPanelView.mKeyguardUpdateCallback.onBiometricRunningStateChanged(true, + BiometricSourceType.FACE); + verify(mKeyguardStatusBar, never()).setVisibility(View.VISIBLE); + + when(mKeyguardBypassController.getBypassEnabled()).thenReturn(true); + mNotificationPanelView.mKeyguardUpdateCallback.onFinishedGoingToSleep(0); + mNotificationPanelView.mKeyguardUpdateCallback.onBiometricRunningStateChanged(true, + BiometricSourceType.FACE); + verify(mKeyguardStatusBar, never()).setVisibility(View.VISIBLE); + } + private class TestableNotificationPanelView extends NotificationPanelView { TestableNotificationPanelView(NotificationWakeUpCoordinator coordinator, PulseExpansionHandler expansionHandler, |