Add a way to fade out taskbar view when closing an app in the taskbar.

Prior to this change, if taskbar is showing and we are cloing an app
that is visible in the taskbar, the taskbar view would immediately
disappear.

Now we will fade out the view until the animation is 33% complete,
at which point the 'space' will be clear for the FloatingIconView
to settle at its final location.

Bug: 273961611
Test: open app in hotseat
      note that the taskbar view is gone immediately
      have taskbar visible, close app that is shown in taskbar
      note that the taskbar view fades out

Change-Id: I5589e2ce3033cfa19669d1bfaf568aef2a96015e
diff --git a/quickstep/src/com/android/launcher3/QuickstepTransitionManager.java b/quickstep/src/com/android/launcher3/QuickstepTransitionManager.java
index 59bb244..8abdb53 100644
--- a/quickstep/src/com/android/launcher3/QuickstepTransitionManager.java
+++ b/quickstep/src/com/android/launcher3/QuickstepTransitionManager.java
@@ -638,7 +638,8 @@
                 (mLauncher.getTaskbarUIController() == null || !isTransientTaskbar(mLauncher))
                         ? null
                         : mLauncher.getTaskbarUIController().findMatchingView(v),
-                !appTargetsAreTranslucent, launcherIconBounds, true /* isOpening */);
+                null /* fadeOutView */, !appTargetsAreTranslucent, launcherIconBounds,
+                true /* isOpening */);
         Rect crop = new Rect();
         Matrix matrix = new Matrix();
 
@@ -1352,7 +1353,7 @@
                     mDeviceProfile.isMultiWindowMode ? 0 : getWindowCornerRadius(mLauncher),
                     isTransluscent, fallbackBackgroundColor);
         } else if (launcherView != null) {
-            floatingIconView = getFloatingIconView(mLauncher, launcherView,
+            floatingIconView = getFloatingIconView(mLauncher, launcherView, null,
                     mLauncher.getTaskbarUIController() == null
                             ? null
                             : mLauncher.getTaskbarUIController().findMatchingView(launcherView),
diff --git a/quickstep/src/com/android/quickstep/LauncherSwipeHandlerV2.java b/quickstep/src/com/android/quickstep/LauncherSwipeHandlerV2.java
index 1dfad16..d966ec3 100644
--- a/quickstep/src/com/android/quickstep/LauncherSwipeHandlerV2.java
+++ b/quickstep/src/com/android/quickstep/LauncherSwipeHandlerV2.java
@@ -104,7 +104,7 @@
 
     private HomeAnimationFactory createIconHomeAnimationFactory(View workspaceView) {
         RectF iconLocation = new RectF();
-        FloatingIconView floatingIconView = getFloatingIconView(mActivity, workspaceView,
+        FloatingIconView floatingIconView = getFloatingIconView(mActivity, workspaceView, null,
                 mActivity.getTaskbarUIController() == null
                         ? null
                         : mActivity.getTaskbarUIController().findMatchingView(workspaceView),
diff --git a/src/com/android/launcher3/views/FloatingIconView.java b/src/com/android/launcher3/views/FloatingIconView.java
index 172b405..c3633db 100644
--- a/src/com/android/launcher3/views/FloatingIconView.java
+++ b/src/com/android/launcher3/views/FloatingIconView.java
@@ -19,6 +19,8 @@
 
 import static com.android.launcher3.Utilities.getBadge;
 import static com.android.launcher3.Utilities.getFullDrawable;
+import static com.android.launcher3.Utilities.mapToRange;
+import static com.android.launcher3.anim.Interpolators.LINEAR;
 import static com.android.launcher3.util.Executors.MODEL_EXECUTOR;
 import static com.android.launcher3.views.IconLabelDotView.setIconAndDotVisible;
 
@@ -98,6 +100,9 @@
     // A view whose visibility should update in sync with mOriginalIcon.
     private @Nullable View mMatchVisibilityView;
 
+    // A view that will fade out as the animation progresses.
+    private @Nullable View mFadeOutView;
+
     private View mOriginalIcon;
     private RectF mPositionOut;
     private Runnable mOnTargetChangeRunnable;
@@ -156,6 +161,11 @@
         setAlpha(alpha);
         mClipIconView.update(rect, progress, shapeProgressStart, cornerRadius, isOpening, this,
                 mLauncher.getDeviceProfile());
+
+        if (mFadeOutView != null) {
+            // The alpha goes from 1 to 0 when progress is 0 and 0.33 respectively.
+            mFadeOutView.setAlpha(1 - Math.min(1f, mapToRange(progress, 0, 0.33f, 0, 1, LINEAR)));
+        }
     }
 
     @Override
@@ -564,14 +574,16 @@
     /**
      * Creates a floating icon view for {@param originalView}.
      * @param originalView The view to copy
-     * @param secondView A view whose visibility should update in sync with originalView.
+     * @param visibilitySyncView A view whose visibility should update in sync with originalView.
+     * @param fadeOutView A view that will fade out as the animation progresses.
      * @param hideOriginal If true, it will hide {@param originalView} while this view is visible.
      *                     Else, we will not draw anything in this view.
      * @param positionOut Rect that will hold the size and position of v.
      * @param isOpening True if this view replaces the icon for app open animation.
      */
     public static FloatingIconView getFloatingIconView(Launcher launcher, View originalView,
-            @Nullable View secondView, boolean hideOriginal, RectF positionOut, boolean isOpening) {
+            @Nullable View visibilitySyncView, @Nullable View fadeOutView, boolean hideOriginal,
+            RectF positionOut, boolean isOpening) {
         final DragLayer dragLayer = launcher.getDragLayer();
         ViewGroup parent = (ViewGroup) dragLayer.getParent();
         FloatingIconView view = launcher.getViewCache().getView(R.layout.floating_icon_view,
@@ -581,7 +593,8 @@
         // Init properties before getting the drawable.
         view.mIsOpening = isOpening;
         view.mOriginalIcon = originalView;
-        view.mMatchVisibilityView = secondView;
+        view.mMatchVisibilityView = visibilitySyncView;
+        view.mFadeOutView = fadeOutView;
         view.mPositionOut = positionOut;
 
         // Get the drawable on the background thread
@@ -610,6 +623,10 @@
         view.mEndRunnable = () -> {
             view.mEndRunnable = null;
 
+            if (view.mFadeOutView != null) {
+                view.mFadeOutView.setAlpha(1f);
+            }
+
             if (hideOriginal) {
                 view.updateViewsVisibility(true /* isVisible */);
                 view.finish(dragLayer);
@@ -669,6 +686,8 @@
         mBtvDrawable.setBackground(null);
         mFastFinishRunnable = null;
         mIconOffsetY = 0;
+        mMatchVisibilityView = null;
+        mFadeOutView = null;
     }
 
     private static class IconLoadResult {