BubbleData [2/n]: adds Listener interface

This change introduces an interface which BubbleData will use to
report changes to the state of bubbles on-screen. This will allow
BubbleData to implement and propagate ordering and grouping changes.

Bug: 123542488
Test: atest BubbleControllerTest
Change-Id: I35708c45e23fed4369605eecd986cdff96e23d34
diff --git a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleController.java b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleController.java
index b1e2212..5acf3c2 100644
--- a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleController.java
+++ b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleController.java
@@ -216,6 +216,7 @@
         }
 
         mBubbleData = data;
+        mBubbleData.setListener(mBubbleDataListener);
         mSurfaceSynchronizer = synchronizer;
     }
 
@@ -438,6 +439,47 @@
         }
     };
 
+    private final BubbleData.Listener mBubbleDataListener = new BubbleData.Listener() {
+        @Override
+        public void onBubbleAdded(Bubble bubble) {
+
+        }
+
+        @Override
+        public void onBubbleRemoved(Bubble bubble, int reason) {
+
+        }
+
+        public void onBubbleUpdated(Bubble bubble) {
+
+        }
+
+        @Override
+        public void onOrderChanged(List<Bubble> bubbles) {
+
+        }
+
+        @Override
+        public void onSelectionChanged(Bubble selectedBubble) {
+
+        }
+
+        @Override
+        public void onExpandedChanged(boolean expanded) {
+
+        }
+
+        @Override
+        public void showFlyoutText(Bubble bubble, String text) {
+
+        }
+
+        @Override
+        public void apply() {
+
+        }
+    };
+
     /**
      * Lets any listeners know if bubble state has changed.
      */
diff --git a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleData.java b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleData.java
index 3609835..cf70287 100644
--- a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleData.java
+++ b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleData.java
@@ -22,6 +22,7 @@
 
 import java.util.Collection;
 import java.util.HashMap;
+import java.util.List;
 
 import javax.inject.Inject;
 import javax.inject.Singleton;
@@ -32,7 +33,61 @@
 @Singleton
 public class BubbleData {
 
+    /**
+     * This interface reports changes to the state and appearance of bubbles which should be applied
+     * as necessary to the UI.
+     * <p>
+     * Each operation is a report of a pending operation. Each should be considered in
+     * combination, when {@link #apply()} is called. For example, both: onExpansionChanged,
+     * and onOrderChanged
+     */
+    interface Listener {
+
+        /**
+         * A new Bubble has been added. A call to {@link #onOrderChanged(List)} will
+         * follow, including the new Bubble in position
+         */
+        void onBubbleAdded(Bubble bubble);
+
+        /**
+         * A Bubble has been removed. A call to {@link #onOrderChanged(List)} will
+         * follow.
+         */
+        void onBubbleRemoved(Bubble bubble, @BubbleController.DismissReason int reason);
+
+        /**
+         * An existing bubble has been updated.
+         *
+         * @param bubble the bubble which was updated
+         */
+        void onBubbleUpdated(Bubble bubble);
+
+        /**
+         * Indicates that one or more bubbles should change position. This may be result of insert,
+         * or removal of a Bubble, in addition to re-sorting existing Bubbles.
+         *
+         * @param bubbles an immutable list of the bubbles in the new order
+         */
+        void onOrderChanged(List<Bubble> bubbles);
+
+        /** Indicates the selected bubble changed. */
+        void onSelectionChanged(Bubble selectedBubble);
+
+        /**
+         * The UI should transition to the given state, incorporating any pending changes during
+         * the animation.
+         */
+        void onExpandedChanged(boolean expanded);
+
+        /** Flyout text should animate in, showing the given text. */
+        void showFlyoutText(Bubble bubble, String text);
+
+        /** Commit any pending operations (since last call of apply()) */
+        void apply();
+    }
+
     private HashMap<String, Bubble> mBubbles = new HashMap<>();
+    private Listener mListener;
 
     @VisibleForTesting
     @Inject
@@ -69,4 +124,8 @@
     public void clear() {
         mBubbles.clear();
     }
+
+    public void setListener(Listener listener) {
+        mListener = listener;
+    }
 }