diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarViewController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarViewController.java index fefa994ff20e9..af9d92113c5c8 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarViewController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarViewController.java @@ -16,6 +16,7 @@ package com.android.systemui.statusbar.phone; +import static com.android.systemui.statusbar.StatusBarState.KEYGUARD; import static com.android.systemui.statusbar.events.SystemStatusAnimationSchedulerKt.ANIMATING_IN; import static com.android.systemui.statusbar.events.SystemStatusAnimationSchedulerKt.ANIMATING_OUT; @@ -23,19 +24,26 @@ import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.ValueAnimator; import android.content.res.Resources; +import android.hardware.biometrics.BiometricSourceType; import android.view.View; import androidx.annotation.NonNull; import com.android.keyguard.CarrierTextController; +import com.android.keyguard.KeyguardUpdateMonitor; +import com.android.keyguard.KeyguardUpdateMonitorCallback; import com.android.systemui.R; import com.android.systemui.animation.Interpolators; import com.android.systemui.battery.BatteryMeterViewController; +import com.android.systemui.plugins.statusbar.StatusBarStateController; +import com.android.systemui.statusbar.StatusBarState; +import com.android.systemui.statusbar.SysuiStatusBarStateController; import com.android.systemui.statusbar.events.SystemStatusAnimationCallback; import com.android.systemui.statusbar.events.SystemStatusAnimationScheduler; import com.android.systemui.statusbar.notification.stack.StackStateAnimator; import com.android.systemui.statusbar.policy.BatteryController; import com.android.systemui.statusbar.policy.ConfigurationController; +import com.android.systemui.statusbar.policy.KeyguardStateController; import com.android.systemui.statusbar.policy.UserInfoController; import com.android.systemui.util.ViewController; @@ -58,6 +66,11 @@ public class KeyguardStatusBarViewController extends ViewController mBlockedIcons; private boolean mBatteryListening; private StatusBarIconController.TintedIconManager mTintedIconManager; private float mKeyguardStatusBarAnimateAlpha = 1f; + /** + * If face auth with bypass is running for the first time after you turn on the screen. + * (From aod or screen off) + */ + private boolean mFirstBypassAttempt; + /** + * If auth happens successfully during {@code mFirstBypassAttempt}, and we should wait until + * the keyguard is dismissed to show the status bar. + */ + private boolean mDelayShowingKeyguardStatusBar; + private int mStatusBarState; + private boolean mDozing; @Inject public KeyguardStatusBarViewController( @@ -133,7 +205,12 @@ public class KeyguardStatusBarViewController extends ViewController new KeyguardStatusBarViewController.ViewState(mAlpha); + @Before public void setup() throws Exception { MockitoAnnotations.initMocks(this); @@ -92,7 +114,12 @@ public class KeyguardStatusBarViewControllerTest extends SysuiTestCase { mStatusBarIconController, new StatusBarIconController.TintedIconManager.Factory(mFeatureFlags), mBatteryMeterViewController, - mViewStateProvider + mViewStateProvider, + mKeyguardStateController, + mKeyguardBypassController, + mKeyguardUpdateMonitor, + mBiometricUnlockController, + mStatusBarStateController ); } @@ -180,4 +207,92 @@ public class KeyguardStatusBarViewControllerTest extends SysuiTestCase { assertThat(mKeyguardStatusBarView.getAlpha()).isEqualTo(newAlpha); assertThat(mKeyguardStatusBarView.getVisibility()).isEqualTo(newVisibility); } + + @Test + public void updateViewState_notKeyguardState_nothingUpdated() { + mAlpha = 0.255f; + mController.onViewAttached(); + updateStateToNotKeyguard(); + + float oldAlpha = mKeyguardStatusBarView.getAlpha(); + + mController.updateViewState(); + + assertThat(mKeyguardStatusBarView.getAlpha()).isEqualTo(oldAlpha); + } + + @Test + public void updateViewState_bypassEnabledAndShouldListenForFace_viewHidden() { + mController.onViewAttached(); + updateStateToKeyguard(); + assertThat(mKeyguardStatusBarView.getVisibility()).isEqualTo(View.VISIBLE); + + when(mKeyguardUpdateMonitor.shouldListenForFace()).thenReturn(true); + when(mKeyguardBypassController.getBypassEnabled()).thenReturn(true); + onFinishedGoingToSleep(); + + mController.updateViewState(); + + assertThat(mKeyguardStatusBarView.getVisibility()).isEqualTo(View.INVISIBLE); + } + + @Test + public void updateViewState_bypassNotEnabled_viewShown() { + mController.onViewAttached(); + updateStateToKeyguard(); + + when(mKeyguardUpdateMonitor.shouldListenForFace()).thenReturn(true); + when(mKeyguardBypassController.getBypassEnabled()).thenReturn(false); + onFinishedGoingToSleep(); + + mController.updateViewState(); + + assertThat(mKeyguardStatusBarView.getVisibility()).isEqualTo(View.VISIBLE); + } + + @Test + public void updateViewState_shouldNotListenForFace_viewShown() { + mController.onViewAttached(); + updateStateToKeyguard(); + + when(mKeyguardUpdateMonitor.shouldListenForFace()).thenReturn(false); + when(mKeyguardBypassController.getBypassEnabled()).thenReturn(true); + onFinishedGoingToSleep(); + + mController.updateViewState(); + + assertThat(mKeyguardStatusBarView.getVisibility()).isEqualTo(View.VISIBLE); + } + + // TODO(b/195442899): Add more tests for #updateViewState once CLs are finalized. + + private void updateStateToNotKeyguard() { + updateStatusBarState(SHADE); + } + + private void updateStateToKeyguard() { + updateStatusBarState(KEYGUARD); + } + + private void updateStatusBarState(int state) { + ArgumentCaptor statusBarStateListenerCaptor = + ArgumentCaptor.forClass(StatusBarStateController.StateListener.class); + verify(mStatusBarStateController).addCallback(statusBarStateListenerCaptor.capture()); + StatusBarStateController.StateListener callback = statusBarStateListenerCaptor.getValue(); + + callback.onStateChanged(state); + } + + /** + * Calls {@link com.android.keyguard.KeyguardUpdateMonitorCallback#onFinishedGoingToSleep(int)} + * to ensure values are updated properly. + */ + private void onFinishedGoingToSleep() { + ArgumentCaptor keyguardUpdateCallbackCaptor = + ArgumentCaptor.forClass(KeyguardUpdateMonitorCallback.class); + verify(mKeyguardUpdateMonitor).registerCallback(keyguardUpdateCallbackCaptor.capture()); + KeyguardUpdateMonitorCallback callback = keyguardUpdateCallbackCaptor.getValue(); + + callback.onFinishedGoingToSleep(0); + } } 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 440b022402929..dc220362c086d 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 @@ -47,7 +47,6 @@ import android.content.ContentResolver; import android.content.res.Configuration; import android.content.res.Resources; import android.database.ContentObserver; -import android.hardware.biometrics.BiometricSourceType; import android.os.Handler; import android.os.Looper; import android.os.PowerManager; @@ -241,8 +240,6 @@ public class NotificationPanelViewTest extends SysuiTestCase { @Mock private ConversationNotificationManager mConversationNotificationManager; @Mock - private BiometricUnlockController mBiometricUnlockController; - @Mock private StatusBarKeyguardViewManager mStatusBarKeyguardViewManager; @Mock private KeyguardStatusViewComponent.Factory mKeyguardStatusViewComponentFactory; @@ -476,7 +473,7 @@ public class NotificationPanelViewTest extends SysuiTestCase { mCommunalSourceMonitor, mMetricsLogger, mActivityManager, mConfigurationController, () -> flingAnimationUtilsBuilder, mStatusBarTouchableRegionManager, mConversationNotificationManager, mMediaHiearchyManager, - mBiometricUnlockController, mStatusBarKeyguardViewManager, + mStatusBarKeyguardViewManager, mNotificationStackScrollLayoutController, mKeyguardStatusViewComponentFactory, mKeyguardQsUserSwitchComponentFactory, @@ -573,20 +570,6 @@ public class NotificationPanelViewTest extends SysuiTestCase { assertThat(mNotificationPanelViewController.isTrackingBlocked()).isFalse(); } - @Test - public void testKeyguardStatusBarVisibility_hiddenForBypass() { - when(mUpdateMonitor.shouldListenForFace()).thenReturn(true); - mNotificationPanelViewController.mKeyguardUpdateCallback.onBiometricRunningStateChanged( - true, BiometricSourceType.FACE); - verify(mKeyguardStatusBar, never()).setVisibility(View.VISIBLE); - - when(mKeyguardBypassController.getBypassEnabled()).thenReturn(true); - mNotificationPanelViewController.mKeyguardUpdateCallback.onFinishedGoingToSleep(0); - mNotificationPanelViewController.mKeyguardUpdateCallback.onBiometricRunningStateChanged( - true, BiometricSourceType.FACE); - verify(mKeyguardStatusBar, never()).setVisibility(View.VISIBLE); - } - @Test public void testA11y_initializeNode() { AccessibilityNodeInfo nodeInfo = new AccessibilityNodeInfo();