Merge "Add a way to fade out taskbar view when closing an app in the taskbar." into tm-qpr-dev am: 149246f077 am: ce06cf89b0

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

Change-Id: I919b45021c1fbc2a5d5c30c2d5eca71a672cd5be
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
diff --git a/quickstep/src/com/android/launcher3/QuickstepTransitionManager.java b/quickstep/src/com/android/launcher3/QuickstepTransitionManager.java
index 537b208..8baa324 100644
--- a/quickstep/src/com/android/launcher3/QuickstepTransitionManager.java
+++ b/quickstep/src/com/android/launcher3/QuickstepTransitionManager.java
@@ -641,7 +641,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();
 
@@ -1362,7 +1363,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 3267ba4..43ad175 100644
--- a/quickstep/src/com/android/quickstep/LauncherSwipeHandlerV2.java
+++ b/quickstep/src/com/android/quickstep/LauncherSwipeHandlerV2.java
@@ -105,7 +105,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 {