Merge "Remove UNOCCLUSION_TRANSITION flag" into udc-dev
This commit is contained in:
@@ -21,8 +21,6 @@ import android.util.Slog;
|
||||
|
||||
import com.android.keyguard.KeyguardClockSwitch.ClockSize;
|
||||
import com.android.keyguard.logging.KeyguardLogger;
|
||||
import com.android.systemui.flags.FeatureFlags;
|
||||
import com.android.systemui.flags.Flags;
|
||||
import com.android.systemui.plugins.ClockAnimations;
|
||||
import com.android.systemui.statusbar.notification.AnimatableProperty;
|
||||
import com.android.systemui.statusbar.notification.PropertyAnimator;
|
||||
@@ -62,7 +60,6 @@ public class KeyguardStatusViewController extends ViewController<KeyguardStatusV
|
||||
KeyguardUpdateMonitor keyguardUpdateMonitor,
|
||||
ConfigurationController configurationController,
|
||||
DozeParameters dozeParameters,
|
||||
FeatureFlags featureFlags,
|
||||
ScreenOffAnimationController screenOffAnimationController,
|
||||
KeyguardLogger logger) {
|
||||
super(keyguardStatusView);
|
||||
@@ -73,8 +70,6 @@ public class KeyguardStatusViewController extends ViewController<KeyguardStatusV
|
||||
mKeyguardVisibilityHelper = new KeyguardVisibilityHelper(mView, keyguardStateController,
|
||||
dozeParameters, screenOffAnimationController, /* animateYPos= */ true,
|
||||
logger.getBuffer());
|
||||
mKeyguardVisibilityHelper.setOcclusionTransitionFlagEnabled(
|
||||
featureFlags.isEnabled(Flags.UNOCCLUSION_TRANSITION));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -28,7 +28,6 @@ import com.android.systemui.statusbar.StatusBarState;
|
||||
import com.android.systemui.statusbar.notification.AnimatableProperty;
|
||||
import com.android.systemui.statusbar.notification.PropertyAnimator;
|
||||
import com.android.systemui.statusbar.notification.stack.AnimationProperties;
|
||||
import com.android.systemui.statusbar.notification.stack.StackStateAnimator;
|
||||
import com.android.systemui.statusbar.phone.DozeParameters;
|
||||
import com.android.systemui.statusbar.phone.ScreenOffAnimationController;
|
||||
import com.android.systemui.statusbar.policy.KeyguardStateController;
|
||||
@@ -49,7 +48,6 @@ public class KeyguardVisibilityHelper {
|
||||
private boolean mAnimateYPos;
|
||||
private boolean mKeyguardViewVisibilityAnimating;
|
||||
private boolean mLastOccludedState = false;
|
||||
private boolean mIsUnoccludeTransitionFlagEnabled = false;
|
||||
private final AnimationProperties mAnimationProperties = new AnimationProperties();
|
||||
private final LogBuffer mLogBuffer;
|
||||
|
||||
@@ -77,10 +75,6 @@ public class KeyguardVisibilityHelper {
|
||||
return mKeyguardViewVisibilityAnimating;
|
||||
}
|
||||
|
||||
public void setOcclusionTransitionFlagEnabled(boolean enabled) {
|
||||
mIsUnoccludeTransitionFlagEnabled = enabled;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the visibility of a keyguard view based on some new state.
|
||||
*/
|
||||
@@ -156,24 +150,9 @@ public class KeyguardVisibilityHelper {
|
||||
// since it may need to be cancelled due to keyguard lifecycle events.
|
||||
mScreenOffAnimationController.animateInKeyguard(
|
||||
mView, mAnimateKeyguardStatusViewVisibleEndRunnable);
|
||||
} else if (!mIsUnoccludeTransitionFlagEnabled && mLastOccludedState && !isOccluded) {
|
||||
// An activity was displayed over the lock screen, and has now gone away
|
||||
log("Unoccluded transition");
|
||||
mView.setVisibility(View.VISIBLE);
|
||||
mView.setAlpha(0f);
|
||||
|
||||
mView.animate()
|
||||
.setDuration(StackStateAnimator.ANIMATION_DURATION_WAKEUP)
|
||||
.setInterpolator(Interpolators.FAST_OUT_SLOW_IN)
|
||||
.alpha(1f)
|
||||
.withEndAction(mAnimateKeyguardStatusViewVisibleEndRunnable)
|
||||
.start();
|
||||
} else {
|
||||
log("Direct set Visibility to VISIBLE");
|
||||
mView.setVisibility(View.VISIBLE);
|
||||
if (!mIsUnoccludeTransitionFlagEnabled) {
|
||||
mView.setAlpha(1f);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
log("Direct set Visibility to GONE");
|
||||
|
||||
@@ -189,10 +189,6 @@ object Flags {
|
||||
@JvmField
|
||||
val REVAMPED_WALLPAPER_UI = releasedFlag(222, "revamped_wallpaper_ui")
|
||||
|
||||
/** A different path for unocclusion transitions back to keyguard */
|
||||
// TODO(b/262859270): Tracking Bug
|
||||
@JvmField val UNOCCLUSION_TRANSITION = releasedFlag(223, "unocclusion_transition")
|
||||
|
||||
// flag for controlling auto pin confirmation and material u shapes in bouncer
|
||||
@JvmField
|
||||
val AUTO_PIN_CONFIRMATION =
|
||||
|
||||
@@ -127,8 +127,6 @@ import com.android.systemui.classifier.FalsingCollector;
|
||||
import com.android.systemui.dagger.qualifiers.UiBackground;
|
||||
import com.android.systemui.dreams.DreamOverlayStateController;
|
||||
import com.android.systemui.dump.DumpManager;
|
||||
import com.android.systemui.flags.FeatureFlags;
|
||||
import com.android.systemui.flags.Flags;
|
||||
import com.android.systemui.keyguard.dagger.KeyguardModule;
|
||||
import com.android.systemui.navigationbar.NavigationModeController;
|
||||
import com.android.systemui.plugins.statusbar.StatusBarStateController;
|
||||
@@ -522,8 +520,6 @@ public class KeyguardViewMediator implements CoreStartable, Dumpable,
|
||||
|
||||
private CentralSurfaces mCentralSurfaces;
|
||||
|
||||
private boolean mUnocclusionTransitionFlagEnabled = false;
|
||||
|
||||
private final DeviceConfig.OnPropertiesChangedListener mOnPropertiesChangedListener =
|
||||
new DeviceConfig.OnPropertiesChangedListener() {
|
||||
@Override
|
||||
@@ -970,9 +966,6 @@ public class KeyguardViewMediator implements CoreStartable, Dumpable,
|
||||
public void onAnimationStart(int transit, RemoteAnimationTarget[] apps,
|
||||
RemoteAnimationTarget[] wallpapers, RemoteAnimationTarget[] nonApps,
|
||||
IRemoteAnimationFinishedCallback finishedCallback) throws RemoteException {
|
||||
if (!mUnocclusionTransitionFlagEnabled) {
|
||||
setOccluded(true /* isOccluded */, true /* animate */);
|
||||
}
|
||||
if (apps == null || apps.length == 0 || apps[0] == null) {
|
||||
if (DEBUG) {
|
||||
Log.d(TAG, "No apps provided to the OccludeByDream runner; "
|
||||
@@ -1023,7 +1016,7 @@ public class KeyguardViewMediator implements CoreStartable, Dumpable,
|
||||
@Override
|
||||
public void onAnimationEnd(Animator animation) {
|
||||
try {
|
||||
if (!mIsCancelled && mUnocclusionTransitionFlagEnabled) {
|
||||
if (!mIsCancelled) {
|
||||
// We're already on the main thread, don't queue this call
|
||||
handleSetOccluded(true /* isOccluded */,
|
||||
false /* animate */);
|
||||
@@ -1200,7 +1193,6 @@ public class KeyguardViewMediator implements CoreStartable, Dumpable,
|
||||
ScreenOnCoordinator screenOnCoordinator,
|
||||
InteractionJankMonitor interactionJankMonitor,
|
||||
DreamOverlayStateController dreamOverlayStateController,
|
||||
FeatureFlags featureFlags,
|
||||
Lazy<ShadeController> shadeControllerLazy,
|
||||
Lazy<NotificationShadeWindowController> notificationShadeWindowControllerLazy,
|
||||
Lazy<ActivityLaunchAnimator> activityLaunchAnimator,
|
||||
@@ -1259,7 +1251,6 @@ public class KeyguardViewMediator implements CoreStartable, Dumpable,
|
||||
|
||||
mDreamOpenAnimationDuration = (int) DREAMING_ANIMATION_DURATION_MS;
|
||||
mDreamCloseAnimationDuration = (int) LOCKSCREEN_ANIMATION_DURATION_MS;
|
||||
mUnocclusionTransitionFlagEnabled = featureFlags.isEnabled(Flags.UNOCCLUSION_TRANSITION);
|
||||
}
|
||||
|
||||
public void userActivity() {
|
||||
|
||||
@@ -39,7 +39,6 @@ import com.android.systemui.dagger.SysUISingleton;
|
||||
import com.android.systemui.dagger.qualifiers.UiBackground;
|
||||
import com.android.systemui.dreams.DreamOverlayStateController;
|
||||
import com.android.systemui.dump.DumpManager;
|
||||
import com.android.systemui.flags.FeatureFlags;
|
||||
import com.android.systemui.keyguard.DismissCallbackRegistry;
|
||||
import com.android.systemui.keyguard.KeyguardUnlockAnimationController;
|
||||
import com.android.systemui.keyguard.KeyguardViewMediator;
|
||||
@@ -113,7 +112,6 @@ public class KeyguardModule {
|
||||
ScreenOnCoordinator screenOnCoordinator,
|
||||
InteractionJankMonitor interactionJankMonitor,
|
||||
DreamOverlayStateController dreamOverlayStateController,
|
||||
FeatureFlags featureFlags,
|
||||
Lazy<ShadeController> shadeController,
|
||||
Lazy<NotificationShadeWindowController> notificationShadeWindowController,
|
||||
Lazy<ActivityLaunchAnimator> activityLaunchAnimator,
|
||||
@@ -144,7 +142,6 @@ public class KeyguardModule {
|
||||
screenOnCoordinator,
|
||||
interactionJankMonitor,
|
||||
dreamOverlayStateController,
|
||||
featureFlags,
|
||||
shadeController,
|
||||
notificationShadeWindowController,
|
||||
activityLaunchAnimator,
|
||||
|
||||
@@ -465,7 +465,7 @@ public final class NotificationPanelViewController implements Dumpable {
|
||||
private int mPanelAlpha;
|
||||
private Runnable mPanelAlphaEndAction;
|
||||
private float mBottomAreaShadeAlpha;
|
||||
private final ValueAnimator mBottomAreaShadeAlphaAnimator;
|
||||
final ValueAnimator mBottomAreaShadeAlphaAnimator;
|
||||
private final AnimatableProperty mPanelAlphaAnimator = AnimatableProperty.from("panelAlpha",
|
||||
NotificationPanelView::setPanelAlphaInternal,
|
||||
NotificationPanelView::getCurrentPanelAlpha,
|
||||
@@ -597,7 +597,6 @@ public final class NotificationPanelViewController implements Dumpable {
|
||||
private int mLockscreenToDreamingTransitionTranslationY;
|
||||
private int mGoneToDreamingTransitionTranslationY;
|
||||
private int mLockscreenToOccludedTransitionTranslationY;
|
||||
private boolean mUnocclusionTransitionFlagEnabled = false;
|
||||
|
||||
private final Runnable mFlingCollapseRunnable = () -> fling(0, false /* expand */,
|
||||
mNextCollapseSpeedUpFactor, false /* expandBecauseOfFalsing */);
|
||||
@@ -886,7 +885,6 @@ public final class NotificationPanelViewController implements Dumpable {
|
||||
mNotificationPanelUnfoldAnimationController = unfoldComponent.map(
|
||||
SysUIUnfoldComponent::getNotificationPanelUnfoldAnimationController);
|
||||
|
||||
mUnocclusionTransitionFlagEnabled = featureFlags.isEnabled(Flags.UNOCCLUSION_TRANSITION);
|
||||
updateUserSwitcherFlags();
|
||||
mKeyguardBottomAreaViewModel = keyguardBottomAreaViewModel;
|
||||
mKeyguardBottomAreaInteractor = keyguardBottomAreaInteractor;
|
||||
@@ -1045,62 +1043,50 @@ public final class NotificationPanelViewController implements Dumpable {
|
||||
mNotificationPanelUnfoldAnimationController.ifPresent(controller ->
|
||||
controller.setup(mNotificationContainerParent));
|
||||
|
||||
if (mUnocclusionTransitionFlagEnabled) {
|
||||
// Dreaming->Lockscreen
|
||||
collectFlow(mView, mKeyguardTransitionInteractor.getDreamingToLockscreenTransition(),
|
||||
mDreamingToLockscreenTransition, mMainDispatcher);
|
||||
collectFlow(mView, mDreamingToLockscreenTransitionViewModel.getLockscreenAlpha(),
|
||||
setTransitionAlpha(mNotificationStackScrollLayoutController),
|
||||
mMainDispatcher);
|
||||
collectFlow(mView, mDreamingToLockscreenTransitionViewModel.lockscreenTranslationY(
|
||||
mDreamingToLockscreenTransitionTranslationY),
|
||||
setTransitionY(mNotificationStackScrollLayoutController),
|
||||
mMainDispatcher);
|
||||
// Dreaming->Lockscreen
|
||||
collectFlow(mView, mKeyguardTransitionInteractor.getDreamingToLockscreenTransition(),
|
||||
mDreamingToLockscreenTransition, mMainDispatcher);
|
||||
collectFlow(mView, mDreamingToLockscreenTransitionViewModel.getLockscreenAlpha(),
|
||||
setTransitionAlpha(mNotificationStackScrollLayoutController), mMainDispatcher);
|
||||
collectFlow(mView, mDreamingToLockscreenTransitionViewModel.lockscreenTranslationY(
|
||||
mDreamingToLockscreenTransitionTranslationY),
|
||||
setTransitionY(mNotificationStackScrollLayoutController), mMainDispatcher);
|
||||
|
||||
// Occluded->Lockscreen
|
||||
collectFlow(mView, mKeyguardTransitionInteractor.getOccludedToLockscreenTransition(),
|
||||
mOccludedToLockscreenTransition, mMainDispatcher);
|
||||
collectFlow(mView, mOccludedToLockscreenTransitionViewModel.getLockscreenAlpha(),
|
||||
setTransitionAlpha(mNotificationStackScrollLayoutController),
|
||||
mMainDispatcher);
|
||||
collectFlow(mView, mOccludedToLockscreenTransitionViewModel.lockscreenTranslationY(
|
||||
mOccludedToLockscreenTransitionTranslationY),
|
||||
setTransitionY(mNotificationStackScrollLayoutController),
|
||||
mMainDispatcher);
|
||||
// Occluded->Lockscreen
|
||||
collectFlow(mView, mKeyguardTransitionInteractor.getOccludedToLockscreenTransition(),
|
||||
mOccludedToLockscreenTransition, mMainDispatcher);
|
||||
collectFlow(mView, mOccludedToLockscreenTransitionViewModel.getLockscreenAlpha(),
|
||||
setTransitionAlpha(mNotificationStackScrollLayoutController), mMainDispatcher);
|
||||
collectFlow(mView, mOccludedToLockscreenTransitionViewModel.lockscreenTranslationY(
|
||||
mOccludedToLockscreenTransitionTranslationY),
|
||||
setTransitionY(mNotificationStackScrollLayoutController), mMainDispatcher);
|
||||
|
||||
// Lockscreen->Dreaming
|
||||
collectFlow(mView, mKeyguardTransitionInteractor.getLockscreenToDreamingTransition(),
|
||||
mLockscreenToDreamingTransition, mMainDispatcher);
|
||||
collectFlow(mView, mLockscreenToDreamingTransitionViewModel.getLockscreenAlpha(),
|
||||
setTransitionAlpha(mNotificationStackScrollLayoutController),
|
||||
mMainDispatcher);
|
||||
collectFlow(mView, mLockscreenToDreamingTransitionViewModel.lockscreenTranslationY(
|
||||
mLockscreenToDreamingTransitionTranslationY),
|
||||
setTransitionY(mNotificationStackScrollLayoutController),
|
||||
mMainDispatcher);
|
||||
// Lockscreen->Dreaming
|
||||
collectFlow(mView, mKeyguardTransitionInteractor.getLockscreenToDreamingTransition(),
|
||||
mLockscreenToDreamingTransition, mMainDispatcher);
|
||||
collectFlow(mView, mLockscreenToDreamingTransitionViewModel.getLockscreenAlpha(),
|
||||
setTransitionAlpha(mNotificationStackScrollLayoutController), mMainDispatcher);
|
||||
collectFlow(mView, mLockscreenToDreamingTransitionViewModel.lockscreenTranslationY(
|
||||
mLockscreenToDreamingTransitionTranslationY),
|
||||
setTransitionY(mNotificationStackScrollLayoutController), mMainDispatcher);
|
||||
|
||||
// Gone->Dreaming
|
||||
collectFlow(mView, mKeyguardTransitionInteractor.getGoneToDreamingTransition(),
|
||||
mGoneToDreamingTransition, mMainDispatcher);
|
||||
collectFlow(mView, mGoneToDreamingTransitionViewModel.getLockscreenAlpha(),
|
||||
setTransitionAlpha(mNotificationStackScrollLayoutController),
|
||||
mMainDispatcher);
|
||||
collectFlow(mView, mGoneToDreamingTransitionViewModel.lockscreenTranslationY(
|
||||
mGoneToDreamingTransitionTranslationY),
|
||||
setTransitionY(mNotificationStackScrollLayoutController),
|
||||
mMainDispatcher);
|
||||
// Gone->Dreaming
|
||||
collectFlow(mView, mKeyguardTransitionInteractor.getGoneToDreamingTransition(),
|
||||
mGoneToDreamingTransition, mMainDispatcher);
|
||||
collectFlow(mView, mGoneToDreamingTransitionViewModel.getLockscreenAlpha(),
|
||||
setTransitionAlpha(mNotificationStackScrollLayoutController), mMainDispatcher);
|
||||
collectFlow(mView, mGoneToDreamingTransitionViewModel.lockscreenTranslationY(
|
||||
mGoneToDreamingTransitionTranslationY),
|
||||
setTransitionY(mNotificationStackScrollLayoutController), mMainDispatcher);
|
||||
|
||||
// Lockscreen->Occluded
|
||||
collectFlow(mView, mKeyguardTransitionInteractor.getLockscreenToOccludedTransition(),
|
||||
mLockscreenToOccludedTransition, mMainDispatcher);
|
||||
collectFlow(mView, mLockscreenToOccludedTransitionViewModel.getLockscreenAlpha(),
|
||||
setTransitionAlpha(mNotificationStackScrollLayoutController),
|
||||
mMainDispatcher);
|
||||
collectFlow(mView, mLockscreenToOccludedTransitionViewModel.lockscreenTranslationY(
|
||||
mLockscreenToOccludedTransitionTranslationY),
|
||||
setTransitionY(mNotificationStackScrollLayoutController),
|
||||
mMainDispatcher);
|
||||
}
|
||||
// Lockscreen->Occluded
|
||||
collectFlow(mView, mKeyguardTransitionInteractor.getLockscreenToOccludedTransition(),
|
||||
mLockscreenToOccludedTransition, mMainDispatcher);
|
||||
collectFlow(mView, mLockscreenToOccludedTransitionViewModel.getLockscreenAlpha(),
|
||||
setTransitionAlpha(mNotificationStackScrollLayoutController), mMainDispatcher);
|
||||
collectFlow(mView, mLockscreenToOccludedTransitionViewModel.lockscreenTranslationY(
|
||||
mLockscreenToOccludedTransitionTranslationY),
|
||||
setTransitionY(mNotificationStackScrollLayoutController), mMainDispatcher);
|
||||
}
|
||||
|
||||
@VisibleForTesting
|
||||
@@ -2480,9 +2466,6 @@ public final class NotificationPanelViewController implements Dumpable {
|
||||
}
|
||||
|
||||
private void onExpandingFinished() {
|
||||
if (!mUnocclusionTransitionFlagEnabled) {
|
||||
mScrimController.onExpandingFinished();
|
||||
}
|
||||
mNotificationStackScrollLayoutController.onExpansionStopped();
|
||||
mHeadsUpManager.onExpandingFinished();
|
||||
mConversationNotificationManager.onNotificationPanelExpandStateChanged(isFullyCollapsed());
|
||||
|
||||
@@ -38,8 +38,6 @@ import com.android.keyguard.dagger.KeyguardBouncerComponent;
|
||||
import com.android.systemui.R;
|
||||
import com.android.systemui.classifier.FalsingCollector;
|
||||
import com.android.systemui.dock.DockManager;
|
||||
import com.android.systemui.flags.FeatureFlags;
|
||||
import com.android.systemui.flags.Flags;
|
||||
import com.android.systemui.keyguard.KeyguardUnlockAnimationController;
|
||||
import com.android.systemui.keyguard.domain.interactor.AlternateBouncerInteractor;
|
||||
import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor;
|
||||
@@ -132,7 +130,6 @@ public class NotificationShadeWindowViewController {
|
||||
NotificationInsetsController notificationInsetsController,
|
||||
AmbientState ambientState,
|
||||
PulsingGestureListener pulsingGestureListener,
|
||||
FeatureFlags featureFlags,
|
||||
KeyguardBouncerViewModel keyguardBouncerViewModel,
|
||||
KeyguardBouncerComponent.Factory keyguardBouncerComponentFactory,
|
||||
AlternateBouncerInteractor alternateBouncerInteractor,
|
||||
@@ -165,10 +162,8 @@ public class NotificationShadeWindowViewController {
|
||||
keyguardBouncerViewModel,
|
||||
keyguardBouncerComponentFactory);
|
||||
|
||||
if (featureFlags.isEnabled(Flags.UNOCCLUSION_TRANSITION)) {
|
||||
collectFlow(mView, keyguardTransitionInteractor.getLockscreenToDreamingTransition(),
|
||||
mLockscreenToDreamingTransition);
|
||||
}
|
||||
collectFlow(mView, keyguardTransitionInteractor.getLockscreenToDreamingTransition(),
|
||||
mLockscreenToDreamingTransition);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -375,8 +375,6 @@ public interface CentralSurfaces extends Dumpable, ActivityStarter, LifecycleOwn
|
||||
void fadeKeyguardAfterLaunchTransition(Runnable beforeFading,
|
||||
Runnable endRunnable, Runnable cancelRunnable);
|
||||
|
||||
void animateKeyguardUnoccluding();
|
||||
|
||||
void startLaunchTransitionTimeout();
|
||||
|
||||
boolean hideKeyguardImpl(boolean forceStateChange);
|
||||
|
||||
@@ -2997,16 +2997,6 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces {
|
||||
mLaunchTransitionCancelRunnable = null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Plays the animation when an activity that was occluding Keyguard goes away.
|
||||
*/
|
||||
@Override
|
||||
public void animateKeyguardUnoccluding() {
|
||||
mNotificationPanelViewController.setExpandedFraction(0f);
|
||||
mCommandQueueCallbacks.animateExpandNotificationsPanel();
|
||||
mScrimController.setUnocclusionAnimationRunning(true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Starts the timeout when we try to start the affordances on Keyguard. We usually rely that
|
||||
* Keyguard goes away via fadeKeyguardAfterLaunchTransition, however, that might not happen
|
||||
|
||||
@@ -137,12 +137,6 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump
|
||||
*/
|
||||
private boolean mTransitioningToFullShade;
|
||||
|
||||
/**
|
||||
* Is there currently an unocclusion animation running. Used to avoid bright flickers
|
||||
* of the notification scrim.
|
||||
*/
|
||||
private boolean mUnOcclusionAnimationRunning;
|
||||
|
||||
/**
|
||||
* The percentage of the bouncer which is hidden. If 1, the bouncer is completely hidden. If
|
||||
* 0, the bouncer is visible.
|
||||
@@ -150,14 +144,6 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump
|
||||
@FloatRange(from = 0, to = 1)
|
||||
private float mBouncerHiddenFraction = KeyguardBouncerConstants.EXPANSION_HIDDEN;
|
||||
|
||||
/**
|
||||
* Set whether an unocclusion animation is currently running on the notification panel. Used
|
||||
* to avoid bright flickers of the notification scrim.
|
||||
*/
|
||||
public void setUnocclusionAnimationRunning(boolean unocclusionAnimationRunning) {
|
||||
mUnOcclusionAnimationRunning = unocclusionAnimationRunning;
|
||||
}
|
||||
|
||||
@IntDef(prefix = {"VISIBILITY_"}, value = {
|
||||
TRANSPARENT,
|
||||
SEMI_TRANSPARENT,
|
||||
@@ -532,10 +518,6 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump
|
||||
}
|
||||
}
|
||||
|
||||
public void onExpandingFinished() {
|
||||
setUnocclusionAnimationRunning(false);
|
||||
}
|
||||
|
||||
@VisibleForTesting
|
||||
protected void onHideWallpaperTimeout() {
|
||||
if (mState != ScrimState.AOD && mState != ScrimState.PULSING) {
|
||||
@@ -875,13 +857,6 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump
|
||||
if (mKeyguardOccluded || hideNotificationScrim) {
|
||||
mNotificationsAlpha = 0;
|
||||
}
|
||||
if (mUnOcclusionAnimationRunning && mState == ScrimState.KEYGUARD) {
|
||||
// We're unoccluding the keyguard and don't want to have a bright flash.
|
||||
mNotificationsAlpha = ScrimState.KEYGUARD.getNotifAlpha();
|
||||
mNotificationsTint = ScrimState.KEYGUARD.getNotifTint();
|
||||
mBehindAlpha = ScrimState.KEYGUARD.getBehindAlpha();
|
||||
mBehindTint = ScrimState.KEYGUARD.getBehindTint();
|
||||
}
|
||||
}
|
||||
if (mState != ScrimState.UNLOCKED) {
|
||||
mAnimatingPanelExpansionOnUnlock = false;
|
||||
|
||||
@@ -281,7 +281,6 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb
|
||||
private float mQsExpansion;
|
||||
final Set<KeyguardViewManagerCallback> mCallbacks = new HashSet<>();
|
||||
private boolean mIsModernAlternateBouncerEnabled;
|
||||
private boolean mIsUnoccludeTransitionFlagEnabled;
|
||||
private boolean mIsBackAnimationEnabled;
|
||||
|
||||
private OnDismissAction mAfterKeyguardGoneAction;
|
||||
@@ -361,7 +360,6 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb
|
||||
.map(SysUIUnfoldComponent::getFoldAodAnimationController).orElse(null);
|
||||
mIsModernAlternateBouncerEnabled = featureFlags.isEnabled(Flags.MODERN_ALTERNATE_BOUNCER);
|
||||
mAlternateBouncerInteractor = alternateBouncerInteractor;
|
||||
mIsUnoccludeTransitionFlagEnabled = featureFlags.isEnabled(Flags.UNOCCLUSION_TRANSITION);
|
||||
mIsBackAnimationEnabled =
|
||||
featureFlags.isEnabled(Flags.WM_ENABLE_PREDICTIVE_BACK_BOUNCER_ANIM);
|
||||
}
|
||||
@@ -880,11 +878,6 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb
|
||||
// by a FLAG_DISMISS_KEYGUARD_ACTIVITY.
|
||||
reset(isOccluding /* hideBouncerWhenShowing*/);
|
||||
}
|
||||
if (!mIsUnoccludeTransitionFlagEnabled) {
|
||||
if (animate && !isOccluded && isShowing && !primaryBouncerIsShowing()) {
|
||||
mCentralSurfaces.animateKeyguardUnoccluding();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -26,7 +26,6 @@ import android.testing.AndroidTestingRunner;
|
||||
|
||||
import com.android.keyguard.logging.KeyguardLogger;
|
||||
import com.android.systemui.SysuiTestCase;
|
||||
import com.android.systemui.flags.FeatureFlags;
|
||||
import com.android.systemui.plugins.ClockAnimations;
|
||||
import com.android.systemui.statusbar.phone.DozeParameters;
|
||||
import com.android.systemui.statusbar.phone.ScreenOffAnimationController;
|
||||
@@ -61,8 +60,6 @@ public class KeyguardStatusViewControllerTest extends SysuiTestCase {
|
||||
@Mock
|
||||
DozeParameters mDozeParameters;
|
||||
@Mock
|
||||
FeatureFlags mFeatureFlags;
|
||||
@Mock
|
||||
ScreenOffAnimationController mScreenOffAnimationController;
|
||||
@Captor
|
||||
private ArgumentCaptor<KeyguardUpdateMonitorCallback> mKeyguardUpdateMonitorCallbackCaptor;
|
||||
@@ -83,7 +80,6 @@ public class KeyguardStatusViewControllerTest extends SysuiTestCase {
|
||||
mKeyguardUpdateMonitor,
|
||||
mConfigurationController,
|
||||
mDozeParameters,
|
||||
mFeatureFlags,
|
||||
mScreenOffAnimationController,
|
||||
mKeyguardLogger);
|
||||
}
|
||||
|
||||
@@ -29,7 +29,6 @@ import static org.mockito.ArgumentMatchers.any;
|
||||
import static org.mockito.ArgumentMatchers.anyBoolean;
|
||||
import static org.mockito.ArgumentMatchers.anyInt;
|
||||
import static org.mockito.Mockito.atLeast;
|
||||
import static org.mockito.Mockito.clearInvocations;
|
||||
import static org.mockito.Mockito.eq;
|
||||
import static org.mockito.Mockito.mock;
|
||||
import static org.mockito.Mockito.never;
|
||||
@@ -67,7 +66,6 @@ import com.android.systemui.classifier.FalsingCollectorFake;
|
||||
import com.android.systemui.colorextraction.SysuiColorExtractor;
|
||||
import com.android.systemui.dreams.DreamOverlayStateController;
|
||||
import com.android.systemui.dump.DumpManager;
|
||||
import com.android.systemui.flags.FeatureFlags;
|
||||
import com.android.systemui.navigationbar.NavigationModeController;
|
||||
import com.android.systemui.settings.UserTracker;
|
||||
import com.android.systemui.shade.NotificationShadeWindowControllerImpl;
|
||||
@@ -136,7 +134,6 @@ public class KeyguardViewMediatorTest extends SysuiTestCase {
|
||||
private @Mock SysuiColorExtractor mColorExtractor;
|
||||
private @Mock AuthController mAuthController;
|
||||
private @Mock ShadeExpansionStateManager mShadeExpansionStateManager;
|
||||
private @Mock FeatureFlags mFeatureFlags;
|
||||
private @Mock ShadeWindowLogger mShadeWindowLogger;
|
||||
private DeviceConfigProxy mDeviceConfig = new DeviceConfigProxyFake();
|
||||
private FakeExecutor mUiBgExecutor = new FakeExecutor(new FakeSystemClock());
|
||||
@@ -545,7 +542,6 @@ public class KeyguardViewMediatorTest extends SysuiTestCase {
|
||||
mScreenOnCoordinator,
|
||||
mInteractionJankMonitor,
|
||||
mDreamOverlayStateController,
|
||||
mFeatureFlags,
|
||||
() -> mShadeController,
|
||||
() -> mNotificationShadeWindowController,
|
||||
() -> mActivityLaunchAnimator,
|
||||
|
||||
@@ -0,0 +1,753 @@
|
||||
/*
|
||||
* Copyright (C) 2023 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package com.android.systemui.shade;
|
||||
|
||||
import static android.content.res.Configuration.ORIENTATION_PORTRAIT;
|
||||
|
||||
import static com.android.keyguard.KeyguardClockSwitch.LARGE;
|
||||
|
||||
import static com.google.common.truth.Truth.assertThat;
|
||||
|
||||
import static kotlinx.coroutines.flow.FlowKt.emptyFlow;
|
||||
|
||||
import static org.mockito.ArgumentMatchers.any;
|
||||
import static org.mockito.ArgumentMatchers.anyBoolean;
|
||||
import static org.mockito.ArgumentMatchers.anyInt;
|
||||
import static org.mockito.ArgumentMatchers.eq;
|
||||
import static org.mockito.Mockito.atLeast;
|
||||
import static org.mockito.Mockito.doAnswer;
|
||||
import static org.mockito.Mockito.mock;
|
||||
import static org.mockito.Mockito.reset;
|
||||
import static org.mockito.Mockito.verify;
|
||||
import static org.mockito.Mockito.when;
|
||||
|
||||
import android.annotation.IdRes;
|
||||
import android.content.ContentResolver;
|
||||
import android.content.res.Configuration;
|
||||
import android.content.res.Resources;
|
||||
import android.database.ContentObserver;
|
||||
import android.os.Handler;
|
||||
import android.os.Looper;
|
||||
import android.os.PowerManager;
|
||||
import android.os.UserManager;
|
||||
import android.util.DisplayMetrics;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.MotionEvent;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.view.ViewParent;
|
||||
import android.view.ViewPropertyAnimator;
|
||||
import android.view.ViewStub;
|
||||
import android.view.ViewTreeObserver;
|
||||
import android.view.accessibility.AccessibilityManager;
|
||||
|
||||
import androidx.constraintlayout.widget.ConstraintSet;
|
||||
|
||||
import com.android.internal.jank.InteractionJankMonitor;
|
||||
import com.android.internal.logging.MetricsLogger;
|
||||
import com.android.internal.logging.UiEventLogger;
|
||||
import com.android.internal.logging.testing.UiEventLoggerFake;
|
||||
import com.android.internal.util.LatencyTracker;
|
||||
import com.android.keyguard.KeyguardClockSwitch;
|
||||
import com.android.keyguard.KeyguardClockSwitchController;
|
||||
import com.android.keyguard.KeyguardStatusView;
|
||||
import com.android.keyguard.KeyguardStatusViewController;
|
||||
import com.android.keyguard.KeyguardUpdateMonitor;
|
||||
import com.android.keyguard.LockIconViewController;
|
||||
import com.android.keyguard.dagger.KeyguardQsUserSwitchComponent;
|
||||
import com.android.keyguard.dagger.KeyguardStatusBarViewComponent;
|
||||
import com.android.keyguard.dagger.KeyguardStatusViewComponent;
|
||||
import com.android.keyguard.dagger.KeyguardUserSwitcherComponent;
|
||||
import com.android.systemui.R;
|
||||
import com.android.systemui.SysuiTestCase;
|
||||
import com.android.systemui.biometrics.AuthController;
|
||||
import com.android.systemui.classifier.FalsingCollectorFake;
|
||||
import com.android.systemui.classifier.FalsingManagerFake;
|
||||
import com.android.systemui.common.ui.view.LongPressHandlingView;
|
||||
import com.android.systemui.doze.DozeLog;
|
||||
import com.android.systemui.dump.DumpManager;
|
||||
import com.android.systemui.flags.FeatureFlags;
|
||||
import com.android.systemui.fragments.FragmentHostManager;
|
||||
import com.android.systemui.fragments.FragmentService;
|
||||
import com.android.systemui.keyguard.KeyguardUnlockAnimationController;
|
||||
import com.android.systemui.keyguard.data.repository.FakeKeyguardBouncerRepository;
|
||||
import com.android.systemui.keyguard.data.repository.FakeKeyguardRepository;
|
||||
import com.android.systemui.keyguard.domain.interactor.AlternateBouncerInteractor;
|
||||
import com.android.systemui.keyguard.domain.interactor.KeyguardBottomAreaInteractor;
|
||||
import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor;
|
||||
import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor;
|
||||
import com.android.systemui.keyguard.ui.viewmodel.DreamingToLockscreenTransitionViewModel;
|
||||
import com.android.systemui.keyguard.ui.viewmodel.GoneToDreamingTransitionViewModel;
|
||||
import com.android.systemui.keyguard.ui.viewmodel.KeyguardBottomAreaViewModel;
|
||||
import com.android.systemui.keyguard.ui.viewmodel.KeyguardLongPressViewModel;
|
||||
import com.android.systemui.keyguard.ui.viewmodel.LockscreenToDreamingTransitionViewModel;
|
||||
import com.android.systemui.keyguard.ui.viewmodel.LockscreenToOccludedTransitionViewModel;
|
||||
import com.android.systemui.keyguard.ui.viewmodel.OccludedToLockscreenTransitionViewModel;
|
||||
import com.android.systemui.media.controls.pipeline.MediaDataManager;
|
||||
import com.android.systemui.media.controls.ui.KeyguardMediaController;
|
||||
import com.android.systemui.media.controls.ui.MediaHierarchyManager;
|
||||
import com.android.systemui.model.SysUiState;
|
||||
import com.android.systemui.navigationbar.NavigationBarController;
|
||||
import com.android.systemui.navigationbar.NavigationModeController;
|
||||
import com.android.systemui.plugins.FalsingManager;
|
||||
import com.android.systemui.plugins.qs.QS;
|
||||
import com.android.systemui.qs.QSFragment;
|
||||
import com.android.systemui.screenrecord.RecordingController;
|
||||
import com.android.systemui.shade.transition.ShadeTransitionController;
|
||||
import com.android.systemui.statusbar.CommandQueue;
|
||||
import com.android.systemui.statusbar.KeyguardIndicationController;
|
||||
import com.android.systemui.statusbar.LockscreenShadeTransitionController;
|
||||
import com.android.systemui.statusbar.NotificationRemoteInputManager;
|
||||
import com.android.systemui.statusbar.NotificationShadeDepthController;
|
||||
import com.android.systemui.statusbar.NotificationShadeWindowController;
|
||||
import com.android.systemui.statusbar.NotificationShelfController;
|
||||
import com.android.systemui.statusbar.PulseExpansionHandler;
|
||||
import com.android.systemui.statusbar.QsFrameTranslateController;
|
||||
import com.android.systemui.statusbar.StatusBarStateControllerImpl;
|
||||
import com.android.systemui.statusbar.SysuiStatusBarStateController;
|
||||
import com.android.systemui.statusbar.VibratorHelper;
|
||||
import com.android.systemui.statusbar.notification.ConversationNotificationManager;
|
||||
import com.android.systemui.statusbar.notification.DynamicPrivacyController;
|
||||
import com.android.systemui.statusbar.notification.NotificationWakeUpCoordinator;
|
||||
import com.android.systemui.statusbar.notification.NotificationWakeUpCoordinatorLogger;
|
||||
import com.android.systemui.statusbar.notification.row.NotificationGutsManager;
|
||||
import com.android.systemui.statusbar.notification.stack.AmbientState;
|
||||
import com.android.systemui.statusbar.notification.stack.NotificationListContainer;
|
||||
import com.android.systemui.statusbar.notification.stack.NotificationRoundnessManager;
|
||||
import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayout;
|
||||
import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayoutController;
|
||||
import com.android.systemui.statusbar.notification.stack.NotificationStackSizeCalculator;
|
||||
import com.android.systemui.statusbar.phone.CentralSurfaces;
|
||||
import com.android.systemui.statusbar.phone.ConfigurationControllerImpl;
|
||||
import com.android.systemui.statusbar.phone.DozeParameters;
|
||||
import com.android.systemui.statusbar.phone.HeadsUpAppearanceController;
|
||||
import com.android.systemui.statusbar.phone.HeadsUpManagerPhone;
|
||||
import com.android.systemui.statusbar.phone.HeadsUpTouchHelper;
|
||||
import com.android.systemui.statusbar.phone.KeyguardBottomAreaView;
|
||||
import com.android.systemui.statusbar.phone.KeyguardBottomAreaViewController;
|
||||
import com.android.systemui.statusbar.phone.KeyguardBypassController;
|
||||
import com.android.systemui.statusbar.phone.KeyguardStatusBarView;
|
||||
import com.android.systemui.statusbar.phone.KeyguardStatusBarViewController;
|
||||
import com.android.systemui.statusbar.phone.LockscreenGestureLogger;
|
||||
import com.android.systemui.statusbar.phone.ScreenOffAnimationController;
|
||||
import com.android.systemui.statusbar.phone.ScrimController;
|
||||
import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager;
|
||||
import com.android.systemui.statusbar.phone.StatusBarTouchableRegionManager;
|
||||
import com.android.systemui.statusbar.phone.TapAgainViewController;
|
||||
import com.android.systemui.statusbar.phone.UnlockedScreenOffAnimationController;
|
||||
import com.android.systemui.statusbar.policy.ConfigurationController;
|
||||
import com.android.systemui.statusbar.policy.KeyguardQsUserSwitchController;
|
||||
import com.android.systemui.statusbar.policy.KeyguardStateController;
|
||||
import com.android.systemui.statusbar.policy.KeyguardUserSwitcherController;
|
||||
import com.android.systemui.statusbar.policy.KeyguardUserSwitcherView;
|
||||
import com.android.systemui.statusbar.window.StatusBarWindowStateController;
|
||||
import com.android.systemui.unfold.SysUIUnfoldComponent;
|
||||
import com.android.systemui.util.time.FakeSystemClock;
|
||||
import com.android.systemui.util.time.SystemClock;
|
||||
import com.android.wm.shell.animation.FlingAnimationUtils;
|
||||
|
||||
import org.junit.After;
|
||||
import org.junit.Before;
|
||||
import org.mockito.ArgumentCaptor;
|
||||
import org.mockito.Captor;
|
||||
import org.mockito.Mock;
|
||||
import org.mockito.MockitoAnnotations;
|
||||
import org.mockito.stubbing.Answer;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Optional;
|
||||
|
||||
import dagger.Lazy;
|
||||
import kotlinx.coroutines.CoroutineDispatcher;
|
||||
|
||||
public class NotificationPanelViewControllerBaseTest extends SysuiTestCase {
|
||||
|
||||
protected static final int SPLIT_SHADE_FULL_TRANSITION_DISTANCE = 400;
|
||||
protected static final int NOTIFICATION_SCRIM_TOP_PADDING_IN_SPLIT_SHADE = 50;
|
||||
protected static final int PANEL_WIDTH = 500; // Random value just for the test.
|
||||
|
||||
@Mock protected CentralSurfaces mCentralSurfaces;
|
||||
@Mock protected NotificationStackScrollLayout mNotificationStackScrollLayout;
|
||||
@Mock protected KeyguardBottomAreaView mKeyguardBottomArea;
|
||||
@Mock protected KeyguardBottomAreaViewController mKeyguardBottomAreaViewController;
|
||||
@Mock protected KeyguardBottomAreaView mQsFrame;
|
||||
@Mock protected HeadsUpManagerPhone mHeadsUpManager;
|
||||
@Mock protected NotificationShelfController mNotificationShelfController;
|
||||
@Mock protected NotificationGutsManager mGutsManager;
|
||||
@Mock protected KeyguardStatusBarView mKeyguardStatusBar;
|
||||
@Mock protected KeyguardUserSwitcherView mUserSwitcherView;
|
||||
@Mock protected ViewStub mUserSwitcherStubView;
|
||||
@Mock protected HeadsUpTouchHelper.Callback mHeadsUpCallback;
|
||||
@Mock protected KeyguardUpdateMonitor mUpdateMonitor;
|
||||
@Mock protected KeyguardBypassController mKeyguardBypassController;
|
||||
@Mock protected DozeParameters mDozeParameters;
|
||||
@Mock protected ScreenOffAnimationController mScreenOffAnimationController;
|
||||
@Mock protected NotificationPanelView mView;
|
||||
@Mock protected LayoutInflater mLayoutInflater;
|
||||
@Mock protected FeatureFlags mFeatureFlags;
|
||||
@Mock protected DynamicPrivacyController mDynamicPrivacyController;
|
||||
@Mock protected StatusBarTouchableRegionManager mStatusBarTouchableRegionManager;
|
||||
@Mock protected KeyguardStateController mKeyguardStateController;
|
||||
@Mock protected DozeLog mDozeLog;
|
||||
@Mock protected ShadeLogger mShadeLog;
|
||||
@Mock protected ShadeHeightLogger mShadeHeightLogger;
|
||||
@Mock protected CommandQueue mCommandQueue;
|
||||
@Mock protected VibratorHelper mVibratorHelper;
|
||||
@Mock protected LatencyTracker mLatencyTracker;
|
||||
@Mock protected PowerManager mPowerManager;
|
||||
@Mock protected AccessibilityManager mAccessibilityManager;
|
||||
@Mock protected MetricsLogger mMetricsLogger;
|
||||
@Mock protected Resources mResources;
|
||||
@Mock protected Configuration mConfiguration;
|
||||
@Mock protected KeyguardClockSwitch mKeyguardClockSwitch;
|
||||
@Mock protected MediaHierarchyManager mMediaHierarchyManager;
|
||||
@Mock protected ConversationNotificationManager mConversationNotificationManager;
|
||||
@Mock protected StatusBarKeyguardViewManager mStatusBarKeyguardViewManager;
|
||||
@Mock protected KeyguardStatusViewComponent.Factory mKeyguardStatusViewComponentFactory;
|
||||
@Mock protected KeyguardQsUserSwitchComponent.Factory mKeyguardQsUserSwitchComponentFactory;
|
||||
@Mock protected KeyguardQsUserSwitchComponent mKeyguardQsUserSwitchComponent;
|
||||
@Mock protected KeyguardQsUserSwitchController mKeyguardQsUserSwitchController;
|
||||
@Mock protected KeyguardUserSwitcherComponent.Factory mKeyguardUserSwitcherComponentFactory;
|
||||
@Mock protected KeyguardUserSwitcherComponent mKeyguardUserSwitcherComponent;
|
||||
@Mock protected KeyguardUserSwitcherController mKeyguardUserSwitcherController;
|
||||
@Mock protected KeyguardStatusViewComponent mKeyguardStatusViewComponent;
|
||||
@Mock protected KeyguardStatusBarViewComponent.Factory mKeyguardStatusBarViewComponentFactory;
|
||||
@Mock protected KeyguardStatusBarViewComponent mKeyguardStatusBarViewComponent;
|
||||
@Mock protected KeyguardClockSwitchController mKeyguardClockSwitchController;
|
||||
@Mock protected KeyguardStatusViewController mKeyguardStatusViewController;
|
||||
@Mock protected KeyguardStatusBarViewController mKeyguardStatusBarViewController;
|
||||
@Mock protected NotificationStackScrollLayoutController
|
||||
mNotificationStackScrollLayoutController;
|
||||
@Mock protected NotificationShadeDepthController mNotificationShadeDepthController;
|
||||
@Mock protected LockscreenShadeTransitionController mLockscreenShadeTransitionController;
|
||||
@Mock protected AuthController mAuthController;
|
||||
@Mock protected ScrimController mScrimController;
|
||||
@Mock protected MediaDataManager mMediaDataManager;
|
||||
@Mock protected AmbientState mAmbientState;
|
||||
@Mock protected UserManager mUserManager;
|
||||
@Mock protected UiEventLogger mUiEventLogger;
|
||||
@Mock protected LockIconViewController mLockIconViewController;
|
||||
@Mock protected KeyguardMediaController mKeyguardMediaController;
|
||||
@Mock protected NavigationModeController mNavigationModeController;
|
||||
@Mock protected NavigationBarController mNavigationBarController;
|
||||
@Mock protected QuickSettingsController mQsController;
|
||||
@Mock protected ShadeHeaderController mShadeHeaderController;
|
||||
@Mock protected ContentResolver mContentResolver;
|
||||
@Mock protected TapAgainViewController mTapAgainViewController;
|
||||
@Mock protected KeyguardIndicationController mKeyguardIndicationController;
|
||||
@Mock protected FragmentService mFragmentService;
|
||||
@Mock protected FragmentHostManager mFragmentHostManager;
|
||||
@Mock protected NotificationRemoteInputManager mNotificationRemoteInputManager;
|
||||
@Mock protected RecordingController mRecordingController;
|
||||
@Mock protected LockscreenGestureLogger mLockscreenGestureLogger;
|
||||
@Mock protected DumpManager mDumpManager;
|
||||
@Mock protected InteractionJankMonitor mInteractionJankMonitor;
|
||||
@Mock protected NotificationsQSContainerController mNotificationsQSContainerController;
|
||||
@Mock protected QsFrameTranslateController mQsFrameTranslateController;
|
||||
@Mock protected StatusBarWindowStateController mStatusBarWindowStateController;
|
||||
@Mock protected KeyguardUnlockAnimationController mKeyguardUnlockAnimationController;
|
||||
@Mock protected NotificationShadeWindowController mNotificationShadeWindowController;
|
||||
@Mock protected SysUiState mSysUiState;
|
||||
@Mock protected NotificationListContainer mNotificationListContainer;
|
||||
@Mock protected NotificationStackSizeCalculator mNotificationStackSizeCalculator;
|
||||
@Mock protected UnlockedScreenOffAnimationController mUnlockedScreenOffAnimationController;
|
||||
@Mock protected ShadeTransitionController mShadeTransitionController;
|
||||
@Mock protected QS mQs;
|
||||
@Mock protected QSFragment mQSFragment;
|
||||
@Mock protected ViewGroup mQsHeader;
|
||||
@Mock protected ViewParent mViewParent;
|
||||
@Mock protected ViewTreeObserver mViewTreeObserver;
|
||||
@Mock protected KeyguardBottomAreaViewModel mKeyguardBottomAreaViewModel;
|
||||
@Mock protected DreamingToLockscreenTransitionViewModel
|
||||
mDreamingToLockscreenTransitionViewModel;
|
||||
@Mock protected OccludedToLockscreenTransitionViewModel
|
||||
mOccludedToLockscreenTransitionViewModel;
|
||||
@Mock protected LockscreenToDreamingTransitionViewModel
|
||||
mLockscreenToDreamingTransitionViewModel;
|
||||
@Mock protected LockscreenToOccludedTransitionViewModel
|
||||
mLockscreenToOccludedTransitionViewModel;
|
||||
@Mock protected GoneToDreamingTransitionViewModel mGoneToDreamingTransitionViewModel;
|
||||
|
||||
@Mock protected KeyguardTransitionInteractor mKeyguardTransitionInteractor;
|
||||
@Mock protected KeyguardLongPressViewModel mKeyuardLongPressViewModel;
|
||||
@Mock protected AlternateBouncerInteractor mAlternateBouncerInteractor;
|
||||
@Mock protected MotionEvent mDownMotionEvent;
|
||||
@Mock protected CoroutineDispatcher mMainDispatcher;
|
||||
@Captor
|
||||
protected ArgumentCaptor<NotificationStackScrollLayout.OnEmptySpaceClickListener>
|
||||
mEmptySpaceClickListenerCaptor;
|
||||
|
||||
protected KeyguardBottomAreaInteractor mKeyguardBottomAreaInteractor;
|
||||
protected KeyguardInteractor mKeyguardInteractor;
|
||||
protected NotificationPanelViewController.TouchHandler mTouchHandler;
|
||||
protected ConfigurationController mConfigurationController;
|
||||
protected SysuiStatusBarStateController mStatusBarStateController;
|
||||
protected NotificationPanelViewController mNotificationPanelViewController;
|
||||
protected View.AccessibilityDelegate mAccessibilityDelegate;
|
||||
protected NotificationsQuickSettingsContainer mNotificationContainerParent;
|
||||
protected List<View.OnAttachStateChangeListener> mOnAttachStateChangeListeners;
|
||||
protected Handler mMainHandler;
|
||||
protected View.OnLayoutChangeListener mLayoutChangeListener;
|
||||
|
||||
protected final FalsingManagerFake mFalsingManager = new FalsingManagerFake();
|
||||
protected final Optional<SysUIUnfoldComponent> mSysUIUnfoldComponent = Optional.empty();
|
||||
protected final DisplayMetrics mDisplayMetrics = new DisplayMetrics();
|
||||
protected final ShadeExpansionStateManager mShadeExpansionStateManager =
|
||||
new ShadeExpansionStateManager();
|
||||
|
||||
protected QuickSettingsController mQuickSettingsController;
|
||||
@Mock protected Lazy<NotificationPanelViewController> mNotificationPanelViewControllerLazy;
|
||||
|
||||
protected FragmentHostManager.FragmentListener mFragmentListener;
|
||||
|
||||
@Before
|
||||
public void setup() {
|
||||
MockitoAnnotations.initMocks(this);
|
||||
mMainDispatcher = getMainDispatcher();
|
||||
mKeyguardBottomAreaInteractor = new KeyguardBottomAreaInteractor(
|
||||
new FakeKeyguardRepository());
|
||||
mKeyguardInteractor = new KeyguardInteractor(new FakeKeyguardRepository(), mCommandQueue,
|
||||
mFeatureFlags, new FakeKeyguardBouncerRepository());
|
||||
SystemClock systemClock = new FakeSystemClock();
|
||||
mStatusBarStateController = new StatusBarStateControllerImpl(mUiEventLogger, mDumpManager,
|
||||
mInteractionJankMonitor, mShadeExpansionStateManager);
|
||||
|
||||
KeyguardStatusView keyguardStatusView = new KeyguardStatusView(mContext);
|
||||
keyguardStatusView.setId(R.id.keyguard_status_view);
|
||||
|
||||
when(mAuthController.isUdfpsEnrolled(anyInt())).thenReturn(false);
|
||||
when(mHeadsUpCallback.getContext()).thenReturn(mContext);
|
||||
when(mView.getResources()).thenReturn(mResources);
|
||||
when(mView.getWidth()).thenReturn(PANEL_WIDTH);
|
||||
when(mResources.getConfiguration()).thenReturn(mConfiguration);
|
||||
mConfiguration.orientation = ORIENTATION_PORTRAIT;
|
||||
when(mResources.getDisplayMetrics()).thenReturn(mDisplayMetrics);
|
||||
mDisplayMetrics.density = 100;
|
||||
when(mResources.getBoolean(R.bool.config_enableNotificationShadeDrag)).thenReturn(true);
|
||||
when(mResources.getDimensionPixelSize(R.dimen.notifications_top_padding_split_shade))
|
||||
.thenReturn(NOTIFICATION_SCRIM_TOP_PADDING_IN_SPLIT_SHADE);
|
||||
when(mResources.getDimensionPixelSize(R.dimen.notification_panel_margin_horizontal))
|
||||
.thenReturn(10);
|
||||
when(mResources.getDimensionPixelSize(R.dimen.split_shade_full_transition_distance))
|
||||
.thenReturn(SPLIT_SHADE_FULL_TRANSITION_DISTANCE);
|
||||
when(mView.getContext()).thenReturn(getContext());
|
||||
when(mView.findViewById(R.id.keyguard_header)).thenReturn(mKeyguardStatusBar);
|
||||
when(mView.findViewById(R.id.keyguard_user_switcher_view)).thenReturn(mUserSwitcherView);
|
||||
when(mView.findViewById(R.id.keyguard_user_switcher_stub)).thenReturn(
|
||||
mUserSwitcherStubView);
|
||||
when(mView.findViewById(R.id.keyguard_clock_container)).thenReturn(mKeyguardClockSwitch);
|
||||
when(mView.findViewById(R.id.notification_stack_scroller))
|
||||
.thenReturn(mNotificationStackScrollLayout);
|
||||
when(mNotificationStackScrollLayoutController.getHeight()).thenReturn(1000);
|
||||
when(mNotificationStackScrollLayoutController.getHeadsUpCallback())
|
||||
.thenReturn(mHeadsUpCallback);
|
||||
when(mKeyguardBottomAreaViewController.getView()).thenReturn(mKeyguardBottomArea);
|
||||
when(mView.findViewById(R.id.keyguard_bottom_area)).thenReturn(mKeyguardBottomArea);
|
||||
when(mKeyguardBottomArea.animate()).thenReturn(mock(ViewPropertyAnimator.class));
|
||||
when(mView.findViewById(R.id.qs_frame)).thenReturn(mQsFrame);
|
||||
when(mView.findViewById(R.id.keyguard_status_view))
|
||||
.thenReturn(mock(KeyguardStatusView.class));
|
||||
mNotificationContainerParent = new NotificationsQuickSettingsContainer(getContext(), null);
|
||||
mNotificationContainerParent.addView(keyguardStatusView);
|
||||
mNotificationContainerParent.onFinishInflate();
|
||||
when(mView.findViewById(R.id.notification_container_parent))
|
||||
.thenReturn(mNotificationContainerParent);
|
||||
when(mFragmentService.getFragmentHostManager(mView)).thenReturn(mFragmentHostManager);
|
||||
FlingAnimationUtils.Builder flingAnimationUtilsBuilder = new FlingAnimationUtils.Builder(
|
||||
mDisplayMetrics);
|
||||
when(mKeyguardQsUserSwitchComponentFactory.build(any()))
|
||||
.thenReturn(mKeyguardQsUserSwitchComponent);
|
||||
when(mKeyguardQsUserSwitchComponent.getKeyguardQsUserSwitchController())
|
||||
.thenReturn(mKeyguardQsUserSwitchController);
|
||||
when(mKeyguardUserSwitcherComponentFactory.build(any()))
|
||||
.thenReturn(mKeyguardUserSwitcherComponent);
|
||||
when(mKeyguardUserSwitcherComponent.getKeyguardUserSwitcherController())
|
||||
.thenReturn(mKeyguardUserSwitcherController);
|
||||
when(mScreenOffAnimationController.shouldAnimateClockChange()).thenReturn(true);
|
||||
when(mQs.getView()).thenReturn(mView);
|
||||
when(mQSFragment.getView()).thenReturn(mView);
|
||||
doAnswer(invocation -> {
|
||||
mFragmentListener = invocation.getArgument(1);
|
||||
return null;
|
||||
}).when(mFragmentHostManager).addTagListener(eq(QS.TAG), any());
|
||||
doAnswer((Answer<Void>) invocation -> {
|
||||
mTouchHandler = invocation.getArgument(0);
|
||||
return null;
|
||||
}).when(mView).setOnTouchListener(any(NotificationPanelViewController.TouchHandler.class));
|
||||
|
||||
// Dreaming->Lockscreen
|
||||
when(mKeyguardTransitionInteractor.getDreamingToLockscreenTransition())
|
||||
.thenReturn(emptyFlow());
|
||||
when(mDreamingToLockscreenTransitionViewModel.getLockscreenAlpha())
|
||||
.thenReturn(emptyFlow());
|
||||
when(mDreamingToLockscreenTransitionViewModel.lockscreenTranslationY(anyInt()))
|
||||
.thenReturn(emptyFlow());
|
||||
|
||||
// Occluded->Lockscreen
|
||||
when(mKeyguardTransitionInteractor.getOccludedToLockscreenTransition())
|
||||
.thenReturn(emptyFlow());
|
||||
when(mOccludedToLockscreenTransitionViewModel.getLockscreenAlpha())
|
||||
.thenReturn(emptyFlow());
|
||||
when(mOccludedToLockscreenTransitionViewModel.lockscreenTranslationY(anyInt()))
|
||||
.thenReturn(emptyFlow());
|
||||
|
||||
// Lockscreen->Dreaming
|
||||
when(mKeyguardTransitionInteractor.getLockscreenToDreamingTransition())
|
||||
.thenReturn(emptyFlow());
|
||||
when(mLockscreenToDreamingTransitionViewModel.getLockscreenAlpha())
|
||||
.thenReturn(emptyFlow());
|
||||
when(mLockscreenToDreamingTransitionViewModel.lockscreenTranslationY(anyInt()))
|
||||
.thenReturn(emptyFlow());
|
||||
|
||||
// Gone->Dreaming
|
||||
when(mKeyguardTransitionInteractor.getGoneToDreamingTransition())
|
||||
.thenReturn(emptyFlow());
|
||||
when(mGoneToDreamingTransitionViewModel.getLockscreenAlpha())
|
||||
.thenReturn(emptyFlow());
|
||||
when(mGoneToDreamingTransitionViewModel.lockscreenTranslationY(anyInt()))
|
||||
.thenReturn(emptyFlow());
|
||||
|
||||
// Lockscreen->Occluded
|
||||
when(mKeyguardTransitionInteractor.getLockscreenToOccludedTransition())
|
||||
.thenReturn(emptyFlow());
|
||||
when(mLockscreenToOccludedTransitionViewModel.getLockscreenAlpha())
|
||||
.thenReturn(emptyFlow());
|
||||
when(mLockscreenToOccludedTransitionViewModel.lockscreenTranslationY(anyInt()))
|
||||
.thenReturn(emptyFlow());
|
||||
|
||||
NotificationWakeUpCoordinator coordinator =
|
||||
new NotificationWakeUpCoordinator(
|
||||
mDumpManager,
|
||||
mock(HeadsUpManagerPhone.class),
|
||||
new StatusBarStateControllerImpl(new UiEventLoggerFake(), mDumpManager,
|
||||
mInteractionJankMonitor, mShadeExpansionStateManager),
|
||||
mKeyguardBypassController,
|
||||
mDozeParameters,
|
||||
mScreenOffAnimationController,
|
||||
mock(NotificationWakeUpCoordinatorLogger.class));
|
||||
mConfigurationController = new ConfigurationControllerImpl(mContext);
|
||||
PulseExpansionHandler expansionHandler = new PulseExpansionHandler(
|
||||
mContext,
|
||||
coordinator,
|
||||
mKeyguardBypassController, mHeadsUpManager,
|
||||
mock(NotificationRoundnessManager.class),
|
||||
mConfigurationController,
|
||||
mStatusBarStateController,
|
||||
mFalsingManager,
|
||||
mShadeExpansionStateManager,
|
||||
mLockscreenShadeTransitionController,
|
||||
new FalsingCollectorFake(),
|
||||
mDumpManager);
|
||||
when(mKeyguardStatusViewComponentFactory.build(any()))
|
||||
.thenReturn(mKeyguardStatusViewComponent);
|
||||
when(mKeyguardStatusViewComponent.getKeyguardClockSwitchController())
|
||||
.thenReturn(mKeyguardClockSwitchController);
|
||||
when(mKeyguardStatusViewComponent.getKeyguardStatusViewController())
|
||||
.thenReturn(mKeyguardStatusViewController);
|
||||
when(mKeyguardStatusBarViewComponentFactory.build(any(), any()))
|
||||
.thenReturn(mKeyguardStatusBarViewComponent);
|
||||
when(mKeyguardStatusBarViewComponent.getKeyguardStatusBarViewController())
|
||||
.thenReturn(mKeyguardStatusBarViewController);
|
||||
when(mLayoutInflater.inflate(eq(R.layout.keyguard_status_view), any(), anyBoolean()))
|
||||
.thenReturn(keyguardStatusView);
|
||||
when(mLayoutInflater.inflate(eq(R.layout.keyguard_user_switcher), any(), anyBoolean()))
|
||||
.thenReturn(mUserSwitcherView);
|
||||
when(mLayoutInflater.inflate(eq(R.layout.keyguard_bottom_area), any(), anyBoolean()))
|
||||
.thenReturn(mKeyguardBottomArea);
|
||||
when(mNotificationRemoteInputManager.isRemoteInputActive())
|
||||
.thenReturn(false);
|
||||
when(mInteractionJankMonitor.begin(any(), anyInt()))
|
||||
.thenReturn(true);
|
||||
when(mInteractionJankMonitor.end(anyInt()))
|
||||
.thenReturn(true);
|
||||
doAnswer(invocation -> {
|
||||
((Runnable) invocation.getArgument(0)).run();
|
||||
return null;
|
||||
}).when(mNotificationShadeWindowController).batchApplyWindowLayoutParams(any());
|
||||
doAnswer(invocation -> {
|
||||
mLayoutChangeListener = invocation.getArgument(0);
|
||||
return null;
|
||||
}).when(mView).addOnLayoutChangeListener(any());
|
||||
|
||||
when(mView.getViewTreeObserver()).thenReturn(mViewTreeObserver);
|
||||
when(mView.getParent()).thenReturn(mViewParent);
|
||||
when(mQs.getHeader()).thenReturn(mQsHeader);
|
||||
when(mDownMotionEvent.getAction()).thenReturn(MotionEvent.ACTION_DOWN);
|
||||
when(mSysUiState.setFlag(anyInt(), anyBoolean())).thenReturn(mSysUiState);
|
||||
|
||||
mMainHandler = new Handler(Looper.getMainLooper());
|
||||
|
||||
when(mView.requireViewById(R.id.keyguard_long_press))
|
||||
.thenReturn(mock(LongPressHandlingView.class));
|
||||
|
||||
mNotificationPanelViewController = new NotificationPanelViewController(
|
||||
mView,
|
||||
mMainHandler,
|
||||
mLayoutInflater,
|
||||
mFeatureFlags,
|
||||
coordinator, expansionHandler, mDynamicPrivacyController, mKeyguardBypassController,
|
||||
mFalsingManager, new FalsingCollectorFake(),
|
||||
mKeyguardStateController,
|
||||
mStatusBarStateController,
|
||||
mStatusBarWindowStateController,
|
||||
mNotificationShadeWindowController,
|
||||
mDozeLog, mDozeParameters, mCommandQueue, mVibratorHelper,
|
||||
mLatencyTracker, mPowerManager, mAccessibilityManager, 0, mUpdateMonitor,
|
||||
mMetricsLogger,
|
||||
mShadeLog,
|
||||
mShadeHeightLogger,
|
||||
mConfigurationController,
|
||||
() -> flingAnimationUtilsBuilder, mStatusBarTouchableRegionManager,
|
||||
mConversationNotificationManager, mMediaHierarchyManager,
|
||||
mStatusBarKeyguardViewManager,
|
||||
mGutsManager,
|
||||
mNotificationsQSContainerController,
|
||||
mNotificationStackScrollLayoutController,
|
||||
mKeyguardStatusViewComponentFactory,
|
||||
mKeyguardQsUserSwitchComponentFactory,
|
||||
mKeyguardUserSwitcherComponentFactory,
|
||||
mKeyguardStatusBarViewComponentFactory,
|
||||
mLockscreenShadeTransitionController,
|
||||
mAuthController,
|
||||
mScrimController,
|
||||
mUserManager,
|
||||
mMediaDataManager,
|
||||
mNotificationShadeDepthController,
|
||||
mAmbientState,
|
||||
mLockIconViewController,
|
||||
mKeyguardMediaController,
|
||||
mTapAgainViewController,
|
||||
mNavigationModeController,
|
||||
mNavigationBarController,
|
||||
mQsController,
|
||||
mFragmentService,
|
||||
mContentResolver,
|
||||
mRecordingController,
|
||||
mShadeHeaderController,
|
||||
mScreenOffAnimationController,
|
||||
mLockscreenGestureLogger,
|
||||
mShadeExpansionStateManager,
|
||||
mNotificationRemoteInputManager,
|
||||
mSysUIUnfoldComponent,
|
||||
mSysUiState,
|
||||
() -> mKeyguardBottomAreaViewController,
|
||||
mKeyguardUnlockAnimationController,
|
||||
mKeyguardIndicationController,
|
||||
mNotificationListContainer,
|
||||
mNotificationStackSizeCalculator,
|
||||
mUnlockedScreenOffAnimationController,
|
||||
mShadeTransitionController,
|
||||
systemClock,
|
||||
mKeyguardBottomAreaViewModel,
|
||||
mKeyguardBottomAreaInteractor,
|
||||
mAlternateBouncerInteractor,
|
||||
mDreamingToLockscreenTransitionViewModel,
|
||||
mOccludedToLockscreenTransitionViewModel,
|
||||
mLockscreenToDreamingTransitionViewModel,
|
||||
mGoneToDreamingTransitionViewModel,
|
||||
mLockscreenToOccludedTransitionViewModel,
|
||||
mMainDispatcher,
|
||||
mKeyguardTransitionInteractor,
|
||||
mDumpManager,
|
||||
mKeyuardLongPressViewModel,
|
||||
mKeyguardInteractor);
|
||||
mNotificationPanelViewController.initDependencies(
|
||||
mCentralSurfaces,
|
||||
null,
|
||||
() -> {},
|
||||
mNotificationShelfController);
|
||||
mNotificationPanelViewController.setTrackingStartedListener(() -> {});
|
||||
mNotificationPanelViewController.setOpenCloseListener(
|
||||
new NotificationPanelViewController.OpenCloseListener() {
|
||||
@Override
|
||||
public void onClosingFinished() {}
|
||||
|
||||
@Override
|
||||
public void onOpenStarted() {}
|
||||
});
|
||||
mNotificationPanelViewController.setHeadsUpManager(mHeadsUpManager);
|
||||
ArgumentCaptor<View.OnAttachStateChangeListener> onAttachStateChangeListenerArgumentCaptor =
|
||||
ArgumentCaptor.forClass(View.OnAttachStateChangeListener.class);
|
||||
verify(mView, atLeast(1)).addOnAttachStateChangeListener(
|
||||
onAttachStateChangeListenerArgumentCaptor.capture());
|
||||
mOnAttachStateChangeListeners = onAttachStateChangeListenerArgumentCaptor.getAllValues();
|
||||
|
||||
ArgumentCaptor<View.AccessibilityDelegate> accessibilityDelegateArgumentCaptor =
|
||||
ArgumentCaptor.forClass(View.AccessibilityDelegate.class);
|
||||
verify(mView).setAccessibilityDelegate(accessibilityDelegateArgumentCaptor.capture());
|
||||
mAccessibilityDelegate = accessibilityDelegateArgumentCaptor.getValue();
|
||||
mNotificationPanelViewController.getStatusBarStateController()
|
||||
.addCallback(mNotificationPanelViewController.getStatusBarStateListener());
|
||||
mNotificationPanelViewController
|
||||
.setHeadsUpAppearanceController(mock(HeadsUpAppearanceController.class));
|
||||
verify(mNotificationStackScrollLayoutController)
|
||||
.setOnEmptySpaceClickListener(mEmptySpaceClickListenerCaptor.capture());
|
||||
verify(mKeyguardStatusViewController).displayClock(LARGE, /* animate */ true);
|
||||
reset(mKeyguardStatusViewController);
|
||||
|
||||
when(mNotificationPanelViewControllerLazy.get())
|
||||
.thenReturn(mNotificationPanelViewController);
|
||||
mQuickSettingsController = new QuickSettingsController(
|
||||
mNotificationPanelViewControllerLazy,
|
||||
mView,
|
||||
mQsFrameTranslateController,
|
||||
mShadeTransitionController,
|
||||
expansionHandler,
|
||||
mNotificationRemoteInputManager,
|
||||
mShadeExpansionStateManager,
|
||||
mStatusBarKeyguardViewManager,
|
||||
mNotificationStackScrollLayoutController,
|
||||
mLockscreenShadeTransitionController,
|
||||
mNotificationShadeDepthController,
|
||||
mShadeHeaderController,
|
||||
mStatusBarTouchableRegionManager,
|
||||
mKeyguardStateController,
|
||||
mKeyguardBypassController,
|
||||
mUpdateMonitor,
|
||||
mScrimController,
|
||||
mMediaDataManager,
|
||||
mMediaHierarchyManager,
|
||||
mAmbientState,
|
||||
mRecordingController,
|
||||
mFalsingManager,
|
||||
new FalsingCollectorFake(),
|
||||
mAccessibilityManager,
|
||||
mLockscreenGestureLogger,
|
||||
mMetricsLogger,
|
||||
mFeatureFlags,
|
||||
mInteractionJankMonitor,
|
||||
mShadeLog
|
||||
);
|
||||
}
|
||||
|
||||
@After
|
||||
public void tearDown() {
|
||||
mNotificationPanelViewController.mBottomAreaShadeAlphaAnimator.cancel();
|
||||
mNotificationPanelViewController.cancelHeightAnimator();
|
||||
mMainHandler.removeCallbacksAndMessages(null);
|
||||
}
|
||||
|
||||
protected void setBottomPadding(int stackBottom, int lockIconPadding, int indicationPadding,
|
||||
int ambientPadding) {
|
||||
|
||||
when(mNotificationStackScrollLayoutController.getTop()).thenReturn(0);
|
||||
when(mNotificationStackScrollLayoutController.getHeight()).thenReturn(stackBottom);
|
||||
when(mNotificationStackScrollLayoutController.getBottom()).thenReturn(stackBottom);
|
||||
when(mLockIconViewController.getTop()).thenReturn((float) (stackBottom - lockIconPadding));
|
||||
|
||||
when(mResources.getDimensionPixelSize(R.dimen.keyguard_indication_bottom_padding))
|
||||
.thenReturn(indicationPadding);
|
||||
mNotificationPanelViewController.loadDimens();
|
||||
|
||||
mNotificationPanelViewController.setAmbientIndicationTop(
|
||||
/* ambientIndicationTop= */ stackBottom - ambientPadding,
|
||||
/* ambientTextVisible= */ true);
|
||||
}
|
||||
|
||||
protected void triggerPositionClockAndNotifications() {
|
||||
mNotificationPanelViewController.onQsSetExpansionHeightCalled(false);
|
||||
}
|
||||
|
||||
protected FalsingManager.FalsingTapListener getFalsingTapListener() {
|
||||
for (View.OnAttachStateChangeListener listener : mOnAttachStateChangeListeners) {
|
||||
listener.onViewAttachedToWindow(mView);
|
||||
}
|
||||
assertThat(mFalsingManager.getTapListeners().size()).isEqualTo(1);
|
||||
return mFalsingManager.getTapListeners().get(0);
|
||||
}
|
||||
|
||||
protected void givenViewAttached() {
|
||||
for (View.OnAttachStateChangeListener listener : mOnAttachStateChangeListeners) {
|
||||
listener.onViewAttachedToWindow(mView);
|
||||
}
|
||||
}
|
||||
|
||||
protected ConstraintSet.Layout getConstraintSetLayout(@IdRes int id) {
|
||||
ConstraintSet constraintSet = new ConstraintSet();
|
||||
constraintSet.clone(mNotificationContainerParent);
|
||||
return constraintSet.getConstraint(id).layout;
|
||||
}
|
||||
|
||||
protected void enableSplitShade(boolean enabled) {
|
||||
when(mResources.getBoolean(R.bool.config_use_split_notification_shade)).thenReturn(enabled);
|
||||
mNotificationPanelViewController.updateResources();
|
||||
}
|
||||
|
||||
protected void updateMultiUserSetting(boolean enabled) {
|
||||
when(mResources.getBoolean(R.bool.qs_show_user_switcher_for_single_user)).thenReturn(false);
|
||||
when(mUserManager.isUserSwitcherEnabled(false)).thenReturn(enabled);
|
||||
final ArgumentCaptor<ContentObserver> observerCaptor =
|
||||
ArgumentCaptor.forClass(ContentObserver.class);
|
||||
verify(mContentResolver)
|
||||
.registerContentObserver(any(), anyBoolean(), observerCaptor.capture());
|
||||
observerCaptor.getValue().onChange(/* selfChange */ false);
|
||||
}
|
||||
|
||||
protected void updateSmallestScreenWidth(int smallestScreenWidthDp) {
|
||||
Configuration configuration = new Configuration();
|
||||
configuration.smallestScreenWidthDp = smallestScreenWidthDp;
|
||||
mConfigurationController.onConfigurationChanged(configuration);
|
||||
}
|
||||
|
||||
protected void onTouchEvent(MotionEvent ev) {
|
||||
mTouchHandler.onTouch(mView, ev);
|
||||
}
|
||||
|
||||
protected void setDozing(boolean dozing, boolean dozingAlwaysOn) {
|
||||
when(mDozeParameters.getAlwaysOn()).thenReturn(dozingAlwaysOn);
|
||||
mNotificationPanelViewController.setDozing(
|
||||
/* dozing= */ dozing,
|
||||
/* animate= */ false
|
||||
);
|
||||
}
|
||||
|
||||
protected void assertKeyguardStatusViewCentered() {
|
||||
mNotificationPanelViewController.updateResources();
|
||||
assertThat(getConstraintSetLayout(R.id.keyguard_status_view).endToEnd).isAnyOf(
|
||||
ConstraintSet.PARENT_ID, ConstraintSet.UNSET);
|
||||
}
|
||||
|
||||
protected void assertKeyguardStatusViewNotCentered() {
|
||||
mNotificationPanelViewController.updateResources();
|
||||
assertThat(getConstraintSetLayout(R.id.keyguard_status_view).endToEnd).isEqualTo(
|
||||
R.id.qs_edge_guideline);
|
||||
}
|
||||
|
||||
protected void setIsFullWidth(boolean fullWidth) {
|
||||
float nsslWidth = fullWidth ? PANEL_WIDTH : PANEL_WIDTH / 2f;
|
||||
when(mNotificationStackScrollLayoutController.getWidth()).thenReturn(nsslWidth);
|
||||
triggerLayoutChange();
|
||||
}
|
||||
|
||||
protected void triggerLayoutChange() {
|
||||
mLayoutChangeListener.onLayoutChange(
|
||||
mView,
|
||||
/* left= */ 0,
|
||||
/* top= */ 0,
|
||||
/* right= */ 0,
|
||||
/* bottom= */ 0,
|
||||
/* oldLeft= */ 0,
|
||||
/* oldTop= */ 0,
|
||||
/* oldRight= */ 0,
|
||||
/* oldBottom= */ 0
|
||||
);
|
||||
}
|
||||
|
||||
protected CoroutineDispatcher getMainDispatcher() {
|
||||
return mMainDispatcher;
|
||||
}
|
||||
}
|
||||
@@ -16,8 +16,6 @@
|
||||
|
||||
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;
|
||||
@@ -31,592 +29,53 @@ import static com.android.systemui.statusbar.StatusBarState.SHADE_LOCKED;
|
||||
import static com.google.common.truth.Truth.assertThat;
|
||||
|
||||
import static org.mockito.ArgumentMatchers.any;
|
||||
import static org.mockito.ArgumentMatchers.anyBoolean;
|
||||
import static org.mockito.ArgumentMatchers.anyFloat;
|
||||
import static org.mockito.ArgumentMatchers.anyInt;
|
||||
import static org.mockito.ArgumentMatchers.anyString;
|
||||
import static org.mockito.ArgumentMatchers.eq;
|
||||
import static org.mockito.Mockito.atLeast;
|
||||
import static org.mockito.Mockito.atLeastOnce;
|
||||
import static org.mockito.Mockito.clearInvocations;
|
||||
import static org.mockito.Mockito.doAnswer;
|
||||
import static org.mockito.Mockito.inOrder;
|
||||
import static org.mockito.Mockito.mock;
|
||||
import static org.mockito.Mockito.never;
|
||||
import static org.mockito.Mockito.reset;
|
||||
import static org.mockito.Mockito.times;
|
||||
import static org.mockito.Mockito.verify;
|
||||
import static org.mockito.Mockito.when;
|
||||
|
||||
import android.annotation.IdRes;
|
||||
import android.content.ContentResolver;
|
||||
import android.content.res.Configuration;
|
||||
import android.content.res.Resources;
|
||||
import android.database.ContentObserver;
|
||||
import android.os.Handler;
|
||||
import android.os.Looper;
|
||||
import android.os.PowerManager;
|
||||
import android.os.UserManager;
|
||||
import android.testing.AndroidTestingRunner;
|
||||
import android.testing.TestableLooper;
|
||||
import android.util.DisplayMetrics;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.MotionEvent;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.view.ViewParent;
|
||||
import android.view.ViewPropertyAnimator;
|
||||
import android.view.ViewStub;
|
||||
import android.view.ViewTreeObserver;
|
||||
import android.view.accessibility.AccessibilityManager;
|
||||
import android.view.accessibility.AccessibilityNodeInfo;
|
||||
|
||||
import androidx.constraintlayout.widget.ConstraintSet;
|
||||
import androidx.test.filters.SmallTest;
|
||||
|
||||
import com.android.internal.jank.InteractionJankMonitor;
|
||||
import com.android.internal.logging.MetricsLogger;
|
||||
import com.android.internal.logging.UiEventLogger;
|
||||
import com.android.internal.logging.testing.UiEventLoggerFake;
|
||||
import com.android.internal.util.CollectionUtils;
|
||||
import com.android.internal.util.LatencyTracker;
|
||||
import com.android.keyguard.FaceAuthApiRequestReason;
|
||||
import com.android.keyguard.KeyguardClockSwitch;
|
||||
import com.android.keyguard.KeyguardClockSwitchController;
|
||||
import com.android.keyguard.KeyguardStatusView;
|
||||
import com.android.keyguard.KeyguardStatusViewController;
|
||||
import com.android.keyguard.KeyguardUpdateMonitor;
|
||||
import com.android.keyguard.LockIconViewController;
|
||||
import com.android.keyguard.dagger.KeyguardQsUserSwitchComponent;
|
||||
import com.android.keyguard.dagger.KeyguardStatusBarViewComponent;
|
||||
import com.android.keyguard.dagger.KeyguardStatusViewComponent;
|
||||
import com.android.keyguard.dagger.KeyguardUserSwitcherComponent;
|
||||
import com.android.systemui.DejankUtils;
|
||||
import com.android.systemui.R;
|
||||
import com.android.systemui.SysuiTestCase;
|
||||
import com.android.systemui.biometrics.AuthController;
|
||||
import com.android.systemui.classifier.FalsingCollectorFake;
|
||||
import com.android.systemui.classifier.FalsingManagerFake;
|
||||
import com.android.systemui.common.ui.view.LongPressHandlingView;
|
||||
import com.android.systemui.doze.DozeLog;
|
||||
import com.android.systemui.dump.DumpManager;
|
||||
import com.android.systemui.flags.FeatureFlags;
|
||||
import com.android.systemui.fragments.FragmentHostManager;
|
||||
import com.android.systemui.fragments.FragmentService;
|
||||
import com.android.systemui.keyguard.KeyguardUnlockAnimationController;
|
||||
import com.android.systemui.keyguard.domain.interactor.AlternateBouncerInteractor;
|
||||
import com.android.systemui.keyguard.domain.interactor.KeyguardBottomAreaInteractor;
|
||||
import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor;
|
||||
import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor;
|
||||
import com.android.systemui.keyguard.ui.viewmodel.DreamingToLockscreenTransitionViewModel;
|
||||
import com.android.systemui.keyguard.ui.viewmodel.GoneToDreamingTransitionViewModel;
|
||||
import com.android.systemui.keyguard.ui.viewmodel.KeyguardBottomAreaViewModel;
|
||||
import com.android.systemui.keyguard.ui.viewmodel.KeyguardLongPressViewModel;
|
||||
import com.android.systemui.keyguard.ui.viewmodel.LockscreenToDreamingTransitionViewModel;
|
||||
import com.android.systemui.keyguard.ui.viewmodel.LockscreenToOccludedTransitionViewModel;
|
||||
import com.android.systemui.keyguard.ui.viewmodel.OccludedToLockscreenTransitionViewModel;
|
||||
import com.android.systemui.media.controls.pipeline.MediaDataManager;
|
||||
import com.android.systemui.media.controls.ui.KeyguardMediaController;
|
||||
import com.android.systemui.media.controls.ui.MediaHierarchyManager;
|
||||
import com.android.systemui.model.SysUiState;
|
||||
import com.android.systemui.navigationbar.NavigationBarController;
|
||||
import com.android.systemui.navigationbar.NavigationModeController;
|
||||
import com.android.systemui.plugins.FalsingManager;
|
||||
import com.android.systemui.plugins.qs.QS;
|
||||
import com.android.systemui.plugins.statusbar.StatusBarStateController;
|
||||
import com.android.systemui.qs.QSFragment;
|
||||
import com.android.systemui.screenrecord.RecordingController;
|
||||
import com.android.systemui.shade.transition.ShadeTransitionController;
|
||||
import com.android.systemui.statusbar.CommandQueue;
|
||||
import com.android.systemui.statusbar.KeyguardIndicationController;
|
||||
import com.android.systemui.statusbar.LockscreenShadeTransitionController;
|
||||
import com.android.systemui.statusbar.NotificationRemoteInputManager;
|
||||
import com.android.systemui.statusbar.NotificationShadeDepthController;
|
||||
import com.android.systemui.statusbar.NotificationShadeWindowController;
|
||||
import com.android.systemui.statusbar.NotificationShelfController;
|
||||
import com.android.systemui.statusbar.PulseExpansionHandler;
|
||||
import com.android.systemui.statusbar.QsFrameTranslateController;
|
||||
import com.android.systemui.statusbar.StatusBarStateControllerImpl;
|
||||
import com.android.systemui.statusbar.SysuiStatusBarStateController;
|
||||
import com.android.systemui.statusbar.VibratorHelper;
|
||||
import com.android.systemui.statusbar.notification.ConversationNotificationManager;
|
||||
import com.android.systemui.statusbar.notification.DynamicPrivacyController;
|
||||
import com.android.systemui.statusbar.notification.NotificationWakeUpCoordinator;
|
||||
import com.android.systemui.statusbar.notification.NotificationWakeUpCoordinatorLogger;
|
||||
import com.android.systemui.statusbar.notification.row.ExpandableView;
|
||||
import com.android.systemui.statusbar.notification.row.ExpandableView.OnHeightChangedListener;
|
||||
import com.android.systemui.statusbar.notification.row.NotificationGutsManager;
|
||||
import com.android.systemui.statusbar.notification.stack.AmbientState;
|
||||
import com.android.systemui.statusbar.notification.stack.NotificationListContainer;
|
||||
import com.android.systemui.statusbar.notification.stack.NotificationRoundnessManager;
|
||||
import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayout;
|
||||
import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayoutController;
|
||||
import com.android.systemui.statusbar.notification.stack.NotificationStackSizeCalculator;
|
||||
import com.android.systemui.statusbar.phone.CentralSurfaces;
|
||||
import com.android.systemui.statusbar.phone.ConfigurationControllerImpl;
|
||||
import com.android.systemui.statusbar.phone.DozeParameters;
|
||||
import com.android.systemui.statusbar.phone.HeadsUpAppearanceController;
|
||||
import com.android.systemui.statusbar.phone.HeadsUpManagerPhone;
|
||||
import com.android.systemui.statusbar.phone.HeadsUpTouchHelper;
|
||||
import com.android.systemui.statusbar.phone.KeyguardBottomAreaView;
|
||||
import com.android.systemui.statusbar.phone.KeyguardBottomAreaViewController;
|
||||
import com.android.systemui.statusbar.phone.KeyguardBypassController;
|
||||
import com.android.systemui.statusbar.phone.KeyguardStatusBarView;
|
||||
import com.android.systemui.statusbar.phone.KeyguardStatusBarViewController;
|
||||
import com.android.systemui.statusbar.phone.LockscreenGestureLogger;
|
||||
import com.android.systemui.statusbar.phone.ScreenOffAnimationController;
|
||||
import com.android.systemui.statusbar.phone.ScrimController;
|
||||
import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager;
|
||||
import com.android.systemui.statusbar.phone.StatusBarTouchableRegionManager;
|
||||
import com.android.systemui.statusbar.phone.TapAgainViewController;
|
||||
import com.android.systemui.statusbar.phone.UnlockedScreenOffAnimationController;
|
||||
import com.android.systemui.statusbar.policy.ConfigurationController;
|
||||
import com.android.systemui.statusbar.policy.KeyguardQsUserSwitchController;
|
||||
import com.android.systemui.statusbar.policy.KeyguardStateController;
|
||||
import com.android.systemui.statusbar.policy.KeyguardUserSwitcherController;
|
||||
import com.android.systemui.statusbar.policy.KeyguardUserSwitcherView;
|
||||
import com.android.systemui.statusbar.window.StatusBarWindowStateController;
|
||||
import com.android.systemui.unfold.SysUIUnfoldComponent;
|
||||
import com.android.systemui.util.time.FakeSystemClock;
|
||||
import com.android.systemui.util.time.SystemClock;
|
||||
import com.android.wm.shell.animation.FlingAnimationUtils;
|
||||
|
||||
import org.junit.After;
|
||||
import org.junit.Before;
|
||||
import org.junit.Ignore;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.mockito.ArgumentCaptor;
|
||||
import org.mockito.Captor;
|
||||
import org.mockito.InOrder;
|
||||
import org.mockito.Mock;
|
||||
import org.mockito.MockitoAnnotations;
|
||||
import org.mockito.stubbing.Answer;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Optional;
|
||||
|
||||
import dagger.Lazy;
|
||||
import kotlinx.coroutines.CoroutineDispatcher;
|
||||
|
||||
@SmallTest
|
||||
@RunWith(AndroidTestingRunner.class)
|
||||
@TestableLooper.RunWithLooper(setAsMainLooper = true)
|
||||
public class NotificationPanelViewControllerTest extends SysuiTestCase {
|
||||
|
||||
private static final int SPLIT_SHADE_FULL_TRANSITION_DISTANCE = 400;
|
||||
private static final int NOTIFICATION_SCRIM_TOP_PADDING_IN_SPLIT_SHADE = 50;
|
||||
private static final int PANEL_WIDTH = 500; // Random value just for the test.
|
||||
|
||||
@Mock private CentralSurfaces mCentralSurfaces;
|
||||
@Mock private NotificationStackScrollLayout mNotificationStackScrollLayout;
|
||||
@Mock private KeyguardBottomAreaView mKeyguardBottomArea;
|
||||
@Mock private KeyguardBottomAreaViewController mKeyguardBottomAreaViewController;
|
||||
@Mock private KeyguardBottomAreaView mQsFrame;
|
||||
@Mock private HeadsUpManagerPhone mHeadsUpManager;
|
||||
@Mock private NotificationShelfController mNotificationShelfController;
|
||||
@Mock private NotificationGutsManager mGutsManager;
|
||||
@Mock private KeyguardStatusBarView mKeyguardStatusBar;
|
||||
@Mock private KeyguardUserSwitcherView mUserSwitcherView;
|
||||
@Mock private ViewStub mUserSwitcherStubView;
|
||||
@Mock private HeadsUpTouchHelper.Callback mHeadsUpCallback;
|
||||
@Mock private KeyguardUpdateMonitor mUpdateMonitor;
|
||||
@Mock private KeyguardBypassController mKeyguardBypassController;
|
||||
@Mock private DozeParameters mDozeParameters;
|
||||
@Mock private ScreenOffAnimationController mScreenOffAnimationController;
|
||||
@Mock private NotificationPanelView mView;
|
||||
@Mock private LayoutInflater mLayoutInflater;
|
||||
@Mock private FeatureFlags mFeatureFlags;
|
||||
@Mock private DynamicPrivacyController mDynamicPrivacyController;
|
||||
@Mock private StatusBarTouchableRegionManager mStatusBarTouchableRegionManager;
|
||||
@Mock private KeyguardStateController mKeyguardStateController;
|
||||
@Mock private DozeLog mDozeLog;
|
||||
@Mock private ShadeLogger mShadeLog;
|
||||
@Mock private ShadeHeightLogger mShadeHeightLogger;
|
||||
@Mock private CommandQueue mCommandQueue;
|
||||
@Mock private VibratorHelper mVibratorHelper;
|
||||
@Mock private LatencyTracker mLatencyTracker;
|
||||
@Mock private PowerManager mPowerManager;
|
||||
@Mock private AccessibilityManager mAccessibilityManager;
|
||||
@Mock private MetricsLogger mMetricsLogger;
|
||||
@Mock private Resources mResources;
|
||||
@Mock private Configuration mConfiguration;
|
||||
@Mock private KeyguardClockSwitch mKeyguardClockSwitch;
|
||||
@Mock private MediaHierarchyManager mMediaHierarchyManager;
|
||||
@Mock private ConversationNotificationManager mConversationNotificationManager;
|
||||
@Mock private StatusBarKeyguardViewManager mStatusBarKeyguardViewManager;
|
||||
@Mock private KeyguardStatusViewComponent.Factory mKeyguardStatusViewComponentFactory;
|
||||
@Mock private KeyguardQsUserSwitchComponent.Factory mKeyguardQsUserSwitchComponentFactory;
|
||||
@Mock private KeyguardQsUserSwitchComponent mKeyguardQsUserSwitchComponent;
|
||||
@Mock private KeyguardQsUserSwitchController mKeyguardQsUserSwitchController;
|
||||
@Mock private KeyguardUserSwitcherComponent.Factory mKeyguardUserSwitcherComponentFactory;
|
||||
@Mock private KeyguardUserSwitcherComponent mKeyguardUserSwitcherComponent;
|
||||
@Mock private KeyguardUserSwitcherController mKeyguardUserSwitcherController;
|
||||
@Mock private KeyguardStatusViewComponent mKeyguardStatusViewComponent;
|
||||
@Mock private KeyguardStatusBarViewComponent.Factory mKeyguardStatusBarViewComponentFactory;
|
||||
@Mock private KeyguardStatusBarViewComponent mKeyguardStatusBarViewComponent;
|
||||
@Mock private KeyguardClockSwitchController mKeyguardClockSwitchController;
|
||||
@Mock private KeyguardStatusViewController mKeyguardStatusViewController;
|
||||
@Mock private KeyguardStatusBarViewController mKeyguardStatusBarViewController;
|
||||
@Mock private NotificationStackScrollLayoutController mNotificationStackScrollLayoutController;
|
||||
@Mock private NotificationShadeDepthController mNotificationShadeDepthController;
|
||||
@Mock private LockscreenShadeTransitionController mLockscreenShadeTransitionController;
|
||||
@Mock private AuthController mAuthController;
|
||||
@Mock private ScrimController mScrimController;
|
||||
@Mock private MediaDataManager mMediaDataManager;
|
||||
@Mock private AmbientState mAmbientState;
|
||||
@Mock private UserManager mUserManager;
|
||||
@Mock private UiEventLogger mUiEventLogger;
|
||||
@Mock private LockIconViewController mLockIconViewController;
|
||||
@Mock private KeyguardMediaController mKeyguardMediaController;
|
||||
@Mock private NavigationModeController mNavigationModeController;
|
||||
@Mock private NavigationBarController mNavigationBarController;
|
||||
@Mock private QuickSettingsController mQsController;
|
||||
@Mock private ShadeHeaderController mShadeHeaderController;
|
||||
@Mock private ContentResolver mContentResolver;
|
||||
@Mock private TapAgainViewController mTapAgainViewController;
|
||||
@Mock private KeyguardIndicationController mKeyguardIndicationController;
|
||||
@Mock private FragmentService mFragmentService;
|
||||
@Mock private FragmentHostManager mFragmentHostManager;
|
||||
@Mock private NotificationRemoteInputManager mNotificationRemoteInputManager;
|
||||
@Mock private RecordingController mRecordingController;
|
||||
@Mock private LockscreenGestureLogger mLockscreenGestureLogger;
|
||||
@Mock private DumpManager mDumpManager;
|
||||
@Mock private InteractionJankMonitor mInteractionJankMonitor;
|
||||
@Mock private NotificationsQSContainerController mNotificationsQSContainerController;
|
||||
@Mock private QsFrameTranslateController mQsFrameTranslateController;
|
||||
@Mock private StatusBarWindowStateController mStatusBarWindowStateController;
|
||||
@Mock private KeyguardUnlockAnimationController mKeyguardUnlockAnimationController;
|
||||
@Mock private NotificationShadeWindowController mNotificationShadeWindowController;
|
||||
@Mock private SysUiState mSysUiState;
|
||||
@Mock private NotificationListContainer mNotificationListContainer;
|
||||
@Mock private NotificationStackSizeCalculator mNotificationStackSizeCalculator;
|
||||
@Mock private UnlockedScreenOffAnimationController mUnlockedScreenOffAnimationController;
|
||||
@Mock private ShadeTransitionController mShadeTransitionController;
|
||||
@Mock private QS mQs;
|
||||
@Mock private QSFragment mQSFragment;
|
||||
@Mock private ViewGroup mQsHeader;
|
||||
@Mock private ViewParent mViewParent;
|
||||
@Mock private ViewTreeObserver mViewTreeObserver;
|
||||
@Mock private KeyguardBottomAreaViewModel mKeyguardBottomAreaViewModel;
|
||||
@Mock private KeyguardBottomAreaInteractor mKeyguardBottomAreaInteractor;
|
||||
@Mock private AlternateBouncerInteractor mAlternateBouncerInteractor;
|
||||
@Mock private DreamingToLockscreenTransitionViewModel mDreamingToLockscreenTransitionViewModel;
|
||||
@Mock private OccludedToLockscreenTransitionViewModel mOccludedToLockscreenTransitionViewModel;
|
||||
@Mock private LockscreenToDreamingTransitionViewModel mLockscreenToDreamingTransitionViewModel;
|
||||
@Mock private LockscreenToOccludedTransitionViewModel mLockscreenToOccludedTransitionViewModel;
|
||||
@Mock private GoneToDreamingTransitionViewModel mGoneToDreamingTransitionViewModel;
|
||||
|
||||
@Mock private KeyguardTransitionInteractor mKeyguardTransitionInteractor;
|
||||
@Mock private KeyguardInteractor mKeyguardInteractor;
|
||||
@Mock private KeyguardLongPressViewModel mKeyuardLongPressViewModel;
|
||||
@Mock private CoroutineDispatcher mMainDispatcher;
|
||||
@Mock private MotionEvent mDownMotionEvent;
|
||||
@Captor
|
||||
private ArgumentCaptor<NotificationStackScrollLayout.OnEmptySpaceClickListener>
|
||||
mEmptySpaceClickListenerCaptor;
|
||||
|
||||
private NotificationPanelViewController.TouchHandler mTouchHandler;
|
||||
private ConfigurationController mConfigurationController;
|
||||
private SysuiStatusBarStateController mStatusBarStateController;
|
||||
private NotificationPanelViewController mNotificationPanelViewController;
|
||||
private View.AccessibilityDelegate mAccessibilityDelegate;
|
||||
private NotificationsQuickSettingsContainer mNotificationContainerParent;
|
||||
private List<View.OnAttachStateChangeListener> mOnAttachStateChangeListeners;
|
||||
private Handler mMainHandler;
|
||||
private View.OnLayoutChangeListener mLayoutChangeListener;
|
||||
|
||||
private final FalsingManagerFake mFalsingManager = new FalsingManagerFake();
|
||||
private final Optional<SysUIUnfoldComponent> mSysUIUnfoldComponent = Optional.empty();
|
||||
private final DisplayMetrics mDisplayMetrics = new DisplayMetrics();
|
||||
private final ShadeExpansionStateManager mShadeExpansionStateManager =
|
||||
new ShadeExpansionStateManager();
|
||||
|
||||
private QuickSettingsController mQuickSettingsController;
|
||||
@Mock private Lazy<NotificationPanelViewController> mNotificationPanelViewControllerLazy;
|
||||
|
||||
private FragmentHostManager.FragmentListener mFragmentListener;
|
||||
public class NotificationPanelViewControllerTest extends NotificationPanelViewControllerBaseTest {
|
||||
|
||||
@Before
|
||||
public void setup() {
|
||||
MockitoAnnotations.initMocks(this);
|
||||
SystemClock systemClock = new FakeSystemClock();
|
||||
mStatusBarStateController = new StatusBarStateControllerImpl(mUiEventLogger, mDumpManager,
|
||||
mInteractionJankMonitor, mShadeExpansionStateManager);
|
||||
|
||||
KeyguardStatusView keyguardStatusView = new KeyguardStatusView(mContext);
|
||||
keyguardStatusView.setId(R.id.keyguard_status_view);
|
||||
public void before() {
|
||||
DejankUtils.setImmediate(true);
|
||||
|
||||
when(mAuthController.isUdfpsEnrolled(anyInt())).thenReturn(false);
|
||||
when(mHeadsUpCallback.getContext()).thenReturn(mContext);
|
||||
when(mView.getResources()).thenReturn(mResources);
|
||||
when(mView.getWidth()).thenReturn(PANEL_WIDTH);
|
||||
when(mResources.getConfiguration()).thenReturn(mConfiguration);
|
||||
mConfiguration.orientation = ORIENTATION_PORTRAIT;
|
||||
when(mResources.getDisplayMetrics()).thenReturn(mDisplayMetrics);
|
||||
mDisplayMetrics.density = 100;
|
||||
when(mResources.getBoolean(R.bool.config_enableNotificationShadeDrag)).thenReturn(true);
|
||||
when(mResources.getDimensionPixelSize(R.dimen.notifications_top_padding_split_shade))
|
||||
.thenReturn(NOTIFICATION_SCRIM_TOP_PADDING_IN_SPLIT_SHADE);
|
||||
when(mResources.getDimensionPixelSize(R.dimen.notification_panel_margin_horizontal))
|
||||
.thenReturn(10);
|
||||
when(mResources.getDimensionPixelSize(R.dimen.split_shade_full_transition_distance))
|
||||
.thenReturn(SPLIT_SHADE_FULL_TRANSITION_DISTANCE);
|
||||
when(mView.getContext()).thenReturn(getContext());
|
||||
when(mView.findViewById(R.id.keyguard_header)).thenReturn(mKeyguardStatusBar);
|
||||
when(mView.findViewById(R.id.keyguard_user_switcher_view)).thenReturn(mUserSwitcherView);
|
||||
when(mView.findViewById(R.id.keyguard_user_switcher_stub)).thenReturn(
|
||||
mUserSwitcherStubView);
|
||||
when(mView.findViewById(R.id.keyguard_clock_container)).thenReturn(mKeyguardClockSwitch);
|
||||
when(mView.findViewById(R.id.notification_stack_scroller))
|
||||
.thenReturn(mNotificationStackScrollLayout);
|
||||
when(mNotificationStackScrollLayoutController.getHeight()).thenReturn(1000);
|
||||
when(mNotificationStackScrollLayoutController.getHeadsUpCallback())
|
||||
.thenReturn(mHeadsUpCallback);
|
||||
when(mKeyguardBottomAreaViewController.getView()).thenReturn(mKeyguardBottomArea);
|
||||
when(mView.findViewById(R.id.keyguard_bottom_area)).thenReturn(mKeyguardBottomArea);
|
||||
when(mKeyguardBottomArea.animate()).thenReturn(mock(ViewPropertyAnimator.class));
|
||||
when(mView.findViewById(R.id.qs_frame)).thenReturn(mQsFrame);
|
||||
when(mView.findViewById(R.id.keyguard_status_view))
|
||||
.thenReturn(mock(KeyguardStatusView.class));
|
||||
mNotificationContainerParent = new NotificationsQuickSettingsContainer(getContext(), null);
|
||||
mNotificationContainerParent.addView(keyguardStatusView);
|
||||
mNotificationContainerParent.onFinishInflate();
|
||||
when(mView.findViewById(R.id.notification_container_parent))
|
||||
.thenReturn(mNotificationContainerParent);
|
||||
when(mFragmentService.getFragmentHostManager(mView)).thenReturn(mFragmentHostManager);
|
||||
FlingAnimationUtils.Builder flingAnimationUtilsBuilder = new FlingAnimationUtils.Builder(
|
||||
mDisplayMetrics);
|
||||
when(mKeyguardQsUserSwitchComponentFactory.build(any()))
|
||||
.thenReturn(mKeyguardQsUserSwitchComponent);
|
||||
when(mKeyguardQsUserSwitchComponent.getKeyguardQsUserSwitchController())
|
||||
.thenReturn(mKeyguardQsUserSwitchController);
|
||||
when(mKeyguardUserSwitcherComponentFactory.build(any()))
|
||||
.thenReturn(mKeyguardUserSwitcherComponent);
|
||||
when(mKeyguardUserSwitcherComponent.getKeyguardUserSwitcherController())
|
||||
.thenReturn(mKeyguardUserSwitcherController);
|
||||
when(mScreenOffAnimationController.shouldAnimateClockChange()).thenReturn(true);
|
||||
when(mQs.getView()).thenReturn(mView);
|
||||
when(mQSFragment.getView()).thenReturn(mView);
|
||||
doAnswer(invocation -> {
|
||||
mFragmentListener = invocation.getArgument(1);
|
||||
return null;
|
||||
}).when(mFragmentHostManager).addTagListener(eq(QS.TAG), any());
|
||||
doAnswer((Answer<Void>) invocation -> {
|
||||
mTouchHandler = invocation.getArgument(0);
|
||||
return null;
|
||||
}).when(mView).setOnTouchListener(any(NotificationPanelViewController.TouchHandler.class));
|
||||
|
||||
NotificationWakeUpCoordinator coordinator =
|
||||
new NotificationWakeUpCoordinator(
|
||||
mDumpManager,
|
||||
mock(HeadsUpManagerPhone.class),
|
||||
new StatusBarStateControllerImpl(new UiEventLoggerFake(), mDumpManager,
|
||||
mInteractionJankMonitor, mShadeExpansionStateManager),
|
||||
mKeyguardBypassController,
|
||||
mDozeParameters,
|
||||
mScreenOffAnimationController,
|
||||
mock(NotificationWakeUpCoordinatorLogger.class));
|
||||
mConfigurationController = new ConfigurationControllerImpl(mContext);
|
||||
PulseExpansionHandler expansionHandler = new PulseExpansionHandler(
|
||||
mContext,
|
||||
coordinator,
|
||||
mKeyguardBypassController, mHeadsUpManager,
|
||||
mock(NotificationRoundnessManager.class),
|
||||
mConfigurationController,
|
||||
mStatusBarStateController,
|
||||
mFalsingManager,
|
||||
mShadeExpansionStateManager,
|
||||
mLockscreenShadeTransitionController,
|
||||
new FalsingCollectorFake(),
|
||||
mDumpManager);
|
||||
when(mKeyguardStatusViewComponentFactory.build(any()))
|
||||
.thenReturn(mKeyguardStatusViewComponent);
|
||||
when(mKeyguardStatusViewComponent.getKeyguardClockSwitchController())
|
||||
.thenReturn(mKeyguardClockSwitchController);
|
||||
when(mKeyguardStatusViewComponent.getKeyguardStatusViewController())
|
||||
.thenReturn(mKeyguardStatusViewController);
|
||||
when(mKeyguardStatusBarViewComponentFactory.build(any(), any()))
|
||||
.thenReturn(mKeyguardStatusBarViewComponent);
|
||||
when(mKeyguardStatusBarViewComponent.getKeyguardStatusBarViewController())
|
||||
.thenReturn(mKeyguardStatusBarViewController);
|
||||
when(mLayoutInflater.inflate(eq(R.layout.keyguard_status_view), any(), anyBoolean()))
|
||||
.thenReturn(keyguardStatusView);
|
||||
when(mLayoutInflater.inflate(eq(R.layout.keyguard_user_switcher), any(), anyBoolean()))
|
||||
.thenReturn(mUserSwitcherView);
|
||||
when(mLayoutInflater.inflate(eq(R.layout.keyguard_bottom_area), any(), anyBoolean()))
|
||||
.thenReturn(mKeyguardBottomArea);
|
||||
when(mNotificationRemoteInputManager.isRemoteInputActive())
|
||||
.thenReturn(false);
|
||||
when(mInteractionJankMonitor.begin(any(), anyInt()))
|
||||
.thenReturn(true);
|
||||
when(mInteractionJankMonitor.end(anyInt()))
|
||||
.thenReturn(true);
|
||||
doAnswer(invocation -> {
|
||||
((Runnable) invocation.getArgument(0)).run();
|
||||
return null;
|
||||
}).when(mNotificationShadeWindowController).batchApplyWindowLayoutParams(any());
|
||||
doAnswer(invocation -> {
|
||||
mLayoutChangeListener = invocation.getArgument(0);
|
||||
return null;
|
||||
}).when(mView).addOnLayoutChangeListener(any());
|
||||
|
||||
when(mView.getViewTreeObserver()).thenReturn(mViewTreeObserver);
|
||||
when(mView.getParent()).thenReturn(mViewParent);
|
||||
when(mQs.getHeader()).thenReturn(mQsHeader);
|
||||
when(mDownMotionEvent.getAction()).thenReturn(MotionEvent.ACTION_DOWN);
|
||||
when(mSysUiState.setFlag(anyInt(), anyBoolean())).thenReturn(mSysUiState);
|
||||
|
||||
mMainHandler = new Handler(Looper.getMainLooper());
|
||||
|
||||
when(mView.requireViewById(R.id.keyguard_long_press))
|
||||
.thenReturn(mock(LongPressHandlingView.class));
|
||||
|
||||
mNotificationPanelViewController = new NotificationPanelViewController(
|
||||
mView,
|
||||
mMainHandler,
|
||||
mLayoutInflater,
|
||||
mFeatureFlags,
|
||||
coordinator, expansionHandler, mDynamicPrivacyController, mKeyguardBypassController,
|
||||
mFalsingManager, new FalsingCollectorFake(),
|
||||
mKeyguardStateController,
|
||||
mStatusBarStateController,
|
||||
mStatusBarWindowStateController,
|
||||
mNotificationShadeWindowController,
|
||||
mDozeLog, mDozeParameters, mCommandQueue, mVibratorHelper,
|
||||
mLatencyTracker, mPowerManager, mAccessibilityManager, 0, mUpdateMonitor,
|
||||
mMetricsLogger,
|
||||
mShadeLog,
|
||||
mShadeHeightLogger,
|
||||
mConfigurationController,
|
||||
() -> flingAnimationUtilsBuilder, mStatusBarTouchableRegionManager,
|
||||
mConversationNotificationManager, mMediaHierarchyManager,
|
||||
mStatusBarKeyguardViewManager,
|
||||
mGutsManager,
|
||||
mNotificationsQSContainerController,
|
||||
mNotificationStackScrollLayoutController,
|
||||
mKeyguardStatusViewComponentFactory,
|
||||
mKeyguardQsUserSwitchComponentFactory,
|
||||
mKeyguardUserSwitcherComponentFactory,
|
||||
mKeyguardStatusBarViewComponentFactory,
|
||||
mLockscreenShadeTransitionController,
|
||||
mAuthController,
|
||||
mScrimController,
|
||||
mUserManager,
|
||||
mMediaDataManager,
|
||||
mNotificationShadeDepthController,
|
||||
mAmbientState,
|
||||
mLockIconViewController,
|
||||
mKeyguardMediaController,
|
||||
mTapAgainViewController,
|
||||
mNavigationModeController,
|
||||
mNavigationBarController,
|
||||
mQsController,
|
||||
mFragmentService,
|
||||
mContentResolver,
|
||||
mRecordingController,
|
||||
mShadeHeaderController,
|
||||
mScreenOffAnimationController,
|
||||
mLockscreenGestureLogger,
|
||||
mShadeExpansionStateManager,
|
||||
mNotificationRemoteInputManager,
|
||||
mSysUIUnfoldComponent,
|
||||
mSysUiState,
|
||||
() -> mKeyguardBottomAreaViewController,
|
||||
mKeyguardUnlockAnimationController,
|
||||
mKeyguardIndicationController,
|
||||
mNotificationListContainer,
|
||||
mNotificationStackSizeCalculator,
|
||||
mUnlockedScreenOffAnimationController,
|
||||
mShadeTransitionController,
|
||||
systemClock,
|
||||
mKeyguardBottomAreaViewModel,
|
||||
mKeyguardBottomAreaInteractor,
|
||||
mAlternateBouncerInteractor,
|
||||
mDreamingToLockscreenTransitionViewModel,
|
||||
mOccludedToLockscreenTransitionViewModel,
|
||||
mLockscreenToDreamingTransitionViewModel,
|
||||
mGoneToDreamingTransitionViewModel,
|
||||
mLockscreenToOccludedTransitionViewModel,
|
||||
mMainDispatcher,
|
||||
mKeyguardTransitionInteractor,
|
||||
mDumpManager,
|
||||
mKeyuardLongPressViewModel,
|
||||
mKeyguardInteractor);
|
||||
mNotificationPanelViewController.initDependencies(
|
||||
mCentralSurfaces,
|
||||
null,
|
||||
() -> {},
|
||||
mNotificationShelfController);
|
||||
mNotificationPanelViewController.setTrackingStartedListener(() -> {});
|
||||
mNotificationPanelViewController.setOpenCloseListener(
|
||||
new NotificationPanelViewController.OpenCloseListener() {
|
||||
@Override
|
||||
public void onClosingFinished() {}
|
||||
|
||||
@Override
|
||||
public void onOpenStarted() {}
|
||||
});
|
||||
mNotificationPanelViewController.setHeadsUpManager(mHeadsUpManager);
|
||||
ArgumentCaptor<View.OnAttachStateChangeListener> onAttachStateChangeListenerArgumentCaptor =
|
||||
ArgumentCaptor.forClass(View.OnAttachStateChangeListener.class);
|
||||
verify(mView, atLeast(1)).addOnAttachStateChangeListener(
|
||||
onAttachStateChangeListenerArgumentCaptor.capture());
|
||||
mOnAttachStateChangeListeners = onAttachStateChangeListenerArgumentCaptor.getAllValues();
|
||||
|
||||
ArgumentCaptor<View.AccessibilityDelegate> accessibilityDelegateArgumentCaptor =
|
||||
ArgumentCaptor.forClass(View.AccessibilityDelegate.class);
|
||||
verify(mView).setAccessibilityDelegate(accessibilityDelegateArgumentCaptor.capture());
|
||||
mAccessibilityDelegate = accessibilityDelegateArgumentCaptor.getValue();
|
||||
mNotificationPanelViewController.getStatusBarStateController()
|
||||
.addCallback(mNotificationPanelViewController.getStatusBarStateListener());
|
||||
mNotificationPanelViewController
|
||||
.setHeadsUpAppearanceController(mock(HeadsUpAppearanceController.class));
|
||||
verify(mNotificationStackScrollLayoutController)
|
||||
.setOnEmptySpaceClickListener(mEmptySpaceClickListenerCaptor.capture());
|
||||
verify(mKeyguardStatusViewController).displayClock(LARGE, /* animate */ true);
|
||||
reset(mKeyguardStatusViewController);
|
||||
|
||||
when(mNotificationPanelViewControllerLazy.get())
|
||||
.thenReturn(mNotificationPanelViewController);
|
||||
mQuickSettingsController = new QuickSettingsController(
|
||||
mNotificationPanelViewControllerLazy,
|
||||
mView,
|
||||
mQsFrameTranslateController,
|
||||
mShadeTransitionController,
|
||||
expansionHandler,
|
||||
mNotificationRemoteInputManager,
|
||||
mShadeExpansionStateManager,
|
||||
mStatusBarKeyguardViewManager,
|
||||
mNotificationStackScrollLayoutController,
|
||||
mLockscreenShadeTransitionController,
|
||||
mNotificationShadeDepthController,
|
||||
mShadeHeaderController,
|
||||
mStatusBarTouchableRegionManager,
|
||||
mKeyguardStateController,
|
||||
mKeyguardBypassController,
|
||||
mUpdateMonitor,
|
||||
mScrimController,
|
||||
mMediaDataManager,
|
||||
mMediaHierarchyManager,
|
||||
mAmbientState,
|
||||
mRecordingController,
|
||||
mFalsingManager,
|
||||
new FalsingCollectorFake(),
|
||||
mAccessibilityManager,
|
||||
mLockscreenGestureLogger,
|
||||
mMetricsLogger,
|
||||
mFeatureFlags,
|
||||
mInteractionJankMonitor,
|
||||
mShadeLog
|
||||
);
|
||||
}
|
||||
|
||||
@After
|
||||
public void tearDown() {
|
||||
mNotificationPanelViewController.cancelHeightAnimator();
|
||||
mMainHandler.removeCallbacksAndMessages(null);
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -671,23 +130,6 @@ public class NotificationPanelViewControllerTest extends SysuiTestCase {
|
||||
.isNotEqualTo(-1);
|
||||
}
|
||||
|
||||
private void setBottomPadding(int stackBottom, int lockIconPadding, int indicationPadding,
|
||||
int ambientPadding) {
|
||||
|
||||
when(mNotificationStackScrollLayoutController.getTop()).thenReturn(0);
|
||||
when(mNotificationStackScrollLayoutController.getHeight()).thenReturn(stackBottom);
|
||||
when(mNotificationStackScrollLayoutController.getBottom()).thenReturn(stackBottom);
|
||||
when(mLockIconViewController.getTop()).thenReturn((float) (stackBottom - lockIconPadding));
|
||||
|
||||
when(mResources.getDimensionPixelSize(R.dimen.keyguard_indication_bottom_padding))
|
||||
.thenReturn(indicationPadding);
|
||||
mNotificationPanelViewController.loadDimens();
|
||||
|
||||
mNotificationPanelViewController.setAmbientIndicationTop(
|
||||
/* ambientIndicationTop= */ stackBottom - ambientPadding,
|
||||
/* ambientTextVisible= */ true);
|
||||
}
|
||||
|
||||
@Test
|
||||
@Ignore("b/261472011 - Test appears inconsistent across environments")
|
||||
public void getVerticalSpaceForLockscreenNotifications_useLockIconBottomPadding_returnsSpaceAvailable() {
|
||||
@@ -991,68 +433,6 @@ public class NotificationPanelViewControllerTest extends SysuiTestCase {
|
||||
assertKeyguardStatusViewCentered();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testDisableUserSwitcherAfterEnabling_returnsViewStubToTheViewHierarchy() {
|
||||
givenViewAttached();
|
||||
when(mResources.getBoolean(
|
||||
com.android.internal.R.bool.config_keyguardUserSwitcher)).thenReturn(true);
|
||||
updateMultiUserSetting(true);
|
||||
clearInvocations(mView);
|
||||
|
||||
updateMultiUserSetting(false);
|
||||
|
||||
ArgumentCaptor<View> captor = ArgumentCaptor.forClass(View.class);
|
||||
verify(mView, atLeastOnce()).addView(captor.capture(), anyInt());
|
||||
final View userSwitcherStub = CollectionUtils.find(captor.getAllValues(),
|
||||
view -> view.getId() == R.id.keyguard_user_switcher_stub);
|
||||
assertThat(userSwitcherStub).isNotNull();
|
||||
assertThat(userSwitcherStub).isInstanceOf(ViewStub.class);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testChangeSmallestScreenWidthAndUserSwitchEnabled_inflatesUserSwitchView() {
|
||||
givenViewAttached();
|
||||
when(mView.findViewById(R.id.keyguard_user_switcher_view)).thenReturn(null);
|
||||
updateSmallestScreenWidth(300);
|
||||
when(mResources.getBoolean(
|
||||
com.android.internal.R.bool.config_keyguardUserSwitcher)).thenReturn(true);
|
||||
when(mResources.getBoolean(R.bool.qs_show_user_switcher_for_single_user)).thenReturn(false);
|
||||
when(mUserManager.isUserSwitcherEnabled(false)).thenReturn(true);
|
||||
|
||||
updateSmallestScreenWidth(800);
|
||||
|
||||
verify(mUserSwitcherStubView).inflate();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testFinishInflate_userSwitcherDisabled_doNotInflateUserSwitchView_initClock() {
|
||||
givenViewAttached();
|
||||
when(mResources.getBoolean(
|
||||
com.android.internal.R.bool.config_keyguardUserSwitcher)).thenReturn(true);
|
||||
when(mResources.getBoolean(R.bool.qs_show_user_switcher_for_single_user)).thenReturn(false);
|
||||
when(mUserManager.isUserSwitcherEnabled(false /* showEvenIfNotActionable */))
|
||||
.thenReturn(false);
|
||||
|
||||
mNotificationPanelViewController.onFinishInflate();
|
||||
|
||||
verify(mUserSwitcherStubView, never()).inflate();
|
||||
verify(mKeyguardStatusViewController, times(3)).displayClock(LARGE, /* animate */ true);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testReInflateViews_userSwitcherDisabled_doNotInflateUserSwitchView() {
|
||||
givenViewAttached();
|
||||
when(mResources.getBoolean(
|
||||
com.android.internal.R.bool.config_keyguardUserSwitcher)).thenReturn(true);
|
||||
when(mResources.getBoolean(R.bool.qs_show_user_switcher_for_single_user)).thenReturn(false);
|
||||
when(mUserManager.isUserSwitcherEnabled(false /* showEvenIfNotActionable */))
|
||||
.thenReturn(false);
|
||||
|
||||
mNotificationPanelViewController.reInflateViews();
|
||||
|
||||
verify(mUserSwitcherStubView, never()).inflate();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCanCollapsePanelOnTouch_trueForKeyGuard() {
|
||||
mStatusBarStateController.setState(KEYGUARD);
|
||||
@@ -1128,26 +508,6 @@ public class NotificationPanelViewControllerTest extends SysuiTestCase {
|
||||
verify(mNotificationStackScrollLayoutController).setPanelFlinging(false);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testDoubleTapRequired_Keyguard() {
|
||||
FalsingManager.FalsingTapListener listener = getFalsingTapListener();
|
||||
mStatusBarStateController.setState(KEYGUARD);
|
||||
|
||||
listener.onAdditionalTapRequired();
|
||||
|
||||
verify(mKeyguardIndicationController).showTransientIndication(anyInt());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testDoubleTapRequired_ShadeLocked() {
|
||||
FalsingManager.FalsingTapListener listener = getFalsingTapListener();
|
||||
mStatusBarStateController.setState(SHADE_LOCKED);
|
||||
|
||||
listener.onAdditionalTapRequired();
|
||||
|
||||
verify(mTapAgainViewController).show();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testRotatingToSplitShadeWithQsExpanded_transitionsToShadeLocked() {
|
||||
mStatusBarStateController.setState(KEYGUARD);
|
||||
@@ -1422,19 +782,6 @@ public class NotificationPanelViewControllerTest extends SysuiTestCase {
|
||||
assertThat(mNotificationPanelViewController.isClosing()).isTrue();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testOnAttachRefreshStatusBarState() {
|
||||
mStatusBarStateController.setState(KEYGUARD);
|
||||
when(mKeyguardStateController.isKeyguardFadingAway()).thenReturn(false);
|
||||
for (View.OnAttachStateChangeListener listener : mOnAttachStateChangeListeners) {
|
||||
listener.onViewAttachedToWindow(mView);
|
||||
}
|
||||
verify(mKeyguardStatusViewController).setKeyguardStatusViewVisibility(
|
||||
KEYGUARD/*statusBarState*/,
|
||||
false/*keyguardFadingAway*/,
|
||||
false/*goingToFullShade*/, SHADE/*oldStatusBarState*/);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getMaxPanelTransitionDistance_expanding_inSplitShade_returnsSplitShadeFullTransitionDistance() {
|
||||
enableSplitShade(true);
|
||||
@@ -1635,98 +982,4 @@ public class NotificationPanelViewControllerTest extends SysuiTestCase {
|
||||
mStatusBarStateController.setState(SHADE_LOCKED);
|
||||
assertThat(mNotificationPanelViewController.isShadeFullyOpen()).isTrue();
|
||||
}
|
||||
|
||||
private static MotionEvent createMotionEvent(int x, int y, int action) {
|
||||
return MotionEvent.obtain(
|
||||
/* downTime= */ 0, /* eventTime= */ 0, action, x, y, /* metaState= */ 0);
|
||||
}
|
||||
|
||||
private void triggerPositionClockAndNotifications() {
|
||||
mNotificationPanelViewController.onQsSetExpansionHeightCalled(false);
|
||||
}
|
||||
|
||||
private FalsingManager.FalsingTapListener getFalsingTapListener() {
|
||||
for (View.OnAttachStateChangeListener listener : mOnAttachStateChangeListeners) {
|
||||
listener.onViewAttachedToWindow(mView);
|
||||
}
|
||||
assertThat(mFalsingManager.getTapListeners().size()).isEqualTo(1);
|
||||
return mFalsingManager.getTapListeners().get(0);
|
||||
}
|
||||
|
||||
private void givenViewAttached() {
|
||||
for (View.OnAttachStateChangeListener listener : mOnAttachStateChangeListeners) {
|
||||
listener.onViewAttachedToWindow(mView);
|
||||
}
|
||||
}
|
||||
|
||||
private ConstraintSet.Layout getConstraintSetLayout(@IdRes int id) {
|
||||
ConstraintSet constraintSet = new ConstraintSet();
|
||||
constraintSet.clone(mNotificationContainerParent);
|
||||
return constraintSet.getConstraint(id).layout;
|
||||
}
|
||||
|
||||
private void enableSplitShade(boolean enabled) {
|
||||
when(mResources.getBoolean(R.bool.config_use_split_notification_shade)).thenReturn(enabled);
|
||||
mNotificationPanelViewController.updateResources();
|
||||
}
|
||||
|
||||
private void updateMultiUserSetting(boolean enabled) {
|
||||
when(mResources.getBoolean(R.bool.qs_show_user_switcher_for_single_user)).thenReturn(false);
|
||||
when(mUserManager.isUserSwitcherEnabled(false)).thenReturn(enabled);
|
||||
final ArgumentCaptor<ContentObserver> observerCaptor =
|
||||
ArgumentCaptor.forClass(ContentObserver.class);
|
||||
verify(mContentResolver)
|
||||
.registerContentObserver(any(), anyBoolean(), observerCaptor.capture());
|
||||
observerCaptor.getValue().onChange(/* selfChange */ false);
|
||||
}
|
||||
|
||||
private void updateSmallestScreenWidth(int smallestScreenWidthDp) {
|
||||
Configuration configuration = new Configuration();
|
||||
configuration.smallestScreenWidthDp = smallestScreenWidthDp;
|
||||
mConfigurationController.onConfigurationChanged(configuration);
|
||||
}
|
||||
|
||||
private void onTouchEvent(MotionEvent ev) {
|
||||
mTouchHandler.onTouch(mView, ev);
|
||||
}
|
||||
|
||||
private void setDozing(boolean dozing, boolean dozingAlwaysOn) {
|
||||
when(mDozeParameters.getAlwaysOn()).thenReturn(dozingAlwaysOn);
|
||||
mNotificationPanelViewController.setDozing(
|
||||
/* dozing= */ dozing,
|
||||
/* animate= */ false
|
||||
);
|
||||
}
|
||||
|
||||
private void assertKeyguardStatusViewCentered() {
|
||||
mNotificationPanelViewController.updateResources();
|
||||
assertThat(getConstraintSetLayout(R.id.keyguard_status_view).endToEnd).isAnyOf(
|
||||
ConstraintSet.PARENT_ID, ConstraintSet.UNSET);
|
||||
}
|
||||
|
||||
private void assertKeyguardStatusViewNotCentered() {
|
||||
mNotificationPanelViewController.updateResources();
|
||||
assertThat(getConstraintSetLayout(R.id.keyguard_status_view).endToEnd).isEqualTo(
|
||||
R.id.qs_edge_guideline);
|
||||
}
|
||||
|
||||
private void setIsFullWidth(boolean fullWidth) {
|
||||
float nsslWidth = fullWidth ? PANEL_WIDTH : PANEL_WIDTH / 2f;
|
||||
when(mNotificationStackScrollLayoutController.getWidth()).thenReturn(nsslWidth);
|
||||
triggerLayoutChange();
|
||||
}
|
||||
|
||||
private void triggerLayoutChange() {
|
||||
mLayoutChangeListener.onLayoutChange(
|
||||
mView,
|
||||
/* left= */ 0,
|
||||
/* top= */ 0,
|
||||
/* right= */ 0,
|
||||
/* bottom= */ 0,
|
||||
/* oldLeft= */ 0,
|
||||
/* oldTop= */ 0,
|
||||
/* oldRight= */ 0,
|
||||
/* oldBottom= */ 0
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,179 @@
|
||||
/*
|
||||
* Copyright (C) 2023 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package com.android.systemui.shade
|
||||
|
||||
import android.testing.AndroidTestingRunner
|
||||
import android.testing.TestableLooper
|
||||
import android.view.View
|
||||
import android.view.ViewStub
|
||||
import androidx.test.filters.SmallTest
|
||||
import com.android.internal.util.CollectionUtils
|
||||
import com.android.keyguard.KeyguardClockSwitch.LARGE
|
||||
import com.android.systemui.R
|
||||
import com.android.systemui.statusbar.StatusBarState.KEYGUARD
|
||||
import com.android.systemui.statusbar.StatusBarState.SHADE
|
||||
import com.android.systemui.statusbar.StatusBarState.SHADE_LOCKED
|
||||
import com.android.systemui.util.mockito.whenever
|
||||
import com.google.common.truth.Truth.assertThat
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.cancelChildren
|
||||
import kotlinx.coroutines.launch
|
||||
import kotlinx.coroutines.test.advanceUntilIdle
|
||||
import kotlinx.coroutines.test.runTest
|
||||
import org.junit.Test
|
||||
import org.junit.runner.RunWith
|
||||
import org.mockito.ArgumentCaptor
|
||||
import org.mockito.ArgumentMatchers.anyInt
|
||||
import org.mockito.Captor
|
||||
import org.mockito.Mockito.atLeastOnce
|
||||
import org.mockito.Mockito.clearInvocations
|
||||
import org.mockito.Mockito.never
|
||||
import org.mockito.Mockito.times
|
||||
import org.mockito.Mockito.verify
|
||||
|
||||
@RunWith(AndroidTestingRunner::class)
|
||||
@TestableLooper.RunWithLooper(setAsMainLooper = true)
|
||||
@SmallTest
|
||||
class NotificationPanelViewControllerWithCoroutinesTest :
|
||||
NotificationPanelViewControllerBaseTest() {
|
||||
|
||||
@Captor private lateinit var viewCaptor: ArgumentCaptor<View>
|
||||
|
||||
override fun getMainDispatcher() = Dispatchers.Main.immediate
|
||||
|
||||
@Test
|
||||
fun testDisableUserSwitcherAfterEnabling_returnsViewStubToTheViewHierarchy() = runTest {
|
||||
launch(Dispatchers.Main.immediate) { givenViewAttached() }
|
||||
advanceUntilIdle()
|
||||
|
||||
whenever(mResources.getBoolean(com.android.internal.R.bool.config_keyguardUserSwitcher))
|
||||
.thenReturn(true)
|
||||
updateMultiUserSetting(true)
|
||||
clearInvocations(mView)
|
||||
|
||||
updateMultiUserSetting(false)
|
||||
|
||||
verify(mView, atLeastOnce()).addView(viewCaptor.capture(), anyInt())
|
||||
val userSwitcherStub =
|
||||
CollectionUtils.find(
|
||||
viewCaptor.getAllValues(),
|
||||
{ view -> view.getId() == R.id.keyguard_user_switcher_stub }
|
||||
)
|
||||
assertThat(userSwitcherStub).isNotNull()
|
||||
assertThat(userSwitcherStub).isInstanceOf(ViewStub::class.java)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun testChangeSmallestScreenWidthAndUserSwitchEnabled_inflatesUserSwitchView() = runTest {
|
||||
launch(Dispatchers.Main.immediate) { givenViewAttached() }
|
||||
advanceUntilIdle()
|
||||
|
||||
whenever(mView.findViewById<View>(R.id.keyguard_user_switcher_view)).thenReturn(null)
|
||||
updateSmallestScreenWidth(300)
|
||||
whenever(mResources.getBoolean(com.android.internal.R.bool.config_keyguardUserSwitcher))
|
||||
.thenReturn(true)
|
||||
whenever(mResources.getBoolean(R.bool.qs_show_user_switcher_for_single_user))
|
||||
.thenReturn(false)
|
||||
whenever(mUserManager.isUserSwitcherEnabled(false)).thenReturn(true)
|
||||
|
||||
updateSmallestScreenWidth(800)
|
||||
|
||||
verify(mUserSwitcherStubView).inflate()
|
||||
}
|
||||
|
||||
@Test
|
||||
fun testFinishInflate_userSwitcherDisabled_doNotInflateUserSwitchView_initClock() = runTest {
|
||||
launch(Dispatchers.Main.immediate) { givenViewAttached() }
|
||||
advanceUntilIdle()
|
||||
|
||||
whenever(mResources.getBoolean(com.android.internal.R.bool.config_keyguardUserSwitcher))
|
||||
.thenReturn(true)
|
||||
whenever(mResources.getBoolean(R.bool.qs_show_user_switcher_for_single_user))
|
||||
.thenReturn(false)
|
||||
whenever(mUserManager.isUserSwitcherEnabled(false /* showEvenIfNotActionable */))
|
||||
.thenReturn(false)
|
||||
|
||||
mNotificationPanelViewController.onFinishInflate()
|
||||
|
||||
verify(mUserSwitcherStubView, never()).inflate()
|
||||
verify(mKeyguardStatusViewController, times(3)).displayClock(LARGE, /* animate */ true)
|
||||
|
||||
coroutineContext.cancelChildren()
|
||||
}
|
||||
|
||||
@Test
|
||||
fun testReInflateViews_userSwitcherDisabled_doNotInflateUserSwitchView() = runTest {
|
||||
launch(Dispatchers.Main.immediate) { givenViewAttached() }
|
||||
advanceUntilIdle()
|
||||
|
||||
whenever(mResources.getBoolean(com.android.internal.R.bool.config_keyguardUserSwitcher))
|
||||
.thenReturn(true)
|
||||
whenever(mResources.getBoolean(R.bool.qs_show_user_switcher_for_single_user))
|
||||
.thenReturn(false)
|
||||
whenever(mUserManager.isUserSwitcherEnabled(false /* showEvenIfNotActionable */))
|
||||
.thenReturn(false)
|
||||
|
||||
mNotificationPanelViewController.reInflateViews()
|
||||
|
||||
verify(mUserSwitcherStubView, never()).inflate()
|
||||
|
||||
coroutineContext.cancelChildren()
|
||||
}
|
||||
|
||||
@Test
|
||||
fun testDoubleTapRequired_Keyguard() = runTest {
|
||||
launch(Dispatchers.Main.immediate) {
|
||||
val listener = getFalsingTapListener()
|
||||
mStatusBarStateController.setState(KEYGUARD)
|
||||
|
||||
listener.onAdditionalTapRequired()
|
||||
|
||||
verify(mKeyguardIndicationController).showTransientIndication(anyInt())
|
||||
}
|
||||
advanceUntilIdle()
|
||||
}
|
||||
|
||||
@Test
|
||||
fun testDoubleTapRequired_ShadeLocked() = runTest {
|
||||
launch(Dispatchers.Main.immediate) {
|
||||
val listener = getFalsingTapListener()
|
||||
mStatusBarStateController.setState(SHADE_LOCKED)
|
||||
|
||||
listener.onAdditionalTapRequired()
|
||||
|
||||
verify(mTapAgainViewController).show()
|
||||
}
|
||||
advanceUntilIdle()
|
||||
}
|
||||
|
||||
@Test
|
||||
fun testOnAttachRefreshStatusBarState() = runTest {
|
||||
launch(Dispatchers.Main.immediate) {
|
||||
mStatusBarStateController.setState(KEYGUARD)
|
||||
whenever(mKeyguardStateController.isKeyguardFadingAway()).thenReturn(false)
|
||||
mOnAttachStateChangeListeners.forEach { it.onViewAttachedToWindow(mView) }
|
||||
verify(mKeyguardStatusViewController)
|
||||
.setKeyguardStatusViewVisibility(
|
||||
KEYGUARD /*statusBarState*/,
|
||||
false /*keyguardFadingAway*/,
|
||||
false /*goingToFullShade*/,
|
||||
SHADE /*oldStatusBarState*/
|
||||
)
|
||||
}
|
||||
advanceUntilIdle()
|
||||
}
|
||||
}
|
||||
@@ -28,10 +28,10 @@ import com.android.systemui.R
|
||||
import com.android.systemui.SysuiTestCase
|
||||
import com.android.systemui.classifier.FalsingCollectorFake
|
||||
import com.android.systemui.dock.DockManager
|
||||
import com.android.systemui.flags.FeatureFlags
|
||||
import com.android.systemui.keyguard.KeyguardUnlockAnimationController
|
||||
import com.android.systemui.keyguard.domain.interactor.AlternateBouncerInteractor
|
||||
import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor
|
||||
import com.android.systemui.keyguard.shared.model.TransitionStep
|
||||
import com.android.systemui.keyguard.ui.viewmodel.KeyguardBouncerViewModel
|
||||
import com.android.systemui.shade.NotificationShadeWindowView.InteractionEventHandler
|
||||
import com.android.systemui.statusbar.LockscreenShadeTransitionController
|
||||
@@ -47,6 +47,7 @@ import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager
|
||||
import com.android.systemui.statusbar.window.StatusBarWindowStateController
|
||||
import com.android.systemui.util.mockito.any
|
||||
import com.google.common.truth.Truth.assertThat
|
||||
import kotlinx.coroutines.flow.emptyFlow
|
||||
import org.junit.Before
|
||||
import org.junit.Test
|
||||
import org.junit.runner.RunWith
|
||||
@@ -81,8 +82,6 @@ class NotificationShadeWindowViewControllerTest : SysuiTestCase() {
|
||||
@Mock
|
||||
private lateinit var keyguardUnlockAnimationController: KeyguardUnlockAnimationController
|
||||
@Mock
|
||||
private lateinit var featureFlags: FeatureFlags
|
||||
@Mock
|
||||
private lateinit var ambientState: AmbientState
|
||||
@Mock
|
||||
private lateinit var keyguardBouncerViewModel: KeyguardBouncerViewModel
|
||||
@@ -124,6 +123,8 @@ class NotificationShadeWindowViewControllerTest : SysuiTestCase() {
|
||||
.thenReturn(keyguardBouncerComponent)
|
||||
whenever(keyguardBouncerComponent.securityContainerController)
|
||||
.thenReturn(keyguardSecurityContainerController)
|
||||
whenever(keyguardTransitionInteractor.lockscreenToDreamingTransition)
|
||||
.thenReturn(emptyFlow<TransitionStep>())
|
||||
underTest = NotificationShadeWindowViewController(
|
||||
lockscreenShadeTransitionController,
|
||||
FalsingCollectorFake(),
|
||||
@@ -143,7 +144,6 @@ class NotificationShadeWindowViewControllerTest : SysuiTestCase() {
|
||||
notificationInsetsController,
|
||||
ambientState,
|
||||
pulsingGestureListener,
|
||||
featureFlags,
|
||||
keyguardBouncerViewModel,
|
||||
keyguardBouncerComponentFactory,
|
||||
alternateBouncerInteractor,
|
||||
|
||||
@@ -25,6 +25,8 @@ import static org.mockito.Mockito.spy;
|
||||
import static org.mockito.Mockito.verify;
|
||||
import static org.mockito.Mockito.when;
|
||||
|
||||
import static kotlinx.coroutines.flow.FlowKt.emptyFlow;
|
||||
|
||||
import android.os.SystemClock;
|
||||
import android.testing.AndroidTestingRunner;
|
||||
import android.testing.TestableLooper;
|
||||
@@ -40,7 +42,6 @@ import com.android.systemui.R;
|
||||
import com.android.systemui.SysuiTestCase;
|
||||
import com.android.systemui.classifier.FalsingCollectorFake;
|
||||
import com.android.systemui.dock.DockManager;
|
||||
import com.android.systemui.flags.FeatureFlags;
|
||||
import com.android.systemui.keyguard.KeyguardUnlockAnimationController;
|
||||
import com.android.systemui.keyguard.domain.interactor.AlternateBouncerInteractor;
|
||||
import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor;
|
||||
@@ -93,7 +94,6 @@ public class NotificationShadeWindowViewTest extends SysuiTestCase {
|
||||
@Mock private KeyguardUnlockAnimationController mKeyguardUnlockAnimationController;
|
||||
@Mock private AmbientState mAmbientState;
|
||||
@Mock private PulsingGestureListener mPulsingGestureListener;
|
||||
@Mock private FeatureFlags mFeatureFlags;
|
||||
@Mock private KeyguardBouncerViewModel mKeyguardBouncerViewModel;
|
||||
@Mock private KeyguardBouncerComponent.Factory mKeyguardBouncerComponentFactory;
|
||||
@Mock private KeyguardBouncerComponent mKeyguardBouncerComponent;
|
||||
@@ -125,6 +125,9 @@ public class NotificationShadeWindowViewTest extends SysuiTestCase {
|
||||
|
||||
when(mDockManager.isDocked()).thenReturn(false);
|
||||
|
||||
when(mKeyguardTransitionInteractor.getLockscreenToDreamingTransition())
|
||||
.thenReturn(emptyFlow());
|
||||
|
||||
mController = new NotificationShadeWindowViewController(
|
||||
mLockscreenShadeTransitionController,
|
||||
new FalsingCollectorFake(),
|
||||
@@ -144,7 +147,6 @@ public class NotificationShadeWindowViewTest extends SysuiTestCase {
|
||||
mNotificationInsetsController,
|
||||
mAmbientState,
|
||||
mPulsingGestureListener,
|
||||
mFeatureFlags,
|
||||
mKeyguardBouncerViewModel,
|
||||
mKeyguardBouncerComponentFactory,
|
||||
mAlternateBouncerInteractor,
|
||||
|
||||
@@ -1355,34 +1355,11 @@ public class ScrimControllerTest extends SysuiTestCase {
|
||||
assertAlphaAfterExpansion(mNotificationsScrim, expectedAlpha, expansion);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void notificationAlpha_unnocclusionAnimating_bouncerActive_usesKeyguardNotifAlpha() {
|
||||
when(mStatusBarKeyguardViewManager.isPrimaryBouncerInTransit()).thenReturn(true);
|
||||
mScrimController.setClipsQsScrim(true);
|
||||
|
||||
mScrimController.transitionTo(ScrimState.KEYGUARD);
|
||||
mScrimController.setUnocclusionAnimationRunning(true);
|
||||
|
||||
assertAlphaAfterExpansion(
|
||||
mNotificationsScrim, ScrimState.KEYGUARD.getNotifAlpha(), /* expansion */ 0f);
|
||||
assertAlphaAfterExpansion(
|
||||
mNotificationsScrim, ScrimState.KEYGUARD.getNotifAlpha(), /* expansion */ 0.4f);
|
||||
assertAlphaAfterExpansion(
|
||||
mNotificationsScrim, ScrimState.KEYGUARD.getNotifAlpha(), /* expansion */ 1.0f);
|
||||
|
||||
// Verify normal behavior after
|
||||
mScrimController.setUnocclusionAnimationRunning(false);
|
||||
float expansion = 0.4f;
|
||||
float alpha = 1 - BouncerPanelExpansionCalculator.aboutToShowBouncerProgress(expansion);
|
||||
assertAlphaAfterExpansion(mNotificationsScrim, alpha, expansion);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void notificationAlpha_unnocclusionAnimating_bouncerNotActive_usesKeyguardNotifAlpha() {
|
||||
when(mStatusBarKeyguardViewManager.isPrimaryBouncerInTransit()).thenReturn(false);
|
||||
|
||||
mScrimController.transitionTo(ScrimState.KEYGUARD);
|
||||
mScrimController.setUnocclusionAnimationRunning(true);
|
||||
|
||||
assertAlphaAfterExpansion(
|
||||
mNotificationsScrim, ScrimState.KEYGUARD.getNotifAlpha(), /* expansion */ 0f);
|
||||
@@ -1392,7 +1369,6 @@ public class ScrimControllerTest extends SysuiTestCase {
|
||||
mNotificationsScrim, ScrimState.KEYGUARD.getNotifAlpha(), /* expansion */ 1.0f);
|
||||
|
||||
// Verify normal behavior after
|
||||
mScrimController.setUnocclusionAnimationRunning(false);
|
||||
float expansion = 0.4f;
|
||||
float alpha = 1 - ShadeInterpolation.getNotificationScrimAlpha(expansion);
|
||||
assertAlphaAfterExpansion(mNotificationsScrim, alpha, expansion);
|
||||
@@ -1598,7 +1574,6 @@ public class ScrimControllerTest extends SysuiTestCase {
|
||||
|
||||
@Test
|
||||
public void setUnOccludingAnimationKeyguard() {
|
||||
mScrimController.setUnocclusionAnimationRunning(true);
|
||||
mScrimController.transitionTo(ScrimState.KEYGUARD);
|
||||
finishAnimationsImmediately();
|
||||
assertThat(mNotificationsScrim.getViewAlpha())
|
||||
|
||||
@@ -367,17 +367,6 @@ public class StatusBarKeyguardViewManagerTest extends SysuiTestCase {
|
||||
verify(mPrimaryBouncerInteractor, never()).setPanelExpansion(anyFloat());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void setOccluded_animatesPanelExpansion_onlyIfBouncerHidden() {
|
||||
mStatusBarKeyguardViewManager.setOccluded(false /* occluded */, true /* animated */);
|
||||
verify(mCentralSurfaces).animateKeyguardUnoccluding();
|
||||
|
||||
when(mPrimaryBouncerInteractor.isFullyShowing()).thenReturn(true);
|
||||
clearInvocations(mCentralSurfaces);
|
||||
mStatusBarKeyguardViewManager.setOccluded(false /* occluded */, true /* animated */);
|
||||
verify(mCentralSurfaces, never()).animateKeyguardUnoccluding();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void setOccluded_onKeyguardOccludedChangedCalled() {
|
||||
clearInvocations(mKeyguardStateController);
|
||||
|
||||
Reference in New Issue
Block a user