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