Cover thumbnail view instead of TaskView for split animation

Fixes: 219622592
Test: Slowed down animation and verified same as before
refactor was done.

Change-Id: Iec8dc9ea1d7925575c3a3b84e12653829a00d8dd
This commit is contained in:
Vinit Nayak
2022-02-14 18:52:52 -08:00
parent b70131e1dd
commit 12a24dca8d
2 changed files with 35 additions and 10 deletions
@@ -30,9 +30,11 @@ import com.android.launcher3.touch.PagedOrientationHandler;
import com.android.launcher3.views.BaseDragLayer;
import com.android.quickstep.util.MultiValueUpdateListener;
import java.util.function.Consumer;
/**
* Create an instance via
* {@link #getFloatingTaskView(StatefulActivity, View, Bitmap, Drawable, RectF)} to
* {@link #getFloatingTaskView(StatefulActivity, View, Bitmap, Drawable, RectF, Consumer)} to
* which will have the thumbnail from the provided existing TaskView overlaying the taskview itself.
*
* Can then animate the taskview using
@@ -46,6 +48,8 @@ public class FloatingTaskView extends FrameLayout {
private SplitPlaceholderView mSplitPlaceholderView;
private RectF mStartingPosition;
@Nullable
private Consumer<RectF> mAdditionalOffsetter;
private final StatefulActivity mActivity;
private final boolean mIsRtl;
private final Rect mOutline = new Rect();
@@ -77,8 +81,9 @@ public class FloatingTaskView extends FrameLayout {
}
private void init(StatefulActivity launcher, View originalView, @Nullable Bitmap thumbnail,
Drawable icon, RectF positionOut) {
Drawable icon, RectF positionOut, Consumer<RectF> additionalOffsetter) {
mStartingPosition = positionOut;
mAdditionalOffsetter = additionalOffsetter;
updateInitialPositionForView(originalView);
final InsettableFrameLayout.LayoutParams lp =
(InsettableFrameLayout.LayoutParams) getLayoutParams();
@@ -102,15 +107,21 @@ public class FloatingTaskView extends FrameLayout {
/**
* Configures and returns a an instance of {@link FloatingTaskView} initially matching the
* appearance of {@code originalView}.
*
* @param additionalOffsetter optional, to set additional offsets to the FloatingTaskView
* to account for translations. If {@code null} then the
* translation values from originalView will be used
*/
public static FloatingTaskView getFloatingTaskView(StatefulActivity launcher,
View originalView, @Nullable Bitmap thumbnail, Drawable icon, RectF positionOut) {
View originalView, @Nullable Bitmap thumbnail, Drawable icon, RectF positionOut,
@Nullable Consumer<RectF> additionalOffsetter) {
final BaseDragLayer dragLayer = launcher.getDragLayer();
ViewGroup parent = (ViewGroup) dragLayer.getParent();
final FloatingTaskView floatingView = (FloatingTaskView) launcher.getLayoutInflater()
.inflate(R.layout.floating_split_select_view, parent, false);
floatingView.init(launcher, originalView, thumbnail, icon, positionOut);
floatingView.init(launcher, originalView, thumbnail, icon, positionOut,
additionalOffsetter);
parent.addView(floatingView);
return floatingView;
}
@@ -120,7 +131,12 @@ public class FloatingTaskView extends FrameLayout {
Utilities.getBoundsForViewInDragLayer(mActivity.getDragLayer(), originalView, viewBounds,
true /* ignoreTransform */, null /* recycle */,
mStartingPosition);
mStartingPosition.offset(originalView.getTranslationX(), originalView.getTranslationY());
if (mAdditionalOffsetter != null) {
mAdditionalOffsetter.accept(mStartingPosition);
} else {
mStartingPosition.offset(originalView.getTranslationX(),
originalView.getTranslationY());
}
final InsettableFrameLayout.LayoutParams lp = new InsettableFrameLayout.LayoutParams(
Math.round(mStartingPosition.width()),
Math.round(mStartingPosition.height()));
@@ -2723,8 +2723,13 @@ public abstract class RecentsView<ACTIVITY_TYPE extends StatefulActivity<STATE_T
if (mSplitHiddenTaskView != null) {
mSplitHiddenTaskView.setVisibility(INVISIBLE);
mFirstFloatingTaskView = FloatingTaskView.getFloatingTaskView(mActivity,
mSplitHiddenTaskView, mSplitHiddenTaskView.getThumbnail().getThumbnail(),
mSplitHiddenTaskView.getIconView().getDrawable(), startingTaskRect);
mSplitHiddenTaskView.getThumbnail(),
mSplitHiddenTaskView.getThumbnail().getThumbnail(),
mSplitHiddenTaskView.getIconView().getDrawable(), startingTaskRect,
floatingTaskViewStartingPosition -> floatingTaskViewStartingPosition.offset(
mSplitHiddenTaskView.getTranslationX(),
mSplitHiddenTaskView.getTranslationY()
));
mFirstFloatingTaskView.setAlpha(1);
mFirstFloatingTaskView.addAnimation(anim, startingTaskRect,
mTempRect, mSplitHiddenTaskView, true /*fadeWithThumbnail*/);
@@ -2732,7 +2737,7 @@ public abstract class RecentsView<ACTIVITY_TYPE extends StatefulActivity<STATE_T
mSplitSelectSource.view.setVisibility(INVISIBLE);
mFirstFloatingTaskView = FloatingTaskView.getFloatingTaskView(mActivity,
mSplitSelectSource.view, null,
mSplitSelectSource.drawable, startingTaskRect);
mSplitSelectSource.drawable, startingTaskRect, null /*additionalOffsetter*/);
mFirstFloatingTaskView.setAlpha(1);
mFirstFloatingTaskView.addAnimation(anim, startingTaskRect,
mTempRect, mSplitSelectSource.view, true /*fadeWithThumbnail*/);
@@ -4023,8 +4028,12 @@ public abstract class RecentsView<ACTIVITY_TYPE extends StatefulActivity<STATE_T
false /*fadeWithThumbnail*/);
mSecondFloatingTaskView = FloatingTaskView.getFloatingTaskView(mActivity,
taskView, taskView.getThumbnail().getThumbnail(),
taskView.getIconView().getDrawable(), secondTaskStartingBounds);
taskView.getThumbnail(), taskView.getThumbnail().getThumbnail(),
taskView.getIconView().getDrawable(), secondTaskStartingBounds,
floatingTaskViewStartingPosition -> floatingTaskViewStartingPosition.offset(
taskView.getTranslationX(),
taskView.getTranslationY()
));
mSecondFloatingTaskView.setAlpha(1);
mSecondFloatingTaskView.addAnimation(pendingAnimation, secondTaskStartingBounds,
secondTaskEndingBounds, taskView.getThumbnail(),