[View Controllers] (2/3) Move KSBVC's visibility and shouldUpdate calculation

out of NPVController and into KSBVC.

Test: atest (+ new unit tests) and manual
Bug: 195442899
Change-Id: I0a88132293dd5a083122a3fd971a5bbc6487355f
This commit is contained in:
Caitlin Cassidy
2021-08-24 19:52:03 +00:00
parent 18a1243a55
commit 997a43c279
4 changed files with 242 additions and 109 deletions

View File

@@ -16,6 +16,7 @@
package com.android.systemui.statusbar.phone; 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_IN;
import static com.android.systemui.statusbar.events.SystemStatusAnimationSchedulerKt.ANIMATING_OUT; 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.AnimatorListenerAdapter;
import android.animation.ValueAnimator; import android.animation.ValueAnimator;
import android.content.res.Resources; import android.content.res.Resources;
import android.hardware.biometrics.BiometricSourceType;
import android.view.View; import android.view.View;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import com.android.keyguard.CarrierTextController; import com.android.keyguard.CarrierTextController;
import com.android.keyguard.KeyguardUpdateMonitor;
import com.android.keyguard.KeyguardUpdateMonitorCallback;
import com.android.systemui.R; import com.android.systemui.R;
import com.android.systemui.animation.Interpolators; import com.android.systemui.animation.Interpolators;
import com.android.systemui.battery.BatteryMeterViewController; 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.SystemStatusAnimationCallback;
import com.android.systemui.statusbar.events.SystemStatusAnimationScheduler; import com.android.systemui.statusbar.events.SystemStatusAnimationScheduler;
import com.android.systemui.statusbar.notification.stack.StackStateAnimator; import com.android.systemui.statusbar.notification.stack.StackStateAnimator;
import com.android.systemui.statusbar.policy.BatteryController; import com.android.systemui.statusbar.policy.BatteryController;
import com.android.systemui.statusbar.policy.ConfigurationController; 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.statusbar.policy.UserInfoController;
import com.android.systemui.util.ViewController; import com.android.systemui.util.ViewController;
@@ -58,6 +66,11 @@ public class KeyguardStatusBarViewController extends ViewController<KeyguardStat
private final StatusBarIconController.TintedIconManager.Factory mTintedIconManagerFactory; private final StatusBarIconController.TintedIconManager.Factory mTintedIconManagerFactory;
private final BatteryMeterViewController mBatteryMeterViewController; private final BatteryMeterViewController mBatteryMeterViewController;
private final ViewStateProvider mViewStateProvider; private final ViewStateProvider mViewStateProvider;
private final KeyguardStateController mKeyguardStateController;
private final KeyguardBypassController mKeyguardBypassController;
private final KeyguardUpdateMonitor mKeyguardUpdateMonitor;
private final BiometricUnlockController mBiometricUnlockController;
private final SysuiStatusBarStateController mStatusBarStateController;
private final ConfigurationController.ConfigurationListener mConfigurationListener = private final ConfigurationController.ConfigurationListener mConfigurationListener =
new ConfigurationController.ConfigurationListener() { new ConfigurationController.ConfigurationListener() {
@@ -115,12 +128,71 @@ public class KeyguardStatusBarViewController extends ViewController<KeyguardStat
updateViewState(); updateViewState();
}; };
private final KeyguardUpdateMonitorCallback mKeyguardUpdateMonitorCallback =
new KeyguardUpdateMonitorCallback() {
@Override
public void onBiometricAuthenticated(
int userId,
BiometricSourceType biometricSourceType,
boolean isStrongBiometric) {
if (mFirstBypassAttempt
&& mKeyguardUpdateMonitor.isUnlockingWithBiometricAllowed(
isStrongBiometric)) {
mDelayShowingKeyguardStatusBar = true;
}
}
@Override
public void onBiometricRunningStateChanged(
boolean running,
BiometricSourceType biometricSourceType) {
boolean keyguardOrShadeLocked =
mStatusBarState == KEYGUARD
|| mStatusBarState == StatusBarState.SHADE_LOCKED;
if (!running
&& mFirstBypassAttempt
&& keyguardOrShadeLocked
&& !mDozing
&& !mDelayShowingKeyguardStatusBar
&& !mBiometricUnlockController.isBiometricUnlock()) {
mFirstBypassAttempt = false;
animateKeyguardStatusBarIn();
}
}
@Override
public void onFinishedGoingToSleep(int why) {
mFirstBypassAttempt = mKeyguardBypassController.getBypassEnabled();
mDelayShowingKeyguardStatusBar = false;
}
};
private final StatusBarStateController.StateListener mStatusBarStateListener =
new StatusBarStateController.StateListener() {
@Override
public void onStateChanged(int newState) {
mStatusBarState = newState;
}
};
private final List<String> mBlockedIcons; private final List<String> mBlockedIcons;
private boolean mBatteryListening; private boolean mBatteryListening;
private StatusBarIconController.TintedIconManager mTintedIconManager; private StatusBarIconController.TintedIconManager mTintedIconManager;
private float mKeyguardStatusBarAnimateAlpha = 1f; 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 @Inject
public KeyguardStatusBarViewController( public KeyguardStatusBarViewController(
@@ -133,7 +205,12 @@ public class KeyguardStatusBarViewController extends ViewController<KeyguardStat
StatusBarIconController statusBarIconController, StatusBarIconController statusBarIconController,
StatusBarIconController.TintedIconManager.Factory tintedIconManagerFactory, StatusBarIconController.TintedIconManager.Factory tintedIconManagerFactory,
BatteryMeterViewController batteryMeterViewController, BatteryMeterViewController batteryMeterViewController,
ViewStateProvider viewStateProvider) { ViewStateProvider viewStateProvider,
KeyguardStateController keyguardStateController,
KeyguardBypassController bypassController,
KeyguardUpdateMonitor keyguardUpdateMonitor,
BiometricUnlockController biometricUnlockController,
SysuiStatusBarStateController statusBarStateController) {
super(view); super(view);
mCarrierTextController = carrierTextController; mCarrierTextController = carrierTextController;
mConfigurationController = configurationController; mConfigurationController = configurationController;
@@ -144,6 +221,24 @@ public class KeyguardStatusBarViewController extends ViewController<KeyguardStat
mTintedIconManagerFactory = tintedIconManagerFactory; mTintedIconManagerFactory = tintedIconManagerFactory;
mBatteryMeterViewController = batteryMeterViewController; mBatteryMeterViewController = batteryMeterViewController;
mViewStateProvider = viewStateProvider; mViewStateProvider = viewStateProvider;
mKeyguardStateController = keyguardStateController;
mKeyguardBypassController = bypassController;
mKeyguardUpdateMonitor = keyguardUpdateMonitor;
mBiometricUnlockController = biometricUnlockController;
mStatusBarStateController = statusBarStateController;
mFirstBypassAttempt = mKeyguardBypassController.getBypassEnabled();
mKeyguardStateController.addCallback(
new KeyguardStateController.Callback() {
@Override
public void onKeyguardFadingAwayChanged() {
if (!mKeyguardStateController.isKeyguardFadingAway()) {
mFirstBypassAttempt = false;
mDelayShowingKeyguardStatusBar = false;
}
}
}
);
Resources r = getResources(); Resources r = getResources();
mBlockedIcons = Collections.unmodifiableList(Arrays.asList( mBlockedIcons = Collections.unmodifiableList(Arrays.asList(
@@ -164,6 +259,8 @@ public class KeyguardStatusBarViewController extends ViewController<KeyguardStat
mConfigurationController.addCallback(mConfigurationListener); mConfigurationController.addCallback(mConfigurationListener);
mAnimationScheduler.addCallback(mAnimationCallback); mAnimationScheduler.addCallback(mAnimationCallback);
mUserInfoController.addCallback(mOnUserInfoChangedListener); mUserInfoController.addCallback(mOnUserInfoChangedListener);
mStatusBarStateController.addCallback(mStatusBarStateListener);
mKeyguardUpdateMonitor.registerCallback(mKeyguardUpdateMonitorCallback);
if (mTintedIconManager == null) { if (mTintedIconManager == null) {
mTintedIconManager = mTintedIconManager =
mTintedIconManagerFactory.create(mView.findViewById(R.id.statusIcons)); mTintedIconManagerFactory.create(mView.findViewById(R.id.statusIcons));
@@ -178,6 +275,8 @@ public class KeyguardStatusBarViewController extends ViewController<KeyguardStat
mConfigurationController.removeCallback(mConfigurationListener); mConfigurationController.removeCallback(mConfigurationListener);
mAnimationScheduler.removeCallback(mAnimationCallback); mAnimationScheduler.removeCallback(mAnimationCallback);
mUserInfoController.removeCallback(mOnUserInfoChangedListener); mUserInfoController.removeCallback(mOnUserInfoChangedListener);
mStatusBarStateController.removeCallback(mStatusBarStateListener);
mKeyguardUpdateMonitor.removeCallback(mKeyguardUpdateMonitorCallback);
if (mTintedIconManager != null) { if (mTintedIconManager != null) {
mStatusBarIconController.removeIconGroup(mTintedIconManager); mStatusBarIconController.removeIconGroup(mTintedIconManager);
} }
@@ -221,6 +320,11 @@ public class KeyguardStatusBarViewController extends ViewController<KeyguardStat
mView.setTopClipping(notificationPanelTop - mView.getTop()); mView.setTopClipping(notificationPanelTop - mView.getTop());
} }
/** Sets the dozing state. */
public void setDozing(boolean dozing) {
mDozing = dozing;
}
/** Animate the keyguard status bar in. */ /** Animate the keyguard status bar in. */
public void animateKeyguardStatusBarIn() { public void animateKeyguardStatusBarIn() {
mView.setVisibility(View.VISIBLE); mView.setVisibility(View.VISIBLE);
@@ -252,16 +356,23 @@ public class KeyguardStatusBarViewController extends ViewController<KeyguardStat
/** /**
* Updates the {@link KeyguardStatusBarView} state based on what the {@link ViewStateProvider} * Updates the {@link KeyguardStatusBarView} state based on what the {@link ViewStateProvider}
* provides. * and other controllers provide.
*/ */
public void updateViewState() { public void updateViewState() {
ViewState newViewState = mViewStateProvider.provideViewState(); ViewState newViewState = mViewStateProvider.provideViewState();
if (!newViewState.mShouldUpdate) { if (!isKeyguardShowing()) {
return; return;
} }
updateViewState(
newViewState.mAlpha * mKeyguardStatusBarAnimateAlpha, float newAlpha = newViewState.mAlpha * mKeyguardStatusBarAnimateAlpha;
newViewState.mVisibility);
boolean hideForBypass =
mFirstBypassAttempt && mKeyguardUpdateMonitor.shouldListenForFace()
|| mDelayShowingKeyguardStatusBar;
int newVisibility = newAlpha != 0f && !mDozing && !hideForBypass
? View.VISIBLE : View.INVISIBLE;
updateViewState(newAlpha, newVisibility);
} }
/** /**
@@ -272,6 +383,10 @@ public class KeyguardStatusBarViewController extends ViewController<KeyguardStat
mView.setVisibility(visibility); mView.setVisibility(visibility);
} }
private boolean isKeyguardShowing() {
return mStatusBarState == KEYGUARD;
}
/** */ /** */
public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
pw.println("KeyguardStatusBarView:"); pw.println("KeyguardStatusBarView:");
@@ -287,14 +402,10 @@ public class KeyguardStatusBarViewController extends ViewController<KeyguardStat
/** A POJO for the desired state of {@link KeyguardStatusBarView}. */ /** A POJO for the desired state of {@link KeyguardStatusBarView}. */
static class ViewState { static class ViewState {
final boolean mShouldUpdate;
final float mAlpha; final float mAlpha;
final int mVisibility;
ViewState(boolean shouldUpdate, float alpha, int visibility) { ViewState(float alpha) {
this.mShouldUpdate = shouldUpdate;
this.mAlpha = alpha; this.mAlpha = alpha;
this.mVisibility = visibility;
} }
} }
} }

View File

@@ -55,7 +55,6 @@ import android.graphics.PointF;
import android.graphics.Rect; import android.graphics.Rect;
import android.graphics.Region; import android.graphics.Region;
import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable;
import android.hardware.biometrics.BiometricSourceType;
import android.os.Bundle; import android.os.Bundle;
import android.os.Handler; import android.os.Handler;
import android.os.PowerManager; import android.os.PowerManager;
@@ -92,7 +91,6 @@ import com.android.internal.util.LatencyTracker;
import com.android.keyguard.KeyguardStatusView; import com.android.keyguard.KeyguardStatusView;
import com.android.keyguard.KeyguardStatusViewController; import com.android.keyguard.KeyguardStatusViewController;
import com.android.keyguard.KeyguardUpdateMonitor; import com.android.keyguard.KeyguardUpdateMonitor;
import com.android.keyguard.KeyguardUpdateMonitorCallback;
import com.android.keyguard.LockIconViewController; import com.android.keyguard.LockIconViewController;
import com.android.keyguard.dagger.KeyguardQsUserSwitchComponent; import com.android.keyguard.dagger.KeyguardQsUserSwitchComponent;
import com.android.keyguard.dagger.KeyguardStatusBarViewComponent; import com.android.keyguard.dagger.KeyguardStatusBarViewComponent;
@@ -242,7 +240,6 @@ public class NotificationPanelViewController extends PanelViewController {
@VisibleForTesting final StatusBarStateListener mStatusBarStateListener = @VisibleForTesting final StatusBarStateListener mStatusBarStateListener =
new StatusBarStateListener(); new StatusBarStateListener();
private final BiometricUnlockController mBiometricUnlockController;
private final NotificationPanelView mView; private final NotificationPanelView mView;
private final VibratorHelper mVibratorHelper; private final VibratorHelper mVibratorHelper;
private final MetricsLogger mMetricsLogger; private final MetricsLogger mMetricsLogger;
@@ -280,42 +277,6 @@ public class NotificationPanelViewController extends PanelViewController {
private static final AnimationProperties private static final AnimationProperties
KEYGUARD_HUN_PROPERTIES = KEYGUARD_HUN_PROPERTIES =
new AnimationProperties().setDuration(StackStateAnimator.ANIMATION_DURATION_STANDARD); new AnimationProperties().setDuration(StackStateAnimator.ANIMATION_DURATION_STANDARD);
@VisibleForTesting
final KeyguardUpdateMonitorCallback
mKeyguardUpdateCallback =
new KeyguardUpdateMonitorCallback() {
@Override
public void onBiometricAuthenticated(int userId,
BiometricSourceType biometricSourceType,
boolean isStrongBiometric) {
if (mFirstBypassAttempt
&& mUpdateMonitor.isUnlockingWithBiometricAllowed(isStrongBiometric)) {
mDelayShowingKeyguardStatusBar = true;
}
}
@Override
public void onBiometricRunningStateChanged(boolean running,
BiometricSourceType biometricSourceType) {
boolean
keyguardOrShadeLocked =
mBarState == KEYGUARD
|| mBarState == StatusBarState.SHADE_LOCKED;
if (!running && mFirstBypassAttempt && keyguardOrShadeLocked && !mDozing
&& !mDelayShowingKeyguardStatusBar
&& !mBiometricUnlockController.isBiometricUnlock()) {
mFirstBypassAttempt = false;
mKeyguardStatusBarViewController.animateKeyguardStatusBarIn();
}
}
@Override
public void onFinishedGoingToSleep(int why) {
mFirstBypassAttempt = mKeyguardBypassController.getBypassEnabled();
mDelayShowingKeyguardStatusBar = false;
}
};
private final LayoutInflater mLayoutInflater; private final LayoutInflater mLayoutInflater;
private final PowerManager mPowerManager; private final PowerManager mPowerManager;
@@ -625,17 +586,6 @@ public class NotificationPanelViewController extends PanelViewController {
*/ */
private boolean mIsPanelCollapseOnQQS; private boolean mIsPanelCollapseOnQQS;
/**
* 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 boolean mAnimatingQS; private boolean mAnimatingQS;
/** /**
@@ -753,17 +703,7 @@ public class NotificationPanelViewController extends PanelViewController {
float alphaQsExpansion = 1 - Math.min(1, computeQsExpansionFraction() * 2); float alphaQsExpansion = 1 - Math.min(1, computeQsExpansionFraction() * 2);
float newAlpha = Math.min(getKeyguardContentsAlpha(), alphaQsExpansion) float newAlpha = Math.min(getKeyguardContentsAlpha(), alphaQsExpansion)
* (1.0f - mKeyguardHeadsUpShowingAmount); * (1.0f - mKeyguardHeadsUpShowingAmount);
return new KeyguardStatusBarViewController.ViewState(newAlpha);
boolean hideForBypass =
mFirstBypassAttempt && mUpdateMonitor.shouldListenForFace()
|| mDelayShowingKeyguardStatusBar;
int newVisibility = newAlpha != 0f && !mDozing && !hideForBypass
? View.VISIBLE : View.INVISIBLE;
return new KeyguardStatusBarViewController.ViewState(
/* shouldAnimate= */ mKeyguardShowing,
newAlpha,
newVisibility);
} }
}; };
@@ -792,7 +732,6 @@ public class NotificationPanelViewController extends PanelViewController {
StatusBarTouchableRegionManager statusBarTouchableRegionManager, StatusBarTouchableRegionManager statusBarTouchableRegionManager,
ConversationNotificationManager conversationNotificationManager, ConversationNotificationManager conversationNotificationManager,
MediaHierarchyManager mediaHierarchyManager, MediaHierarchyManager mediaHierarchyManager,
BiometricUnlockController biometricUnlockController,
StatusBarKeyguardViewManager statusBarKeyguardViewManager, StatusBarKeyguardViewManager statusBarKeyguardViewManager,
NotificationStackScrollLayoutController notificationStackScrollLayoutController, NotificationStackScrollLayoutController notificationStackScrollLayoutController,
KeyguardStatusViewComponent.Factory keyguardStatusViewComponentFactory, KeyguardStatusViewComponent.Factory keyguardStatusViewComponentFactory,
@@ -883,7 +822,6 @@ public class NotificationPanelViewController extends PanelViewController {
mDisplayId = displayId; mDisplayId = displayId;
mPulseExpansionHandler = pulseExpansionHandler; mPulseExpansionHandler = pulseExpansionHandler;
mDozeParameters = dozeParameters; mDozeParameters = dozeParameters;
mBiometricUnlockController = biometricUnlockController;
mScrimController = scrimController; mScrimController = scrimController;
mScrimController.setClipsQsScrim(!mShouldUseSplitNotificationShade); mScrimController.setClipsQsScrim(!mShouldUseSplitNotificationShade);
mUserManager = userManager; mUserManager = userManager;
@@ -900,21 +838,8 @@ public class NotificationPanelViewController extends PanelViewController {
mKeyguardBypassController = bypassController; mKeyguardBypassController = bypassController;
mUpdateMonitor = keyguardUpdateMonitor; mUpdateMonitor = keyguardUpdateMonitor;
mCommunalSourceMonitor = communalSourceMonitor; mCommunalSourceMonitor = communalSourceMonitor;
mFirstBypassAttempt = mKeyguardBypassController.getBypassEnabled();
KeyguardStateController.Callback
keyguardMonitorCallback =
new KeyguardStateController.Callback() {
@Override
public void onKeyguardFadingAwayChanged() {
if (!mKeyguardStateController.isKeyguardFadingAway()) {
mFirstBypassAttempt = false;
mDelayShowingKeyguardStatusBar = false;
}
}
};
mLockscreenShadeTransitionController = lockscreenShadeTransitionController; mLockscreenShadeTransitionController = lockscreenShadeTransitionController;
lockscreenShadeTransitionController.setNotificationPanelController(this); lockscreenShadeTransitionController.setNotificationPanelController(this);
mKeyguardStateController.addCallback(keyguardMonitorCallback);
DynamicPrivacyControlListener DynamicPrivacyControlListener
dynamicPrivacyControlListener = dynamicPrivacyControlListener =
new DynamicPrivacyControlListener(); new DynamicPrivacyControlListener();
@@ -3740,6 +3665,7 @@ public class NotificationPanelViewController extends PanelViewController {
mDozing = dozing; mDozing = dozing;
mNotificationStackScrollLayoutController.setDozing(mDozing, animate, wakeUpTouchLocation); mNotificationStackScrollLayoutController.setDozing(mDozing, animate, wakeUpTouchLocation);
mKeyguardBottomArea.setDozing(mDozing, animate); mKeyguardBottomArea.setDozing(mDozing, animate);
mKeyguardStatusBarViewController.setDozing(mDozing);
if (dozing) { if (dozing) {
mBottomAreaShadeAlphaAnimator.cancel(); mBottomAreaShadeAlphaAnimator.cancel();
@@ -4649,7 +4575,6 @@ public class NotificationPanelViewController extends PanelViewController {
.addTagListener(QS.TAG, mFragmentListener); .addTagListener(QS.TAG, mFragmentListener);
mStatusBarStateController.addCallback(mStatusBarStateListener); mStatusBarStateController.addCallback(mStatusBarStateListener);
mConfigurationController.addCallback(mConfigurationListener); mConfigurationController.addCallback(mConfigurationListener);
mUpdateMonitor.registerCallback(mKeyguardUpdateCallback);
mCommunalSourceMonitor.addCallback(mCommunalSourceMonitorCallback); mCommunalSourceMonitor.addCallback(mCommunalSourceMonitorCallback);
// Theme might have changed between inflating this view and attaching it to the // Theme might have changed between inflating this view and attaching it to the
// window, so // window, so
@@ -4668,7 +4593,6 @@ public class NotificationPanelViewController extends PanelViewController {
.removeTagListener(QS.TAG, mFragmentListener); .removeTagListener(QS.TAG, mFragmentListener);
mStatusBarStateController.removeCallback(mStatusBarStateListener); mStatusBarStateController.removeCallback(mStatusBarStateListener);
mConfigurationController.removeCallback(mConfigurationListener); mConfigurationController.removeCallback(mConfigurationListener);
mUpdateMonitor.removeCallback(mKeyguardUpdateCallback);
mCommunalSourceMonitor.removeCallback(mCommunalSourceMonitorCallback); mCommunalSourceMonitor.removeCallback(mCommunalSourceMonitorCallback);
// Clear source when detached. // Clear source when detached.
setCommunalSource(null /*source*/); setCommunalSource(null /*source*/);

View File

@@ -17,10 +17,14 @@
package com.android.systemui.statusbar.phone; package com.android.systemui.statusbar.phone;
import static com.android.systemui.statusbar.StatusBarState.KEYGUARD;
import static com.android.systemui.statusbar.StatusBarState.SHADE;
import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertThat;
import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import android.testing.AndroidTestingRunner; import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper; import android.testing.TestableLooper;
@@ -30,18 +34,24 @@ import android.view.View;
import androidx.test.filters.SmallTest; import androidx.test.filters.SmallTest;
import com.android.keyguard.CarrierTextController; import com.android.keyguard.CarrierTextController;
import com.android.keyguard.KeyguardUpdateMonitor;
import com.android.keyguard.KeyguardUpdateMonitorCallback;
import com.android.systemui.R; import com.android.systemui.R;
import com.android.systemui.SysuiTestCase; import com.android.systemui.SysuiTestCase;
import com.android.systemui.battery.BatteryMeterViewController; import com.android.systemui.battery.BatteryMeterViewController;
import com.android.systemui.flags.FeatureFlags; import com.android.systemui.flags.FeatureFlags;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.statusbar.SysuiStatusBarStateController;
import com.android.systemui.statusbar.events.SystemStatusAnimationScheduler; import com.android.systemui.statusbar.events.SystemStatusAnimationScheduler;
import com.android.systemui.statusbar.policy.BatteryController; import com.android.systemui.statusbar.policy.BatteryController;
import com.android.systemui.statusbar.policy.ConfigurationController; 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.statusbar.policy.UserInfoController;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import org.mockito.Mock; import org.mockito.Mock;
import org.mockito.MockitoAnnotations; import org.mockito.MockitoAnnotations;
@@ -66,11 +76,23 @@ public class KeyguardStatusBarViewControllerTest extends SysuiTestCase {
@Mock @Mock
private BatteryMeterViewController mBatteryMeterViewController; private BatteryMeterViewController mBatteryMeterViewController;
@Mock @Mock
private KeyguardStatusBarViewController.ViewStateProvider mViewStateProvider; private KeyguardStateController mKeyguardStateController;
@Mock
private KeyguardBypassController mKeyguardBypassController;
@Mock
private KeyguardUpdateMonitor mKeyguardUpdateMonitor;
@Mock
private BiometricUnlockController mBiometricUnlockController;
@Mock
private SysuiStatusBarStateController mStatusBarStateController;
private KeyguardStatusBarView mKeyguardStatusBarView; private KeyguardStatusBarView mKeyguardStatusBarView;
private KeyguardStatusBarViewController mController; private KeyguardStatusBarViewController mController;
private float mAlpha = 0.5f;
private final KeyguardStatusBarViewController.ViewStateProvider mViewStateProvider =
() -> new KeyguardStatusBarViewController.ViewState(mAlpha);
@Before @Before
public void setup() throws Exception { public void setup() throws Exception {
MockitoAnnotations.initMocks(this); MockitoAnnotations.initMocks(this);
@@ -92,7 +114,12 @@ public class KeyguardStatusBarViewControllerTest extends SysuiTestCase {
mStatusBarIconController, mStatusBarIconController,
new StatusBarIconController.TintedIconManager.Factory(mFeatureFlags), new StatusBarIconController.TintedIconManager.Factory(mFeatureFlags),
mBatteryMeterViewController, mBatteryMeterViewController,
mViewStateProvider mViewStateProvider,
mKeyguardStateController,
mKeyguardBypassController,
mKeyguardUpdateMonitor,
mBiometricUnlockController,
mStatusBarStateController
); );
} }
@@ -180,4 +207,92 @@ public class KeyguardStatusBarViewControllerTest extends SysuiTestCase {
assertThat(mKeyguardStatusBarView.getAlpha()).isEqualTo(newAlpha); assertThat(mKeyguardStatusBarView.getAlpha()).isEqualTo(newAlpha);
assertThat(mKeyguardStatusBarView.getVisibility()).isEqualTo(newVisibility); 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<StatusBarStateController.StateListener> 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<KeyguardUpdateMonitorCallback> keyguardUpdateCallbackCaptor =
ArgumentCaptor.forClass(KeyguardUpdateMonitorCallback.class);
verify(mKeyguardUpdateMonitor).registerCallback(keyguardUpdateCallbackCaptor.capture());
KeyguardUpdateMonitorCallback callback = keyguardUpdateCallbackCaptor.getValue();
callback.onFinishedGoingToSleep(0);
}
} }

View File

@@ -47,7 +47,6 @@ import android.content.ContentResolver;
import android.content.res.Configuration; import android.content.res.Configuration;
import android.content.res.Resources; import android.content.res.Resources;
import android.database.ContentObserver; import android.database.ContentObserver;
import android.hardware.biometrics.BiometricSourceType;
import android.os.Handler; import android.os.Handler;
import android.os.Looper; import android.os.Looper;
import android.os.PowerManager; import android.os.PowerManager;
@@ -241,8 +240,6 @@ public class NotificationPanelViewTest extends SysuiTestCase {
@Mock @Mock
private ConversationNotificationManager mConversationNotificationManager; private ConversationNotificationManager mConversationNotificationManager;
@Mock @Mock
private BiometricUnlockController mBiometricUnlockController;
@Mock
private StatusBarKeyguardViewManager mStatusBarKeyguardViewManager; private StatusBarKeyguardViewManager mStatusBarKeyguardViewManager;
@Mock @Mock
private KeyguardStatusViewComponent.Factory mKeyguardStatusViewComponentFactory; private KeyguardStatusViewComponent.Factory mKeyguardStatusViewComponentFactory;
@@ -476,7 +473,7 @@ public class NotificationPanelViewTest extends SysuiTestCase {
mCommunalSourceMonitor, mMetricsLogger, mActivityManager, mConfigurationController, mCommunalSourceMonitor, mMetricsLogger, mActivityManager, mConfigurationController,
() -> flingAnimationUtilsBuilder, mStatusBarTouchableRegionManager, () -> flingAnimationUtilsBuilder, mStatusBarTouchableRegionManager,
mConversationNotificationManager, mMediaHiearchyManager, mConversationNotificationManager, mMediaHiearchyManager,
mBiometricUnlockController, mStatusBarKeyguardViewManager, mStatusBarKeyguardViewManager,
mNotificationStackScrollLayoutController, mNotificationStackScrollLayoutController,
mKeyguardStatusViewComponentFactory, mKeyguardStatusViewComponentFactory,
mKeyguardQsUserSwitchComponentFactory, mKeyguardQsUserSwitchComponentFactory,
@@ -573,20 +570,6 @@ public class NotificationPanelViewTest extends SysuiTestCase {
assertThat(mNotificationPanelViewController.isTrackingBlocked()).isFalse(); 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 @Test
public void testA11y_initializeNode() { public void testA11y_initializeNode() {
AccessibilityNodeInfo nodeInfo = new AccessibilityNodeInfo(); AccessibilityNodeInfo nodeInfo = new AccessibilityNodeInfo();