From c0c1c55c5d933687dfeda4f84d1f006f8586dcc8 Mon Sep 17 00:00:00 2001 From: Jon Miranda Date: Fri, 17 Mar 2023 10:01:34 -0700 Subject: [PATCH] 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 --- .../launcher3/QuickstepTransitionManager.java | 5 ++-- .../quickstep/LauncherSwipeHandlerV2.java | 2 +- .../launcher3/views/FloatingIconView.java | 25 ++++++++++++++++--- 3 files changed, 26 insertions(+), 6 deletions(-) diff --git a/quickstep/src/com/android/launcher3/QuickstepTransitionManager.java b/quickstep/src/com/android/launcher3/QuickstepTransitionManager.java index 59bb244975..8abdb53be3 100644 --- a/quickstep/src/com/android/launcher3/QuickstepTransitionManager.java +++ b/quickstep/src/com/android/launcher3/QuickstepTransitionManager.java @@ -638,7 +638,8 @@ public class QuickstepTransitionManager implements OnDeviceProfileChangeListener (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 @@ public class QuickstepTransitionManager implements OnDeviceProfileChangeListener 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 1dfad16d05..d966ec3c4a 100644 --- a/quickstep/src/com/android/quickstep/LauncherSwipeHandlerV2.java +++ b/quickstep/src/com/android/quickstep/LauncherSwipeHandlerV2.java @@ -104,7 +104,7 @@ public class LauncherSwipeHandlerV2 extends 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 172b40517a..c3633db11f 100644 --- a/src/com/android/launcher3/views/FloatingIconView.java +++ b/src/com/android/launcher3/views/FloatingIconView.java @@ -19,6 +19,8 @@ import static android.view.Gravity.LEFT; 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 @@ public class FloatingIconView extends FrameLayout implements // 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 @@ public class FloatingIconView extends FrameLayout implements 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 @@ public class FloatingIconView extends FrameLayout implements /** * 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 @@ public class FloatingIconView extends FrameLayout implements // 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 @@ public class FloatingIconView extends FrameLayout implements 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 @@ public class FloatingIconView extends FrameLayout implements mBtvDrawable.setBackground(null); mFastFinishRunnable = null; mIconOffsetY = 0; + mMatchVisibilityView = null; + mFadeOutView = null; } private static class IconLoadResult {