Continued the bypass experience

The lock icon now hides as soon as the notifications are showing
to avoid the overlap introduced in the previous CL.
We're also introducing a new listener that one can listen to
for when the notifications are fully hidden.
That same listener is now used to hide and show the aod icons

Bug: 130327302
Change-Id: I5694a38e542b82bf2738d66bdff28d122a9f89e7
This commit is contained in:
Selim Cinek
2019-06-18 18:59:09 -07:00
parent b0fada6ca0
commit 820ba2d94d
11 changed files with 175 additions and 37 deletions

View File

@@ -75,6 +75,7 @@ android_library {
"--extra-packages",
"com.android.keyguard",
],
kotlincflags: ["-Xjvm-default=enable"],
plugins: ["dagger2-compiler-2.19"],
}
@@ -128,6 +129,7 @@ android_library {
"telephony-common",
"android.test.base",
],
kotlincflags: ["-Xjvm-default=enable"],
aaptflags: [
"--extra-packages",
"com.android.keyguard:com.android.systemui",
@@ -155,6 +157,8 @@ android_app {
"telephony-common",
],
kotlincflags: ["-Xjvm-default=enable"],
dxflags: ["--multi-dex"],
aaptflags: [
"--extra-packages",
@@ -191,6 +195,8 @@ android_app {
"telephony-common",
],
kotlincflags: ["-Xjvm-default=enable"],
srcs: [
"legacy/recents/src/**/*.java",
"legacy/recents/src/**/I*.aidl",

View File

@@ -48,9 +48,11 @@ import com.android.systemui.statusbar.NotificationMediaManager;
import com.android.systemui.statusbar.ScrimView;
import com.android.systemui.statusbar.notification.NotificationEntryManager;
import com.android.systemui.statusbar.notification.NotificationInterruptionStateProvider;
import com.android.systemui.statusbar.notification.NotificationWakeUpCoordinator;
import com.android.systemui.statusbar.notification.collection.NotificationData;
import com.android.systemui.statusbar.phone.DozeParameters;
import com.android.systemui.statusbar.phone.KeyguardBouncer;
import com.android.systemui.statusbar.phone.KeyguardBypassController;
import com.android.systemui.statusbar.phone.KeyguardEnvironmentImpl;
import com.android.systemui.statusbar.phone.LockIcon;
import com.android.systemui.statusbar.phone.LockscreenWallpaper;
@@ -145,10 +147,14 @@ public class SystemUIFactory {
}
public NotificationIconAreaController createNotificationIconAreaController(Context context,
StatusBar statusBar, StatusBarStateController statusBarStateController,
StatusBar statusBar,
NotificationWakeUpCoordinator wakeUpCoordinator,
KeyguardBypassController keyguardBypassController,
StatusBarStateController statusBarStateController,
NotificationListener listener) {
return new NotificationIconAreaController(context, statusBar, statusBarStateController,
listener, Dependency.get(NotificationMediaManager.class));
wakeUpCoordinator, keyguardBypassController, listener,
Dependency.get(NotificationMediaManager.class));
}
public KeyguardIndicationController createKeyguardIndicationController(Context context,

View File

@@ -93,6 +93,7 @@ constructor(context: Context,
get() = mFalsingManager.isFalseTouch
var qsExpanded: Boolean = false
var pulseExpandAbortListener: Runnable? = null
var bouncerShowing: Boolean = false
init {
mMinDragDistance = context.resources.getDimensionPixelSize(
@@ -107,7 +108,8 @@ constructor(context: Context,
}
private fun maybeStartExpansion(event: MotionEvent): Boolean {
if (!wakeUpCoordinator.canShowPulsingHuns || qsExpanded) {
if (!wakeUpCoordinator.canShowPulsingHuns || qsExpanded
|| bouncerShowing) {
return false
}
if (velocityTracker == null) {

View File

@@ -66,7 +66,9 @@ class NotificationWakeUpCoordinator @Inject constructor(
private var mLinearVisibilityAmount = 0.0f
private var mWakingUp = false
private val mEntrySetToClearWhenFinished = mutableSetOf<NotificationEntry>()
private val mDozeParameters: DozeParameters;
private val mDozeParameters: DozeParameters
private var pulseExpanding: Boolean = false
private val wakeUpListeners = arrayListOf<WakeUpListener>()
var fullyAwake: Boolean = false
var willWakeUp = false
@@ -89,6 +91,16 @@ class NotificationWakeUpCoordinator @Inject constructor(
}
}
var notificationsFullyHidden: Boolean = false
private set(value) {
if (field != value) {
field = value
for (listener in wakeUpListeners) {
listener.onFullyHiddenChanged(value)
}
}
}
/**
* True if we can show pulsing heads up notifications
*/
@@ -104,7 +116,6 @@ class NotificationWakeUpCoordinator @Inject constructor(
return canShow
}
init {
mHeadsUpManagerPhone.addListener(this)
mStatusBarStateController.addCallback(this)
@@ -113,8 +124,19 @@ class NotificationWakeUpCoordinator @Inject constructor(
fun setStackScroller(stackScroller: NotificationStackScrollLayout) {
mStackScroller = stackScroller
pulseExpanding = stackScroller.isPulseExpanding
stackScroller.setOnPulseHeightChangedListener {
val nowExpanding = isPulseExpanding()
val changed = nowExpanding != pulseExpanding
pulseExpanding = nowExpanding
for (listener in wakeUpListeners) {
listener.onPulseExpansionChanged(changed)
}
}
}
fun isPulseExpanding(): Boolean = mStackScroller.isPulseExpanding
/**
* @param visible should notifications be visible
* @param animate should this change be animated
@@ -132,6 +154,14 @@ class NotificationWakeUpCoordinator @Inject constructor(
}
}
fun addListener(listener: WakeUpListener) {
wakeUpListeners.add(listener);
}
fun removeFullyHiddenChangedListener(listener: WakeUpListener) {
wakeUpListeners.remove(listener);
}
private fun updateNotificationVisibility(animate: Boolean, increaseSpeed: Boolean) {
// TODO: handle Lockscreen wakeup for bypass when we're not pulsing anymore
var visible = mNotificationsVisibleForExpansion || mHeadsUpManagerPhone.hasNotifications()
@@ -244,7 +274,7 @@ class NotificationWakeUpCoordinator @Inject constructor(
val linearAmount = Math.min(1.0f - mLinearVisibilityAmount, mLinearDozeAmount)
val amount = Math.min(1.0f - mVisibilityAmount, mDozeAmount)
mStackScroller.setHideAmount(linearAmount, amount)
iconAreaController.setFullyHidden(linearAmount == 1.0f);
notificationsFullyHidden = linearAmount == 1.0f;
}
private fun notifyAnimationStart(awake: Boolean) {
@@ -300,4 +330,17 @@ class NotificationWakeUpCoordinator @Inject constructor(
private fun shouldAnimateVisibility() =
mDozeParameters.getAlwaysOn() && !mDozeParameters.getDisplayNeedsBlanking()
interface WakeUpListener {
/**
* Called whenever the notifications are fully hidden or shown
*/
@JvmDefault fun onFullyHiddenChanged(isFullyHidden: Boolean) {}
/**
* Called whenever the pulseExpansion changes
* @param expandingChanged if the user has started or stopped expanding
*/
@JvmDefault fun onPulseExpansionChanged(expandingChanged: Boolean) {}
}
}

View File

@@ -3278,7 +3278,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd
@Override
@ShadeViewRefactor(RefactorComponent.STATE_RESOLVER)
public void generateAddAnimation(ExpandableView child, boolean fromMoreCard) {
if (mIsExpanded && mAnimationsEnabled && !mChangePositionInProgress) {
if (mIsExpanded && mAnimationsEnabled && !mChangePositionInProgress && !isFullyHidden()) {
// Generate Animations
mChildrenToAddAnimated.add(child);
if (fromMoreCard) {
@@ -3286,7 +3286,8 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd
}
mNeedsAnimation = true;
}
if (isHeadsUp(child) && mAnimationsEnabled && !mChangePositionInProgress) {
if (isHeadsUp(child) && mAnimationsEnabled && !mChangePositionInProgress
&& !isFullyHidden()) {
mAddedHeadsUpChildren.add(child);
mChildrenToAddAnimated.remove(child);
}

View File

@@ -47,6 +47,8 @@ import com.android.systemui.R;
import com.android.systemui.dock.DockManager;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.statusbar.KeyguardAffordanceView;
import com.android.systemui.statusbar.StatusBarState;
import com.android.systemui.statusbar.notification.NotificationWakeUpCoordinator;
import com.android.systemui.statusbar.phone.ScrimController.ScrimVisibility;
import com.android.systemui.statusbar.policy.AccessibilityController;
import com.android.systemui.statusbar.policy.ConfigurationController;
@@ -64,7 +66,8 @@ import javax.inject.Named;
*/
public class LockIcon extends KeyguardAffordanceView implements OnUserInfoChangedListener,
StatusBarStateController.StateListener, ConfigurationController.ConfigurationListener,
UnlockMethodCache.OnUnlockMethodChangedListener {
UnlockMethodCache.OnUnlockMethodChangedListener,
NotificationWakeUpCoordinator.WakeUpListener {
private static final int STATE_LOCKED = 0;
private static final int STATE_LOCK_OPEN = 1;
@@ -78,6 +81,8 @@ public class LockIcon extends KeyguardAffordanceView implements OnUserInfoChange
private final DockManager mDockManager;
private final Handler mMainHandler;
private final KeyguardMonitor mKeyguardMonitor;
private final KeyguardBypassController mBypassController;
private final NotificationWakeUpCoordinator mWakeUpCoordinator;
private int mLastState = 0;
private boolean mTransientBiometricsError;
@@ -92,6 +97,7 @@ public class LockIcon extends KeyguardAffordanceView implements OnUserInfoChange
private int mIconColor;
private float mDozeAmount;
private int mIconRes;
private boolean mBouncerShowing;
private boolean mWasPulsingOnThisFrame;
private boolean mWakeAndUnlockRunning;
private boolean mKeyguardShowing;
@@ -150,6 +156,8 @@ public class LockIcon extends KeyguardAffordanceView implements OnUserInfoChange
StatusBarStateController statusBarStateController,
ConfigurationController configurationController,
AccessibilityController accessibilityController,
KeyguardBypassController bypassController,
NotificationWakeUpCoordinator wakeUpCoordinator,
KeyguardMonitor keyguardMonitor,
@Nullable DockManager dockManager,
@Named(MAIN_HANDLER_NAME) Handler mainHandler) {
@@ -160,6 +168,8 @@ public class LockIcon extends KeyguardAffordanceView implements OnUserInfoChange
mAccessibilityController = accessibilityController;
mConfigurationController = configurationController;
mStatusBarStateController = statusBarStateController;
mBypassController = bypassController;
mWakeUpCoordinator = wakeUpCoordinator;
mKeyguardMonitor = keyguardMonitor;
mDockManager = dockManager;
mMainHandler = mainHandler;
@@ -173,6 +183,7 @@ public class LockIcon extends KeyguardAffordanceView implements OnUserInfoChange
mKeyguardMonitor.addCallback(mKeyguardMonitorCallback);
mKeyguardUpdateMonitor.registerCallback(mUpdateMonitorCallback);
mUnlockMethodCache.addListener(this);
mWakeUpCoordinator.addListener(this);
mSimLocked = mKeyguardUpdateMonitor.isSimPinSecure();
if (mDockManager != null) {
mDockManager.addListener(mDockEventListener);
@@ -187,6 +198,7 @@ public class LockIcon extends KeyguardAffordanceView implements OnUserInfoChange
mConfigurationController.removeCallback(this);
mKeyguardUpdateMonitor.removeCallback(mUpdateMonitorCallback);
mKeyguardMonitor.removeCallback(mKeyguardMonitorCallback);
mWakeUpCoordinator.removeFullyHiddenChangedListener(this);
mUnlockMethodCache.removeListener(this);
if (mDockManager != null) {
mDockManager.removeListener(mDockEventListener);
@@ -279,6 +291,12 @@ public class LockIcon extends KeyguardAffordanceView implements OnUserInfoChange
boolean onAodNotPulsingOrDocked = mDozing && (!mPulsing || mDocked);
boolean invisible = onAodNotPulsingOrDocked || mWakeAndUnlockRunning
|| mShowingLaunchAffordance;
if (mBypassController.getBypassEnabled()
&& mStatusBarStateController.getState() == StatusBarState.KEYGUARD
&& !mWakeUpCoordinator.getNotificationsFullyHidden()
&& !mBouncerShowing) {
invisible = true;
}
setVisibility(invisible ? INVISIBLE : VISIBLE);
updateClickability();
}
@@ -369,6 +387,20 @@ public class LockIcon extends KeyguardAffordanceView implements OnUserInfoChange
return -1;
}
@Override
public void onFullyHiddenChanged(boolean isFullyHidden) {
if (mBypassController.getBypassEnabled()) {
update();
}
}
public void setBouncerShowing(boolean bouncerShowing) {
mBouncerShowing = bouncerShowing;
if (mBypassController.getBypassEnabled()) {
update();
}
}
@Retention(RetentionPolicy.SOURCE)
@IntDef({ERROR, UNLOCK, LOCK, SCANNING, LOCK_IN})
@interface LockAnimIndex {}

View File

@@ -29,6 +29,7 @@ import com.android.systemui.statusbar.StatusBarIconView;
import com.android.systemui.statusbar.StatusBarState;
import com.android.systemui.statusbar.notification.NotificationEntryManager;
import com.android.systemui.statusbar.notification.NotificationUtils;
import com.android.systemui.statusbar.notification.NotificationWakeUpCoordinator;
import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow;
@@ -41,7 +42,8 @@ import java.util.function.Function;
* normally reserved for notifications.
*/
public class NotificationIconAreaController implements DarkReceiver,
StatusBarStateController.StateListener {
StatusBarStateController.StateListener,
NotificationWakeUpCoordinator.WakeUpListener {
public static final String HIGH_PRIORITY = "high_priority";
private static final long AOD_ICONS_APPEAR_DURATION = 200;
@@ -51,6 +53,8 @@ public class NotificationIconAreaController implements DarkReceiver,
private final Runnable mUpdateStatusBarIcons = this::updateStatusBarIcons;
private final StatusBarStateController mStatusBarStateController;
private final NotificationMediaManager mMediaManager;
private final NotificationWakeUpCoordinator mWakeUpCoordinator;
private final KeyguardBypassController mBypassController;
private final DozeParameters mDozeParameters;
@VisibleForTesting
final NotificationListener.NotificationSettingsListener mSettingsListener =
@@ -91,6 +95,8 @@ public class NotificationIconAreaController implements DarkReceiver,
public NotificationIconAreaController(Context context, StatusBar statusBar,
StatusBarStateController statusBarStateController,
NotificationWakeUpCoordinator wakeUpCoordinator,
KeyguardBypassController keyguardBypassController,
NotificationListener notificationListener,
NotificationMediaManager notificationMediaManager) {
mStatusBar = statusBar;
@@ -102,6 +108,9 @@ public class NotificationIconAreaController implements DarkReceiver,
mMediaManager = notificationMediaManager;
notificationListener.addNotificationSettingsListener(mSettingsListener);
mDozeParameters = DozeParameters.getInstance(mContext);
mWakeUpCoordinator = wakeUpCoordinator;
wakeUpCoordinator.addListener(this);
mBypassController = keyguardBypassController;
initializeNotificationAreaViews(context);
reloadAodColor();
@@ -238,7 +247,8 @@ public class NotificationIconAreaController implements DarkReceiver,
protected boolean shouldShowNotificationIcon(NotificationEntry entry,
boolean showAmbient, boolean showLowPriority, boolean hideDismissed,
boolean hideRepliedMessages, boolean hideCurrentMedia, boolean hideCenteredIcon) {
boolean hideRepliedMessages, boolean hideCurrentMedia, boolean hideCenteredIcon,
boolean hidePulsing) {
final boolean isCenteredNotificationIcon = entry.centeredIcon != null
&& Objects.equals(entry.centeredIcon, mCenteredIconView);
@@ -270,6 +280,9 @@ public class NotificationIconAreaController implements DarkReceiver,
if (!showAmbient && entry.shouldSuppressStatusBar()) {
return false;
}
if (hidePulsing && entry.showingPulsing()) {
return false;
}
return true;
}
@@ -292,7 +305,8 @@ public class NotificationIconAreaController implements DarkReceiver,
false /* hideDismissed */,
false /* hideRepliedMessages */,
false /* hideCurrentMedia */,
true /* hide centered icon */);
true /* hide centered icon */,
false /* hidePulsing */);
}
public void updateStatusBarIcons() {
@@ -302,7 +316,8 @@ public class NotificationIconAreaController implements DarkReceiver,
true /* hideDismissed */,
true /* hideRepliedMessages */,
false /* hideCurrentMedia */,
true /* hide centered icon */);
true /* hide centered icon */,
false /* hidePulsing */);
}
private void updateCenterIcon() {
@@ -312,7 +327,8 @@ public class NotificationIconAreaController implements DarkReceiver,
false /* hideDismissed */,
false /* hideRepliedMessages */,
false /* hideCurrentMedia */,
false /* hide centered icon */);
false /* hide centered icon */,
false /* hidePulsing */);
}
public void updateAodIcons() {
@@ -322,7 +338,8 @@ public class NotificationIconAreaController implements DarkReceiver,
true /* hideDismissed */,
true /* hideRepliedMessages */,
true /* hideCurrentMedia */,
true /* hide centered icon */);
true /* hide centered icon */,
mBypassController.getBypassEnabled() /* hidePulsing */);
}
@VisibleForTesting
@@ -338,11 +355,12 @@ public class NotificationIconAreaController implements DarkReceiver,
* @param showAmbient should ambient notification icons be shown
* @param hideDismissed should dismissed icons be hidden
* @param hideRepliedMessages should messages that have been replied to be hidden
* @param hidePulsing should pulsing notifications be hidden
*/
private void updateIconsForLayout(Function<NotificationEntry, StatusBarIconView> function,
NotificationIconContainer hostLayout, boolean showAmbient, boolean showLowPriority,
boolean hideDismissed, boolean hideRepliedMessages, boolean hideCurrentMedia,
boolean hideCenteredIcon) {
boolean hideCenteredIcon, boolean hidePulsing) {
ArrayList<StatusBarIconView> toShow = new ArrayList<>(
mNotificationScrollLayout.getChildCount());
@@ -352,7 +370,7 @@ public class NotificationIconAreaController implements DarkReceiver,
if (view instanceof ExpandableNotificationRow) {
NotificationEntry ent = ((ExpandableNotificationRow) view).getEntry();
if (shouldShowNotificationIcon(ent, showAmbient, showLowPriority, hideDismissed,
hideRepliedMessages, hideCurrentMedia, hideCenteredIcon)) {
hideRepliedMessages, hideCurrentMedia, hideCenteredIcon, hidePulsing)) {
StatusBarIconView iconView = function.apply(ent);
if (iconView != null) {
toShow.add(iconView);
@@ -514,6 +532,7 @@ public class NotificationIconAreaController implements DarkReceiver,
@Override
public void onStateChanged(int newState) {
updateAodIconsVisibility();
updateAnimations();
}
@@ -562,17 +581,31 @@ public class NotificationIconAreaController implements DarkReceiver,
}
}
public void setFullyHidden(boolean fullyHidden) {
if (mFullyHidden != fullyHidden) {
mFullyHidden = fullyHidden;
if (fullyHidden) {
appearAodIcons();
}
@Override
public void onFullyHiddenChanged(boolean fullyHidden) {
if (fullyHidden && !mBypassController.getBypassEnabled()) {
appearAodIcons();
}
updateAodIconsVisibility();
updateAodIcons();
}
@Override
public void onPulseExpansionChanged(boolean expandingChanged) {
if (expandingChanged) {
updateAodIconsVisibility();
}
}
private void updateAodIconsVisibility() {
mAodIcons.setVisibility(mFullyHidden ? View.VISIBLE : View.INVISIBLE);
boolean visible = mBypassController.getBypassEnabled()
|| mWakeUpCoordinator.getNotificationsFullyHidden();
if (mStatusBarStateController.getState() != StatusBarState.KEYGUARD) {
visible = false;
}
if (visible && mWakeUpCoordinator.isPulseExpanding()) {
visible = false;
}
mAodIcons.setVisibility(visible ? View.VISIBLE : View.INVISIBLE);
}
}

View File

@@ -113,7 +113,8 @@ public class NotificationPanelView extends PanelView implements
KeyguardAffordanceHelper.Callback, NotificationStackScrollLayout.OnEmptySpaceClickListener,
OnHeadsUpChangedListener, QS.HeightListener, ZenModeController.Callback,
ConfigurationController.ConfigurationListener, StateListener,
PulseExpansionHandler.ExpansionCallback, DynamicPrivacyController.Listener {
PulseExpansionHandler.ExpansionCallback, DynamicPrivacyController.Listener,
NotificationWakeUpCoordinator.WakeUpListener {
private static final boolean DEBUG = false;
@@ -429,16 +430,16 @@ public class NotificationPanelView extends PanelView implements
mWakeUpCoordinator.setStackScroller(mNotificationStackScroller);
mQsFrame = findViewById(R.id.qs_frame);
mPulseExpansionHandler.setUp(mNotificationStackScroller, this, mShadeController);
mNotificationStackScroller.setOnPulseHeightChangedListener(
() -> {
if (mKeyguardBypassController.getBypassEnabled()) {
// Position the notifications while dragging down while pulsing
requestScrollerTopPaddingUpdate(false /* animate */);
updateQSPulseExpansion();
}
});
mWakeUpCoordinator.addListener(new NotificationWakeUpCoordinator.WakeUpListener() {
@Override
public void onPulseExpansionChanged(boolean expandingChanged) {
if (mKeyguardBypassController.getBypassEnabled()) {
// Position the notifications while dragging down while pulsing
requestScrollerTopPaddingUpdate(false /* animate */);
updateQSPulseExpansion();
}
}
});
}
@Override

View File

@@ -799,6 +799,7 @@ public class StatusBar extends SystemUI implements DemoMode,
mNotificationIconAreaController = SystemUIFactory.getInstance()
.createNotificationIconAreaController(context, this,
mWakeUpCoordinator, mKeyguardBypassController,
mStatusBarStateController, mNotificationListener);
mWakeUpCoordinator.setIconAreaController(mNotificationIconAreaController);
inflateShelf();
@@ -3572,6 +3573,8 @@ public class StatusBar extends SystemUI implements DemoMode,
public void setBouncerShowing(boolean bouncerShowing) {
mBouncerShowing = bouncerShowing;
mKeyguardBypassController.setBouncerShowing(bouncerShowing);
mPulseExpansionHandler.setBouncerShowing(bouncerShowing);
mStatusBarWindow.setBouncerShowing(bouncerShowing);
if (mStatusBarView != null) mStatusBarView.setBouncerShowing(bouncerShowing);
updateHideIconsForBouncer(true /* animate */);
mCommandQueue.recomputeDisableFlags(mDisplayId, true /* animate */);

View File

@@ -525,6 +525,12 @@ public class StatusBarWindowView extends FrameLayout {
mBypassController = bypassController;
}
public void setBouncerShowing(boolean bouncerShowing) {
if (mLockIcon != null) {
mLockIcon.setBouncerShowing(bouncerShowing);
}
}
public class LayoutParams extends FrameLayout.LayoutParams {
public boolean ignoreRightInset;

View File

@@ -33,12 +33,12 @@ import com.android.systemui.SysuiTestCase;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.statusbar.NotificationListener;
import com.android.systemui.statusbar.NotificationMediaManager;
import com.android.systemui.statusbar.notification.NotificationWakeUpCoordinator;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
@SmallTest
@@ -57,6 +57,10 @@ public class NotificationIconAreaControllerTest extends SysuiTestCase {
@Mock
StatusBarStateController mStatusBarStateController;
@Mock
NotificationWakeUpCoordinator mNotificationWakeUpCoordinator;
@Mock
KeyguardBypassController mBypassController;
@Mock
private NotificationMediaManager mMediaManager;
private NotificationIconAreaController mController;
@@ -67,7 +71,8 @@ public class NotificationIconAreaControllerTest extends SysuiTestCase {
when(mStatusBarWindowView.findViewById(R.id.clock_notification_icon_container)).thenReturn(
mIconContainer);
mController = new NotificationIconAreaController(mContext, mStatusBar,
mStatusBarStateController, mListener, mMediaManager);
mStatusBarStateController, mNotificationWakeUpCoordinator, mBypassController,
mListener, mMediaManager);
}
@Test