Cleaning up some no-op calls during workspace binding

Bug: 318539160
Flag: None
Test: Manual
Change-Id: Ida21d849a06ed9c0ebf5671214dd9ee8525288d3
diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java
index 2b203e1..2471254 100644
--- a/src/com/android/launcher3/Launcher.java
+++ b/src/com/android/launcher3/Launcher.java
@@ -237,7 +237,6 @@
 import com.android.launcher3.util.Thunk;
 import com.android.launcher3.util.TouchController;
 import com.android.launcher3.util.TraceHelper;
-import com.android.launcher3.util.ViewOnDrawExecutor;
 import com.android.launcher3.views.ActivityContext;
 import com.android.launcher3.views.ComposeInitializer;
 import com.android.launcher3.views.FloatingIconView;
@@ -2233,12 +2232,6 @@
         return info;
     }
 
-    public void clearPendingExecutor(ViewOnDrawExecutor executor) {
-        if (mModelCallbacks.getPendingExecutor() == executor) {
-            mModelCallbacks.setPendingExecutor(null);
-        }
-    }
-
     /**
      * Call back when ModelCallbacks finish binding the Launcher data.
      */
diff --git a/src/com/android/launcher3/ModelCallbacks.kt b/src/com/android/launcher3/ModelCallbacks.kt
index f6bc1f1..0e38007 100644
--- a/src/com/android/launcher3/ModelCallbacks.kt
+++ b/src/com/android/launcher3/ModelCallbacks.kt
@@ -3,7 +3,6 @@
 import android.annotation.TargetApi
 import android.os.Build
 import android.os.Trace
-import android.view.ViewTreeObserver.OnDrawListener
 import androidx.annotation.UiThread
 import com.android.launcher3.LauncherConstants.TraceEvents
 import com.android.launcher3.WorkspaceLayoutManager.FIRST_SCREEN_ID
@@ -18,7 +17,6 @@
 import com.android.launcher3.model.data.WorkspaceItemInfo
 import com.android.launcher3.popup.PopupContainerWithArrow
 import com.android.launcher3.util.ComponentKey
-import com.android.launcher3.util.Executors
 import com.android.launcher3.util.IntArray as LIntArray
 import com.android.launcher3.util.IntSet as LIntSet
 import com.android.launcher3.util.PackageUserKey
@@ -77,11 +75,15 @@
         workspaceItemCount: Int,
         isBindSync: Boolean
     ) {
+        if (Utilities.ATLEAST_S) {
+            Trace.endAsyncSection(
+                TraceEvents.DISPLAY_WORKSPACE_TRACE_METHOD_NAME,
+                TraceEvents.DISPLAY_WORKSPACE_TRACE_COOKIE
+            )
+        }
         synchronouslyBoundPages = boundPages
         pagesToBindSynchronously = LIntSet()
         clearPendingBinds()
-        val executor = ViewOnDrawExecutor(pendingTasks)
-        pendingExecutor = executor
         if (!launcher.isInState(LauncherState.ALL_APPS)) {
             launcher.appsView.appsStore.enableDeferUpdates(AllAppsStore.DEFER_UPDATES_NEXT_DRAW)
             pendingTasks.add {
@@ -90,24 +92,15 @@
                 )
             }
         }
-        executor.onLoadAnimationCompleted()
-        executor.attachTo(launcher)
-        if (Utilities.ATLEAST_S) {
-            Trace.endAsyncSection(
-                TraceEvents.DISPLAY_WORKSPACE_TRACE_METHOD_NAME,
-                TraceEvents.DISPLAY_WORKSPACE_TRACE_COOKIE
-            )
-        }
-        launcher.bindComplete(workspaceItemCount, isBindSync)
-        launcher.rootView.viewTreeObserver.addOnDrawListener(
-            object : OnDrawListener {
-                override fun onDraw() {
-                    Executors.MAIN_EXECUTOR.handler.postAtFrontOfQueue {
-                        launcher.rootView.getViewTreeObserver().removeOnDrawListener(this)
-                    }
+        val executor =
+            ViewOnDrawExecutor(pendingTasks) {
+                if (pendingExecutor == it) {
+                    pendingExecutor = null
                 }
             }
-        )
+        pendingExecutor = executor
+        executor.attachTo(launcher)
+        launcher.bindComplete(workspaceItemCount, isBindSync)
     }
 
     /**
diff --git a/src/com/android/launcher3/util/ViewOnDrawExecutor.java b/src/com/android/launcher3/util/ViewOnDrawExecutor.java
index fada4a3..26bfd36 100644
--- a/src/com/android/launcher3/util/ViewOnDrawExecutor.java
+++ b/src/com/android/launcher3/util/ViewOnDrawExecutor.java
@@ -20,6 +20,8 @@
 import android.view.View.OnAttachStateChangeListener;
 import android.view.ViewTreeObserver.OnDrawListener;
 
+import androidx.annotation.NonNull;
+
 import com.android.launcher3.Launcher;
 
 import java.util.function.Consumer;
@@ -31,26 +33,23 @@
         OnAttachStateChangeListener {
 
     private final RunnableList mTasks;
-
-    private Consumer<ViewOnDrawExecutor> mOnClearCallback;
+    private final Consumer<ViewOnDrawExecutor> mOnClearCallback;
     private View mAttachedView;
     private boolean mCompleted;
 
-    private boolean mLoadAnimationCompleted;
     private boolean mFirstDrawCompleted;
 
     private boolean mCancelled;
 
-    public ViewOnDrawExecutor(RunnableList tasks) {
+    public ViewOnDrawExecutor(RunnableList tasks,
+            @NonNull Consumer<ViewOnDrawExecutor> onClearCallback) {
         mTasks = tasks;
+        mOnClearCallback = onClearCallback;
     }
 
     public void attachTo(Launcher launcher) {
-        mOnClearCallback = launcher::clearPendingExecutor;
         mAttachedView = launcher.getWorkspace();
-
         mAttachedView.addOnAttachStateChangeListener(this);
-
         if (mAttachedView.isAttachedToWindow()) {
             attachObserver();
         }
@@ -77,17 +76,10 @@
         mAttachedView.post(this);
     }
 
-    public void onLoadAnimationCompleted() {
-        mLoadAnimationCompleted = true;
-        if (mAttachedView != null) {
-            mAttachedView.post(this);
-        }
-    }
-
     @Override
     public void run() {
-        // Post the pending tasks after both onDraw and onLoadAnimationCompleted have been called.
-        if (mLoadAnimationCompleted && mFirstDrawCompleted && !mCompleted) {
+        // Post the pending tasks after first draw
+        if (mFirstDrawCompleted && !mCompleted) {
             markCompleted();
         }
     }
@@ -104,9 +96,8 @@
             mAttachedView.getViewTreeObserver().removeOnDrawListener(this);
             mAttachedView.removeOnAttachStateChangeListener(this);
         }
-        if (mOnClearCallback != null) {
-            mOnClearCallback.accept(this);
-        }
+
+        mOnClearCallback.accept(this);
     }
 
     public void cancel() {