Split NotificationViewHierarchyManager out of StatusBar.

NotificationViewHierarchyManager handles bundling and unbundling of
notifications. In doing so, which notifications are parents/children of
the other can change. NotificationViewHierarchyManager makes sure the
view hierarchy of the notifications matches their grouping.

Bug: 63874929
Bug: 62602530
Test: runtest systemui
Test: Compile and run
Change-Id: Ia1c8ed75d4eb8df52897c5d6aa0713f8335b2a19
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java
index db83655..c10de61 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java
@@ -76,12 +76,14 @@
 import com.android.systemui.statusbar.NotificationData.Entry;
 import com.android.systemui.statusbar.NotificationEntryManager;
 import com.android.systemui.statusbar.NotificationGutsManager;
+import com.android.systemui.statusbar.NotificationListContainer;
 import com.android.systemui.statusbar.NotificationListener;
 import com.android.systemui.statusbar.NotificationLockscreenUserManager;
 import com.android.systemui.statusbar.NotificationLogger;
 import com.android.systemui.statusbar.NotificationMediaManager;
 import com.android.systemui.statusbar.NotificationPresenter;
 import com.android.systemui.statusbar.NotificationRemoteInputManager;
+import com.android.systemui.statusbar.NotificationViewHierarchyManager;
 import com.android.systemui.statusbar.StatusBarState;
 import com.android.systemui.statusbar.notification.VisualStabilityManager;
 import com.android.systemui.statusbar.policy.DeviceProvisionedController;
@@ -103,25 +105,27 @@
 @RunWithLooper
 public class StatusBarTest extends SysuiTestCase {
 
-    StatusBarKeyguardViewManager mStatusBarKeyguardViewManager;
-    UnlockMethodCache mUnlockMethodCache;
-    KeyguardIndicationController mKeyguardIndicationController;
-    NotificationStackScrollLayout mStackScroller;
-    TestableStatusBar mStatusBar;
-    FakeMetricsLogger mMetricsLogger;
-    HeadsUpManager mHeadsUpManager;
-    NotificationData mNotificationData;
-    PowerManager mPowerManager;
-    SystemServicesProxy mSystemServicesProxy;
-    NotificationPanelView mNotificationPanelView;
-    ScrimController mScrimController;
-    IStatusBarService mBarService;
-    NotificationListener mNotificationListener;
-    NotificationLogger mNotificationLogger;
-    ArrayList<Entry> mNotificationList;
-    FingerprintUnlockController mFingerprintUnlockController;
+    private StatusBarKeyguardViewManager mStatusBarKeyguardViewManager;
+    private UnlockMethodCache mUnlockMethodCache;
+    private KeyguardIndicationController mKeyguardIndicationController;
+    private NotificationStackScrollLayout mStackScroller;
+    private TestableStatusBar mStatusBar;
+    private FakeMetricsLogger mMetricsLogger;
+    private HeadsUpManager mHeadsUpManager;
+    private NotificationData mNotificationData;
+    private PowerManager mPowerManager;
+    private SystemServicesProxy mSystemServicesProxy;
+    private NotificationPanelView mNotificationPanelView;
+    private ScrimController mScrimController;
+    private IStatusBarService mBarService;
+    private NotificationListener mNotificationListener;
+    private NotificationLogger mNotificationLogger;
+    private ArrayList<Entry> mNotificationList;
+    private FingerprintUnlockController mFingerprintUnlockController;
     private DisplayMetrics mDisplayMetrics = new DisplayMetrics();
     private TestableNotificationEntryManager mEntryManager;
+    private NotificationViewHierarchyManager mViewHierarchyManager;
+    private VisualStabilityManager mVisualStabilityManager;
 
     @Before
     public void setup() throws Exception {
@@ -133,7 +137,10 @@
         mDependency.injectMockDependency(NotificationRemoteInputManager.class);
         mDependency.injectMockDependency(NotificationMediaManager.class);
         mDependency.injectMockDependency(ForegroundServiceController.class);
-        mDependency.injectMockDependency(NotificationListener.class);
+        mNotificationListener = mDependency.injectMockDependency(NotificationListener.class);
+        mViewHierarchyManager = mDependency.injectMockDependency(
+                NotificationViewHierarchyManager.class);
+        mVisualStabilityManager = mDependency.injectMockDependency(VisualStabilityManager.class);
         mDependency.injectTestDependency(KeyguardMonitor.class, mock(KeyguardMonitorImpl.class));
         CommandQueue commandQueue = mock(CommandQueue.class);
         when(commandQueue.asBinder()).thenReturn(new Binder());
@@ -161,7 +168,6 @@
                 new Handler(handlerThread.getLooper()));
         when(powerManagerService.isInteractive()).thenReturn(true);
         mBarService = mock(IStatusBarService.class);
-        mNotificationListener = mock(NotificationListener.class);
         mNotificationLogger = new NotificationLogger(mNotificationListener, mDependency.get(
                 UiOffloadThread.class));
 
@@ -175,7 +181,8 @@
         mStatusBar = new TestableStatusBar(mStatusBarKeyguardViewManager, mUnlockMethodCache,
                 mKeyguardIndicationController, mStackScroller, mHeadsUpManager,
                 mPowerManager, mNotificationPanelView, mBarService, mNotificationListener,
-                mNotificationLogger, mEntryManager, mScrimController, mFingerprintUnlockController);
+                mNotificationLogger, mVisualStabilityManager, mViewHierarchyManager,
+                mEntryManager, mScrimController, mFingerprintUnlockController);
         mStatusBar.mContext = mContext;
         mStatusBar.mComponents = mContext.getComponents();
         doAnswer(invocation -> {
@@ -190,8 +197,8 @@
             return null;
         }).when(mStatusBarKeyguardViewManager).addAfterKeyguardGoneRunnable(any());
 
-        mEntryManager.setUpForTest(mStatusBar, mStackScroller, mStatusBar,
-                mock(VisualStabilityManager.class), mHeadsUpManager, mNotificationData);
+        mEntryManager.setUpForTest(mStatusBar, mStackScroller, mStatusBar, mHeadsUpManager,
+                mNotificationData);
         mNotificationLogger.setUpWithPresenter(mStatusBar, mStackScroller);
 
         when(mStackScroller.getActivatedChild()).thenReturn(null);
@@ -590,6 +597,8 @@
                 PowerManager pm, NotificationPanelView panelView,
                 IStatusBarService barService, NotificationListener notificationListener,
                 NotificationLogger notificationLogger,
+                VisualStabilityManager visualStabilityManager,
+                NotificationViewHierarchyManager viewHierarchyManager,
                 TestableNotificationEntryManager entryManager, ScrimController scrimController,
                 FingerprintUnlockController fingerprintUnlockController) {
             mStatusBarKeyguardViewManager = man;
@@ -603,6 +612,8 @@
             mNotificationListener = notificationListener;
             mNotificationLogger = notificationLogger;
             mWakefulnessLifecycle = createAwakeWakefulnessLifecycle();
+            mVisualStabilityManager = visualStabilityManager;
+            mViewHierarchyManager = viewHierarchyManager;
             mEntryManager = entryManager;
             mScrimController = scrimController;
             mFingerprintUnlockController = fingerprintUnlockController;
@@ -644,6 +655,7 @@
                     mDependency.get(NotificationListener.class),
                     metricsLogger,
                     mDependency.get(DeviceProvisionedController.class),
+                    mDependency.get(VisualStabilityManager.class),
                     mDependency.get(UiOffloadThread.class),
                     context);
             mSystemServicesProxy = systemServicesProxy;
@@ -651,13 +663,11 @@
         }
 
         public void setUpForTest(NotificationPresenter presenter,
-                NotificationStackScrollLayout stackScroller,
+                NotificationListContainer listContainer,
                 Callback callback,
-                VisualStabilityManager visualStabilityManager,
                 HeadsUpManager headsUpManager,
                 NotificationData notificationData) {
-            super.setUpWithPresenter(presenter, stackScroller, callback, visualStabilityManager,
-                    headsUpManager);
+            super.setUpWithPresenter(presenter, listContainer, callback, headsUpManager);
             mNotificationData = notificationData;
             mUseHeadsUp = true;
         }