Merge "Ensure the overflow is added first to the bubble bar" into udc-qpr-dev am: 434c907531 am: 4f8962217b

Original change: https://googleplex-android-review.googlesource.com/c/platform/packages/apps/Launcher3/+/23781224

Change-Id: I58e50f815e9fc091a9fb80ce8f33eea1f7e67184
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
diff --git a/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleBarController.java b/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleBarController.java
index 2bd6fcb..6b5c962 100644
--- a/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleBarController.java
+++ b/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleBarController.java
@@ -185,16 +185,26 @@
             mBubbleBarViewController.setHiddenForBubbles(!BUBBLE_BAR_ENABLED);
             mBubbleStashedHandleViewController.setHiddenForBubbles(!BUBBLE_BAR_ENABLED);
         });
+    }
 
-        BUBBLE_STATE_EXECUTOR.execute(() -> {
-            if (mOverflowBubble == null) {
-                BubbleBarOverflow overflow = createOverflow(mContext);
-                mMainExecutor.execute(() -> {
+    /**
+     * Creates and adds the overflow bubble to the bubble bar if it hasn't been created yet.
+     *
+     * <p>This should be called on the {@link #BUBBLE_STATE_EXECUTOR} executor to avoid inflating
+     * the overflow multiple times.
+     */
+    private void createAndAddOverflowIfNeeded() {
+        if (mOverflowBubble == null) {
+            BubbleBarOverflow overflow = createOverflow(mContext);
+            mMainExecutor.execute(() -> {
+                // we're on the main executor now, so check that the overflow hasn't been created
+                // again to avoid races.
+                if (mOverflowBubble == null) {
                     mBubbleBarViewController.addBubble(overflow);
                     mOverflowBubble = overflow;
-                });
-            }
-        });
+                }
+            });
+        }
     }
 
     /**
@@ -226,6 +236,7 @@
                 || !update.currentBubbleList.isEmpty()) {
             // We have bubbles to load
             BUBBLE_STATE_EXECUTOR.execute(() -> {
+                createAndAddOverflowIfNeeded();
                 if (update.addedBubble != null) {
                     viewUpdate.addedBubble = populateBubble(update.addedBubble, mContext, mBarView);
                 }