From acaf0749b3a58679793deb21e0cf655d3700bd8a Mon Sep 17 00:00:00 2001 From: Vinit Nayak Date: Fri, 14 Feb 2020 10:45:55 -0800 Subject: [PATCH] Adjust target and src rects for swipe to home animation Floating icon animation runs entirely in portrait since that's what orienation launcher starts in. Current app window target rects are in landscape to be able animate to Overview correctly (which is not in portrait since the leash from WM is in the same orientation as that of foreground app). Invert that rect as the animation from app window to floating icon progresses. Fixes: 148528795 Change-Id: Ie1149a1a8904afc80bd1986f8d67b6f2d88c49f2 --- .../android/quickstep/BaseSwipeUpHandler.java | 40 +++++++++++------ .../quickstep/FallbackSwipeHandler.java | 3 +- .../quickstep/LauncherActivityInterface.java | 3 +- .../quickstep/LauncherSwipeHandler.java | 1 + .../com/android/quickstep/TaskViewUtils.java | 1 - .../util/AppWindowAnimationHelper.java | 8 ++-- .../android/quickstep/views/RecentsView.java | 2 +- .../quickstep/BaseActivityInterface.java | 15 ++++--- .../OrientationTouchTransformer.java | 1 + .../model/PagedViewOrientedState.java | 4 ++ .../launcher3/states/RotationHelper.java | 2 +- .../touch/LandscapePagedViewHandler.java | 44 +++++++------------ .../touch/PagedOrientationHandler.java | 10 +++-- .../touch/PortraitPagedViewHandler.java | 30 +++++-------- .../touch/SeascapePagedViewHandler.java | 36 +++++++-------- 15 files changed, 105 insertions(+), 95 deletions(-) diff --git a/quickstep/recents_ui_overrides/src/com/android/quickstep/BaseSwipeUpHandler.java b/quickstep/recents_ui_overrides/src/com/android/quickstep/BaseSwipeUpHandler.java index 8957b0d3e9..f50bb3e59a 100644 --- a/quickstep/recents_ui_overrides/src/com/android/quickstep/BaseSwipeUpHandler.java +++ b/quickstep/recents_ui_overrides/src/com/android/quickstep/BaseSwipeUpHandler.java @@ -125,7 +125,7 @@ public abstract class BaseSwipeUpHandler mGestureState.setState(STATE_END_TARGET_ANIMATION_FINISHED); } }); + getOrientationHandler().adjustFloatingIconStartVelocity(velocityPxPerMs); windowAnim.start(velocityPxPerMs); homeAnimFactory.playAtomicAnimation(velocityPxPerMs.y); mRunningWindowAnim = RunningWindowAnim.wrap(windowAnim); diff --git a/quickstep/recents_ui_overrides/src/com/android/quickstep/TaskViewUtils.java b/quickstep/recents_ui_overrides/src/com/android/quickstep/TaskViewUtils.java index aedb756101..8d735915d9 100644 --- a/quickstep/recents_ui_overrides/src/com/android/quickstep/TaskViewUtils.java +++ b/quickstep/recents_ui_overrides/src/com/android/quickstep/TaskViewUtils.java @@ -130,7 +130,6 @@ public final class TaskViewUtils { .setLauncherOnTop(true); final RecentsView recentsView = v.getRecentsView(); - params.setPagedOrientedState(recentsView.getPagedViewOrientedState()); final ValueAnimator appAnimator = ValueAnimator.ofFloat(0, 1); appAnimator.setInterpolator(TOUCH_RESPONSE_INTERPOLATOR); appAnimator.addUpdateListener(new MultiValueUpdateListener() { diff --git a/quickstep/recents_ui_overrides/src/com/android/quickstep/util/AppWindowAnimationHelper.java b/quickstep/recents_ui_overrides/src/com/android/quickstep/util/AppWindowAnimationHelper.java index 6923ca25ff..91af1563d2 100644 --- a/quickstep/recents_ui_overrides/src/com/android/quickstep/util/AppWindowAnimationHelper.java +++ b/quickstep/recents_ui_overrides/src/com/android/quickstep/util/AppWindowAnimationHelper.java @@ -22,6 +22,7 @@ import android.graphics.Matrix.ScaleToFit; import android.graphics.Rect; import android.graphics.RectF; import android.os.Build; +import android.view.Surface; import androidx.annotation.Nullable; @@ -157,11 +158,12 @@ public class AppWindowAnimationHelper { } private float getSrcToTargetScale() { - if (mOrientedState == null) { + if (mOrientedState == null || + (mOrientedState.getDisplayRotation() == Surface.ROTATION_0 + || mOrientedState.getDisplayRotation() == Surface.ROTATION_180)) { return mSourceRect.width() / mTargetRect.width(); } else { - return mOrientedState.getOrientationHandler() - .getCurrentAppAnimationScale(mSourceRect, mTargetRect); + return mSourceRect.height() / mTargetRect.height(); } } 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 50a66299b4..4bd1215710 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 @@ -381,7 +381,7 @@ public abstract class RecentsView extends PagedView impl mOrientationListener = new OrientationEventListener(getContext()) { @Override public void onOrientationChanged(int i) { - int rotation = RotationHelper.getRotationFromDegrees(i, mPreviousRotation); + int rotation = RotationHelper.getRotationFromDegrees(i); if (mPreviousRotation != rotation) { animateRecentsRotationInPlace(rotation); mPreviousRotation = rotation; diff --git a/quickstep/src/com/android/quickstep/BaseActivityInterface.java b/quickstep/src/com/android/quickstep/BaseActivityInterface.java index 58d6ee7998..64e053f318 100644 --- a/quickstep/src/com/android/quickstep/BaseActivityInterface.java +++ b/quickstep/src/com/android/quickstep/BaseActivityInterface.java @@ -149,13 +149,18 @@ public interface BaseActivityInterface { // No-op } - static RectF getDefaultWindowTargetRect(DeviceProfile dp) { + static RectF getDefaultWindowTargetRect(PagedOrientationHandler orientationHandler, + DeviceProfile dp) { final int halfIconSize = dp.iconSizePx / 2; - final float targetCenterX = dp.availableWidthPx / 2f; - final float targetCenterY = dp.availableHeightPx - dp.hotseatBarSizePx; + 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(targetCenterX - halfIconSize, targetCenterY - halfIconSize, - targetCenterX + halfIconSize, targetCenterY + halfIconSize); + return new RectF(targetX - halfIconSize, targetY - halfIconSize, + targetX + halfIconSize, targetY + halfIconSize); } } diff --git a/quickstep/src/com/android/quickstep/OrientationTouchTransformer.java b/quickstep/src/com/android/quickstep/OrientationTouchTransformer.java index f78ac57cd7..832baf5eb8 100644 --- a/quickstep/src/com/android/quickstep/OrientationTouchTransformer.java +++ b/quickstep/src/com/android/quickstep/OrientationTouchTransformer.java @@ -300,6 +300,7 @@ class OrientationTouchTransformer { } boolean applyTransform(MotionEvent event, boolean forceTransform) { + // TODO(b/149658423): See if we can use RotationHelper.getRotationMatrix here MotionEvent tmp = MotionEvent.obtain(event); Matrix outMatrix = new Matrix(); int delta = RotationHelper.deltaRotation(mCurrentRotation, mRotation); diff --git a/src/com/android/launcher3/model/PagedViewOrientedState.java b/src/com/android/launcher3/model/PagedViewOrientedState.java index fd1154c9fa..1349effe72 100644 --- a/src/com/android/launcher3/model/PagedViewOrientedState.java +++ b/src/com/android/launcher3/model/PagedViewOrientedState.java @@ -83,6 +83,10 @@ public final class PagedViewOrientedState { } } + public int getDisplayRotation() { + return mDisplayRotation; + } + /** * Gets the difference between the rotation of the device/display and which region the * user is currently interacting with in factors of 90 degree clockwise rotations. diff --git a/src/com/android/launcher3/states/RotationHelper.java b/src/com/android/launcher3/states/RotationHelper.java index 95b13b448a..3b134b0c03 100644 --- a/src/com/android/launcher3/states/RotationHelper.java +++ b/src/com/android/launcher3/states/RotationHelper.java @@ -249,7 +249,7 @@ public class RotationHelper implements OnSharedPreferenceChangeListener { return degrees; } - public static int getRotationFromDegrees(int degrees, int currentRotation) { + public static int getRotationFromDegrees(int degrees) { int threshold = 70; if (degrees >= (360 - threshold) || degrees < (threshold)) { return Surface.ROTATION_0; diff --git a/src/com/android/launcher3/touch/LandscapePagedViewHandler.java b/src/com/android/launcher3/touch/LandscapePagedViewHandler.java index 3090d97fe0..1db65b9705 100644 --- a/src/com/android/launcher3/touch/LandscapePagedViewHandler.java +++ b/src/com/android/launcher3/touch/LandscapePagedViewHandler.java @@ -18,10 +18,12 @@ package com.android.launcher3.touch; import android.content.res.Resources; import android.graphics.Matrix; +import android.graphics.PointF; import android.graphics.Rect; import android.graphics.RectF; import android.util.FloatProperty; import android.view.MotionEvent; +import android.view.Surface; import android.view.VelocityTracker; import android.view.View; import android.view.accessibility.AccessibilityEvent; @@ -30,6 +32,7 @@ import com.android.launcher3.DeviceProfile; import com.android.launcher3.LauncherState.ScaleAndTranslation; import com.android.launcher3.PagedView; import com.android.launcher3.Utilities; +import com.android.launcher3.states.RotationHelper; import com.android.launcher3.util.OverScroller; import static com.android.launcher3.LauncherAnimUtils.VIEW_TRANSLATE_X; @@ -37,10 +40,6 @@ import static com.android.launcher3.LauncherAnimUtils.VIEW_TRANSLATE_Y; import static com.android.launcher3.touch.SingleAxisSwipeDetector.HORIZONTAL; public class LandscapePagedViewHandler implements PagedOrientationHandler { - @Override - public float getCurrentAppAnimationScale(RectF src, RectF target) { - return src.height() / target.height(); - } @Override public int getPrimaryValue(int x, int y) { @@ -77,13 +76,15 @@ public class LandscapePagedViewHandler implements PagedOrientationHandler { } @Override - public float getDragLengthFactor(int dimension, int transitionDragLength) { - return Math.min(1.0f, (float) dimension / transitionDragLength); + public boolean isGoingUp(float displacement) { + return displacement > 0; } @Override - public boolean isGoingUp(float displacement) { - return displacement > 0; + public void adjustFloatingIconStartVelocity(PointF velocity) { + float oldX = velocity.x; + float oldY = velocity.y; + velocity.set(-oldY, oldX); } @Override @@ -189,29 +190,18 @@ public class LandscapePagedViewHandler implements PagedOrientationHandler { } @Override - public void offsetTaskRect(RectF rect, float value, int delta) { - if (delta == 0) { - rect.offset(value, 0); - } else if (delta == 1) { - rect.offset(0, -value); - } else if (delta == 2) { - rect.offset(-value, 0); - } else { + public void offsetTaskRect(RectF rect, float value, int displayRotation) { + if (displayRotation == Surface.ROTATION_0) { rect.offset(0, value); + } else if (displayRotation == Surface.ROTATION_90) { + rect.offset(value, 0); + } else if (displayRotation == Surface.ROTATION_180) { + rect.offset(0, -value); + } else { + rect.offset(-value, 0); } } - @Override - public void mapRectFromNormalOrientation(Rect src, int screenWidth, int screenHeight) { - Matrix m = new Matrix(); - m.setRotate(270); - m.postTranslate(0, screenWidth); - RectF newTarget = new RectF(); - RectF oldTarget = new RectF(src); - m.mapRect(newTarget, oldTarget); - src.set((int)newTarget.left, (int)newTarget.top, (int)newTarget.right, (int)newTarget.bottom); - } - @Override public int getChildStart(View view) { return view.getTop(); diff --git a/src/com/android/launcher3/touch/PagedOrientationHandler.java b/src/com/android/launcher3/touch/PagedOrientationHandler.java index 2f02076f8e..b4802cda90 100644 --- a/src/com/android/launcher3/touch/PagedOrientationHandler.java +++ b/src/com/android/launcher3/touch/PagedOrientationHandler.java @@ -18,6 +18,7 @@ package com.android.launcher3.touch; import android.content.res.Resources; import android.graphics.Canvas; +import android.graphics.PointF; import android.graphics.Rect; import android.graphics.RectF; import android.util.FloatProperty; @@ -75,8 +76,6 @@ public interface PagedOrientationHandler { boolean getRecentsRtlSetting(Resources resources); float getDegreesRotated(); void offsetTaskRect(RectF rect, float value, int delta); - void mapRectFromNormalOrientation(Rect src, int screenWidth, int screenHeight); - float getCurrentAppAnimationScale(RectF src, RectF target); int getPrimaryValue(int x, int y); int getSecondaryValue(int x, int y); void delegateScrollTo(PagedView pagedView, int secondaryScroll, int primaryScroll); @@ -85,9 +84,14 @@ public interface PagedOrientationHandler { void delegateScrollBy(PagedView pagedView, int unboundedScroll, int x, int y); void scrollerStartScroll(OverScroller scroller, int newPosition); CurveProperties getCurveProperties(PagedView pagedView, Rect insets); - float getDragLengthFactor(int dimension, int transitionDragLength); boolean isGoingUp(float displacement); + /** + * Maps the velocity from the coordinate plane of the foreground app to that + * of Launcher's (which now will always be portrait) + */ + void adjustFloatingIconStartVelocity(PointF velocity); + class CurveProperties { public final int scroll; public final int halfPageSize; diff --git a/src/com/android/launcher3/touch/PortraitPagedViewHandler.java b/src/com/android/launcher3/touch/PortraitPagedViewHandler.java index fbd80bbfd1..22eee49df6 100644 --- a/src/com/android/launcher3/touch/PortraitPagedViewHandler.java +++ b/src/com/android/launcher3/touch/PortraitPagedViewHandler.java @@ -17,10 +17,13 @@ package com.android.launcher3.touch; import android.content.res.Resources; +import android.graphics.Matrix; +import android.graphics.PointF; import android.graphics.Rect; import android.graphics.RectF; import android.util.FloatProperty; import android.view.MotionEvent; +import android.view.Surface; import android.view.VelocityTracker; import android.view.View; import android.view.accessibility.AccessibilityEvent; @@ -29,6 +32,7 @@ import com.android.launcher3.DeviceProfile; import com.android.launcher3.LauncherState.ScaleAndTranslation; import com.android.launcher3.PagedView; import com.android.launcher3.Utilities; +import com.android.launcher3.states.RotationHelper; import com.android.launcher3.util.OverScroller; import static com.android.launcher3.LauncherAnimUtils.VIEW_TRANSLATE_X; @@ -37,11 +41,6 @@ import static com.android.launcher3.touch.SingleAxisSwipeDetector.VERTICAL; public class PortraitPagedViewHandler implements PagedOrientationHandler { - @Override - public float getCurrentAppAnimationScale(RectF src, RectF target) { - return src.width() / target.width(); - } - @Override public int getPrimaryValue(int x, int y) { return x; @@ -77,13 +76,13 @@ public class PortraitPagedViewHandler implements PagedOrientationHandler { } @Override - public float getDragLengthFactor(int dimension, int transitionDragLength) { - return (float) dimension / transitionDragLength; + public boolean isGoingUp(float displacement) { + return displacement < 0; } @Override - public boolean isGoingUp(float displacement) { - return displacement < 0; + public void adjustFloatingIconStartVelocity(PointF velocity) { + //no-op } @Override @@ -189,23 +188,18 @@ public class PortraitPagedViewHandler implements PagedOrientationHandler { } @Override - public void offsetTaskRect(RectF rect, float value, int delta) { - if (delta == 0) { + public void offsetTaskRect(RectF rect, float value, int displayRotation) { + if (displayRotation == Surface.ROTATION_0) { rect.offset(value, 0); - } else if (delta == 1) { + } else if (displayRotation == Surface.ROTATION_90) { rect.offset(0, -value); - } else if (delta == 2) { + } else if (displayRotation == Surface.ROTATION_180) { rect.offset(-value, 0); } else { rect.offset(0, value); } } - @Override - public void mapRectFromNormalOrientation(Rect src, int screenWidth, int screenHeight) { - //no-op - } - @Override public int getChildStart(View view) { return view.getLeft(); diff --git a/src/com/android/launcher3/touch/SeascapePagedViewHandler.java b/src/com/android/launcher3/touch/SeascapePagedViewHandler.java index f1875cc32f..eebd87fc86 100644 --- a/src/com/android/launcher3/touch/SeascapePagedViewHandler.java +++ b/src/com/android/launcher3/touch/SeascapePagedViewHandler.java @@ -17,9 +17,9 @@ package com.android.launcher3.touch; import android.content.res.Resources; -import android.graphics.Matrix; -import android.graphics.Rect; +import android.graphics.PointF; import android.graphics.RectF; +import android.view.Surface; import com.android.launcher3.Utilities; @@ -36,29 +36,18 @@ public class SeascapePagedViewHandler extends LandscapePagedViewHandler { } @Override - public void offsetTaskRect(RectF rect, float value, int delta) { - if (delta == 0) { - rect.offset(-value, 0); - } else if (delta == 1) { + public void offsetTaskRect(RectF rect, float value, int displayRotation) { + if (displayRotation == Surface.ROTATION_0) { rect.offset(0, value); - } else if (delta == 2) { - rect.offset(-value, 0); - } else { + } else if (displayRotation == Surface.ROTATION_90) { + rect.offset(value, 0); + } else if (displayRotation == Surface.ROTATION_180) { rect.offset(0, -value); + } else { + rect.offset(-value, 0); } } - @Override - public void mapRectFromNormalOrientation(Rect src, int screenWidth, int screenHeight) { - Matrix m = new Matrix(); - m.setRotate(90); - m.postTranslate(screenHeight, 0); - RectF newTarget = new RectF(); - RectF oldTarget = new RectF(src); - m.mapRect(newTarget, oldTarget); - src.set((int)newTarget.left, (int)newTarget.top, (int)newTarget.right, (int)newTarget.bottom); - } - @Override public float getDegreesRotated() { return 270; @@ -68,4 +57,11 @@ public class SeascapePagedViewHandler extends LandscapePagedViewHandler { public boolean isGoingUp(float displacement) { return displacement < 0; } + + @Override + public void adjustFloatingIconStartVelocity(PointF velocity) { + float oldX = velocity.x; + float oldY = velocity.y; + velocity.set(oldY, -oldX); + } }