New Pipeline: various migrations

Test: manual
Fixes: 218105121
Fixes: 218095046
Fixes: 218095049
Bug: 218105118
Bug: 218105357
Bug: 218099854
Change-Id: I79023e91d4346579491fb8c8eb228998cb166927
This commit is contained in:
Jeff DeCew
2022-02-06 13:36:23 +00:00
parent d0e75eb2c4
commit a75676fdfb
23 changed files with 149 additions and 114 deletions

View File

@@ -23,7 +23,8 @@ import com.android.systemui.plugins.ActivityStarter
import com.android.systemui.plugins.FalsingManager
import com.android.systemui.qs.PageIndicator
import com.android.systemui.shared.system.SysUiStatsLog
import com.android.systemui.statusbar.notification.collection.legacy.VisualStabilityManager
import com.android.systemui.statusbar.notification.collection.provider.OnReorderingAllowedListener
import com.android.systemui.statusbar.notification.collection.provider.VisualStabilityProvider
import com.android.systemui.statusbar.policy.ConfigurationController
import com.android.systemui.util.Utils
import com.android.systemui.util.animation.UniqueObjectHostView
@@ -48,7 +49,7 @@ private val DEBUG = Log.isLoggable(TAG, Log.DEBUG)
class MediaCarouselController @Inject constructor(
private val context: Context,
private val mediaControlPanelFactory: Provider<MediaControlPanel>,
private val visualStabilityManager: VisualStabilityManager,
private val visualStabilityProvider: VisualStabilityProvider,
private val mediaHostStatesManager: MediaHostStatesManager,
private val activityStarter: ActivityStarter,
private val systemClock: SystemClock,
@@ -121,7 +122,7 @@ class MediaCarouselController @Inject constructor(
private lateinit var settingsButton: View
private val mediaContent: ViewGroup
private val pageIndicator: PageIndicator
private val visualStabilityCallback: VisualStabilityManager.Callback
private val visualStabilityCallback: OnReorderingAllowedListener
private var needsReordering: Boolean = false
private var keysNeedRemoval = mutableSetOf<String>()
private var bgColor = getBackgroundColor()
@@ -172,6 +173,9 @@ class MediaCarouselController @Inject constructor(
*/
lateinit var updateUserVisibility: () -> Unit
private val isReorderingAllowed: Boolean
get() = visualStabilityProvider.isReorderingAllowed
init {
dumpManager.registerDumpable(TAG, this)
mediaFrame = inflateMediaCarousel()
@@ -184,8 +188,7 @@ class MediaCarouselController @Inject constructor(
inflateSettingsButton()
mediaContent = mediaCarousel.requireViewById(R.id.media_carousel)
configurationController.addCallback(configListener)
// TODO (b/162832756): remove visual stability manager when migrating to new pipeline
visualStabilityCallback = VisualStabilityManager.Callback {
visualStabilityCallback = OnReorderingAllowedListener {
if (needsReordering) {
needsReordering = false
reorderAllPlayers(previousVisiblePlayerKey = null)
@@ -203,8 +206,7 @@ class MediaCarouselController @Inject constructor(
// Let's reset our scroll position
mediaCarouselScrollHandler.scrollToStart()
}
visualStabilityManager.addReorderingAllowedCallback(visualStabilityCallback,
true /* persistent */)
visualStabilityProvider.addPersistentReorderingAllowedListener(visualStabilityCallback)
mediaManager.addListener(object : MediaDataManager.Listener {
override fun onMediaDataLoaded(
key: String,
@@ -266,7 +268,7 @@ class MediaCarouselController @Inject constructor(
// This view isn't playing, let's remove this! This happens e.g when
// dismissing/timing out a view. We still have the data around because
// resumption could be on, but we should save the resources and release this.
if (visualStabilityManager.isReorderingAllowed) {
if (isReorderingAllowed) {
onMediaDataRemoved(key)
} else {
keysNeedRemoval.add(key)
@@ -336,7 +338,7 @@ class MediaCarouselController @Inject constructor(
override fun onSmartspaceMediaDataRemoved(key: String, immediately: Boolean) {
if (DEBUG) Log.d(TAG, "My Smartspace media removal request is received")
if (immediately || visualStabilityManager.isReorderingAllowed) {
if (immediately || isReorderingAllowed) {
onMediaDataRemoved(key)
} else {
keysNeedRemoval.add(key)
@@ -438,7 +440,7 @@ class MediaCarouselController @Inject constructor(
} else {
existingPlayer.bindPlayer(data, key)
MediaPlayerData.addMediaPlayer(key, data, existingPlayer, systemClock)
if (visualStabilityManager.isReorderingAllowed || shouldScrollToActivePlayer) {
if (isReorderingAllowed || shouldScrollToActivePlayer) {
reorderAllPlayers(curVisibleMediaKey)
} else {
needsReordering = true

View File

@@ -58,8 +58,8 @@ import com.android.settingslib.utils.ThreadUtils;
import com.android.systemui.R;
import com.android.systemui.animation.DialogLaunchAnimator;
import com.android.systemui.plugins.ActivityStarter;
import com.android.systemui.statusbar.notification.NotificationEntryManager;
import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.notification.collection.notifcollection.CommonNotifCollection;
import com.android.systemui.statusbar.phone.ShadeController;
import com.android.systemui.statusbar.phone.SystemUIDialogManager;
@@ -90,7 +90,7 @@ public class MediaOutputController implements LocalMediaManager.DeviceCallback {
private final List<MediaDevice> mGroupMediaDevices = new CopyOnWriteArrayList<>();
private final boolean mAboveStatusbar;
private final boolean mVolumeAdjustmentForRemoteGroupSessions;
private final NotificationEntryManager mNotificationEntryManager;
private final CommonNotifCollection mNotifCollection;
@VisibleForTesting
final List<MediaDevice> mMediaDevices = new CopyOnWriteArrayList<>();
@@ -107,7 +107,7 @@ public class MediaOutputController implements LocalMediaManager.DeviceCallback {
public MediaOutputController(@NonNull Context context, String packageName,
boolean aboveStatusbar, MediaSessionManager mediaSessionManager, LocalBluetoothManager
lbm, ShadeController shadeController, ActivityStarter starter,
NotificationEntryManager notificationEntryManager, UiEventLogger uiEventLogger,
CommonNotifCollection notifCollection, UiEventLogger uiEventLogger,
DialogLaunchAnimator dialogLaunchAnimator, SystemUIDialogManager dialogManager) {
mContext = context;
mPackageName = packageName;
@@ -116,7 +116,7 @@ public class MediaOutputController implements LocalMediaManager.DeviceCallback {
mShadeController = shadeController;
mActivityStarter = starter;
mAboveStatusbar = aboveStatusbar;
mNotificationEntryManager = notificationEntryManager;
mNotifCollection = notifCollection;
InfoMediaManager imm = new InfoMediaManager(mContext, packageName, null, lbm);
mLocalMediaManager = new LocalMediaManager(mContext, lbm, imm, packageName);
mMetricLogger = new MediaOutputMetricLogger(mContext, mPackageName);
@@ -287,8 +287,7 @@ public class MediaOutputController implements LocalMediaManager.DeviceCallback {
if (TextUtils.isEmpty(mPackageName)) {
return null;
}
for (NotificationEntry entry
: mNotificationEntryManager.getActiveNotificationsForCurrentUser()) {
for (NotificationEntry entry : mNotifCollection.getAllNotifs()) {
final Notification notification = entry.getSbn().getNotification();
if (notification.isMediaNotification()
&& TextUtils.equals(entry.getSbn().getPackageName(), mPackageName)) {
@@ -523,7 +522,7 @@ public class MediaOutputController implements LocalMediaManager.DeviceCallback {
// We show the output group dialog from the output dialog.
MediaOutputController controller = new MediaOutputController(mContext, mPackageName,
mAboveStatusbar, mMediaSessionManager, mLocalBluetoothManager, mShadeController,
mActivityStarter, mNotificationEntryManager, mUiEventLogger, mDialogLaunchAnimator,
mActivityStarter, mNotifCollection, mUiEventLogger, mDialogLaunchAnimator,
mDialogManager);
MediaOutputGroupDialog dialog = new MediaOutputGroupDialog(mContext, mAboveStatusbar,
controller, mDialogManager);

View File

@@ -23,7 +23,7 @@ import com.android.internal.logging.UiEventLogger
import com.android.settingslib.bluetooth.LocalBluetoothManager
import com.android.systemui.animation.DialogLaunchAnimator
import com.android.systemui.plugins.ActivityStarter
import com.android.systemui.statusbar.notification.NotificationEntryManager
import com.android.systemui.statusbar.notification.collection.notifcollection.CommonNotifCollection
import com.android.systemui.statusbar.phone.ShadeController
import com.android.systemui.statusbar.phone.SystemUIDialogManager
import javax.inject.Inject
@@ -37,7 +37,7 @@ class MediaOutputDialogFactory @Inject constructor(
private val lbm: LocalBluetoothManager?,
private val shadeController: ShadeController,
private val starter: ActivityStarter,
private val notificationEntryManager: NotificationEntryManager,
private val notifCollection: CommonNotifCollection,
private val uiEventLogger: UiEventLogger,
private val dialogLaunchAnimator: DialogLaunchAnimator,
private val dialogManager: SystemUIDialogManager
@@ -52,7 +52,7 @@ class MediaOutputDialogFactory @Inject constructor(
mediaOutputDialog?.dismiss()
val controller = MediaOutputController(context, packageName, aboveStatusBar,
mediaSessionManager, lbm, shadeController, starter, notificationEntryManager,
mediaSessionManager, lbm, shadeController, starter, notifCollection,
uiEventLogger, dialogLaunchAnimator, dialogManager)
val dialog = MediaOutputDialog(context, aboveStatusBar, controller, uiEventLogger,
dialogManager)

View File

@@ -95,12 +95,13 @@ import com.android.systemui.people.PeopleTileViewHelper;
import com.android.systemui.people.SharedPreferencesHelper;
import com.android.systemui.statusbar.NotificationListener;
import com.android.systemui.statusbar.NotificationListener.NotificationHandler;
import com.android.systemui.statusbar.notification.NotificationEntryManager;
import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.notification.collection.notifcollection.CommonNotifCollection;
import com.android.wm.shell.bubbles.Bubbles;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
@@ -129,7 +130,7 @@ public class PeopleSpaceWidgetManager {
private IPeopleManager mIPeopleManager;
private SharedPreferences mSharedPrefs;
private PeopleManager mPeopleManager;
private NotificationEntryManager mNotificationEntryManager;
private CommonNotifCollection mNotifCollection;
private PackageManager mPackageManager;
private INotificationManager mINotificationManager;
private Optional<Bubbles> mBubblesOptional;
@@ -156,7 +157,7 @@ public class PeopleSpaceWidgetManager {
@Inject
public PeopleSpaceWidgetManager(Context context, LauncherApps launcherApps,
NotificationEntryManager notificationEntryManager,
CommonNotifCollection notifCollection,
PackageManager packageManager, Optional<Bubbles> bubblesOptional,
UserManager userManager, NotificationManager notificationManager,
BroadcastDispatcher broadcastDispatcher, @Background Executor bgExecutor) {
@@ -168,7 +169,7 @@ public class PeopleSpaceWidgetManager {
mLauncherApps = launcherApps;
mSharedPrefs = PreferenceManager.getDefaultSharedPreferences(mContext);
mPeopleManager = context.getSystemService(PeopleManager.class);
mNotificationEntryManager = notificationEntryManager;
mNotifCollection = notifCollection;
mPackageManager = packageManager;
mINotificationManager = INotificationManager.Stub.asInterface(
ServiceManager.getService(Context.NOTIFICATION_SERVICE));
@@ -235,7 +236,7 @@ public class PeopleSpaceWidgetManager {
PeopleSpaceWidgetManager(Context context,
AppWidgetManager appWidgetManager, IPeopleManager iPeopleManager,
PeopleManager peopleManager, LauncherApps launcherApps,
NotificationEntryManager notificationEntryManager, PackageManager packageManager,
CommonNotifCollection notifCollection, PackageManager packageManager,
Optional<Bubbles> bubblesOptional, UserManager userManager, BackupManager backupManager,
INotificationManager iNotificationManager, NotificationManager notificationManager,
@Background Executor executor) {
@@ -244,7 +245,7 @@ public class PeopleSpaceWidgetManager {
mIPeopleManager = iPeopleManager;
mPeopleManager = peopleManager;
mLauncherApps = launcherApps;
mNotificationEntryManager = notificationEntryManager;
mNotifCollection = notifCollection;
mPackageManager = packageManager;
mBubblesOptional = bubblesOptional;
mUserManager = userManager;
@@ -519,13 +520,7 @@ public class PeopleSpaceWidgetManager {
/** Returns active and pending notifications grouped by {@link PeopleTileKey}. */
public Map<PeopleTileKey, Set<NotificationEntry>> getGroupedConversationNotifications() {
List<NotificationEntry> notifications =
new ArrayList<>(mNotificationEntryManager.getVisibleNotifications());
Iterable<NotificationEntry> pendingNotifications =
mNotificationEntryManager.getPendingNotificationsIterator();
for (NotificationEntry entry : pendingNotifications) {
notifications.add(entry);
}
Collection<NotificationEntry> notifications = mNotifCollection.getAllNotifs();
if (DEBUG) Log.d(TAG, "Number of total notifications: " + notifications.size());
Map<PeopleTileKey, Set<NotificationEntry>> groupedNotifications =
notifications

View File

@@ -17,7 +17,6 @@
package com.android.systemui.statusbar;
import static com.android.systemui.statusbar.RemoteInputController.processForRemoteInput;
import static com.android.systemui.statusbar.notification.NotificationEntryManager.UNDEFINED_DISMISS_REASON;
import android.annotation.NonNull;
import android.annotation.SuppressLint;
@@ -32,6 +31,7 @@ import android.util.Log;
import com.android.systemui.dagger.qualifiers.Main;
import com.android.systemui.statusbar.dagger.StatusBarModule;
import com.android.systemui.statusbar.notification.collection.NotifCollection;
import com.android.systemui.statusbar.phone.NotificationListenerWithPlugins;
import com.android.systemui.statusbar.phone.StatusBar;
import com.android.systemui.util.time.SystemClock;
@@ -155,7 +155,7 @@ public class NotificationListener extends NotificationListenerWithPlugins {
@Override
public void onNotificationRemoved(StatusBarNotification sbn, RankingMap rankingMap) {
onNotificationRemoved(sbn, rankingMap, UNDEFINED_DISMISS_REASON);
onNotificationRemoved(sbn, rankingMap, NotifCollection.REASON_UNKNOWN);
}
@Override

View File

@@ -1043,6 +1043,11 @@ public class NotificationEntryManager implements
mNotifCollectionListeners.add(listener);
}
@Override
public void removeCollectionListener(@NonNull NotifCollectionListener listener) {
mNotifCollectionListeners.remove(listener);
}
/*
* End annexation
* -----

View File

@@ -213,6 +213,12 @@ public class NotifCollection implements Dumpable {
mNotifCollectionListeners.add(listener);
}
/** @see NotifPipeline#removeCollectionListener(NotifCollectionListener) */
void removeCollectionListener(NotifCollectionListener listener) {
Assert.isMainThread();
mNotifCollectionListeners.remove(listener);
}
/** @see NotifPipeline#addNotificationLifetimeExtender(NotifLifetimeExtender) */
void addNotificationLifetimeExtender(NotifLifetimeExtender extender) {
Assert.isMainThread();

View File

@@ -94,6 +94,10 @@ class NotifPipeline @Inject constructor(
mNotifCollection.addCollectionListener(listener)
}
override fun removeCollectionListener(listener: NotifCollectionListener) {
mNotifCollection.removeCollectionListener(listener)
}
/**
* Returns the NotificationEntry associated with [key].
*/

View File

@@ -147,6 +147,7 @@ public class ShadeListBuilder implements Dumpable {
*/
public void attach(NotifCollection collection) {
Assert.isMainThread();
collection.addCollectionListener(mInteractionTracker);
collection.setBuildListener(mReadyForBuildListener);
}

View File

@@ -27,11 +27,11 @@ import com.android.systemui.dagger.SysUISingleton;
import com.android.systemui.dump.DumpManager;
import com.android.systemui.keyguard.WakefulnessLifecycle;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.statusbar.NotificationViewHierarchyManager;
import com.android.systemui.statusbar.notification.collection.ListEntry;
import com.android.systemui.statusbar.notification.collection.NotifPipeline;
import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.notification.collection.listbuilder.pluggable.NotifStabilityManager;
import com.android.systemui.statusbar.notification.collection.provider.VisualStabilityProvider;
import com.android.systemui.statusbar.notification.collection.render.NotifPanelEventSource;
import com.android.systemui.statusbar.policy.HeadsUpManager;
import com.android.systemui.util.concurrency.DelayableExecutor;
@@ -49,11 +49,6 @@ import javax.inject.Inject;
* Ensures that notifications are visually stable if the user is looking at the notifications.
* Group and section changes are re-allowed when the notification entries are no longer being
* viewed.
*
* Previously this was implemented in the view-layer {@link NotificationViewHierarchyManager} by
* {@link com.android.systemui.statusbar.notification.collection.legacy.VisualStabilityManager}.
* This is now integrated in the data-layer via
* {@link com.android.systemui.statusbar.notification.collection.ShadeListBuilder}.
*/
// TODO(b/204468557): Move to @CoordinatorScope
@SysUISingleton
@@ -63,6 +58,7 @@ public class VisualStabilityCoordinator implements Coordinator, Dumpable,
private final HeadsUpManager mHeadsUpManager;
private final NotifPanelEventSource mNotifPanelEventSource;
private final StatusBarStateController mStatusBarStateController;
private final VisualStabilityProvider mVisualStabilityProvider;
private final WakefulnessLifecycle mWakefulnessLifecycle;
private boolean mScreenOn;
@@ -93,8 +89,10 @@ public class VisualStabilityCoordinator implements Coordinator, Dumpable,
HeadsUpManager headsUpManager,
NotifPanelEventSource notifPanelEventSource,
StatusBarStateController statusBarStateController,
VisualStabilityProvider visualStabilityProvider,
WakefulnessLifecycle wakefulnessLifecycle) {
mHeadsUpManager = headsUpManager;
mVisualStabilityProvider = visualStabilityProvider;
mWakefulnessLifecycle = wakefulnessLifecycle;
mStatusBarStateController = statusBarStateController;
mDelayableExecutor = delayableExecutor;
@@ -178,6 +176,7 @@ public class VisualStabilityCoordinator implements Coordinator, Dumpable,
|| mIsSuppressingEntryReorder))) {
mNotifStabilityManager.invalidateList();
}
mVisualStabilityProvider.setReorderingAllowed(mReorderingAllowed);
}
private boolean isSuppressingSectionChange() {

View File

@@ -31,6 +31,7 @@ import com.android.systemui.statusbar.notification.NotificationEntryListener;
import com.android.systemui.statusbar.notification.NotificationEntryManager;
import com.android.systemui.statusbar.notification.VisibilityLocationProvider;
import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.notification.collection.provider.VisualStabilityProvider;
import com.android.systemui.statusbar.notification.dagger.NotificationsModule;
import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow;
import com.android.systemui.statusbar.policy.OnHeadsUpChangedListener;
@@ -52,6 +53,7 @@ public class VisualStabilityManager implements OnHeadsUpChangedListener, Dumpabl
private final ArrayList<Callback> mGroupChangesAllowedCallbacks = new ArrayList<>();
private final ArraySet<Callback> mPersistentGroupCallbacks = new ArraySet<>();
private final Handler mHandler;
private final VisualStabilityProvider mVisualStabilityProvider;
private boolean mPanelExpanded;
private boolean mScreenOn;
@@ -70,11 +72,13 @@ public class VisualStabilityManager implements OnHeadsUpChangedListener, Dumpabl
*/
public VisualStabilityManager(
NotificationEntryManager notificationEntryManager,
VisualStabilityProvider visualStabilityProvider,
@Main Handler handler,
StatusBarStateController statusBarStateController,
WakefulnessLifecycle wakefulnessLifecycle,
DumpManager dumpManager) {
mVisualStabilityProvider = visualStabilityProvider;
mHandler = handler;
dumpManager.registerDumpable(this);
@@ -181,6 +185,7 @@ public class VisualStabilityManager implements OnHeadsUpChangedListener, Dumpabl
if (changedToTrue) {
notifyChangeAllowed(mReorderingAllowedCallbacks, mPersistentReorderingCallbacks);
}
mVisualStabilityProvider.setReorderingAllowed(reorderingAllowed);
boolean groupChangesAllowed = (!mScreenOn || !mPanelExpanded) && !mPulsing;
changedToTrue = groupChangesAllowed && !mGroupChangedAllowed;
mGroupChangedAllowed = groupChangesAllowed;

View File

@@ -40,6 +40,11 @@ public interface CommonNotifCollection {
*/
void addCollectionListener(@NonNull NotifCollectionListener listener);
/**
* Unregisters a listener previously added with {@link #addCollectionListener}
*/
void removeCollectionListener(@NonNull NotifCollectionListener listener);
/**
* Returns the list of all known notifications, i.e. the notifications that are currently posted
* to the phone. In general, this tracks closely to the list maintained by NotificationManager,

View File

@@ -0,0 +1,27 @@
package com.android.systemui.statusbar.notification.collection.provider
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.util.ListenerSet
import javax.inject.Inject
@SysUISingleton
class VisualStabilityProvider @Inject constructor() {
private val listeners = ListenerSet<OnReorderingAllowedListener>()
var isReorderingAllowed = true
set(value) {
if (field != value) {
field = value
if (value) {
listeners.forEach(OnReorderingAllowedListener::onReorderingAllowed)
}
}
}
fun addPersistentReorderingAllowedListener(listener: OnReorderingAllowedListener) =
listeners.addIfAbsent(listener)
}
fun interface OnReorderingAllowedListener {
fun onReorderingAllowed()
}

View File

@@ -62,6 +62,7 @@ import com.android.systemui.statusbar.notification.collection.legacy.VisualStabi
import com.android.systemui.statusbar.notification.collection.notifcollection.CommonNotifCollection;
import com.android.systemui.statusbar.notification.collection.provider.HighPriorityProvider;
import com.android.systemui.statusbar.notification.collection.provider.NotificationVisibilityProviderImpl;
import com.android.systemui.statusbar.notification.collection.provider.VisualStabilityProvider;
import com.android.systemui.statusbar.notification.collection.render.GroupExpansionManager;
import com.android.systemui.statusbar.notification.collection.render.GroupExpansionManagerImpl;
import com.android.systemui.statusbar.notification.collection.render.GroupMembershipManager;
@@ -200,12 +201,14 @@ public interface NotificationsModule {
@Provides
static VisualStabilityManager provideVisualStabilityManager(
NotificationEntryManager notificationEntryManager,
VisualStabilityProvider visualStabilityProvider,
Handler handler,
StatusBarStateController statusBarStateController,
WakefulnessLifecycle wakefulnessLifecycle,
DumpManager dumpManager) {
return new VisualStabilityManager(
notificationEntryManager,
visualStabilityProvider,
handler,
statusBarStateController,
wakefulnessLifecycle,

View File

@@ -31,7 +31,6 @@ import android.util.SparseArray
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import com.android.internal.statusbar.NotificationVisibility
import com.android.internal.widget.MessagingGroup
import com.android.settingslib.notification.ConversationIconFactory
import com.android.systemui.R
@@ -41,9 +40,9 @@ import com.android.systemui.dagger.qualifiers.Main
import com.android.systemui.plugins.NotificationPersonExtractorPlugin
import com.android.systemui.statusbar.NotificationListener
import com.android.systemui.statusbar.NotificationLockscreenUserManager
import com.android.systemui.statusbar.notification.NotificationEntryListener
import com.android.systemui.statusbar.notification.NotificationEntryManager
import com.android.systemui.statusbar.notification.collection.NotificationEntry
import com.android.systemui.statusbar.notification.collection.notifcollection.CommonNotifCollection
import com.android.systemui.statusbar.notification.collection.notifcollection.NotifCollectionListener
import com.android.systemui.statusbar.notification.people.PeopleNotificationIdentifier.Companion.TYPE_NON_PERSON
import com.android.systemui.statusbar.policy.ExtensionController
import java.util.ArrayDeque
@@ -89,7 +88,7 @@ class NotificationPersonExtractorPluginBoundary @Inject constructor(
@SysUISingleton
class PeopleHubDataSourceImpl @Inject constructor(
private val notificationEntryManager: NotificationEntryManager,
private val notifCollection: CommonNotifCollection,
private val extractor: NotificationPersonExtractor,
private val userManager: UserManager,
launcherApps: LauncherApps,
@@ -119,19 +118,11 @@ class PeopleHubDataSourceImpl @Inject constructor(
)
}
private val notificationEntryListener = object : NotificationEntryListener {
override fun onEntryInflated(entry: NotificationEntry) = addVisibleEntry(entry)
override fun onEntryReinflated(entry: NotificationEntry) = addVisibleEntry(entry)
override fun onPostEntryUpdated(entry: NotificationEntry) = addVisibleEntry(entry)
override fun onEntryRemoved(
entry: NotificationEntry,
visibility: NotificationVisibility?,
removedByUser: Boolean,
reason: Int
) = removeVisibleEntry(entry, reason)
private val notifCollectionListener = object : NotifCollectionListener {
override fun onEntryAdded(entry: NotificationEntry) = addVisibleEntry(entry)
override fun onEntryUpdated(entry: NotificationEntry) = addVisibleEntry(entry)
override fun onEntryRemoved(entry: NotificationEntry, reason: Int) =
removeVisibleEntry(entry, reason)
}
private fun removeVisibleEntry(entry: NotificationEntry, reason: Int) {
@@ -179,7 +170,7 @@ class PeopleHubDataSourceImpl @Inject constructor(
currentProfiles: SparseArray<UserInfo>?
) = updateUi()
})
notificationEntryManager.addNotificationEntryListener(notificationEntryListener)
notifCollection.addCollectionListener(notifCollectionListener)
} else {
getPeopleHubModelForCurrentUser()?.let(listener::onDataChanged)
}
@@ -189,8 +180,7 @@ class PeopleHubDataSourceImpl @Inject constructor(
if (dataListeners.isEmpty()) {
userChangeSubscription?.unsubscribe()
userChangeSubscription = null
notificationEntryManager
.removeNotificationEntryListener(notificationEntryListener)
notifCollection.removeCollectionListener(notifCollectionListener)
}
}
}

View File

@@ -46,7 +46,6 @@ import com.android.systemui.Dependency;
import com.android.systemui.R;
import com.android.systemui.plugins.statusbar.NotificationMenuRowPlugin;
import com.android.systemui.statusbar.notification.AssistantFeedbackController;
import com.android.systemui.statusbar.notification.NotificationEntryManager;
import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.util.Compile;
@@ -62,7 +61,6 @@ public class FeedbackInfo extends LinearLayout implements NotificationGuts.GutsC
private String mPkg;
private NotificationEntry mEntry;
private NotificationEntryManager mNotificationEntryManager;
private IStatusBarService mStatusBarService;
private AssistantFeedbackController mFeedbackController;
private NotificationGutsManager mNotificationGutsManager;
@@ -86,7 +84,6 @@ public class FeedbackInfo extends LinearLayout implements NotificationGuts.GutsC
mRanking = entry.getRanking();
mFeedbackController = controller;
mAppName = mPkg;
mNotificationEntryManager = Dependency.get(NotificationEntryManager.class);
mStatusBarService = Dependency.get(IStatusBarService.class);
mNotificationGutsManager = Dependency.get(NotificationGutsManager.class);

View File

@@ -21,12 +21,13 @@ import android.os.RemoteException;
import android.service.notification.StatusBarNotification;
import android.util.Log;
import androidx.annotation.NonNull;
import com.android.internal.statusbar.IStatusBarService;
import com.android.internal.statusbar.NotificationVisibility;
import com.android.systemui.dagger.SysUISingleton;
import com.android.systemui.statusbar.notification.NotificationEntryListener;
import com.android.systemui.statusbar.notification.NotificationEntryManager;
import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.notification.collection.notifcollection.CommonNotifCollection;
import com.android.systemui.statusbar.notification.collection.notifcollection.NotifCollectionListener;
import javax.inject.Inject;
@@ -49,8 +50,8 @@ public class RemoteInputUriController {
* that RemoteInput URI grants are cleaned up when the notification entry is removed from
* the shade.
*/
public void attach(NotificationEntryManager manager) {
manager.addNotificationEntryListener(mInlineUriListener);
public void attach(CommonNotifCollection manager) {
manager.addCollectionListener(mInlineUriListener);
}
/**
@@ -70,10 +71,9 @@ public class RemoteInputUriController {
* Ensures that inline URI permissions are cleared when notification entries are removed from
* the shade.
*/
private final NotificationEntryListener mInlineUriListener = new NotificationEntryListener() {
private final NotifCollectionListener mInlineUriListener = new NotifCollectionListener() {
@Override
public void onEntryRemoved(NotificationEntry entry, NotificationVisibility visibility,
boolean removedByUser, int reason) {
public void onEntryRemoved(@NonNull NotificationEntry entry, int reason) {
try {
mStatusBarManagerService.clearInlineReplyUriPermissions(entry.getKey());
} catch (RemoteException ex) {

View File

@@ -50,7 +50,7 @@ import com.android.systemui.statusbar.NotificationLockscreenUserManager;
import com.android.systemui.statusbar.NotificationLockscreenUserManagerImpl;
import com.android.systemui.statusbar.NotificationShadeWindowController;
import com.android.systemui.statusbar.notification.NotificationEntryManager;
import com.android.systemui.statusbar.notification.collection.legacy.NotificationGroupManagerLegacy;
import com.android.systemui.statusbar.notification.collection.render.GroupMembershipManager;
import com.android.systemui.statusbar.phone.DozeServiceHost;
import com.android.systemui.statusbar.phone.HeadsUpManagerPhone;
import com.android.systemui.statusbar.phone.KeyguardBypassController;
@@ -166,7 +166,7 @@ public abstract class TvSystemUIModule {
HeadsUpManagerLogger headsUpManagerLogger,
StatusBarStateController statusBarStateController,
KeyguardBypassController bypassController,
NotificationGroupManagerLegacy groupManager,
GroupMembershipManager groupManager,
ConfigurationController configurationController) {
return new HeadsUpManagerPhone(
context,

View File

@@ -25,7 +25,7 @@ import com.android.systemui.dagger.qualifiers.Main
import com.android.systemui.dump.DumpManager
import com.android.systemui.plugins.ActivityStarter
import com.android.systemui.plugins.FalsingManager
import com.android.systemui.statusbar.notification.collection.legacy.VisualStabilityManager
import com.android.systemui.statusbar.notification.collection.provider.VisualStabilityProvider
import com.android.systemui.statusbar.policy.ConfigurationController
import com.android.systemui.util.concurrency.DelayableExecutor
import com.android.systemui.util.time.FakeSystemClock
@@ -36,8 +36,8 @@ import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.Mock
import org.mockito.MockitoAnnotations
import org.mockito.Mockito.`when` as whenever
import javax.inject.Provider
import org.mockito.Mockito.`when` as whenever
private val DATA = MediaData(
userId = -1,
@@ -66,7 +66,7 @@ class MediaCarouselControllerTest : SysuiTestCase() {
@Mock lateinit var mediaControlPanelFactory: Provider<MediaControlPanel>
@Mock lateinit var panel: MediaControlPanel
@Mock lateinit var visualStabilityManager: VisualStabilityManager
@Mock lateinit var visualStabilityProvider: VisualStabilityProvider
@Mock lateinit var mediaHostStatesManager: MediaHostStatesManager
@Mock lateinit var activityStarter: ActivityStarter
@Mock @Main private lateinit var executor: DelayableExecutor
@@ -87,7 +87,7 @@ class MediaCarouselControllerTest : SysuiTestCase() {
mediaCarouselController = MediaCarouselController(
context,
mediaControlPanelFactory,
visualStabilityManager,
visualStabilityProvider,
mediaHostStatesManager,
activityStarter,
clock,

View File

@@ -52,8 +52,8 @@ import com.android.systemui.R;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.animation.DialogLaunchAnimator;
import com.android.systemui.plugins.ActivityStarter;
import com.android.systemui.statusbar.notification.NotificationEntryManager;
import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.notification.collection.notifcollection.CommonNotifCollection;
import com.android.systemui.statusbar.phone.ShadeController;
import com.android.systemui.statusbar.phone.SystemUIDialogManager;
@@ -91,8 +91,7 @@ public class MediaOutputControllerTest extends SysuiTestCase {
private RoutingSessionInfo mRemoteSessionInfo = mock(RoutingSessionInfo.class);
private ShadeController mShadeController = mock(ShadeController.class);
private ActivityStarter mStarter = mock(ActivityStarter.class);
private NotificationEntryManager mNotificationEntryManager =
mock(NotificationEntryManager.class);
private CommonNotifCollection mNotifCollection = mock(CommonNotifCollection.class);
private final UiEventLogger mUiEventLogger = mock(UiEventLogger.class);
private final DialogLaunchAnimator mDialogLaunchAnimator = mock(DialogLaunchAnimator.class);
private final SystemUIDialogManager mDialogManager = mock(SystemUIDialogManager.class);
@@ -118,7 +117,7 @@ public class MediaOutputControllerTest extends SysuiTestCase {
mMediaOutputController = new MediaOutputController(mSpyContext, TEST_PACKAGE_NAME, false,
mMediaSessionManager, mLocalBluetoothManager, mShadeController, mStarter,
mNotificationEntryManager, mUiEventLogger, mDialogLaunchAnimator, mDialogManager);
mNotifCollection, mUiEventLogger, mDialogLaunchAnimator, mDialogManager);
mLocalMediaManager = spy(mMediaOutputController.mLocalMediaManager);
mMediaOutputController.mLocalMediaManager = mLocalMediaManager;
MediaDescription.Builder builder = new MediaDescription.Builder();
@@ -162,7 +161,7 @@ public class MediaOutputControllerTest extends SysuiTestCase {
public void start_withoutPackageName_verifyMediaControllerInit() {
mMediaOutputController = new MediaOutputController(mSpyContext, null, false,
mMediaSessionManager, mLocalBluetoothManager, mShadeController, mStarter,
mNotificationEntryManager, mUiEventLogger, mDialogLaunchAnimator, mDialogManager);
mNotifCollection, mUiEventLogger, mDialogLaunchAnimator, mDialogManager);
mMediaOutputController.start(mCb);
@@ -183,7 +182,7 @@ public class MediaOutputControllerTest extends SysuiTestCase {
public void stop_withoutPackageName_verifyMediaControllerDeinit() {
mMediaOutputController = new MediaOutputController(mSpyContext, null, false,
mMediaSessionManager, mLocalBluetoothManager, mShadeController, mStarter,
mNotificationEntryManager, mUiEventLogger, mDialogLaunchAnimator, mDialogManager);
mNotifCollection, mUiEventLogger, mDialogLaunchAnimator, mDialogManager);
mMediaOutputController.start(mCb);
@@ -454,7 +453,7 @@ public class MediaOutputControllerTest extends SysuiTestCase {
public void getNotificationLargeIcon_withoutPackageName_returnsNull() {
mMediaOutputController = new MediaOutputController(mSpyContext, null, false,
mMediaSessionManager, mLocalBluetoothManager, mShadeController, mStarter,
mNotificationEntryManager, mUiEventLogger, mDialogLaunchAnimator, mDialogManager);
mNotifCollection, mUiEventLogger, mDialogLaunchAnimator, mDialogManager);
assertThat(mMediaOutputController.getNotificationIcon()).isNull();
}
@@ -467,8 +466,7 @@ public class MediaOutputControllerTest extends SysuiTestCase {
final Notification notification = mock(Notification.class);
entryList.add(entry);
when(mNotificationEntryManager.getActiveNotificationsForCurrentUser())
.thenReturn(entryList);
when(mNotifCollection.getAllNotifs()).thenReturn(entryList);
when(entry.getSbn()).thenReturn(sbn);
when(sbn.getNotification()).thenReturn(notification);
when(sbn.getPackageName()).thenReturn(TEST_PACKAGE_NAME);
@@ -487,15 +485,14 @@ public class MediaOutputControllerTest extends SysuiTestCase {
final Icon icon = mock(Icon.class);
entryList.add(entry);
when(mNotificationEntryManager.getActiveNotificationsForCurrentUser())
.thenReturn(entryList);
when(mNotifCollection.getAllNotifs()).thenReturn(entryList);
when(entry.getSbn()).thenReturn(sbn);
when(sbn.getNotification()).thenReturn(notification);
when(sbn.getPackageName()).thenReturn(TEST_PACKAGE_NAME);
when(notification.isMediaNotification()).thenReturn(true);
when(notification.getLargeIcon()).thenReturn(icon);
assertThat(mMediaOutputController.getNotificationIcon() instanceof IconCompat).isTrue();
assertThat(mMediaOutputController.getNotificationIcon()).isInstanceOf(IconCompat.class);
}
@Test
@@ -507,8 +504,7 @@ public class MediaOutputControllerTest extends SysuiTestCase {
final Icon icon = mock(Icon.class);
entryList.add(entry);
when(mNotificationEntryManager.getActiveNotificationsForCurrentUser())
.thenReturn(entryList);
when(mNotifCollection.getAllNotifs()).thenReturn(entryList);
when(entry.getSbn()).thenReturn(sbn);
when(sbn.getNotification()).thenReturn(notification);
when(sbn.getPackageName()).thenReturn(TEST_PACKAGE_NAME);

View File

@@ -109,11 +109,11 @@ import com.android.systemui.people.SharedPreferencesHelper;
import com.android.systemui.statusbar.NotificationListener;
import com.android.systemui.statusbar.NotificationListener.NotificationHandler;
import com.android.systemui.statusbar.SbnBuilder;
import com.android.systemui.statusbar.notification.NotificationEntryManager;
import com.android.systemui.statusbar.notification.collection.NoManSimulator;
import com.android.systemui.statusbar.notification.collection.NoManSimulator.NotifEvent;
import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.notification.collection.NotificationEntryBuilder;
import com.android.systemui.statusbar.notification.collection.notifcollection.CommonNotifCollection;
import com.android.systemui.util.concurrency.FakeExecutor;
import com.android.systemui.util.time.FakeSystemClock;
import com.android.wm.shell.bubbles.Bubbles;
@@ -239,7 +239,7 @@ public class PeopleSpaceWidgetManagerTest extends SysuiTestCase {
@Mock
private LauncherApps mLauncherApps;
@Mock
private NotificationEntryManager mNotificationEntryManager;
private CommonNotifCollection mNotifCollection;
@Mock
private PackageManager mPackageManager;
@Mock
@@ -269,9 +269,8 @@ public class PeopleSpaceWidgetManagerTest extends SysuiTestCase {
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
mLauncherApps = mock(LauncherApps.class);
mDependency.injectTestDependency(NotificationEntryManager.class, mNotificationEntryManager);
mManager = new PeopleSpaceWidgetManager(mContext, mAppWidgetManager, mIPeopleManager,
mPeopleManager, mLauncherApps, mNotificationEntryManager, mPackageManager,
mPeopleManager, mLauncherApps, mNotifCollection, mPackageManager,
Optional.of(mBubbles), mUserManager, mBackupManager, mINotificationManager,
mNotificationManager, mFakeExecutor);
mManager.attach(mListenerService);
@@ -633,7 +632,7 @@ public class PeopleSpaceWidgetManagerTest extends SysuiTestCase {
.setShortcutInfo(mShortcutInfo)
.setId(1);
NotificationEntry entry = builder.build();
when(mNotificationEntryManager.getVisibleNotifications()).thenReturn(List.of(entry));
when(mNotifCollection.getAllNotifs()).thenReturn(List.of(entry));
NotifEvent notif1 = mNoMan.postNotif(builder);
mClock.advanceTime(MIN_LINGER_DURATION);
@@ -692,7 +691,7 @@ public class PeopleSpaceWidgetManagerTest extends SysuiTestCase {
.setShortcutInfo(mShortcutInfo)
.setId(1);
NotificationEntry entry = builder.build();
when(mNotificationEntryManager.getVisibleNotifications()).thenReturn(List.of(entry));
when(mNotifCollection.getAllNotifs()).thenReturn(List.of(entry));
NotifEvent notif1 = mNoMan.postNotif(builder);
mClock.advanceTime(MIN_LINGER_DURATION);
@@ -716,7 +715,7 @@ public class PeopleSpaceWidgetManagerTest extends SysuiTestCase {
.setShortcutInfo(mShortcutInfo)
.setId(1);
NotificationEntry entry = builder.build();
when(mNotificationEntryManager.getVisibleNotifications()).thenReturn(List.of(entry));
when(mNotifCollection.getAllNotifs()).thenReturn(List.of(entry));
NotifEvent notif1 = mNoMan.postNotif(builder);
mClock.advanceTime(MIN_LINGER_DURATION);
@@ -740,7 +739,7 @@ public class PeopleSpaceWidgetManagerTest extends SysuiTestCase {
.setShortcutInfo(mShortcutInfo)
.setId(1);
NotificationEntry entry = builder.build();
when(mNotificationEntryManager.getVisibleNotifications()).thenReturn(List.of(entry));
when(mNotifCollection.getAllNotifs()).thenReturn(List.of(entry));
NotifEvent notif1 = mNoMan.postNotif(builder);
mClock.advanceTime(MIN_LINGER_DURATION);
@@ -771,12 +770,12 @@ public class PeopleSpaceWidgetManagerTest extends SysuiTestCase {
.setId(1);
NotificationEntry entry = builder.build();
when(mNotificationEntryManager.getVisibleNotifications()).thenReturn(List.of(entry));
when(mNotifCollection.getAllNotifs()).thenReturn(List.of(entry));
NotifEvent notif1 = mNoMan.postNotif(builder);
mClock.advanceTime(MIN_LINGER_DURATION);
when(mNotificationEntryManager.getVisibleNotifications()).thenReturn(List.of());
when(mNotifCollection.getAllNotifs()).thenReturn(List.of());
NotifEvent notif1b = mNoMan.retractNotif(notif1.sbn.cloneLight(), 0);
mClock.advanceTime(MIN_LINGER_DURATION);
@@ -814,7 +813,7 @@ public class PeopleSpaceWidgetManagerTest extends SysuiTestCase {
.setSbn(sbn)
.setId(1);
NotificationEntry entry = builder.build();
when(mNotificationEntryManager.getVisibleNotifications()).thenReturn(List.of(entry));
when(mNotifCollection.getAllNotifs()).thenReturn(List.of(entry));
NotifEvent notif1 = mNoMan.postNotif(builder);
mClock.advanceTime(MIN_LINGER_DURATION);
@@ -858,7 +857,7 @@ public class PeopleSpaceWidgetManagerTest extends SysuiTestCase {
.setShortcutInfo(mShortcutInfo)
.setId(1);
NotificationEntry entry = builder.build();
when(mNotificationEntryManager.getVisibleNotifications()).thenReturn(List.of(entry));
when(mNotifCollection.getAllNotifs()).thenReturn(List.of(entry));
NotifEvent notif1 = mNoMan.postNotif(builder);
@@ -891,7 +890,7 @@ public class PeopleSpaceWidgetManagerTest extends SysuiTestCase {
.setShortcutInfo(mShortcutInfo)
.setId(1);
NotificationEntry entry = builder.build();
when(mNotificationEntryManager.getVisibleNotifications()).thenReturn(List.of(entry));
when(mNotifCollection.getAllNotifs()).thenReturn(List.of(entry));
NotifEvent notif1 = mNoMan.postNotif(builder);
mClock.advanceTime(MIN_LINGER_DURATION);
@@ -922,7 +921,7 @@ public class PeopleSpaceWidgetManagerTest extends SysuiTestCase {
.setShortcutInfo(mShortcutInfo)
.setId(1);
NotificationEntry entry = builder.build();
when(mNotificationEntryManager.getVisibleNotifications()).thenReturn(List.of(entry));
when(mNotifCollection.getAllNotifs()).thenReturn(List.of(entry));
NotifEvent notif1 = mNoMan.postNotif(builder);
mClock.advanceTime(MIN_LINGER_DURATION);
@@ -1215,8 +1214,7 @@ public class PeopleSpaceWidgetManagerTest extends SysuiTestCase {
.setPackageName(TEST_PACKAGE_A)
.setUserHandle(new UserHandle(0))
.build();
when(mNotificationEntryManager.getVisibleNotifications())
.thenReturn(List.of(mNotificationEntry));
when(mNotifCollection.getAllNotifs()).thenReturn(List.of(mNotificationEntry));
PeopleSpaceTile actual =
mManager.augmentTileFromNotificationEntryManager(tile,
@@ -1224,8 +1222,7 @@ public class PeopleSpaceWidgetManagerTest extends SysuiTestCase {
assertThat(actual.getNotificationContent().toString()).isEqualTo(NOTIFICATION_CONTENT_1);
verify(mNotificationEntryManager, times(1))
.getVisibleNotifications();
verify(mNotifCollection, times(1)).getAllNotifs();
}
@Test
@@ -1237,8 +1234,7 @@ public class PeopleSpaceWidgetManagerTest extends SysuiTestCase {
.setPackageName(TEST_PACKAGE_A)
.setUserHandle(new UserHandle(0))
.build();
when(mNotificationEntryManager.getVisibleNotifications())
.thenReturn(List.of(mNotificationEntry));
when(mNotifCollection.getAllNotifs()).thenReturn(List.of(mNotificationEntry));
PeopleSpaceTile actual =
mManager.augmentTileFromNotificationEntryManager(tile,
@@ -1246,8 +1242,7 @@ public class PeopleSpaceWidgetManagerTest extends SysuiTestCase {
assertThat(TextUtils.isEmpty(actual.getNotificationContent())).isTrue();
verify(mNotificationEntryManager, times(1))
.getVisibleNotifications();
verify(mNotifCollection, times(1)).getAllNotifs();
}
@Test

View File

@@ -38,6 +38,7 @@ import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.notification.collection.NotificationEntryBuilder;
import com.android.systemui.statusbar.notification.collection.legacy.VisualStabilityManager;
import com.android.systemui.statusbar.notification.collection.provider.VisualStabilityProvider;
import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow;
import org.junit.Before;
@@ -53,6 +54,7 @@ public class VisualStabilityManagerTest extends SysuiTestCase {
private TestableLooper mTestableLooper;
private VisualStabilityManager mVisualStabilityManager;
private VisualStabilityProvider mVisualStabilityProvider = mock(VisualStabilityProvider.class);
private VisualStabilityManager.Callback mCallback = mock(VisualStabilityManager.Callback.class);
private VisibilityLocationProvider mLocationProvider = mock(VisibilityLocationProvider.class);
private ExpandableNotificationRow mRow = mock(ExpandableNotificationRow.class);
@@ -69,6 +71,7 @@ public class VisualStabilityManagerTest extends SysuiTestCase {
mTestableLooper = TestableLooper.get(this);
mVisualStabilityManager = new VisualStabilityManager(
mock(NotificationEntryManager.class),
mVisualStabilityProvider,
new Handler(mTestableLooper.getLooper()),
statusBarStateController,
wakefulnessLifecycle,

View File

@@ -40,6 +40,7 @@ import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.notification.collection.NotificationEntryBuilder;
import com.android.systemui.statusbar.notification.collection.listbuilder.pluggable.NotifStabilityManager;
import com.android.systemui.statusbar.notification.collection.listbuilder.pluggable.Pluggable;
import com.android.systemui.statusbar.notification.collection.provider.VisualStabilityProvider;
import com.android.systemui.statusbar.notification.collection.render.NotifPanelEventSource;
import com.android.systemui.statusbar.policy.HeadsUpManager;
import com.android.systemui.util.concurrency.FakeExecutor;
@@ -67,6 +68,7 @@ public class VisualStabilityCoordinatorTest extends SysuiTestCase {
@Mock private Pluggable.PluggableListener<NotifStabilityManager> mInvalidateListener;
@Mock private HeadsUpManager mHeadsUpManager;
@Mock private NotifPanelEventSource mNotifPanelEventSource;
@Mock private VisualStabilityProvider mVisualStabilityProvider;
@Captor private ArgumentCaptor<WakefulnessLifecycle.Observer> mWakefulnessObserverCaptor;
@Captor private ArgumentCaptor<StatusBarStateController.StateListener> mSBStateListenerCaptor;
@@ -92,6 +94,7 @@ public class VisualStabilityCoordinatorTest extends SysuiTestCase {
mHeadsUpManager,
mNotifPanelEventSource,
mStatusBarStateController,
mVisualStabilityProvider,
mWakefulnessLifecycle);
mCoordinator.attach(mNotifPipeline);