Merge "Fix quick switch from home biased towards returning home" into ub-launcher3-qt-future-dev
diff --git a/quickstep/recents_ui_overrides/src/com/android/launcher3/uioverrides/touchcontrollers/NoButtonQuickSwitchTouchController.java b/quickstep/recents_ui_overrides/src/com/android/launcher3/uioverrides/touchcontrollers/NoButtonQuickSwitchTouchController.java
index 7dec014..76374af 100644
--- a/quickstep/recents_ui_overrides/src/com/android/launcher3/uioverrides/touchcontrollers/NoButtonQuickSwitchTouchController.java
+++ b/quickstep/recents_ui_overrides/src/com/android/launcher3/uioverrides/touchcontrollers/NoButtonQuickSwitchTouchController.java
@@ -409,8 +409,8 @@
             updateNonOverviewAnim(targetState, new AnimatorSetBuilder(), 0 /* animComponents */);
             nonOverviewAnim = mNonOverviewAnim.getAnimationPlayer();
 
-            new StaggeredWorkspaceAnim(mLauncher, null, velocity.y,
-                    false /* animateOverviewScrim */).start();
+            new StaggeredWorkspaceAnim(mLauncher, velocity.y, false /* animateOverviewScrim */)
+                    .start();
         } else {
             boolean canceled = targetState == NORMAL;
             if (canceled) {
diff --git a/quickstep/recents_ui_overrides/src/com/android/quickstep/LauncherActivityControllerHelper.java b/quickstep/recents_ui_overrides/src/com/android/quickstep/LauncherActivityControllerHelper.java
index eefde12..c0be9ec 100644
--- a/quickstep/recents_ui_overrides/src/com/android/quickstep/LauncherActivityControllerHelper.java
+++ b/quickstep/recents_ui_overrides/src/com/android/quickstep/LauncherActivityControllerHelper.java
@@ -166,8 +166,8 @@
 
             @Override
             public void playAtomicAnimation(float velocity) {
-                new StaggeredWorkspaceAnim(activity, workspaceView, velocity,
-                        true /* animateOverviewScrim */).start();
+                new StaggeredWorkspaceAnim(activity, velocity, true /* animateOverviewScrim */)
+                        .start();
             }
         };
     }
diff --git a/quickstep/recents_ui_overrides/src/com/android/quickstep/util/StaggeredWorkspaceAnim.java b/quickstep/recents_ui_overrides/src/com/android/quickstep/util/StaggeredWorkspaceAnim.java
index 5f02de2..958ef7d 100644
--- a/quickstep/recents_ui_overrides/src/com/android/quickstep/util/StaggeredWorkspaceAnim.java
+++ b/quickstep/recents_ui_overrides/src/com/android/quickstep/util/StaggeredWorkspaceAnim.java
@@ -28,8 +28,6 @@
 import android.view.View;
 import android.view.ViewGroup;
 
-import androidx.annotation.Nullable;
-
 import com.android.launcher3.CellLayout;
 import com.android.launcher3.DeviceProfile;
 import com.android.launcher3.Launcher;
@@ -43,7 +41,6 @@
 import com.android.launcher3.anim.PropertySetter;
 import com.android.launcher3.anim.SpringObjectAnimator;
 import com.android.launcher3.graphics.OverviewScrim;
-import com.android.launcher3.views.IconLabelDotView;
 import com.android.quickstep.views.RecentsView;
 
 import java.util.ArrayList;
@@ -67,20 +64,12 @@
     private final float mVelocity;
     private final float mSpringTransY;
 
-    // The original view of the {@link FloatingIconView}.
-    private final View mOriginalView;
-
     private final List<Animator> mAnimators = new ArrayList<>();
 
-    /**
-     * @param floatingViewOriginalView The FloatingIconView's original view.
-     */
-    public StaggeredWorkspaceAnim(Launcher launcher, @Nullable View floatingViewOriginalView,
-            float velocity, boolean animateOverviewScrim) {
+    public StaggeredWorkspaceAnim(Launcher launcher, float velocity, boolean animateOverviewScrim) {
         prepareToAnimate(launcher);
 
         mVelocity = velocity;
-        mOriginalView = floatingViewOriginalView;
 
         // Scale the translationY based on the initial velocity to better sync the workspace items
         // with the floating view.
@@ -212,35 +201,12 @@
         springTransY.setStartDelay(startDelay);
         mAnimators.add(springTransY);
 
-        ObjectAnimator alpha = getAlphaAnimator(v, startDelay);
-        if (v == mOriginalView) {
-            // For IconLabelDotViews, we just want the label to fade in.
-            // Icon, badge, and dots will animate in separately (controlled via FloatingIconView)
-            if (v instanceof IconLabelDotView) {
-                alpha.addListener(new AnimatorListenerAdapter() {
-                    @Override
-                    public void onAnimationStart(Animator animation) {
-                        IconLabelDotView view = (IconLabelDotView) v;
-                        view.setIconVisible(false);
-                        view.setForceHideDot(true);
-                    }
-                });
-            } else {
-                return;
-            }
-        }
-
         v.setAlpha(0);
-        mAnimators.add(alpha);
-    }
-
-    private ObjectAnimator getAlphaAnimator(View v, long startDelay) {
         ObjectAnimator alpha = ObjectAnimator.ofFloat(v, View.ALPHA, 0f, 1f);
         alpha.setInterpolator(LINEAR);
         alpha.setDuration(ALPHA_DURATION_MS);
         alpha.setStartDelay(startDelay);
-        return alpha;
-
+        mAnimators.add(alpha);
     }
 
     private void addScrimAnimationForState(Launcher launcher, LauncherState state, long duration) {
diff --git a/src/com/android/launcher3/views/FloatingIconView.java b/src/com/android/launcher3/views/FloatingIconView.java
index 45c0d90..49d94f0 100644
--- a/src/com/android/launcher3/views/FloatingIconView.java
+++ b/src/com/android/launcher3/views/FloatingIconView.java
@@ -560,7 +560,7 @@
      * Checks if the icon result is loaded. If true, we set the icon immediately. Else, we add a
      * callback to set the icon once the icon result is loaded.
      */
-    private void checkIconResult(View originalView, boolean isOpening) {
+    private void checkIconResult(View originalView) {
         CancellationSignal cancellationSignal = new CancellationSignal();
 
         if (mIconLoadResult == null) {
@@ -572,9 +572,7 @@
             if (mIconLoadResult.isIconLoaded) {
                 setIcon(originalView, mIconLoadResult.drawable, mIconLoadResult.badge,
                         mIconLoadResult.iconOffset);
-                if (isOpening) {
-                    hideOriginalView(originalView);
-                }
+                hideOriginalView(originalView);
             } else {
                 mIconLoadResult.onIconLoaded = () -> {
                     if (cancellationSignal.isCanceled()) {
@@ -583,12 +581,8 @@
 
                     setIcon(originalView, mIconLoadResult.drawable, mIconLoadResult.badge,
                             mIconLoadResult.iconOffset);
-
                     setVisibility(VISIBLE);
-                    if (isOpening) {
-                        // Delay swapping views until the icon is loaded to prevent a flash.
-                        hideOriginalView(originalView);
-                    }
+                    hideOriginalView(originalView);
                 };
                 mLoadIconSignal = cancellationSignal;
             }
@@ -596,9 +590,9 @@
     }
 
     private void hideOriginalView(View originalView) {
-        if (originalView instanceof BubbleTextView) {
-            ((BubbleTextView) originalView).setIconVisible(false);
-            ((BubbleTextView) originalView).setForceHideDot(true);
+        if (originalView instanceof IconLabelDotView) {
+            ((IconLabelDotView) originalView).setIconVisible(false);
+            ((IconLabelDotView) originalView).setForceHideDot(true);
         } else {
             originalView.setVisibility(INVISIBLE);
         }
@@ -674,6 +668,9 @@
     }
 
     public void fastFinish() {
+        if (mLoadIconSignal != null) {
+            mLoadIconSignal.cancel();
+        }
         if (mEndRunnable != null) {
             mEndRunnable.run();
             mEndRunnable = null;
@@ -689,6 +686,10 @@
         if (mIconLoadResult != null && mIconLoadResult.isIconLoaded) {
             setVisibility(View.VISIBLE);
         }
+        if (!mIsOpening) {
+            // When closing an app, we want the item on the workspace to be invisible immediately
+            hideOriginalView(mOriginalIcon);
+        }
     }
 
     @Override
@@ -798,7 +799,7 @@
         // Must be called after the fastFinish listener and end runnable is created so that
         // the icon is not left in a hidden state.
         if (shouldLoadIcon) {
-            view.checkIconResult(originalView, isOpening);
+            view.checkIconResult(originalView);
         }
 
         return view;
@@ -842,6 +843,7 @@
                 @Override
                 public void onAnimationStart(Animator animation) {
                     btv.setIconVisible(true);
+                    btv.setForceHideDot(true);
                 }
             });
             fade.play(ObjectAnimator.ofInt(btv.getIcon(), DRAWABLE_ALPHA, 0, 255));