diff --git a/quickstep/recents_ui_overrides/src/com/android/quickstep/SwipeUpAnimationLogic.java b/quickstep/recents_ui_overrides/src/com/android/quickstep/SwipeUpAnimationLogic.java index 137f8091ad..2963b6ce18 100644 --- a/quickstep/recents_ui_overrides/src/com/android/quickstep/SwipeUpAnimationLogic.java +++ b/quickstep/recents_ui_overrides/src/com/android/quickstep/SwipeUpAnimationLogic.java @@ -101,7 +101,8 @@ public abstract class SwipeUpAnimationLogic { AnimatorPlaybackController normalController = pa.createPlaybackController(); mWindowTransitionController = AnimatorControllerWithResistance.createForRecents( normalController, mContext, mTaskViewSimulator.getOrientationState(), - mDp, mTaskViewSimulator.recentsViewScale, AnimatedFloat.VALUE); + mDp, mTaskViewSimulator.recentsViewScale, AnimatedFloat.VALUE, + mTaskViewSimulator.recentsViewSecondaryTranslation, AnimatedFloat.VALUE); } @UiThread diff --git a/quickstep/recents_ui_overrides/src/com/android/quickstep/fallback/FallbackRecentsStateController.java b/quickstep/recents_ui_overrides/src/com/android/quickstep/fallback/FallbackRecentsStateController.java index 163c23268b..24a761066a 100644 --- a/quickstep/recents_ui_overrides/src/com/android/quickstep/fallback/FallbackRecentsStateController.java +++ b/quickstep/recents_ui_overrides/src/com/android/quickstep/fallback/FallbackRecentsStateController.java @@ -19,6 +19,7 @@ import static com.android.launcher3.anim.Interpolators.LINEAR; import static com.android.launcher3.states.StateAnimationConfig.ANIM_OVERVIEW_MODAL; import static com.android.launcher3.states.StateAnimationConfig.ANIM_OVERVIEW_SCALE; import static com.android.launcher3.states.StateAnimationConfig.ANIM_OVERVIEW_TRANSLATE_X; +import static com.android.launcher3.states.StateAnimationConfig.ANIM_OVERVIEW_TRANSLATE_Y; import static com.android.launcher3.states.StateAnimationConfig.PLAY_ATOMIC_OVERVIEW_PEEK; import static com.android.launcher3.states.StateAnimationConfig.PLAY_ATOMIC_OVERVIEW_SCALE; import static com.android.launcher3.states.StateAnimationConfig.SKIP_OVERVIEW; @@ -26,6 +27,7 @@ import static com.android.quickstep.views.RecentsView.ADJACENT_PAGE_OFFSET; import static com.android.quickstep.views.RecentsView.FULLSCREEN_PROGRESS; import static com.android.quickstep.views.RecentsView.RECENTS_SCALE_PROPERTY; import static com.android.quickstep.views.RecentsView.TASK_MODALNESS; +import static com.android.quickstep.views.RecentsView.TASK_SECONDARY_TRANSLATION; import com.android.launcher3.anim.PendingAnimation; import com.android.launcher3.anim.PropertySetter; @@ -86,6 +88,8 @@ public class FallbackRecentsStateController implements StateHandler { return new float[] { NO_SCALE, NO_OFFSET }; } - private static class ModalState extends RecentsState { public ModalState(int id, int flags) { diff --git a/quickstep/recents_ui_overrides/src/com/android/quickstep/util/TaskViewSimulator.java b/quickstep/recents_ui_overrides/src/com/android/quickstep/util/TaskViewSimulator.java index 94e496d183..6a2d32405c 100644 --- a/quickstep/recents_ui_overrides/src/com/android/quickstep/util/TaskViewSimulator.java +++ b/quickstep/recents_ui_overrides/src/com/android/quickstep/util/TaskViewSimulator.java @@ -92,6 +92,7 @@ public class TaskViewSimulator implements TransformParams.BuilderProxy { // RecentsView properties public final AnimatedFloat recentsViewScale = new AnimatedFloat(); public final AnimatedFloat fullScreenProgress = new AnimatedFloat(); + public final AnimatedFloat recentsViewSecondaryTranslation = new AnimatedFloat(); private final ScrollState mScrollState = new ScrollState(); // Cached calculations @@ -297,8 +298,10 @@ public class TaskViewSimulator implements TransformParams.BuilderProxy { mOrientationState.getOrientationHandler().set( mMatrix, MATRIX_POST_TRANSLATE, mScrollState.scroll); - // Apply recensView matrix + // Apply RecentsView matrix mMatrix.postScale(recentsViewScale.value, recentsViewScale.value, mPivot.x, mPivot.y); + mOrientationState.getOrientationHandler().setSecondary(mMatrix, MATRIX_POST_TRANSLATE, + recentsViewSecondaryTranslation.value); applyWindowToHomeRotation(mMatrix); // Crop rect is the inverse of thumbnail matrix diff --git a/quickstep/recents_ui_overrides/src/com/android/quickstep/views/RecentsView.java b/quickstep/recents_ui_overrides/src/com/android/quickstep/views/RecentsView.java index 3119f56932..ef75d8abd5 100644 --- a/quickstep/recents_ui_overrides/src/com/android/quickstep/views/RecentsView.java +++ b/quickstep/recents_ui_overrides/src/com/android/quickstep/views/RecentsView.java @@ -211,6 +211,19 @@ public abstract class RecentsView extends PagedView } }; + public static final FloatProperty TASK_SECONDARY_TRANSLATION = + new FloatProperty("taskSecondaryTranslation") { + @Override + public void setValue(RecentsView recentsView, float v) { + recentsView.setTaskViewsSecondaryTranslation(v); + } + + @Override + public Float get(RecentsView recentsView) { + return recentsView.mTaskViewsSecondaryTranslation; + } + }; + /** Same as normal SCALE_PROPERTY, but also updates page offsets that depend on this scale. */ public static final FloatProperty RECENTS_SCALE_PROPERTY = new FloatProperty("recentsScale") { @@ -220,6 +233,7 @@ public abstract class RecentsView extends PagedView view.setScaleY(scale); view.mLastComputedTaskPushOutDistance = null; view.updatePageOffsets(); + view.setTaskViewsSecondaryTranslation(view.mTaskViewsSecondaryTranslation); } @Override @@ -271,6 +285,7 @@ public abstract class RecentsView extends PagedView protected boolean mFreezeViewVisibility; private float mAdjacentPageOffset = 0; + private float mTaskViewsSecondaryTranslation = 0; /** * TODO: Call reloadIdNeeded in onTaskStackChanged. @@ -1417,7 +1432,7 @@ public abstract class RecentsView extends PagedView FloatProperty secondaryViewTranslate = mOrientationHandler.getSecondaryViewTranslate(); int secondaryTaskDimension = mOrientationHandler.getSecondaryDimension(taskView); - int verticalFactor = mOrientationHandler.getTaskDismissDirectionFactor(); + int verticalFactor = mOrientationHandler.getSecondaryTranslationDirectionFactor(); ResourceProvider rp = DynamicResource.provider(mActivity); SpringProperty sp = new SpringProperty(SpringProperty.FLAG_CAN_SPRING_ON_START) @@ -1945,6 +1960,14 @@ public abstract class RecentsView extends PagedView return distanceToOffscreen * offsetProgress; } + private void setTaskViewsSecondaryTranslation(float translation) { + mTaskViewsSecondaryTranslation = translation; + for (int i = 0; i < getTaskViewCount(); i++) { + TaskView task = getTaskViewAt(i); + mOrientationHandler.getSecondaryViewTranslate().set(task, translation / getScaleY()); + } + } + /** * TODO: Do not assume motion across X axis for adjacent page */ diff --git a/quickstep/src/com/android/launcher3/uioverrides/BaseRecentsViewStateController.java b/quickstep/src/com/android/launcher3/uioverrides/BaseRecentsViewStateController.java index 6e120e8bd8..1b8e244ac1 100644 --- a/quickstep/src/com/android/launcher3/uioverrides/BaseRecentsViewStateController.java +++ b/quickstep/src/com/android/launcher3/uioverrides/BaseRecentsViewStateController.java @@ -24,11 +24,13 @@ import static com.android.launcher3.states.StateAnimationConfig.ANIM_OVERVIEW_MO import static com.android.launcher3.states.StateAnimationConfig.ANIM_OVERVIEW_SCALE; import static com.android.launcher3.states.StateAnimationConfig.ANIM_OVERVIEW_SCRIM_FADE; import static com.android.launcher3.states.StateAnimationConfig.ANIM_OVERVIEW_TRANSLATE_X; +import static com.android.launcher3.states.StateAnimationConfig.ANIM_OVERVIEW_TRANSLATE_Y; import static com.android.launcher3.states.StateAnimationConfig.PLAY_ATOMIC_OVERVIEW_PEEK; import static com.android.launcher3.states.StateAnimationConfig.PLAY_ATOMIC_OVERVIEW_SCALE; import static com.android.launcher3.states.StateAnimationConfig.SKIP_OVERVIEW; import static com.android.quickstep.views.RecentsView.ADJACENT_PAGE_OFFSET; import static com.android.quickstep.views.RecentsView.RECENTS_SCALE_PROPERTY; +import static com.android.quickstep.views.RecentsView.TASK_SECONDARY_TRANSLATION; import android.util.FloatProperty; @@ -63,6 +65,7 @@ public abstract class BaseRecentsViewStateController float[] scaleAndOffset = state.getOverviewScaleAndOffset(mLauncher); RECENTS_SCALE_PROPERTY.set(mRecentsView, scaleAndOffset[0]); ADJACENT_PAGE_OFFSET.set(mRecentsView, scaleAndOffset[1]); + TASK_SECONDARY_TRANSLATION.set(mRecentsView, 0f); getContentAlphaProperty().set(mRecentsView, state.overviewUi ? 1f : 0); OverviewScrim scrim = mLauncher.getDragLayer().getOverviewScrim(); @@ -97,6 +100,8 @@ public abstract class BaseRecentsViewStateController config.getInterpolator(ANIM_OVERVIEW_SCALE, LINEAR)); setter.setFloat(mRecentsView, ADJACENT_PAGE_OFFSET, scaleAndOffset[1], config.getInterpolator(ANIM_OVERVIEW_TRANSLATE_X, LINEAR)); + setter.setFloat(mRecentsView, TASK_SECONDARY_TRANSLATION, 0f, + config.getInterpolator(ANIM_OVERVIEW_TRANSLATE_Y, LINEAR)); setter.setFloat(mRecentsView, getContentAlphaProperty(), toState.overviewUi ? 1 : 0, config.getInterpolator(ANIM_OVERVIEW_FADE, AGGRESSIVE_EASE_IN_OUT)); diff --git a/quickstep/src/com/android/quickstep/BaseActivityInterface.java b/quickstep/src/com/android/quickstep/BaseActivityInterface.java index a9a4e95381..1a4620b3e7 100644 --- a/quickstep/src/com/android/quickstep/BaseActivityInterface.java +++ b/quickstep/src/com/android/quickstep/BaseActivityInterface.java @@ -28,6 +28,7 @@ import static com.android.quickstep.util.RecentsAtomicAnimationFactory.INDEX_REC import static com.android.quickstep.views.RecentsView.ADJACENT_PAGE_OFFSET; import static com.android.quickstep.views.RecentsView.FULLSCREEN_PROGRESS; import static com.android.quickstep.views.RecentsView.RECENTS_SCALE_PROPERTY; +import static com.android.quickstep.views.RecentsView.TASK_SECONDARY_TRANSLATION; import android.animation.Animator; import android.annotation.TargetApi; @@ -350,7 +351,8 @@ public abstract class BaseActivityInterface AnimatorControllerWithResistance createForRecents( + public static AnimatorControllerWithResistance createForRecents( AnimatorPlaybackController normalController, Context context, RecentsOrientedState recentsOrientedState, DeviceProfile dp, SCALE scaleTarget, - FloatProperty scaleProperty) { + FloatProperty scaleProperty, TRANSLATION translationTarget, + FloatProperty translationProperty) { Rect startRect = new Rect(); LauncherActivityInterface.INSTANCE.calculateTaskSize(context, dp, startRect, recentsOrientedState.getOrientationHandler()); @@ -150,6 +156,19 @@ public class AnimatorControllerWithResistance { resistAnim.addFloat(scaleTarget, scaleProperty, startScale, endScale, scaleInterpolator); + if (!isTwoButtonMode) { + // Compute where the task view would be based on the end scale, if we didn't translate. + RectF endRectF = new RectF(startRect); + Matrix temp = new Matrix(); + temp.setScale(RECENTS_SCALE_MAX_RESIST, RECENTS_SCALE_MAX_RESIST, pivot.x, pivot.y); + temp.mapRect(endRectF); + // Translate such that the task view touches the top of the screen when drag does. + float endTranslation = endRectF.top * recentsOrientedState.getOrientationHandler() + .getSecondaryTranslationDirectionFactor(); + resistAnim.addFloat(translationTarget, translationProperty, 0, endTranslation, + RECENTS_TRANSLATE_RESIST_INTERPOLATOR); + } + AnimatorPlaybackController resistanceController = resistAnim.createPlaybackController(); return new AnimatorControllerWithResistance(normalController, resistanceController); } diff --git a/src/com/android/launcher3/touch/LandscapePagedViewHandler.java b/src/com/android/launcher3/touch/LandscapePagedViewHandler.java index d98e5727c4..fb02f79c49 100644 --- a/src/com/android/launcher3/touch/LandscapePagedViewHandler.java +++ b/src/com/android/launcher3/touch/LandscapePagedViewHandler.java @@ -107,6 +107,11 @@ public class LandscapePagedViewHandler implements PagedOrientationHandler { action.call(target, 0, param); } + @Override + public void setSecondary(T target, Float2DAction action, float param) { + action.call(target, param, 0); + } + @Override public float getPrimaryDirection(MotionEvent event, int pointerIndex) { return event.getY(pointerIndex); @@ -220,8 +225,7 @@ public class LandscapePagedViewHandler implements PagedOrientationHandler { return -1; } - @Override - public int getTaskDismissDirectionFactor() { + public int getSecondaryTranslationDirectionFactor() { return 1; } diff --git a/src/com/android/launcher3/touch/PagedOrientationHandler.java b/src/com/android/launcher3/touch/PagedOrientationHandler.java index b3b0dc1750..354d78d0ac 100644 --- a/src/com/android/launcher3/touch/PagedOrientationHandler.java +++ b/src/com/android/launcher3/touch/PagedOrientationHandler.java @@ -57,6 +57,7 @@ public interface PagedOrientationHandler { void set(T target, Int2DAction action, int param); void set(T target, Float2DAction action, float param); + void setSecondary(T target, Float2DAction action, float param); float getPrimaryDirection(MotionEvent event, int pointerIndex); float getPrimaryVelocity(VelocityTracker velocityTracker, int pointerId); int getMeasuredSize(View view); @@ -76,7 +77,7 @@ public interface PagedOrientationHandler { int getScrollOffsetEnd(View view, Rect insets); SingleAxisSwipeDetector.Direction getOppositeSwipeDirection(); int getPrimaryTranslationDirectionFactor(); - int getTaskDismissDirectionFactor(); + int getSecondaryTranslationDirectionFactor(); int getTaskDragDisplacementFactor(boolean isRtl); ChildBounds getChildBounds(View child, int childStart, int pageCenter, boolean layoutChild); void setMaxScroll(AccessibilityEvent event, int maxScroll); diff --git a/src/com/android/launcher3/touch/PortraitPagedViewHandler.java b/src/com/android/launcher3/touch/PortraitPagedViewHandler.java index c0690fc23c..06479e6b6a 100644 --- a/src/com/android/launcher3/touch/PortraitPagedViewHandler.java +++ b/src/com/android/launcher3/touch/PortraitPagedViewHandler.java @@ -104,6 +104,11 @@ public class PortraitPagedViewHandler implements PagedOrientationHandler { action.call(target, param, 0); } + @Override + public void setSecondary(T target, Float2DAction action, float param) { + action.call(target, 0, param); + } + @Override public float getPrimaryDirection(MotionEvent event, int pointerIndex) { return event.getX(pointerIndex); @@ -217,8 +222,7 @@ public class PortraitPagedViewHandler implements PagedOrientationHandler { return 1; } - @Override - public int getTaskDismissDirectionFactor() { + public int getSecondaryTranslationDirectionFactor() { return -1; } diff --git a/src/com/android/launcher3/touch/SeascapePagedViewHandler.java b/src/com/android/launcher3/touch/SeascapePagedViewHandler.java index c00fe298aa..60d19d9beb 100644 --- a/src/com/android/launcher3/touch/SeascapePagedViewHandler.java +++ b/src/com/android/launcher3/touch/SeascapePagedViewHandler.java @@ -28,7 +28,7 @@ import com.android.launcher3.Utilities; public class SeascapePagedViewHandler extends LandscapePagedViewHandler { @Override - public int getTaskDismissDirectionFactor() { + public int getSecondaryTranslationDirectionFactor() { return -1; }