Merge "Using TaskViewSimulator for both Launcher and fallback recents" into ub-launcher3-rvc-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
ae5afa74cd
+205
-153
@@ -15,6 +15,8 @@
|
|||||||
*/
|
*/
|
||||||
package com.android.quickstep;
|
package com.android.quickstep;
|
||||||
|
|
||||||
|
import static com.android.launcher3.LauncherState.BACKGROUND_APP;
|
||||||
|
import static com.android.launcher3.LauncherState.OVERVIEW;
|
||||||
import static com.android.launcher3.anim.Interpolators.ACCEL_1_5;
|
import static com.android.launcher3.anim.Interpolators.ACCEL_1_5;
|
||||||
import static com.android.launcher3.anim.Interpolators.DEACCEL;
|
import static com.android.launcher3.anim.Interpolators.DEACCEL;
|
||||||
import static com.android.launcher3.config.FeatureFlags.ENABLE_QUICKSTEP_LIVE_TILE;
|
import static com.android.launcher3.config.FeatureFlags.ENABLE_QUICKSTEP_LIVE_TILE;
|
||||||
@@ -23,9 +25,13 @@ import static com.android.launcher3.util.VibratorWrapper.OVERVIEW_HAPTIC;
|
|||||||
import static com.android.launcher3.views.FloatingIconView.SHAPE_PROGRESS_DURATION;
|
import static com.android.launcher3.views.FloatingIconView.SHAPE_PROGRESS_DURATION;
|
||||||
|
|
||||||
import android.animation.Animator;
|
import android.animation.Animator;
|
||||||
|
import android.animation.AnimatorSet;
|
||||||
|
import android.animation.ObjectAnimator;
|
||||||
import android.annotation.TargetApi;
|
import android.annotation.TargetApi;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
|
import android.graphics.Matrix;
|
||||||
|
import android.graphics.Matrix.ScaleToFit;
|
||||||
import android.graphics.PointF;
|
import android.graphics.PointF;
|
||||||
import android.graphics.Rect;
|
import android.graphics.Rect;
|
||||||
import android.graphics.RectF;
|
import android.graphics.RectF;
|
||||||
@@ -35,32 +41,34 @@ import android.view.MotionEvent;
|
|||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.animation.Interpolator;
|
import android.view.animation.Interpolator;
|
||||||
|
|
||||||
|
import androidx.annotation.NonNull;
|
||||||
|
import androidx.annotation.Nullable;
|
||||||
import androidx.annotation.UiThread;
|
import androidx.annotation.UiThread;
|
||||||
|
|
||||||
import com.android.launcher3.BaseDraggingActivity;
|
import com.android.launcher3.BaseDraggingActivity;
|
||||||
import com.android.launcher3.DeviceProfile;
|
import com.android.launcher3.DeviceProfile;
|
||||||
import com.android.launcher3.InvariantDeviceProfile;
|
import com.android.launcher3.InvariantDeviceProfile;
|
||||||
import com.android.launcher3.R;
|
|
||||||
import com.android.launcher3.Utilities;
|
import com.android.launcher3.Utilities;
|
||||||
import com.android.launcher3.anim.AnimationSuccessListener;
|
import com.android.launcher3.anim.AnimationSuccessListener;
|
||||||
import com.android.launcher3.anim.AnimatorPlaybackController;
|
import com.android.launcher3.anim.AnimatorPlaybackController;
|
||||||
import com.android.launcher3.touch.PagedOrientationHandler;
|
import com.android.launcher3.touch.PagedOrientationHandler;
|
||||||
import com.android.launcher3.util.VibratorWrapper;
|
import com.android.launcher3.util.VibratorWrapper;
|
||||||
import com.android.launcher3.views.FloatingIconView;
|
import com.android.launcher3.views.FloatingIconView;
|
||||||
import com.android.quickstep.BaseActivityInterface.HomeAnimationFactory;
|
|
||||||
import com.android.quickstep.RecentsAnimationCallbacks.RecentsAnimationListener;
|
import com.android.quickstep.RecentsAnimationCallbacks.RecentsAnimationListener;
|
||||||
import com.android.quickstep.util.ActiveGestureLog;
|
import com.android.quickstep.util.ActiveGestureLog;
|
||||||
import com.android.quickstep.util.ActivityInitListener;
|
import com.android.quickstep.util.ActivityInitListener;
|
||||||
import com.android.quickstep.util.AppWindowAnimationHelper;
|
|
||||||
import com.android.quickstep.util.RecentsOrientedState;
|
|
||||||
import com.android.quickstep.util.RectFSpringAnim;
|
import com.android.quickstep.util.RectFSpringAnim;
|
||||||
|
import com.android.quickstep.util.TaskViewSimulator;
|
||||||
import com.android.quickstep.util.TransformParams;
|
import com.android.quickstep.util.TransformParams;
|
||||||
|
import com.android.quickstep.util.TransformParams.BuilderProxy;
|
||||||
|
import com.android.quickstep.util.WindowSizeStrategy;
|
||||||
import com.android.quickstep.views.RecentsView;
|
import com.android.quickstep.views.RecentsView;
|
||||||
import com.android.quickstep.views.TaskView;
|
import com.android.quickstep.views.TaskView;
|
||||||
import com.android.systemui.shared.recents.model.ThumbnailData;
|
import com.android.systemui.shared.recents.model.ThumbnailData;
|
||||||
import com.android.systemui.shared.system.InputConsumerController;
|
import com.android.systemui.shared.system.InputConsumerController;
|
||||||
import com.android.systemui.shared.system.RemoteAnimationTargetCompat;
|
import com.android.systemui.shared.system.RemoteAnimationTargetCompat;
|
||||||
import com.android.systemui.shared.system.SyncRtSurfaceTransactionApplierCompat;
|
import com.android.systemui.shared.system.SyncRtSurfaceTransactionApplierCompat;
|
||||||
|
import com.android.systemui.shared.system.SyncRtSurfaceTransactionApplierCompat.SurfaceParams.Builder;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.function.Consumer;
|
import java.util.function.Consumer;
|
||||||
@@ -93,7 +101,9 @@ public abstract class BaseSwipeUpHandler<T extends BaseDraggingActivity, Q exten
|
|||||||
protected final BaseActivityInterface<T> mActivityInterface;
|
protected final BaseActivityInterface<T> mActivityInterface;
|
||||||
protected final InputConsumerController mInputConsumer;
|
protected final InputConsumerController mInputConsumer;
|
||||||
|
|
||||||
protected AppWindowAnimationHelper mAppWindowAnimationHelper;
|
protected final TaskViewSimulator mTaskViewSimulator;
|
||||||
|
private AnimatorPlaybackController mWindowTransitionController;
|
||||||
|
|
||||||
protected final TransformParams mTransformParams = new TransformParams();
|
protected final TransformParams mTransformParams = new TransformParams();
|
||||||
|
|
||||||
// Shift in the range of [0, 1].
|
// Shift in the range of [0, 1].
|
||||||
@@ -113,7 +123,6 @@ public abstract class BaseSwipeUpHandler<T extends BaseDraggingActivity, Q exten
|
|||||||
protected T mActivity;
|
protected T mActivity;
|
||||||
protected Q mRecentsView;
|
protected Q mRecentsView;
|
||||||
protected DeviceProfile mDp;
|
protected DeviceProfile mDp;
|
||||||
private final int mPageSpacing;
|
|
||||||
|
|
||||||
protected Runnable mGestureEndCallback;
|
protected Runnable mGestureEndCallback;
|
||||||
|
|
||||||
@@ -122,18 +131,16 @@ public abstract class BaseSwipeUpHandler<T extends BaseDraggingActivity, Q exten
|
|||||||
protected boolean mCanceled;
|
protected boolean mCanceled;
|
||||||
protected int mLastStartedTaskId = -1;
|
protected int mLastStartedTaskId = -1;
|
||||||
|
|
||||||
private RecentsOrientedState mOrientedState;
|
|
||||||
|
|
||||||
protected BaseSwipeUpHandler(Context context, RecentsAnimationDeviceState deviceState,
|
protected BaseSwipeUpHandler(Context context, RecentsAnimationDeviceState deviceState,
|
||||||
GestureState gestureState, InputConsumerController inputConsumer) {
|
GestureState gestureState, InputConsumerController inputConsumer,
|
||||||
|
WindowSizeStrategy windowSizeStrategy) {
|
||||||
mContext = context;
|
mContext = context;
|
||||||
mDeviceState = deviceState;
|
mDeviceState = deviceState;
|
||||||
mGestureState = gestureState;
|
mGestureState = gestureState;
|
||||||
mActivityInterface = gestureState.getActivityInterface();
|
mActivityInterface = gestureState.getActivityInterface();
|
||||||
mActivityInitListener = mActivityInterface.createActivityInitListener(this::onActivityInit);
|
mActivityInitListener = mActivityInterface.createActivityInitListener(this::onActivityInit);
|
||||||
mInputConsumer = inputConsumer;
|
mInputConsumer = inputConsumer;
|
||||||
mAppWindowAnimationHelper = new AppWindowAnimationHelper(context);
|
mTaskViewSimulator = new TaskViewSimulator(context, windowSizeStrategy);
|
||||||
mPageSpacing = context.getResources().getDimensionPixelSize(R.dimen.recents_page_spacing);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -193,7 +200,6 @@ public abstract class BaseSwipeUpHandler<T extends BaseDraggingActivity, Q exten
|
|||||||
updateFinalShift();
|
updateFinalShift();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
mRecentsView.setAppWindowAnimationHelper(mAppWindowAnimationHelper);
|
|
||||||
runOnRecentsAnimationStart(() ->
|
runOnRecentsAnimationStart(() ->
|
||||||
mRecentsView.setRecentsAnimationTargets(mRecentsAnimationController,
|
mRecentsView.setRecentsAnimationTargets(mRecentsAnimationController,
|
||||||
mRecentsAnimationTargets));
|
mRecentsAnimationTargets));
|
||||||
@@ -247,36 +253,29 @@ public abstract class BaseSwipeUpHandler<T extends BaseDraggingActivity, Q exten
|
|||||||
return mRecentsAnimationTargets != null && mRecentsAnimationTargets.hasTargets();
|
return mRecentsAnimationTargets != null && mRecentsAnimationTargets.hasTargets();
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void updateSource(Rect stackBounds, RemoteAnimationTargetCompat runningTarget) {
|
|
||||||
mAppWindowAnimationHelper.updateSource(stackBounds, runningTarget);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onRecentsAnimationStart(RecentsAnimationController recentsAnimationController,
|
public void onRecentsAnimationStart(RecentsAnimationController recentsAnimationController,
|
||||||
RecentsAnimationTargets targets) {
|
RecentsAnimationTargets targets) {
|
||||||
mRecentsAnimationController = recentsAnimationController;
|
mRecentsAnimationController = recentsAnimationController;
|
||||||
mRecentsAnimationTargets = targets;
|
mRecentsAnimationTargets = targets;
|
||||||
DeviceProfile dp = InvariantDeviceProfile.INSTANCE.get(mContext).getDeviceProfile(mContext);
|
DeviceProfile dp = InvariantDeviceProfile.INSTANCE.get(mContext).getDeviceProfile(mContext);
|
||||||
final Rect overviewStackBounds;
|
|
||||||
RemoteAnimationTargetCompat runningTaskTarget = targets.findTask(
|
RemoteAnimationTargetCompat runningTaskTarget = targets.findTask(
|
||||||
mGestureState.getRunningTaskId());
|
mGestureState.getRunningTaskId());
|
||||||
|
|
||||||
if (targets.minimizedHomeBounds != null && runningTaskTarget != null) {
|
if (targets.minimizedHomeBounds != null && runningTaskTarget != null) {
|
||||||
overviewStackBounds = mActivityInterface
|
Rect overviewStackBounds = mActivityInterface
|
||||||
.getOverviewWindowBounds(targets.minimizedHomeBounds, runningTaskTarget);
|
.getOverviewWindowBounds(targets.minimizedHomeBounds, runningTaskTarget);
|
||||||
dp = dp.getMultiWindowProfile(mContext, overviewStackBounds);
|
dp = dp.getMultiWindowProfile(mContext, overviewStackBounds);
|
||||||
} else {
|
} else {
|
||||||
// If we are not in multi-window mode, home insets should be same as system insets.
|
// If we are not in multi-window mode, home insets should be same as system insets.
|
||||||
dp = dp.copy(mContext);
|
dp = dp.copy(mContext);
|
||||||
overviewStackBounds = getStackBounds(dp);
|
|
||||||
}
|
}
|
||||||
dp.updateInsets(targets.homeContentInsets);
|
dp.updateInsets(targets.homeContentInsets);
|
||||||
dp.updateIsSeascape(mContext);
|
dp.updateIsSeascape(mContext);
|
||||||
if (runningTaskTarget != null) {
|
if (runningTaskTarget != null) {
|
||||||
updateSource(overviewStackBounds, runningTaskTarget);
|
mTaskViewSimulator.setPreview(runningTaskTarget);
|
||||||
}
|
}
|
||||||
|
|
||||||
mAppWindowAnimationHelper.prepareAnimation(dp);
|
|
||||||
initTransitionEndpoints(dp);
|
initTransitionEndpoints(dp);
|
||||||
|
|
||||||
// Notify when the animation starts
|
// Notify when the animation starts
|
||||||
@@ -338,7 +337,8 @@ public abstract class BaseSwipeUpHandler<T extends BaseDraggingActivity, Q exten
|
|||||||
return new Rect(loc[0], loc[1], loc[0] + rootView.getWidth(),
|
return new Rect(loc[0], loc[1], loc[0] + rootView.getWidth(),
|
||||||
loc[1] + rootView.getHeight());
|
loc[1] + rootView.getHeight());
|
||||||
} else {
|
} else {
|
||||||
return new Rect(0, 0, dp.widthPx, dp.heightPx);
|
return new Rect(dp.windowX, dp.windowY,
|
||||||
|
dp.windowX + dp.widthPx, dp.windowY + dp.heightPx);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -348,25 +348,6 @@ public abstract class BaseSwipeUpHandler<T extends BaseDraggingActivity, Q exten
|
|||||||
mTransitionDragLength = mActivityInterface.getSwipeUpDestinationAndLength(
|
mTransitionDragLength = mActivityInterface.getSwipeUpDestinationAndLength(
|
||||||
dp, mContext, TEMP_RECT);
|
dp, mContext, TEMP_RECT);
|
||||||
|
|
||||||
if (!dp.isMultiWindowMode) {
|
|
||||||
// When updating the target rect, also update the home bounds since the location on
|
|
||||||
// screen of the launcher window may be stale (position is not updated until first
|
|
||||||
// traversal after the window is resized). We only do this for non-multiwindow because
|
|
||||||
// we otherwise use the minimized home bounds provided by the system.
|
|
||||||
mAppWindowAnimationHelper.updateHomeBounds(getStackBounds(dp));
|
|
||||||
}
|
|
||||||
int displayRotation = 0;
|
|
||||||
if (mOrientedState != null && mOrientedState.isMultipleOrientationSupportedByDevice()) {
|
|
||||||
// TODO(b/150300347): The first recents animation after launcher is started with the
|
|
||||||
// foreground app not in landscape will look funky until that bug is fixed
|
|
||||||
displayRotation = mOrientedState.getDisplayRotation();
|
|
||||||
|
|
||||||
RectF tempRectF = new RectF(TEMP_RECT);
|
|
||||||
mOrientedState.mapRectFromRotation(displayRotation,
|
|
||||||
tempRectF, dp.widthPx, dp.heightPx);
|
|
||||||
tempRectF.roundOut(TEMP_RECT);
|
|
||||||
}
|
|
||||||
mAppWindowAnimationHelper.updateTargetRect(TEMP_RECT);
|
|
||||||
if (mDeviceState.isFullyGesturalNavMode()) {
|
if (mDeviceState.isFullyGesturalNavMode()) {
|
||||||
// We can drag all the way to the top of the screen.
|
// We can drag all the way to the top of the screen.
|
||||||
mDragLengthFactor = (float) dp.heightPx / mTransitionDragLength;
|
mDragLengthFactor = (float) dp.heightPx / mTransitionDragLength;
|
||||||
@@ -375,6 +356,24 @@ public abstract class BaseSwipeUpHandler<T extends BaseDraggingActivity, Q exten
|
|||||||
mDragLengthFactorStartPullback = dragFactorStartAndMaxProgress.first;
|
mDragLengthFactorStartPullback = dragFactorStartAndMaxProgress.first;
|
||||||
mDragLengthFactorMaxPullback = dragFactorStartAndMaxProgress.second;
|
mDragLengthFactorMaxPullback = dragFactorStartAndMaxProgress.second;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mTaskViewSimulator.setDp(dp);
|
||||||
|
mTaskViewSimulator.setLayoutRotation(
|
||||||
|
mDeviceState.getCurrentActiveRotation(),
|
||||||
|
mDeviceState.getDisplayRotation());
|
||||||
|
|
||||||
|
AnimatorSet anim = new AnimatorSet();
|
||||||
|
anim.setDuration(mTransitionDragLength * 2);
|
||||||
|
anim.setInterpolator(t -> t * mDragLengthFactor);
|
||||||
|
anim.play(ObjectAnimator.ofFloat(mTaskViewSimulator.recentsViewScale,
|
||||||
|
AnimatedFloat.VALUE,
|
||||||
|
mTaskViewSimulator.getFullScreenScale(), 1));
|
||||||
|
anim.play(ObjectAnimator.ofFloat(mTaskViewSimulator.fullScreenProgress,
|
||||||
|
AnimatedFloat.VALUE,
|
||||||
|
BACKGROUND_APP.getOverviewFullscreenProgress(),
|
||||||
|
OVERVIEW.getOverviewFullscreenProgress()));
|
||||||
|
mWindowTransitionController =
|
||||||
|
AnimatorPlaybackController.wrap(anim, mTransitionDragLength * 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -385,9 +384,6 @@ public abstract class BaseSwipeUpHandler<T extends BaseDraggingActivity, Q exten
|
|||||||
protected boolean onActivityInit(Boolean alreadyOnHome) {
|
protected boolean onActivityInit(Boolean alreadyOnHome) {
|
||||||
T createdActivity = mActivityInterface.getCreatedActivity();
|
T createdActivity = mActivityInterface.getCreatedActivity();
|
||||||
if (createdActivity != null) {
|
if (createdActivity != null) {
|
||||||
mOrientedState = ((RecentsView) createdActivity.getOverviewPanel())
|
|
||||||
.getPagedViewOrientedState();
|
|
||||||
mAppWindowAnimationHelper = new AppWindowAnimationHelper(mOrientedState, mContext);
|
|
||||||
initTransitionEndpoints(InvariantDeviceProfile.INSTANCE.get(mContext)
|
initTransitionEndpoints(InvariantDeviceProfile.INSTANCE.get(mContext)
|
||||||
.getDeviceProfile(mContext));
|
.getDeviceProfile(mContext));
|
||||||
}
|
}
|
||||||
@@ -436,34 +432,21 @@ public abstract class BaseSwipeUpHandler<T extends BaseDraggingActivity, Q exten
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Applies the transform on the recents animation without any additional null checks
|
* Applies the transform on the recents animation
|
||||||
*/
|
*/
|
||||||
protected void applyTransformUnchecked() {
|
protected void applyWindowTransform() {
|
||||||
float shift = mCurrentShift.value;
|
if (mWindowTransitionController != null) {
|
||||||
float offset = mRecentsView == null ? 0 : mRecentsView.getScrollOffsetScaled();
|
float progress = mCurrentShift.value / mDragLengthFactor;
|
||||||
float taskSize = getOrientationHandler()
|
mWindowTransitionController.setPlayFraction(progress);
|
||||||
.getPrimarySize(mAppWindowAnimationHelper.getTargetRect());
|
mTransformParams.setTargetSet(mRecentsAnimationTargets);
|
||||||
float offsetScale = getTaskCurveScaleForOffset(offset, taskSize);
|
|
||||||
mTransformParams
|
|
||||||
.setProgress(shift)
|
|
||||||
.setOffset(offset)
|
|
||||||
.setOffsetScale(offsetScale)
|
|
||||||
.setTargetSet(mRecentsAnimationTargets);
|
|
||||||
mAppWindowAnimationHelper.applyTransform(mTransformParams);
|
|
||||||
}
|
|
||||||
|
|
||||||
private float getTaskCurveScaleForOffset(float offset, float taskSize) {
|
mTaskViewSimulator.setScroll(mRecentsView == null ? 0 : mRecentsView.getScrollOffset());
|
||||||
int dpPixel = getOrientationHandler().getShortEdgeLength(mDp);
|
mTaskViewSimulator.apply(mTransformParams);
|
||||||
float distanceToReachEdge = dpPixel / 2 + taskSize / 2 + mPageSpacing;
|
}
|
||||||
float interpolation = Math.min(1, offset / distanceToReachEdge);
|
|
||||||
return TaskView.getCurveScaleForInterpolation(interpolation);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected PagedOrientationHandler getOrientationHandler() {
|
protected PagedOrientationHandler getOrientationHandler() {
|
||||||
if (mOrientedState == null) {
|
return mTaskViewSimulator.getOrientationState().getOrientationHandler();
|
||||||
return PagedOrientationHandler.PORTRAIT;
|
|
||||||
}
|
|
||||||
return mOrientedState.getOrientationHandler();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -474,102 +457,40 @@ public abstract class BaseSwipeUpHandler<T extends BaseDraggingActivity, Q exten
|
|||||||
protected RectFSpringAnim createWindowAnimationToHome(float startProgress,
|
protected RectFSpringAnim createWindowAnimationToHome(float startProgress,
|
||||||
HomeAnimationFactory homeAnimationFactory) {
|
HomeAnimationFactory homeAnimationFactory) {
|
||||||
final RectF targetRect = homeAnimationFactory.getWindowTargetRect();
|
final RectF targetRect = homeAnimationFactory.getWindowTargetRect();
|
||||||
final View floatingView = homeAnimationFactory.getFloatingView();
|
final FloatingIconView fiv = homeAnimationFactory.mIconView;
|
||||||
final boolean isFloatingIconView = floatingView instanceof FloatingIconView;
|
final boolean isFloatingIconView = fiv != null;
|
||||||
final RectF startRect = new RectF(mAppWindowAnimationHelper.applyTransform(
|
|
||||||
mTransformParams.setProgress(startProgress)
|
mWindowTransitionController.setPlayFraction(startProgress / mDragLengthFactor);
|
||||||
.setTargetSet(mRecentsAnimationTargets)));
|
mTaskViewSimulator.apply(mTransformParams
|
||||||
if (isFloatingIconView) {
|
.setProgress(startProgress)
|
||||||
mOrientedState.mapInverseRectFromNormalOrientation(
|
.setTargetSet(mRecentsAnimationTargets));
|
||||||
startRect, mDp.widthPx, mDp.heightPx);
|
RectF cropRectF = new RectF(mTaskViewSimulator.getCurrentCropRect());
|
||||||
}
|
|
||||||
|
// Matrix to map a rect in Launcher space to window space
|
||||||
|
Matrix homeToWindowPositionMap = new Matrix();
|
||||||
|
mTaskViewSimulator.applyWindowToHomeRotation(homeToWindowPositionMap);
|
||||||
|
|
||||||
|
final RectF startRect = new RectF(cropRectF);
|
||||||
|
mTaskViewSimulator.getCurrentMatrix().mapRect(startRect);
|
||||||
|
// Move the startRect to Launcher space as floatingIconView runs in Launcher
|
||||||
|
Matrix windowToHomePositionMap = new Matrix();
|
||||||
|
homeToWindowPositionMap.invert(windowToHomePositionMap);
|
||||||
|
windowToHomePositionMap.mapRect(startRect);
|
||||||
|
|
||||||
RectFSpringAnim anim = new RectFSpringAnim(startRect, targetRect, mContext);
|
RectFSpringAnim anim = new RectFSpringAnim(startRect, targetRect, mContext);
|
||||||
if (isFloatingIconView) {
|
if (isFloatingIconView) {
|
||||||
FloatingIconView fiv = (FloatingIconView) floatingView;
|
|
||||||
anim.addAnimatorListener(fiv);
|
anim.addAnimatorListener(fiv);
|
||||||
fiv.setOnTargetChangeListener(anim::onTargetPositionChanged);
|
fiv.setOnTargetChangeListener(anim::onTargetPositionChanged);
|
||||||
fiv.setFastFinishRunnable(anim::end);
|
fiv.setFastFinishRunnable(anim::end);
|
||||||
}
|
}
|
||||||
|
|
||||||
AnimatorPlaybackController homeAnim = homeAnimationFactory.createActivityAnimationToHome();
|
SpringAnimationRunner runner = new SpringAnimationRunner(
|
||||||
|
homeAnimationFactory, cropRectF, homeToWindowPositionMap);
|
||||||
// End on a "round-enough" radius so that the shape reveal doesn't have to do too much
|
anim.addOnUpdateListener(runner);
|
||||||
// rounding at the end of the animation.
|
anim.addAnimatorListener(runner);
|
||||||
float startRadius = mAppWindowAnimationHelper.getCurrentCornerRadius();
|
|
||||||
float endRadius = startRect.width() / 6f;
|
|
||||||
|
|
||||||
float startTransformProgress = mTransformParams.getProgress();
|
|
||||||
float endTransformProgress = 1;
|
|
||||||
|
|
||||||
// We want the window alpha to be 0 once this threshold is met, so that the
|
|
||||||
// FolderIconView can be seen morphing into the icon shape.
|
|
||||||
final float windowAlphaThreshold = isFloatingIconView ? 1f - SHAPE_PROGRESS_DURATION : 1f;
|
|
||||||
final RectF rotatedRect = new RectF();
|
|
||||||
anim.addOnUpdateListener(new RectFSpringAnim.OnUpdateListener() {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onUpdate(RectF currentRect, float progress) {
|
|
||||||
homeAnim.setPlayFraction(progress);
|
|
||||||
|
|
||||||
rotatedRect.set(currentRect);
|
|
||||||
if (isFloatingIconView) {
|
|
||||||
mOrientedState.mapRectFromNormalOrientation(
|
|
||||||
rotatedRect, mDp.widthPx, mDp.heightPx);
|
|
||||||
mTransformParams.setCornerRadius(endRadius * progress + startRadius
|
|
||||||
* (1f - progress));
|
|
||||||
}
|
|
||||||
mTransformParams.setProgress(
|
|
||||||
Utilities.mapRange(progress, startTransformProgress, endTransformProgress))
|
|
||||||
.setCurrentRect(rotatedRect)
|
|
||||||
.setTargetAlpha(getWindowAlpha(progress));
|
|
||||||
mAppWindowAnimationHelper.applyTransform(mTransformParams);
|
|
||||||
|
|
||||||
if (isFloatingIconView) {
|
|
||||||
((FloatingIconView) floatingView).update(currentRect, 1f, progress,
|
|
||||||
windowAlphaThreshold, mAppWindowAnimationHelper.getCurrentCornerRadius(),
|
|
||||||
false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onCancel() {
|
|
||||||
if (isFloatingIconView) {
|
|
||||||
((FloatingIconView) floatingView).fastFinish();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
anim.addAnimatorListener(new AnimationSuccessListener() {
|
|
||||||
@Override
|
|
||||||
public void onAnimationStart(Animator animation) {
|
|
||||||
homeAnim.dispatchOnStart();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onAnimationSuccess(Animator animator) {
|
|
||||||
homeAnim.getAnimationPlayer().end();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
return anim;
|
return anim;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @param progress The progress of the animation to the home screen.
|
|
||||||
* @return The current alpha to set on the animating app window.
|
|
||||||
*/
|
|
||||||
protected float getWindowAlpha(float progress) {
|
|
||||||
// Alpha interpolates between [1, 0] between progress values [start, end]
|
|
||||||
final float start = 0f;
|
|
||||||
final float end = 0.85f;
|
|
||||||
|
|
||||||
if (progress <= start) {
|
|
||||||
return 1f;
|
|
||||||
}
|
|
||||||
if (progress >= end) {
|
|
||||||
return 0f;
|
|
||||||
}
|
|
||||||
return Utilities.mapToRange(progress, start, end, 1, 0, ACCEL_1_5);
|
|
||||||
}
|
|
||||||
|
|
||||||
public interface Factory {
|
public interface Factory {
|
||||||
|
|
||||||
BaseSwipeUpHandler newHandler(GestureState gestureState, long touchTimeMs,
|
BaseSwipeUpHandler newHandler(GestureState gestureState, long touchTimeMs,
|
||||||
@@ -609,4 +530,135 @@ public abstract class BaseSwipeUpHandler<T extends BaseDraggingActivity, Q exten
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param progress The progress of the animation to the home screen.
|
||||||
|
* @return The current alpha to set on the animating app window.
|
||||||
|
*/
|
||||||
|
protected float getWindowAlpha(float progress) {
|
||||||
|
// Alpha interpolates between [1, 0] between progress values [start, end]
|
||||||
|
final float start = 0f;
|
||||||
|
final float end = 0.85f;
|
||||||
|
|
||||||
|
if (progress <= start) {
|
||||||
|
return 1f;
|
||||||
|
}
|
||||||
|
if (progress >= end) {
|
||||||
|
return 0f;
|
||||||
|
}
|
||||||
|
return Utilities.mapToRange(progress, start, end, 1, 0, ACCEL_1_5);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected abstract class HomeAnimationFactory {
|
||||||
|
|
||||||
|
private FloatingIconView mIconView;
|
||||||
|
|
||||||
|
public HomeAnimationFactory(@Nullable FloatingIconView iconView) {
|
||||||
|
mIconView = iconView;
|
||||||
|
}
|
||||||
|
|
||||||
|
public @NonNull RectF getWindowTargetRect() {
|
||||||
|
PagedOrientationHandler orientationHandler = getOrientationHandler();
|
||||||
|
DeviceProfile dp = mDp;
|
||||||
|
final int halfIconSize = dp.iconSizePx / 2;
|
||||||
|
float primaryDimension = orientationHandler
|
||||||
|
.getPrimaryValue(dp.availableWidthPx, dp.availableHeightPx);
|
||||||
|
float secondaryDimension = orientationHandler
|
||||||
|
.getSecondaryValue(dp.availableWidthPx, dp.availableHeightPx);
|
||||||
|
final float targetX = primaryDimension / 2f;
|
||||||
|
final float targetY = secondaryDimension - dp.hotseatBarSizePx;
|
||||||
|
// Fallback to animate to center of screen.
|
||||||
|
return new RectF(targetX - halfIconSize, targetY - halfIconSize,
|
||||||
|
targetX + halfIconSize, targetY + halfIconSize);
|
||||||
|
}
|
||||||
|
|
||||||
|
public abstract @NonNull AnimatorPlaybackController createActivityAnimationToHome();
|
||||||
|
|
||||||
|
public void playAtomicAnimation(float velocity) {
|
||||||
|
// No-op
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private class SpringAnimationRunner extends AnimationSuccessListener
|
||||||
|
implements RectFSpringAnim.OnUpdateListener, BuilderProxy {
|
||||||
|
|
||||||
|
final Rect mCropRect = new Rect();
|
||||||
|
final Matrix mMatrix = new Matrix();
|
||||||
|
|
||||||
|
final RectF mWindowCurrentRect = new RectF();
|
||||||
|
final Matrix mHomeToWindowPositionMap;
|
||||||
|
|
||||||
|
final FloatingIconView mFIV;
|
||||||
|
final AnimatorPlaybackController mHomeAnim;
|
||||||
|
final RectF mCropRectF;
|
||||||
|
|
||||||
|
final float mStartRadius;
|
||||||
|
final float mEndRadius;
|
||||||
|
final float mWindowAlphaThreshold;
|
||||||
|
|
||||||
|
SpringAnimationRunner(HomeAnimationFactory factory, RectF cropRectF,
|
||||||
|
Matrix homeToWindowPositionMap) {
|
||||||
|
mHomeAnim = factory.createActivityAnimationToHome();
|
||||||
|
mCropRectF = cropRectF;
|
||||||
|
mHomeToWindowPositionMap = homeToWindowPositionMap;
|
||||||
|
|
||||||
|
cropRectF.roundOut(mCropRect);
|
||||||
|
mFIV = factory.mIconView;
|
||||||
|
|
||||||
|
// End on a "round-enough" radius so that the shape reveal doesn't have to do too much
|
||||||
|
// rounding at the end of the animation.
|
||||||
|
mStartRadius = mTaskViewSimulator.getCurrentCornerRadius();
|
||||||
|
mEndRadius = cropRectF.width() / 2f;
|
||||||
|
|
||||||
|
// We want the window alpha to be 0 once this threshold is met, so that the
|
||||||
|
// FolderIconView can be seen morphing into the icon shape.
|
||||||
|
mWindowAlphaThreshold = mFIV != null ? 1f - SHAPE_PROGRESS_DURATION : 1f;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onUpdate(RectF currentRect, float progress) {
|
||||||
|
mHomeAnim.setPlayFraction(progress);
|
||||||
|
mHomeToWindowPositionMap.mapRect(mWindowCurrentRect, currentRect);
|
||||||
|
|
||||||
|
mMatrix.setRectToRect(mCropRectF, mWindowCurrentRect, ScaleToFit.FILL);
|
||||||
|
float cornerRadius = Utilities.mapRange(progress, mStartRadius, mEndRadius);
|
||||||
|
mTransformParams
|
||||||
|
.setTargetAlpha(getWindowAlpha(progress))
|
||||||
|
.setCornerRadius(cornerRadius);
|
||||||
|
|
||||||
|
mTransformParams.applySurfaceParams(mTransformParams.createSurfaceParams(this));
|
||||||
|
if (mFIV != null) {
|
||||||
|
mFIV.update(currentRect, 1f, progress,
|
||||||
|
mWindowAlphaThreshold, mMatrix.mapRadius(cornerRadius), false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onBuildParams(Builder builder, RemoteAnimationTargetCompat app, int targetMode,
|
||||||
|
TransformParams params) {
|
||||||
|
if (app.mode == targetMode
|
||||||
|
&& app.activityType != RemoteAnimationTargetCompat.ACTIVITY_TYPE_HOME) {
|
||||||
|
builder.withMatrix(mMatrix)
|
||||||
|
.withWindowCrop(mCropRect)
|
||||||
|
.withCornerRadius(params.getCornerRadius());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onCancel() {
|
||||||
|
if (mFIV != null) {
|
||||||
|
mFIV.fastFinish();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onAnimationStart(Animator animation) {
|
||||||
|
mHomeAnim.dispatchOnStart();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onAnimationSuccess(Animator animator) {
|
||||||
|
mHomeAnim.getAnimationPlayer().end();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
-37
@@ -21,18 +21,14 @@ import static com.android.quickstep.fallback.FallbackRecentsView.ZOOM_PROGRESS;
|
|||||||
import static com.android.quickstep.util.WindowSizeStrategy.FALLBACK_RECENTS_SIZE_STRATEGY;
|
import static com.android.quickstep.util.WindowSizeStrategy.FALLBACK_RECENTS_SIZE_STRATEGY;
|
||||||
import static com.android.quickstep.views.RecentsView.CONTENT_ALPHA;
|
import static com.android.quickstep.views.RecentsView.CONTENT_ALPHA;
|
||||||
|
|
||||||
import android.animation.Animator;
|
|
||||||
import android.animation.AnimatorSet;
|
import android.animation.AnimatorSet;
|
||||||
import android.animation.ObjectAnimator;
|
import android.animation.ObjectAnimator;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.graphics.Rect;
|
import android.graphics.Rect;
|
||||||
import android.graphics.RectF;
|
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
|
|
||||||
import com.android.launcher3.DeviceProfile;
|
import com.android.launcher3.DeviceProfile;
|
||||||
import com.android.launcher3.anim.AnimationSuccessListener;
|
|
||||||
import com.android.launcher3.anim.AnimatorPlaybackController;
|
import com.android.launcher3.anim.AnimatorPlaybackController;
|
||||||
import com.android.launcher3.userevent.nano.LauncherLogProto;
|
import com.android.launcher3.userevent.nano.LauncherLogProto;
|
||||||
import com.android.quickstep.fallback.FallbackRecentsView;
|
import com.android.quickstep.fallback.FallbackRecentsView;
|
||||||
@@ -89,39 +85,6 @@ public final class FallbackActivityInterface implements
|
|||||||
// set to zero prior to this class becoming active.
|
// set to zero prior to this class becoming active.
|
||||||
}
|
}
|
||||||
|
|
||||||
@NonNull
|
|
||||||
@Override
|
|
||||||
public HomeAnimationFactory prepareHomeUI() {
|
|
||||||
RecentsActivity activity = getCreatedActivity();
|
|
||||||
RecentsView recentsView = activity.getOverviewPanel();
|
|
||||||
|
|
||||||
return new HomeAnimationFactory() {
|
|
||||||
@NonNull
|
|
||||||
@Override
|
|
||||||
public RectF getWindowTargetRect() {
|
|
||||||
float centerX = recentsView.getPivotX();
|
|
||||||
float centerY = recentsView.getPivotY();
|
|
||||||
return new RectF(centerX, centerY, centerX, centerY);
|
|
||||||
}
|
|
||||||
|
|
||||||
@NonNull
|
|
||||||
@Override
|
|
||||||
public AnimatorPlaybackController createActivityAnimationToHome() {
|
|
||||||
Animator anim = ObjectAnimator.ofFloat(recentsView, CONTENT_ALPHA, 0);
|
|
||||||
anim.addListener(new AnimationSuccessListener() {
|
|
||||||
@Override
|
|
||||||
public void onAnimationSuccess(Animator animator) {
|
|
||||||
recentsView.startHome();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
AnimatorSet animatorSet = new AnimatorSet();
|
|
||||||
animatorSet.play(anim);
|
|
||||||
long accuracy = 2 * Math.max(recentsView.getWidth(), recentsView.getHeight());
|
|
||||||
return AnimatorPlaybackController.wrap(animatorSet, accuracy);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public AnimationFactory prepareRecentsUI(boolean activityVisible,
|
public AnimationFactory prepareRecentsUI(boolean activityVisible,
|
||||||
boolean animateActivity, Consumer<AnimatorPlaybackController> callback) {
|
boolean animateActivity, Consumer<AnimatorPlaybackController> callback) {
|
||||||
|
|||||||
@@ -24,6 +24,7 @@ import static com.android.quickstep.GestureState.GestureEndTarget.RECENTS;
|
|||||||
import static com.android.quickstep.MultiStateCallback.DEBUG_STATES;
|
import static com.android.quickstep.MultiStateCallback.DEBUG_STATES;
|
||||||
import static com.android.quickstep.RecentsActivity.EXTRA_TASK_ID;
|
import static com.android.quickstep.RecentsActivity.EXTRA_TASK_ID;
|
||||||
import static com.android.quickstep.RecentsActivity.EXTRA_THUMBNAIL;
|
import static com.android.quickstep.RecentsActivity.EXTRA_THUMBNAIL;
|
||||||
|
import static com.android.quickstep.util.WindowSizeStrategy.FALLBACK_RECENTS_SIZE_STRATEGY;
|
||||||
import static com.android.quickstep.views.RecentsView.UPDATE_SYSUI_FLAGS_THRESHOLD;
|
import static com.android.quickstep.views.RecentsView.UPDATE_SYSUI_FLAGS_THRESHOLD;
|
||||||
|
|
||||||
import android.animation.Animator;
|
import android.animation.Animator;
|
||||||
@@ -32,7 +33,6 @@ import android.app.ActivityOptions;
|
|||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.graphics.PointF;
|
import android.graphics.PointF;
|
||||||
import android.graphics.RectF;
|
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.util.ArrayMap;
|
import android.util.ArrayMap;
|
||||||
import android.view.MotionEvent;
|
import android.view.MotionEvent;
|
||||||
@@ -40,9 +40,7 @@ import android.view.MotionEvent;
|
|||||||
import com.android.launcher3.R;
|
import com.android.launcher3.R;
|
||||||
import com.android.launcher3.anim.AnimationSuccessListener;
|
import com.android.launcher3.anim.AnimationSuccessListener;
|
||||||
import com.android.launcher3.anim.AnimatorPlaybackController;
|
import com.android.launcher3.anim.AnimatorPlaybackController;
|
||||||
import com.android.launcher3.touch.PagedOrientationHandler;
|
|
||||||
import com.android.launcher3.util.ObjectWrapper;
|
import com.android.launcher3.util.ObjectWrapper;
|
||||||
import com.android.quickstep.BaseActivityInterface.HomeAnimationFactory;
|
|
||||||
import com.android.quickstep.GestureState.GestureEndTarget;
|
import com.android.quickstep.GestureState.GestureEndTarget;
|
||||||
import com.android.quickstep.fallback.FallbackRecentsView;
|
import com.android.quickstep.fallback.FallbackRecentsView;
|
||||||
import com.android.quickstep.util.RectFSpringAnim;
|
import com.android.quickstep.util.RectFSpringAnim;
|
||||||
@@ -108,7 +106,7 @@ public class FallbackSwipeHandler extends BaseSwipeUpHandler<RecentsActivity, Fa
|
|||||||
public FallbackSwipeHandler(Context context, RecentsAnimationDeviceState deviceState,
|
public FallbackSwipeHandler(Context context, RecentsAnimationDeviceState deviceState,
|
||||||
GestureState gestureState, InputConsumerController inputConsumer,
|
GestureState gestureState, InputConsumerController inputConsumer,
|
||||||
boolean isLikelyToStartNewTask, boolean continuingLastGesture) {
|
boolean isLikelyToStartNewTask, boolean continuingLastGesture) {
|
||||||
super(context, deviceState, gestureState, inputConsumer);
|
super(context, deviceState, gestureState, inputConsumer, FALLBACK_RECENTS_SIZE_STRATEGY);
|
||||||
|
|
||||||
mInQuickSwitchMode = isLikelyToStartNewTask || continuingLastGesture;
|
mInQuickSwitchMode = isLikelyToStartNewTask || continuingLastGesture;
|
||||||
mContinuingLastGesture = continuingLastGesture;
|
mContinuingLastGesture = continuingLastGesture;
|
||||||
@@ -156,7 +154,7 @@ public class FallbackSwipeHandler extends BaseSwipeUpHandler<RecentsActivity, Fa
|
|||||||
|
|
||||||
private void onLauncherAlphaChanged() {
|
private void onLauncherAlphaChanged() {
|
||||||
if (mRecentsAnimationTargets != null && mGestureState.getEndTarget() == null) {
|
if (mRecentsAnimationTargets != null && mGestureState.getEndTarget() == null) {
|
||||||
applyTransformUnchecked();
|
applyWindowTransform();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -261,9 +259,7 @@ public class FallbackSwipeHandler extends BaseSwipeUpHandler<RecentsActivity, Fa
|
|||||||
updateOverviewThresholdPassed(mCurrentShift.value >= MIN_PROGRESS_FOR_OVERVIEW);
|
updateOverviewThresholdPassed(mCurrentShift.value >= MIN_PROGRESS_FOR_OVERVIEW);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mRecentsAnimationTargets != null) {
|
applyWindowTransform();
|
||||||
applyTransformUnchecked();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -468,11 +464,7 @@ public class FallbackSwipeHandler extends BaseSwipeUpHandler<RecentsActivity, Fa
|
|||||||
RecentsAnimationTargets targets) {
|
RecentsAnimationTargets targets) {
|
||||||
super.onRecentsAnimationStart(controller, targets);
|
super.onRecentsAnimationStart(controller, targets);
|
||||||
mRecentsAnimationController.enableInputConsumer();
|
mRecentsAnimationController.enableInputConsumer();
|
||||||
|
applyWindowTransform();
|
||||||
if (mRunningOverHome) {
|
|
||||||
mAppWindowAnimationHelper.prepareAnimation(mDp);
|
|
||||||
}
|
|
||||||
applyTransformUnchecked();
|
|
||||||
|
|
||||||
mStateCallback.setStateOnUiThread(STATE_APP_CONTROLLER_RECEIVED);
|
mStateCallback.setStateOnUiThread(STATE_APP_CONTROLLER_RECEIVED);
|
||||||
}
|
}
|
||||||
@@ -495,18 +487,7 @@ public class FallbackSwipeHandler extends BaseSwipeUpHandler<RecentsActivity, Fa
|
|||||||
* @param startProgress The progress of {@link #mCurrentShift} to start the window from.
|
* @param startProgress The progress of {@link #mCurrentShift} to start the window from.
|
||||||
*/
|
*/
|
||||||
private RectFSpringAnim createWindowAnimationToHome(float startProgress, long duration) {
|
private RectFSpringAnim createWindowAnimationToHome(float startProgress, long duration) {
|
||||||
HomeAnimationFactory factory = new HomeAnimationFactory() {
|
HomeAnimationFactory factory = new HomeAnimationFactory(null) {
|
||||||
@Override
|
|
||||||
public RectF getWindowTargetRect() {
|
|
||||||
PagedOrientationHandler orientationHandler = mRecentsView != null
|
|
||||||
? mRecentsView.getPagedOrientationHandler()
|
|
||||||
: (mDp.isLandscape
|
|
||||||
? PagedOrientationHandler.LANDSCAPE
|
|
||||||
: PagedOrientationHandler.PORTRAIT);
|
|
||||||
return HomeAnimationFactory
|
|
||||||
.getDefaultWindowTargetRect(orientationHandler, mDp);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public AnimatorPlaybackController createActivityAnimationToHome() {
|
public AnimatorPlaybackController createActivityAnimationToHome() {
|
||||||
AnimatorSet anim = new AnimatorSet();
|
AnimatorSet anim = new AnimatorSet();
|
||||||
|
|||||||
-65
@@ -17,7 +17,6 @@ package com.android.quickstep;
|
|||||||
|
|
||||||
import static com.android.launcher3.LauncherAnimUtils.SCALE_PROPERTY;
|
import static com.android.launcher3.LauncherAnimUtils.SCALE_PROPERTY;
|
||||||
import static com.android.launcher3.LauncherState.BACKGROUND_APP;
|
import static com.android.launcher3.LauncherState.BACKGROUND_APP;
|
||||||
import static com.android.launcher3.LauncherState.NORMAL;
|
|
||||||
import static com.android.launcher3.LauncherState.OVERVIEW;
|
import static com.android.launcher3.LauncherState.OVERVIEW;
|
||||||
import static com.android.launcher3.anim.Interpolators.ACCEL_2;
|
import static com.android.launcher3.anim.Interpolators.ACCEL_2;
|
||||||
import static com.android.launcher3.anim.Interpolators.INSTANT;
|
import static com.android.launcher3.anim.Interpolators.INSTANT;
|
||||||
@@ -34,15 +33,11 @@ import android.animation.AnimatorSet;
|
|||||||
import android.animation.ObjectAnimator;
|
import android.animation.ObjectAnimator;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.graphics.Rect;
|
import android.graphics.Rect;
|
||||||
import android.graphics.RectF;
|
|
||||||
import android.os.UserHandle;
|
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
import android.util.Pair;
|
import android.util.Pair;
|
||||||
import android.view.MotionEvent;
|
import android.view.MotionEvent;
|
||||||
import android.view.View;
|
|
||||||
import android.view.animation.Interpolator;
|
import android.view.animation.Interpolator;
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
import androidx.annotation.UiThread;
|
import androidx.annotation.UiThread;
|
||||||
|
|
||||||
@@ -58,16 +53,13 @@ import com.android.launcher3.statehandlers.DepthController;
|
|||||||
import com.android.launcher3.statehandlers.DepthController.ClampedDepthProperty;
|
import com.android.launcher3.statehandlers.DepthController.ClampedDepthProperty;
|
||||||
import com.android.launcher3.testing.TestProtocol;
|
import com.android.launcher3.testing.TestProtocol;
|
||||||
import com.android.launcher3.userevent.nano.LauncherLogProto;
|
import com.android.launcher3.userevent.nano.LauncherLogProto;
|
||||||
import com.android.launcher3.views.FloatingIconView;
|
|
||||||
import com.android.quickstep.SysUINavigationMode.Mode;
|
import com.android.quickstep.SysUINavigationMode.Mode;
|
||||||
import com.android.quickstep.util.ActivityInitListener;
|
import com.android.quickstep.util.ActivityInitListener;
|
||||||
import com.android.quickstep.util.LayoutUtils;
|
import com.android.quickstep.util.LayoutUtils;
|
||||||
import com.android.quickstep.util.ShelfPeekAnim;
|
import com.android.quickstep.util.ShelfPeekAnim;
|
||||||
import com.android.quickstep.util.ShelfPeekAnim.ShelfAnimState;
|
import com.android.quickstep.util.ShelfPeekAnim.ShelfAnimState;
|
||||||
import com.android.quickstep.util.StaggeredWorkspaceAnim;
|
|
||||||
import com.android.quickstep.views.LauncherRecentsView;
|
import com.android.quickstep.views.LauncherRecentsView;
|
||||||
import com.android.quickstep.views.RecentsView;
|
import com.android.quickstep.views.RecentsView;
|
||||||
import com.android.quickstep.views.TaskView;
|
|
||||||
import com.android.systemui.plugins.shared.LauncherOverlayManager;
|
import com.android.systemui.plugins.shared.LauncherOverlayManager;
|
||||||
import com.android.systemui.shared.recents.model.ThumbnailData;
|
import com.android.systemui.shared.recents.model.ThumbnailData;
|
||||||
import com.android.systemui.shared.system.RemoteAnimationTargetCompat;
|
import com.android.systemui.shared.system.RemoteAnimationTargetCompat;
|
||||||
@@ -150,63 +142,6 @@ public final class LauncherActivityInterface implements BaseActivityInterface<La
|
|||||||
launcher.onAssistantVisibilityChanged(visibility);
|
launcher.onAssistantVisibilityChanged(visibility);
|
||||||
}
|
}
|
||||||
|
|
||||||
@NonNull
|
|
||||||
@Override
|
|
||||||
public HomeAnimationFactory prepareHomeUI() {
|
|
||||||
Launcher launcher = getCreatedActivity();
|
|
||||||
final DeviceProfile dp = launcher.getDeviceProfile();
|
|
||||||
final RecentsView recentsView = launcher.getOverviewPanel();
|
|
||||||
final TaskView runningTaskView = recentsView.getRunningTaskView();
|
|
||||||
final View workspaceView;
|
|
||||||
if (runningTaskView != null && runningTaskView.getTask().key.getComponent() != null) {
|
|
||||||
workspaceView = launcher.getWorkspace().getFirstMatchForAppClose(
|
|
||||||
runningTaskView.getTask().key.getComponent().getPackageName(),
|
|
||||||
UserHandle.of(runningTaskView.getTask().key.userId));
|
|
||||||
} else {
|
|
||||||
workspaceView = null;
|
|
||||||
}
|
|
||||||
final RectF iconLocation = new RectF();
|
|
||||||
boolean canUseWorkspaceView = workspaceView != null && workspaceView.isAttachedToWindow();
|
|
||||||
FloatingIconView floatingIconView = canUseWorkspaceView
|
|
||||||
? FloatingIconView.getFloatingIconView(launcher, workspaceView,
|
|
||||||
true /* hideOriginal */, iconLocation, false /* isOpening */)
|
|
||||||
: null;
|
|
||||||
setLauncherHideBackArrow(true);
|
|
||||||
return new HomeAnimationFactory() {
|
|
||||||
@Nullable
|
|
||||||
@Override
|
|
||||||
public View getFloatingView() {
|
|
||||||
return floatingIconView;
|
|
||||||
}
|
|
||||||
|
|
||||||
@NonNull
|
|
||||||
@Override
|
|
||||||
public RectF getWindowTargetRect() {
|
|
||||||
if (canUseWorkspaceView) {
|
|
||||||
return iconLocation;
|
|
||||||
} else {
|
|
||||||
return HomeAnimationFactory
|
|
||||||
.getDefaultWindowTargetRect(recentsView.getPagedOrientationHandler(), dp);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@NonNull
|
|
||||||
@Override
|
|
||||||
public AnimatorPlaybackController createActivityAnimationToHome() {
|
|
||||||
// Return an empty APC here since we have an non-user controlled animation to home.
|
|
||||||
long accuracy = 2 * Math.max(dp.widthPx, dp.heightPx);
|
|
||||||
return launcher.getStateManager().createAnimationToNewWorkspace(NORMAL, accuracy,
|
|
||||||
0 /* animComponents */);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void playAtomicAnimation(float velocity) {
|
|
||||||
new StaggeredWorkspaceAnim(launcher, velocity, true /* animateOverviewScrim */)
|
|
||||||
.start();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public AnimationFactory prepareRecentsUI(boolean activityVisible,
|
public AnimationFactory prepareRecentsUI(boolean activityVisible,
|
||||||
boolean animateActivity, Consumer<AnimatorPlaybackController> callback) {
|
boolean animateActivity, Consumer<AnimatorPlaybackController> callback) {
|
||||||
|
|||||||
+60
-70
@@ -17,8 +17,7 @@ package com.android.quickstep;
|
|||||||
|
|
||||||
import static com.android.launcher3.BaseActivity.INVISIBLE_BY_STATE_HANDLER;
|
import static com.android.launcher3.BaseActivity.INVISIBLE_BY_STATE_HANDLER;
|
||||||
import static com.android.launcher3.BaseActivity.STATE_HANDLER_INVISIBILITY_FLAGS;
|
import static com.android.launcher3.BaseActivity.STATE_HANDLER_INVISIBILITY_FLAGS;
|
||||||
import static com.android.launcher3.LauncherState.BACKGROUND_APP;
|
import static com.android.launcher3.LauncherState.NORMAL;
|
||||||
import static com.android.launcher3.LauncherState.OVERVIEW;
|
|
||||||
import static com.android.launcher3.anim.Interpolators.DEACCEL;
|
import static com.android.launcher3.anim.Interpolators.DEACCEL;
|
||||||
import static com.android.launcher3.anim.Interpolators.LINEAR;
|
import static com.android.launcher3.anim.Interpolators.LINEAR;
|
||||||
import static com.android.launcher3.anim.Interpolators.OVERSHOOT_1_2;
|
import static com.android.launcher3.anim.Interpolators.OVERSHOOT_1_2;
|
||||||
@@ -41,17 +40,16 @@ import static com.android.quickstep.views.RecentsView.UPDATE_SYSUI_FLAGS_THRESHO
|
|||||||
|
|
||||||
import android.animation.Animator;
|
import android.animation.Animator;
|
||||||
import android.animation.AnimatorSet;
|
import android.animation.AnimatorSet;
|
||||||
import android.animation.ObjectAnimator;
|
|
||||||
import android.animation.TimeInterpolator;
|
import android.animation.TimeInterpolator;
|
||||||
import android.animation.ValueAnimator;
|
import android.animation.ValueAnimator;
|
||||||
import android.annotation.TargetApi;
|
import android.annotation.TargetApi;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.graphics.PointF;
|
import android.graphics.PointF;
|
||||||
import android.graphics.Rect;
|
|
||||||
import android.graphics.RectF;
|
import android.graphics.RectF;
|
||||||
import android.os.Build;
|
import android.os.Build;
|
||||||
import android.os.SystemClock;
|
import android.os.SystemClock;
|
||||||
|
import android.os.UserHandle;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.View.OnApplyWindowInsetsListener;
|
import android.view.View.OnApplyWindowInsetsListener;
|
||||||
import android.view.ViewTreeObserver.OnDrawListener;
|
import android.view.ViewTreeObserver.OnDrawListener;
|
||||||
@@ -64,6 +62,7 @@ import androidx.annotation.UiThread;
|
|||||||
import com.android.launcher3.AbstractFloatingView;
|
import com.android.launcher3.AbstractFloatingView;
|
||||||
import com.android.launcher3.BaseDraggingActivity;
|
import com.android.launcher3.BaseDraggingActivity;
|
||||||
import com.android.launcher3.DeviceProfile;
|
import com.android.launcher3.DeviceProfile;
|
||||||
|
import com.android.launcher3.Launcher;
|
||||||
import com.android.launcher3.R;
|
import com.android.launcher3.R;
|
||||||
import com.android.launcher3.Utilities;
|
import com.android.launcher3.Utilities;
|
||||||
import com.android.launcher3.anim.AnimationSuccessListener;
|
import com.android.launcher3.anim.AnimationSuccessListener;
|
||||||
@@ -74,15 +73,15 @@ import com.android.launcher3.userevent.nano.LauncherLogProto.Action.Direction;
|
|||||||
import com.android.launcher3.userevent.nano.LauncherLogProto.Action.Touch;
|
import com.android.launcher3.userevent.nano.LauncherLogProto.Action.Touch;
|
||||||
import com.android.launcher3.userevent.nano.LauncherLogProto.ContainerType;
|
import com.android.launcher3.userevent.nano.LauncherLogProto.ContainerType;
|
||||||
import com.android.launcher3.util.TraceHelper;
|
import com.android.launcher3.util.TraceHelper;
|
||||||
|
import com.android.launcher3.views.FloatingIconView;
|
||||||
import com.android.quickstep.BaseActivityInterface.AnimationFactory;
|
import com.android.quickstep.BaseActivityInterface.AnimationFactory;
|
||||||
import com.android.quickstep.BaseActivityInterface.HomeAnimationFactory;
|
|
||||||
import com.android.quickstep.GestureState.GestureEndTarget;
|
import com.android.quickstep.GestureState.GestureEndTarget;
|
||||||
import com.android.quickstep.inputconsumers.OverviewInputConsumer;
|
import com.android.quickstep.inputconsumers.OverviewInputConsumer;
|
||||||
import com.android.quickstep.util.ActiveGestureLog;
|
import com.android.quickstep.util.ActiveGestureLog;
|
||||||
import com.android.quickstep.util.RectFSpringAnim;
|
import com.android.quickstep.util.RectFSpringAnim;
|
||||||
import com.android.quickstep.util.ShelfPeekAnim;
|
import com.android.quickstep.util.ShelfPeekAnim;
|
||||||
import com.android.quickstep.util.ShelfPeekAnim.ShelfAnimState;
|
import com.android.quickstep.util.ShelfPeekAnim.ShelfAnimState;
|
||||||
import com.android.quickstep.util.TaskViewSimulator;
|
import com.android.quickstep.util.StaggeredWorkspaceAnim;
|
||||||
import com.android.quickstep.util.TransformParams.TargetAlphaProvider;
|
import com.android.quickstep.util.TransformParams.TargetAlphaProvider;
|
||||||
import com.android.quickstep.views.LiveTileOverlay;
|
import com.android.quickstep.views.LiveTileOverlay;
|
||||||
import com.android.quickstep.views.RecentsView;
|
import com.android.quickstep.views.RecentsView;
|
||||||
@@ -96,8 +95,8 @@ import com.android.systemui.shared.system.RemoteAnimationTargetCompat;
|
|||||||
* Handles the navigation gestures when Launcher is the default home activity.
|
* Handles the navigation gestures when Launcher is the default home activity.
|
||||||
*/
|
*/
|
||||||
@TargetApi(Build.VERSION_CODES.O)
|
@TargetApi(Build.VERSION_CODES.O)
|
||||||
public class LauncherSwipeHandler<T extends BaseDraggingActivity>
|
public class LauncherSwipeHandler extends BaseSwipeUpHandler<Launcher, RecentsView>
|
||||||
extends BaseSwipeUpHandler<T, RecentsView> implements OnApplyWindowInsetsListener {
|
implements OnApplyWindowInsetsListener {
|
||||||
private static final String TAG = LauncherSwipeHandler.class.getSimpleName();
|
private static final String TAG = LauncherSwipeHandler.class.getSimpleName();
|
||||||
|
|
||||||
private static final String[] STATE_NAMES = DEBUG_STATES ? new String[16] : null;
|
private static final String[] STATE_NAMES = DEBUG_STATES ? new String[16] : null;
|
||||||
@@ -151,7 +150,6 @@ public class LauncherSwipeHandler<T extends BaseDraggingActivity>
|
|||||||
STATE_LAUNCHER_PRESENT | STATE_LAUNCHER_DRAWN | STATE_LAUNCHER_STARTED;
|
STATE_LAUNCHER_PRESENT | STATE_LAUNCHER_DRAWN | STATE_LAUNCHER_STARTED;
|
||||||
|
|
||||||
public static final long MAX_SWIPE_DURATION = 350;
|
public static final long MAX_SWIPE_DURATION = 350;
|
||||||
public static final long MIN_SWIPE_DURATION = 80;
|
|
||||||
public static final long MIN_OVERSHOOT_DURATION = 120;
|
public static final long MIN_OVERSHOOT_DURATION = 120;
|
||||||
|
|
||||||
public static final float MIN_PROGRESS_FOR_OVERVIEW = 0.7f;
|
public static final float MIN_PROGRESS_FOR_OVERVIEW = 0.7f;
|
||||||
@@ -180,9 +178,6 @@ public class LauncherSwipeHandler<T extends BaseDraggingActivity>
|
|||||||
private AnimatorPlaybackController mLauncherTransitionController;
|
private AnimatorPlaybackController mLauncherTransitionController;
|
||||||
private boolean mHasLauncherTransitionControllerStarted;
|
private boolean mHasLauncherTransitionControllerStarted;
|
||||||
|
|
||||||
private final TaskViewSimulator mTaskViewSimulator;
|
|
||||||
private AnimatorPlaybackController mWindowTransitionController;
|
|
||||||
|
|
||||||
private AnimationFactory mAnimationFactory = (t) -> { };
|
private AnimationFactory mAnimationFactory = (t) -> { };
|
||||||
|
|
||||||
private boolean mWasLauncherAlreadyVisible;
|
private boolean mWasLauncherAlreadyVisible;
|
||||||
@@ -203,11 +198,10 @@ public class LauncherSwipeHandler<T extends BaseDraggingActivity>
|
|||||||
TaskAnimationManager taskAnimationManager, GestureState gestureState,
|
TaskAnimationManager taskAnimationManager, GestureState gestureState,
|
||||||
long touchTimeMs, boolean continuingLastGesture,
|
long touchTimeMs, boolean continuingLastGesture,
|
||||||
InputConsumerController inputConsumer) {
|
InputConsumerController inputConsumer) {
|
||||||
super(context, deviceState, gestureState, inputConsumer);
|
super(context, deviceState, gestureState, inputConsumer, LAUNCHER_ACTIVITY_SIZE_STRATEGY);
|
||||||
mTaskAnimationManager = taskAnimationManager;
|
mTaskAnimationManager = taskAnimationManager;
|
||||||
mTouchTimeMs = touchTimeMs;
|
mTouchTimeMs = touchTimeMs;
|
||||||
mContinuingLastGesture = continuingLastGesture;
|
mContinuingLastGesture = continuingLastGesture;
|
||||||
mTaskViewSimulator = new TaskViewSimulator(context, LAUNCHER_ACTIVITY_SIZE_STRATEGY);
|
|
||||||
|
|
||||||
initAfterSubclassConstructor();
|
initAfterSubclassConstructor();
|
||||||
initStateCallbacks();
|
initStateCallbacks();
|
||||||
@@ -279,7 +273,7 @@ public class LauncherSwipeHandler<T extends BaseDraggingActivity>
|
|||||||
@Override
|
@Override
|
||||||
protected boolean onActivityInit(Boolean alreadyOnHome) {
|
protected boolean onActivityInit(Boolean alreadyOnHome) {
|
||||||
super.onActivityInit(alreadyOnHome);
|
super.onActivityInit(alreadyOnHome);
|
||||||
final T activity = mActivityInterface.getCreatedActivity();
|
final Launcher activity = mActivityInterface.getCreatedActivity();
|
||||||
if (mActivity == activity) {
|
if (mActivity == activity) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -327,7 +321,7 @@ public class LauncherSwipeHandler<T extends BaseDraggingActivity>
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void onLauncherStart() {
|
private void onLauncherStart() {
|
||||||
final T activity = mActivityInterface.getCreatedActivity();
|
final Launcher activity = mActivityInterface.getCreatedActivity();
|
||||||
if (mActivity != activity) {
|
if (mActivity != activity) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -518,34 +512,6 @@ public class LauncherSwipeHandler<T extends BaseDraggingActivity>
|
|||||||
mAnimationFactory.createActivityInterface(mTransitionDragLength);
|
mAnimationFactory.createActivityInterface(mTransitionDragLength);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void updateSource(Rect stackBounds, RemoteAnimationTargetCompat runningTarget) {
|
|
||||||
super.updateSource(stackBounds, runningTarget);
|
|
||||||
mTaskViewSimulator.setPreview(runningTarget, mRecentsAnimationTargets);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void initTransitionEndpoints(DeviceProfile dp) {
|
|
||||||
super.initTransitionEndpoints(dp);
|
|
||||||
mTaskViewSimulator.setDp(dp);
|
|
||||||
mTaskViewSimulator.setLayoutRotation(
|
|
||||||
mDeviceState.getCurrentActiveRotation(),
|
|
||||||
mDeviceState.getDisplayRotation());
|
|
||||||
|
|
||||||
AnimatorSet anim = new AnimatorSet();
|
|
||||||
anim.setDuration(mTransitionDragLength * 2);
|
|
||||||
anim.setInterpolator(t -> t * mDragLengthFactor);
|
|
||||||
anim.play(ObjectAnimator.ofFloat(mTaskViewSimulator.recentsViewScale,
|
|
||||||
AnimatedFloat.VALUE,
|
|
||||||
mTaskViewSimulator.getFullScreenScale(), 1));
|
|
||||||
anim.play(ObjectAnimator.ofFloat(mTaskViewSimulator.fullScreenProgress,
|
|
||||||
AnimatedFloat.VALUE,
|
|
||||||
BACKGROUND_APP.getOverviewFullscreenProgress(),
|
|
||||||
OVERVIEW.getOverviewFullscreenProgress()));
|
|
||||||
mWindowTransitionController =
|
|
||||||
AnimatorPlaybackController.wrap(anim, mTransitionDragLength * 2);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* We don't want to change mLauncherTransitionController if mGestureState.getEndTarget() == HOME
|
* We don't want to change mLauncherTransitionController if mGestureState.getEndTarget() == HOME
|
||||||
* (it has its own animation) or if we're already animating the current controller.
|
* (it has its own animation) or if we're already animating the current controller.
|
||||||
@@ -576,18 +542,11 @@ public class LauncherSwipeHandler<T extends BaseDraggingActivity>
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void updateFinalShift() {
|
public void updateFinalShift() {
|
||||||
if (mRecentsAnimationTargets != null) {
|
|
||||||
// Base class expects applyTransformUnchecked to be called here.
|
|
||||||
// TODO: Remove this dependency for swipe-up animation.
|
|
||||||
// applyTransformUnchecked();
|
|
||||||
updateSysUiFlags(mCurrentShift.value);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ENABLE_QUICKSTEP_LIVE_TILE.get()) {
|
if (ENABLE_QUICKSTEP_LIVE_TILE.get()) {
|
||||||
if (mRecentsAnimationTargets != null) {
|
if (mRecentsAnimationTargets != null) {
|
||||||
LiveTileOverlay.INSTANCE.update(
|
LiveTileOverlay.INSTANCE.update(
|
||||||
mAppWindowAnimationHelper.getCurrentRectWithInsets(),
|
mTaskViewSimulator.getCurrentCropRect(),
|
||||||
mAppWindowAnimationHelper.getCurrentCornerRadius());
|
mTaskViewSimulator.getCurrentCornerRadius());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -599,14 +558,8 @@ public class LauncherSwipeHandler<T extends BaseDraggingActivity>
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mWindowTransitionController != null) {
|
updateSysUiFlags(mCurrentShift.value);
|
||||||
float progress = mCurrentShift.value / mDragLengthFactor;
|
applyWindowTransform();
|
||||||
mWindowTransitionController.setPlayFraction(progress);
|
|
||||||
mTransformParams.setTargetSet(mRecentsAnimationTargets);
|
|
||||||
|
|
||||||
mTaskViewSimulator.setScroll(mRecentsView == null ? 0 : mRecentsView.getScrollOffset());
|
|
||||||
mTaskViewSimulator.apply(mTransformParams);
|
|
||||||
}
|
|
||||||
updateLauncherTransitionProgress();
|
updateLauncherTransitionProgress();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -680,7 +633,7 @@ public class LauncherSwipeHandler<T extends BaseDraggingActivity>
|
|||||||
*/
|
*/
|
||||||
@UiThread
|
@UiThread
|
||||||
private void notifyGestureStartedAsync() {
|
private void notifyGestureStartedAsync() {
|
||||||
final T curActivity = mActivity;
|
final Launcher curActivity = mActivity;
|
||||||
if (curActivity != null) {
|
if (curActivity != null) {
|
||||||
// Once the gesture starts, we can no longer transition home through the button, so
|
// Once the gesture starts, we can no longer transition home through the button, so
|
||||||
// reset the force override of the activity visibility
|
// reset the force override of the activity visibility
|
||||||
@@ -962,24 +915,61 @@ public class LauncherSwipeHandler<T extends BaseDraggingActivity>
|
|||||||
Interpolator interpolator, GestureEndTarget target, PointF velocityPxPerMs) {
|
Interpolator interpolator, GestureEndTarget target, PointF velocityPxPerMs) {
|
||||||
// Set the state, but don't notify until the animation completes
|
// Set the state, but don't notify until the animation completes
|
||||||
mGestureState.setEndTarget(target, false /* isAtomic */);
|
mGestureState.setEndTarget(target, false /* isAtomic */);
|
||||||
|
|
||||||
maybeUpdateRecentsAttachedState();
|
maybeUpdateRecentsAttachedState();
|
||||||
|
|
||||||
if (mGestureState.getEndTarget() == HOME) {
|
if (mGestureState.getEndTarget() == HOME) {
|
||||||
HomeAnimationFactory homeAnimFactory;
|
HomeAnimationFactory homeAnimFactory;
|
||||||
if (mActivity != null) {
|
if (mActivity != null) {
|
||||||
homeAnimFactory = mActivityInterface.prepareHomeUI();
|
final TaskView runningTaskView = mRecentsView.getRunningTaskView();
|
||||||
} else {
|
final View workspaceView;
|
||||||
homeAnimFactory = new HomeAnimationFactory() {
|
if (runningTaskView != null
|
||||||
@NonNull
|
&& runningTaskView.getTask().key.getComponent() != null) {
|
||||||
|
workspaceView = mActivity.getWorkspace().getFirstMatchForAppClose(
|
||||||
|
runningTaskView.getTask().key.getComponent().getPackageName(),
|
||||||
|
UserHandle.of(runningTaskView.getTask().key.userId));
|
||||||
|
} else {
|
||||||
|
workspaceView = null;
|
||||||
|
}
|
||||||
|
final RectF iconLocation = new RectF();
|
||||||
|
boolean canUseWorkspaceView =
|
||||||
|
workspaceView != null && workspaceView.isAttachedToWindow();
|
||||||
|
FloatingIconView floatingIconView = canUseWorkspaceView
|
||||||
|
? FloatingIconView.getFloatingIconView(mActivity, workspaceView,
|
||||||
|
true /* hideOriginal */, iconLocation, false /* isOpening */)
|
||||||
|
: null;
|
||||||
|
|
||||||
|
mActivity.getRootView().setForceHideBackArrow(true);
|
||||||
|
|
||||||
|
homeAnimFactory = new HomeAnimationFactory(floatingIconView) {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public RectF getWindowTargetRect() {
|
public RectF getWindowTargetRect() {
|
||||||
RectF fallbackTarget = new RectF(mAppWindowAnimationHelper.getTargetRect());
|
if (canUseWorkspaceView) {
|
||||||
Utilities.scaleRectFAboutCenter(fallbackTarget, 0.25f);
|
return iconLocation;
|
||||||
return fallbackTarget;
|
} else {
|
||||||
|
return super.getWindowTargetRect();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@NonNull
|
@NonNull
|
||||||
|
@Override
|
||||||
|
public AnimatorPlaybackController createActivityAnimationToHome() {
|
||||||
|
// Return an empty APC here since we have an non-user controlled animation
|
||||||
|
// to home.
|
||||||
|
long accuracy = 2 * Math.max(mDp.widthPx, mDp.heightPx);
|
||||||
|
return mActivity.getStateManager().createAnimationToNewWorkspace(
|
||||||
|
NORMAL, accuracy, 0 /* animComponents */);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void playAtomicAnimation(float velocity) {
|
||||||
|
new StaggeredWorkspaceAnim(mActivity, velocity,
|
||||||
|
true /* animateOverviewScrim */).start();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
} else {
|
||||||
|
homeAnimFactory = new HomeAnimationFactory(null) {
|
||||||
@Override
|
@Override
|
||||||
public AnimatorPlaybackController createActivityAnimationToHome() {
|
public AnimatorPlaybackController createActivityAnimationToHome() {
|
||||||
return AnimatorPlaybackController.wrap(new AnimatorSet(), duration);
|
return AnimatorPlaybackController.wrap(new AnimatorSet(), duration);
|
||||||
|
|||||||
-10
@@ -222,18 +222,8 @@ public class AppWindowAnimationHelper implements TransformParams.BuilderProxy {
|
|||||||
mCurrentRect.set(params.getCurrentRect());
|
mCurrentRect.set(params.getCurrentRect());
|
||||||
} else {
|
} else {
|
||||||
mTmpRectF.set(mTargetRect);
|
mTmpRectF.set(mTargetRect);
|
||||||
Utilities.scaleRectFAboutCenter(mTmpRectF, params.getOffsetScale());
|
|
||||||
mCurrentRect.set(mRectFEvaluator.evaluate(
|
mCurrentRect.set(mRectFEvaluator.evaluate(
|
||||||
params.getProgress(), mSourceRect, mTmpRectF));
|
params.getProgress(), mSourceRect, mTmpRectF));
|
||||||
if (mOrientedState == null
|
|
||||||
|| !mOrientedState.isMultipleOrientationSupportedByDevice()) {
|
|
||||||
mCurrentRect.offset(params.getOffset(), 0);
|
|
||||||
} else {
|
|
||||||
int displayRotation = mOrientedState.getDisplayRotation();
|
|
||||||
int launcherRotation = mOrientedState.getLauncherRotation();
|
|
||||||
mOrientedState.getOrientationHandler().offsetTaskRect(
|
|
||||||
mCurrentRect, params.getOffset(), displayRotation, launcherRotation);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
updateClipRect(params);
|
updateClipRect(params);
|
||||||
|
|||||||
+40
-11
@@ -33,7 +33,6 @@ import com.android.launcher3.R;
|
|||||||
import com.android.launcher3.Utilities;
|
import com.android.launcher3.Utilities;
|
||||||
import com.android.launcher3.touch.PagedOrientationHandler;
|
import com.android.launcher3.touch.PagedOrientationHandler;
|
||||||
import com.android.quickstep.AnimatedFloat;
|
import com.android.quickstep.AnimatedFloat;
|
||||||
import com.android.quickstep.RecentsAnimationTargets;
|
|
||||||
import com.android.quickstep.views.RecentsView.ScrollState;
|
import com.android.quickstep.views.RecentsView.ScrollState;
|
||||||
import com.android.quickstep.views.TaskThumbnailView.PreviewPositionHelper;
|
import com.android.quickstep.views.TaskThumbnailView.PreviewPositionHelper;
|
||||||
import com.android.quickstep.views.TaskView;
|
import com.android.quickstep.views.TaskView;
|
||||||
@@ -61,7 +60,6 @@ public class TaskViewSimulator implements TransformParams.BuilderProxy {
|
|||||||
|
|
||||||
private final Matrix mMatrix = new Matrix();
|
private final Matrix mMatrix = new Matrix();
|
||||||
private RemoteAnimationTargetCompat mRunningTarget;
|
private RemoteAnimationTargetCompat mRunningTarget;
|
||||||
private RecentsAnimationTargets mAllTargets;
|
|
||||||
|
|
||||||
// Thumbnail view properties
|
// Thumbnail view properties
|
||||||
private final Rect mThumbnailPosition = new Rect();
|
private final Rect mThumbnailPosition = new Rect();
|
||||||
@@ -124,10 +122,8 @@ public class TaskViewSimulator implements TransformParams.BuilderProxy {
|
|||||||
/**
|
/**
|
||||||
* Sets the targets which the simulator will control
|
* Sets the targets which the simulator will control
|
||||||
*/
|
*/
|
||||||
public void setPreview(
|
public void setPreview(RemoteAnimationTargetCompat runningTarget) {
|
||||||
RemoteAnimationTargetCompat runningTarget, RecentsAnimationTargets allTargets) {
|
|
||||||
mRunningTarget = runningTarget;
|
mRunningTarget = runningTarget;
|
||||||
mAllTargets = allTargets;
|
|
||||||
|
|
||||||
mThumbnailData.insets.set(mRunningTarget.contentInsets);
|
mThumbnailData.insets.set(mRunningTarget.contentInsets);
|
||||||
// TODO: What is this?
|
// TODO: What is this?
|
||||||
@@ -149,6 +145,43 @@ public class TaskViewSimulator implements TransformParams.BuilderProxy {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the current clipped/visible window bounds in the window coordinate space
|
||||||
|
*/
|
||||||
|
public RectF getCurrentCropRect() {
|
||||||
|
// Crop rect is the inverse of thumbnail matrix
|
||||||
|
RectF insets = mCurrentFullscreenParams.mCurrentDrawnInsets;
|
||||||
|
mTempRectF.set(-insets.left, -insets.top,
|
||||||
|
mTaskRect.width() + insets.right, mTaskRect.height() + insets.bottom);
|
||||||
|
mInversePositionMatrix.mapRect(mTempRectF);
|
||||||
|
return mTempRectF;
|
||||||
|
}
|
||||||
|
|
||||||
|
public RecentsOrientedState getOrientationState() {
|
||||||
|
return mOrientationState;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the current transform applied to the window
|
||||||
|
*/
|
||||||
|
public Matrix getCurrentMatrix() {
|
||||||
|
return mMatrix;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Applies the rotation on the matrix to so that it maps from launcher coordinate space to
|
||||||
|
* window coordinate space.
|
||||||
|
*/
|
||||||
|
public void applyWindowToHomeRotation(Matrix matrix) {
|
||||||
|
mMatrix.postTranslate(mDp.windowX, mDp.windowY);
|
||||||
|
postDisplayRotation(deltaRotation(
|
||||||
|
mOrientationState.getLauncherRotation(), mOrientationState.getDisplayRotation()),
|
||||||
|
mDp.widthPx, mDp.heightPx, matrix);
|
||||||
|
if (mRunningTarget != null) {
|
||||||
|
matrix.postTranslate(-mRunningTarget.position.x, -mRunningTarget.position.y);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Applies the target to the previously set parameters
|
* Applies the target to the previously set parameters
|
||||||
*/
|
*/
|
||||||
@@ -206,11 +239,7 @@ public class TaskViewSimulator implements TransformParams.BuilderProxy {
|
|||||||
|
|
||||||
// Apply recensView matrix
|
// Apply recensView matrix
|
||||||
mMatrix.postScale(recentsViewScale.value, recentsViewScale.value, mPivot.x, mPivot.y);
|
mMatrix.postScale(recentsViewScale.value, recentsViewScale.value, mPivot.x, mPivot.y);
|
||||||
postDisplayRotation(deltaRotation(
|
applyWindowToHomeRotation(mMatrix);
|
||||||
mOrientationState.getLauncherRotation(), mOrientationState.getDisplayRotation()),
|
|
||||||
mDp.widthPx, mDp.heightPx, mMatrix);
|
|
||||||
mMatrix.postTranslate(mDp.windowX - mRunningTarget.position.x,
|
|
||||||
mDp.windowY - mRunningTarget.position.y);
|
|
||||||
|
|
||||||
// Crop rect is the inverse of thumbnail matrix
|
// Crop rect is the inverse of thumbnail matrix
|
||||||
mTempRectF.set(-insets.left, -insets.top,
|
mTempRectF.set(-insets.left, -insets.top,
|
||||||
@@ -224,7 +253,7 @@ public class TaskViewSimulator implements TransformParams.BuilderProxy {
|
|||||||
@Override
|
@Override
|
||||||
public void onBuildParams(Builder builder, RemoteAnimationTargetCompat app,
|
public void onBuildParams(Builder builder, RemoteAnimationTargetCompat app,
|
||||||
int targetMode, TransformParams params) {
|
int targetMode, TransformParams params) {
|
||||||
if (app.mode == mAllTargets.targetMode
|
if (app.mode == targetMode
|
||||||
&& app.activityType != RemoteAnimationTargetCompat.ACTIVITY_TYPE_HOME) {
|
&& app.activityType != RemoteAnimationTargetCompat.ACTIVITY_TYPE_HOME) {
|
||||||
builder.withMatrix(mMatrix)
|
builder.withMatrix(mMatrix)
|
||||||
.withWindowCrop(mTmpCropRect)
|
.withWindowCrop(mTmpCropRect)
|
||||||
|
|||||||
@@ -30,8 +30,6 @@ import com.android.systemui.shared.system.TransactionCompat;
|
|||||||
public class TransformParams {
|
public class TransformParams {
|
||||||
|
|
||||||
private float mProgress;
|
private float mProgress;
|
||||||
private float mOffset;
|
|
||||||
private float mOffsetScale;
|
|
||||||
private @Nullable RectF mCurrentRect;
|
private @Nullable RectF mCurrentRect;
|
||||||
private float mTargetAlpha;
|
private float mTargetAlpha;
|
||||||
private float mCornerRadius;
|
private float mCornerRadius;
|
||||||
@@ -43,8 +41,6 @@ public class TransformParams {
|
|||||||
|
|
||||||
public TransformParams() {
|
public TransformParams() {
|
||||||
mProgress = 0;
|
mProgress = 0;
|
||||||
mOffset = 0;
|
|
||||||
mOffsetScale = 1;
|
|
||||||
mCurrentRect = null;
|
mCurrentRect = null;
|
||||||
mTargetAlpha = 1;
|
mTargetAlpha = 1;
|
||||||
mCornerRadius = -1;
|
mCornerRadius = -1;
|
||||||
@@ -89,26 +85,6 @@ public class TransformParams {
|
|||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* If {@link #mCurrentRect} is null (i.e. {@link #setCurrentRect(RectF)} hasn't overridden
|
|
||||||
* the default), then offset the current rect by this amount after computing the rect based
|
|
||||||
* on {@link #mProgress}.
|
|
||||||
*/
|
|
||||||
public TransformParams setOffset(float offset) {
|
|
||||||
mOffset = offset;
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* If {@link #mCurrentRect} is null (i.e. {@link #setCurrentRect(RectF)} hasn't overridden
|
|
||||||
* the default), then scale the current rect by this amount after computing the rect based
|
|
||||||
* on {@link #mProgress}.
|
|
||||||
*/
|
|
||||||
public TransformParams setOffsetScale(float offsetScale) {
|
|
||||||
mOffsetScale = offsetScale;
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Specifies the set of RemoteAnimationTargetCompats that are included in the transformation
|
* Specifies the set of RemoteAnimationTargetCompats that are included in the transformation
|
||||||
* that these TransformParams help compute. These TransformParams generally only apply to
|
* that these TransformParams help compute. These TransformParams generally only apply to
|
||||||
@@ -183,14 +159,6 @@ public class TransformParams {
|
|||||||
return mProgress;
|
return mProgress;
|
||||||
}
|
}
|
||||||
|
|
||||||
public float getOffset() {
|
|
||||||
return mOffset;
|
|
||||||
}
|
|
||||||
|
|
||||||
public float getOffsetScale() {
|
|
||||||
return mOffsetScale;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
public RectF getCurrentRect() {
|
public RectF getCurrentRect() {
|
||||||
return mCurrentRect;
|
return mCurrentRect;
|
||||||
|
|||||||
@@ -18,14 +18,12 @@ package com.android.quickstep;
|
|||||||
import android.annotation.TargetApi;
|
import android.annotation.TargetApi;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.graphics.Rect;
|
import android.graphics.Rect;
|
||||||
import android.graphics.RectF;
|
|
||||||
import android.os.Build;
|
import android.os.Build;
|
||||||
import android.util.Pair;
|
import android.util.Pair;
|
||||||
import android.view.MotionEvent;
|
import android.view.MotionEvent;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.animation.Interpolator;
|
import android.view.animation.Interpolator;
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
import androidx.annotation.UiThread;
|
import androidx.annotation.UiThread;
|
||||||
|
|
||||||
@@ -33,7 +31,6 @@ import com.android.launcher3.BaseDraggingActivity;
|
|||||||
import com.android.launcher3.DeviceProfile;
|
import com.android.launcher3.DeviceProfile;
|
||||||
import com.android.launcher3.anim.AnimatorPlaybackController;
|
import com.android.launcher3.anim.AnimatorPlaybackController;
|
||||||
import com.android.launcher3.statehandlers.DepthController;
|
import com.android.launcher3.statehandlers.DepthController;
|
||||||
import com.android.launcher3.touch.PagedOrientationHandler;
|
|
||||||
import com.android.quickstep.util.ActivityInitListener;
|
import com.android.quickstep.util.ActivityInitListener;
|
||||||
import com.android.quickstep.util.ShelfPeekAnim;
|
import com.android.quickstep.util.ShelfPeekAnim;
|
||||||
import com.android.systemui.shared.recents.model.ThumbnailData;
|
import com.android.systemui.shared.recents.model.ThumbnailData;
|
||||||
@@ -66,8 +63,6 @@ public interface BaseActivityInterface<T extends BaseDraggingActivity> {
|
|||||||
default void onSwipeUpToHomeComplete() { }
|
default void onSwipeUpToHomeComplete() { }
|
||||||
void onAssistantVisibilityChanged(float visibility);
|
void onAssistantVisibilityChanged(float visibility);
|
||||||
|
|
||||||
@NonNull HomeAnimationFactory prepareHomeUI();
|
|
||||||
|
|
||||||
AnimationFactory prepareRecentsUI(boolean activityVisible, boolean animateActivity,
|
AnimationFactory prepareRecentsUI(boolean activityVisible, boolean animateActivity,
|
||||||
Consumer<AnimatorPlaybackController> callback);
|
Consumer<AnimatorPlaybackController> callback);
|
||||||
|
|
||||||
@@ -152,35 +147,4 @@ public interface BaseActivityInterface<T extends BaseDraggingActivity> {
|
|||||||
*/
|
*/
|
||||||
default void setRecentsAttachedToAppWindow(boolean attached, boolean animate) { }
|
default void setRecentsAttachedToAppWindow(boolean attached, boolean animate) { }
|
||||||
}
|
}
|
||||||
|
|
||||||
interface HomeAnimationFactory {
|
|
||||||
|
|
||||||
/** Return the floating view that will animate in sync with the closing window. */
|
|
||||||
default @Nullable View getFloatingView() {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@NonNull RectF getWindowTargetRect();
|
|
||||||
|
|
||||||
@NonNull AnimatorPlaybackController createActivityAnimationToHome();
|
|
||||||
|
|
||||||
default void playAtomicAnimation(float velocity) {
|
|
||||||
// No-op
|
|
||||||
}
|
|
||||||
|
|
||||||
static RectF getDefaultWindowTargetRect(PagedOrientationHandler orientationHandler,
|
|
||||||
DeviceProfile dp) {
|
|
||||||
final int halfIconSize = dp.iconSizePx / 2;
|
|
||||||
float primaryDimension = orientationHandler
|
|
||||||
.getPrimaryValue(dp.availableWidthPx, dp.availableHeightPx);
|
|
||||||
float secondaryDimension = orientationHandler
|
|
||||||
.getSecondaryValue(dp.availableWidthPx, dp.availableHeightPx);
|
|
||||||
final float targetX = primaryDimension / 2f;
|
|
||||||
final float targetY = secondaryDimension - dp.hotseatBarSizePx;
|
|
||||||
// Fallback to animate to center of screen.
|
|
||||||
return new RectF(targetX - halfIconSize, targetY - halfIconSize,
|
|
||||||
targetX + halfIconSize, targetY + halfIconSize);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -37,7 +37,6 @@ import android.database.ContentObserver;
|
|||||||
import android.graphics.Matrix;
|
import android.graphics.Matrix;
|
||||||
import android.graphics.PointF;
|
import android.graphics.PointF;
|
||||||
import android.graphics.Rect;
|
import android.graphics.Rect;
|
||||||
import android.graphics.RectF;
|
|
||||||
import android.os.Handler;
|
import android.os.Handler;
|
||||||
import android.provider.Settings;
|
import android.provider.Settings;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
@@ -124,7 +123,6 @@ public final class RecentsOrientedState implements SharedPreferences.OnSharedPre
|
|||||||
private final WindowSizeStrategy mSizeStrategy;
|
private final WindowSizeStrategy mSizeStrategy;
|
||||||
|
|
||||||
private final Matrix mTmpMatrix = new Matrix();
|
private final Matrix mTmpMatrix = new Matrix();
|
||||||
private final Matrix mTmpInverseMatrix = new Matrix();
|
|
||||||
|
|
||||||
private int mFlags;
|
private int mFlags;
|
||||||
private int mPreviousRotation = ROTATION_0;
|
private int mPreviousRotation = ROTATION_0;
|
||||||
@@ -419,23 +417,6 @@ public final class RecentsOrientedState implements SharedPreferences.OnSharedPre
|
|||||||
*/
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
public void mapRectFromNormalOrientation(RectF src, int screenWidth, int screenHeight) {
|
|
||||||
mapRectFromRotation(mDisplayRotation, src, screenWidth, screenHeight);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void mapRectFromRotation(int rotation, RectF src, int screenWidth, int screenHeight) {
|
|
||||||
mTmpMatrix.reset();
|
|
||||||
postDisplayRotation(rotation, screenWidth, screenHeight, mTmpMatrix);
|
|
||||||
mTmpMatrix.mapRect(src);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void mapInverseRectFromNormalOrientation(RectF src, int screenWidth, int screenHeight) {
|
|
||||||
mTmpMatrix.reset();
|
|
||||||
postDisplayRotation(mDisplayRotation, screenWidth, screenHeight, mTmpMatrix);
|
|
||||||
mTmpMatrix.invert(mTmpInverseMatrix);
|
|
||||||
mTmpInverseMatrix.mapRect(src);
|
|
||||||
}
|
|
||||||
|
|
||||||
@SurfaceRotation
|
@SurfaceRotation
|
||||||
public static int getRotationForUserDegreesRotated(float degrees, int currentRotation) {
|
public static int getRotationForUserDegreesRotated(float degrees, int currentRotation) {
|
||||||
if (degrees == ORIENTATION_UNKNOWN) {
|
if (degrees == ORIENTATION_UNKNOWN) {
|
||||||
|
|||||||
Reference in New Issue
Block a user