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); + } }