diff options
20 files changed, 992 insertions, 957 deletions
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardStatusViewController.java b/packages/SystemUI/src/com/android/keyguard/KeyguardStatusViewController.java index b53b868025e8..f4c581552bc4 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardStatusViewController.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardStatusViewController.java @@ -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 diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardVisibilityHelper.java b/packages/SystemUI/src/com/android/keyguard/KeyguardVisibilityHelper.java index 7e48193bfc62..a678edc0eb06 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardVisibilityHelper.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardVisibilityHelper.java @@ -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"); diff --git a/packages/SystemUI/src/com/android/systemui/flags/Flags.kt b/packages/SystemUI/src/com/android/systemui/flags/Flags.kt index ab78b1bcfca6..2a1bca70cb5f 100644 --- a/packages/SystemUI/src/com/android/systemui/flags/Flags.kt +++ b/packages/SystemUI/src/com/android/systemui/flags/Flags.kt @@ -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 = diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java index 02bee3efbe2f..2ad1ab722d55 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java +++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java @@ -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() { diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/dagger/KeyguardModule.java b/packages/SystemUI/src/com/android/systemui/keyguard/dagger/KeyguardModule.java index 98d3570106ce..47ef0fac17ab 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/dagger/KeyguardModule.java +++ b/packages/SystemUI/src/com/android/systemui/keyguard/dagger/KeyguardModule.java @@ -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, diff --git a/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java b/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java index b502b4d02e00..95206e549ba5 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java +++ b/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java @@ -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); - - // 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); - - // 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); - } + // 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); + + // 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); + + // 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()); diff --git a/packages/SystemUI/src/com/android/systemui/shade/NotificationShadeWindowViewController.java b/packages/SystemUI/src/com/android/systemui/shade/NotificationShadeWindowViewController.java index 60fa865b83bc..87350b465895 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/NotificationShadeWindowViewController.java +++ b/packages/SystemUI/src/com/android/systemui/shade/NotificationShadeWindowViewController.java @@ -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); } /** diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfaces.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfaces.java index 8dcfec71b68e..9e62817fcc67 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfaces.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfaces.java @@ -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); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java index 93b580c5bd7a..ae97407aa767 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java @@ -2998,16 +2998,6 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces { } /** - * 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 * because the launched app crashed or something else went wrong. diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java index 80093a3da325..8e0ec284c840 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java @@ -138,26 +138,12 @@ 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. */ @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; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java index a127139fcc69..66f5b6508494 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java @@ -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 diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardStatusViewControllerTest.java b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardStatusViewControllerTest.java index dfad15d68375..71449145d668 100644 --- a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardStatusViewControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardStatusViewControllerTest.java @@ -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); } diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardViewMediatorTest.java b/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardViewMediatorTest.java index 7c20e3c9baff..c93e677071cd 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardViewMediatorTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardViewMediatorTest.java @@ -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, diff --git a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerBaseTest.java b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerBaseTest.java new file mode 100644 index 000000000000..52b0b6abda1d --- /dev/null +++ b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerBaseTest.java @@ -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; + } +} diff --git a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerTest.java index 8f6653f1d601..abcde3dca4e9 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerTest.java @@ -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() { @@ -992,68 +434,6 @@ public class NotificationPanelViewControllerTest extends SysuiTestCase { } @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); @@ -1129,26 +509,6 @@ public class NotificationPanelViewControllerTest extends SysuiTestCase { } @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); when(mQsController.getExpanded()).thenReturn(true); @@ -1423,19 +783,6 @@ public class NotificationPanelViewControllerTest extends SysuiTestCase { } @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); mNotificationPanelViewController.expandWithQs(); @@ -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 - ); - } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerWithCoroutinesTest.kt b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerWithCoroutinesTest.kt new file mode 100644 index 000000000000..0c046e93ee20 --- /dev/null +++ b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerWithCoroutinesTest.kt @@ -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() + } +} diff --git a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationShadeWindowViewControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationShadeWindowViewControllerTest.kt index d229a08ad7c4..0a401b09b6cf 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationShadeWindowViewControllerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationShadeWindowViewControllerTest.kt @@ -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, diff --git a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationShadeWindowViewTest.java b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationShadeWindowViewTest.java index 5e9c2199897d..5d719790386a 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationShadeWindowViewTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationShadeWindowViewTest.java @@ -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, diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java index c0537a6dc4cf..dc5a0472f49e 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java @@ -1356,33 +1356,10 @@ public class ScrimControllerTest extends SysuiTestCase { } @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()) diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManagerTest.java index 1aad83eb73ae..158e9adcff43 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManagerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManagerTest.java @@ -368,17 +368,6 @@ public class StatusBarKeyguardViewManagerTest extends SysuiTestCase { } @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); clearInvocations(mKeyguardUpdateMonitor); |