Removing some new object creation during touch handling
> Motion various transformation methods to Orientation Handler
> Moving orientation handler to quickstep package
Bug: 150300347
Bug: 151269990
Bug: 149610456
Change-Id: I28434c1d1f62a3b85f3583740f0a8f827513fab3
diff --git a/src/com/android/launcher3/PagedView.java b/src/com/android/launcher3/PagedView.java
index 5e47e2f..e36ae94 100644
--- a/src/com/android/launcher3/PagedView.java
+++ b/src/com/android/launcher3/PagedView.java
@@ -38,7 +38,6 @@
import android.view.InputDevice;
import android.view.KeyEvent;
import android.view.MotionEvent;
-import android.view.Surface;
import android.view.VelocityTracker;
import android.view.View;
import android.view.ViewConfiguration;
@@ -55,12 +54,10 @@
import com.android.launcher3.anim.Interpolators;
import com.android.launcher3.compat.AccessibilityManagerCompat;
import com.android.launcher3.config.FeatureFlags;
-import com.android.launcher3.model.PagedViewOrientedState;
import com.android.launcher3.pageindicators.PageIndicator;
import com.android.launcher3.touch.OverScroll;
import com.android.launcher3.touch.PagedOrientationHandler;
import com.android.launcher3.touch.PagedOrientationHandler.ChildBounds;
-import com.android.launcher3.touch.PortraitPagedViewHandler;
import com.android.launcher3.util.OverScroller;
import com.android.launcher3.util.Thunk;
import com.android.launcher3.views.ActivityContext;
@@ -121,8 +118,7 @@
private float mLastMotion;
private float mLastMotionRemainder;
private float mTotalMotion;
- protected PagedOrientationHandler mOrientationHandler = new PortraitPagedViewHandler();
- protected final PagedViewOrientedState mOrientationState = new PagedViewOrientedState();
+ protected PagedOrientationHandler mOrientationHandler = PagedOrientationHandler.PORTRAIT;
protected int[] mPageScrolls;
private boolean mIsBeingDragged;
@@ -144,9 +140,6 @@
protected int mUnboundedScroll;
- protected int mLayoutRotation = Surface.ROTATION_0;
- protected int mDisplayRotation = Surface.ROTATION_0;
-
// Page Indicator
@Thunk int mPageIndicatorViewId;
protected T mPageIndicator;
@@ -417,37 +410,6 @@
return mUnboundedScroll;
}
- protected void updateLayoutRotation(int touchRotation) {
- setLayoutRotation(touchRotation, mDisplayRotation);
- }
-
- /** @param touchRotation Must be one of {@link android.view.Surface.ROTATION_0/90/180/270} */
- public void setLayoutRotation(int touchRotation, int displayRotation) {
- if (mLayoutRotation == touchRotation && mDisplayRotation == displayRotation) {
- return;
- }
-
- mOrientationState.update(touchRotation, displayRotation);
- mOrientationHandler = mOrientationState.getOrientationHandler();
- mLayoutRotation = touchRotation;
- mDisplayRotation = displayRotation;
- requestLayout();
- }
-
- public PagedViewOrientedState getPagedViewOrientedState() {
- return mOrientationState;
- }
-
- public PagedOrientationHandler getPagedOrientationHandler() {
- return getPagedViewOrientedState().getOrientationHandler();
- }
-
- public void disableMultipleLayoutRotations(boolean disable) {
- mOrientationState.disableMultipleOrientations(disable);
- mOrientationHandler = mOrientationState.getOrientationHandler();
- requestLayout();
- }
-
@Override
public void scrollBy(int x, int y) {
mOrientationHandler.delegateScrollBy(this, getUnboundedScroll(), x, y);
diff --git a/src/com/android/launcher3/model/PagedViewOrientedState.java b/src/com/android/launcher3/model/PagedViewOrientedState.java
deleted file mode 100644
index e48b8c1..0000000
--- a/src/com/android/launcher3/model/PagedViewOrientedState.java
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- *
- * * Copyright (C) 2020 The Android Open Source Project
- * *
- * * Licensed under the Apache License, Version 2.0 (the "License");
- * * you may not use this file except in compliance with the License.
- * * You may obtain a copy of the License at
- * *
- * * http://www.apache.org/licenses/LICENSE-2.0
- * *
- * * Unless required by applicable law or agreed to in writing, software
- * * distributed under the License is distributed on an "AS IS" BASIS,
- * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * * See the License for the specific language governing permissions and
- * * limitations under the License.
- *
- */
-
-package com.android.launcher3.model;
-
-import android.view.Surface;
-
-import com.android.launcher3.states.RotationHelper;
-import com.android.launcher3.touch.PortraitPagedViewHandler;
-import com.android.launcher3.touch.LandscapePagedViewHandler;
-import com.android.launcher3.touch.PagedOrientationHandler;
-import com.android.launcher3.touch.SeascapePagedViewHandler;
-
-/**
- * Container to hold orientation/rotation related information for Launcher.
- * This is not meant to be an abstraction layer for applying different functionality between
- * the different orientation/rotations. For that see {@link PagedOrientationHandler}
- *
- * This class has initial default state assuming the device and foreground app have
- * no ({@link Surface.ROTATION_0} rotation.
- *
- * Currently this class resides in {@link com.android.launcher3.PagedView}, but there's a ticket
- * to disassociate it from Launcher since it's needed before Launcher is instantiated
- * See TODO(b/150300347)
- */
-public final class PagedViewOrientedState {
-
- private PagedOrientationHandler mOrientationHandler = new PortraitPagedViewHandler();
-
- private int mTouchRotation = Surface.ROTATION_0;
- private int mDisplayRotation = Surface.ROTATION_0;
- /**
- * If {@code true} we default to {@link PortraitPagedViewHandler} and don't support any fake
- * launcher orientations.
- */
- private boolean mDisableMultipleOrientations;
-
- /**
- * Sets the appropriate {@link PagedOrientationHandler} for {@link #mOrientationHandler}
- * @param touchRotation The rotation the nav bar region that is touched is in
- * @param displayRotation Rotation of the display/device
- */
- public void update(int touchRotation, int displayRotation) {
- if (mDisableMultipleOrientations) {
- return;
- }
-
- mDisplayRotation = displayRotation;
- mTouchRotation = touchRotation;
- if (mTouchRotation == Surface.ROTATION_90) {
- mOrientationHandler = new LandscapePagedViewHandler();
- } else if (mTouchRotation == Surface.ROTATION_270) {
- mOrientationHandler = new SeascapePagedViewHandler();
- } else {
- mOrientationHandler = new PortraitPagedViewHandler();
- }
- }
-
- public boolean areMultipleLayoutOrientationsDisabled() {
- return mDisableMultipleOrientations;
- }
-
- /**
- * Setting this preference will render future calls to {@link #update(int, int)} as a no-op.
- */
- public void disableMultipleOrientations(boolean disable) {
- mDisableMultipleOrientations = disable;
- if (disable) {
- mOrientationHandler = new PortraitPagedViewHandler();
- }
- }
-
- 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.
- * Ex. Display is in portrait -> 0, user touches landscape region -> 1, this
- * method would return 3 because it takes 3 clockwise 90 degree rotations from normal to
- * landscape (portrait -> seascape -> reverse portrait -> landscape)
- */
- public int getTouchDisplayDelta() {
- return RotationHelper.deltaRotation(mTouchRotation, mDisplayRotation);
- }
-
- public PagedOrientationHandler getOrientationHandler() {
- return mOrientationHandler;
- }
-}
diff --git a/src/com/android/launcher3/states/RotationHelper.java b/src/com/android/launcher3/states/RotationHelper.java
index 8bb6a08..2e0521f 100644
--- a/src/com/android/launcher3/states/RotationHelper.java
+++ b/src/com/android/launcher3/states/RotationHelper.java
@@ -31,12 +31,7 @@
import android.content.SharedPreferences;
import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
import android.content.res.Resources;
-import android.graphics.Matrix;
-import android.graphics.Rect;
-import android.graphics.RectF;
import android.provider.Settings;
-import android.view.MotionEvent;
-import android.view.Surface;
import com.android.launcher3.R;
import com.android.launcher3.Utilities;
@@ -258,138 +253,6 @@
}
}
- public static int getDegreesFromRotation(int rotation) {
- int degrees;
- switch (rotation) {
- case Surface.ROTATION_90:
- degrees = 90;
- break;
- case Surface.ROTATION_180:
- degrees = 180;
- break;
- case Surface.ROTATION_270:
- degrees = 270;
- break;
- case Surface.ROTATION_0:
- default:
- degrees = 0;
- break;
- }
- return degrees;
- }
-
- public static int getRotationFromDegrees(float degrees) {
- int threshold = 70;
- if (degrees >= (360 - threshold) || degrees < (threshold)) {
- return Surface.ROTATION_0;
- } else if (degrees < (90 + threshold)) {
- return Surface.ROTATION_270;
- } else if (degrees < 180 + threshold) {
- return Surface.ROTATION_180;
- } else {
- return Surface.ROTATION_90;
- }
- }
-
- /**
- * @return how many factors {@param newRotation} is rotated 90 degrees clockwise.
- * E.g. 1->Rotated by 90 degrees clockwise, 2->Rotated 180 clockwise...
- * A value of 0 means no rotation has been applied
- */
- public static int deltaRotation(int oldRotation, int newRotation) {
- int delta = newRotation - oldRotation;
- if (delta < 0) delta += 4;
- return delta;
- }
-
- /**
- * For landscape, since the navbar is already in a vertical position, we don't have to do any
- * rotations as the change in Y coordinate is what is read. We only flip the sign of the
- * y coordinate to make it match existing behavior of swipe to the top to go previous
- */
- public static void transformEventForNavBar(MotionEvent ev, boolean inverse) {
- // TODO(b/151269990): Use a temp matrix
- Matrix m = new Matrix();
- m.setScale(1, -1);
- if (inverse) {
- Matrix inv = new Matrix();
- m.invert(inv);
- ev.transform(inv);
- } else {
- ev.transform(m);
- }
- }
-
- /**
- * Creates a matrix to transform the given motion event specified by degrees.
- * If {@param inverse} is {@code true}, the inverse of that matrix will be applied
- */
- public static void transformEvent(float degrees, MotionEvent ev, boolean inverse) {
- Matrix transform = new Matrix();
- // TODO(b/151269990): Use a temp matrix
- transform.setRotate(degrees);
- if (inverse) {
- Matrix inv = new Matrix();
- transform.invert(inv);
- ev.transform(inv);
- } else {
- ev.transform(transform);
- }
- // TODO: Add scaling back in based on degrees
-// if (getWidth() > 0 && getHeight() > 0) {
-// float scale = ((float) getWidth()) / getHeight();
-// transform.postScale(scale, 1 / scale);
-// }
- }
-
- /**
- * TODO(b/149658423): Have {@link com.android.quickstep.OrientationTouchTransformer
- * also use this}
- */
- public static Matrix getRotationMatrix(int screenWidth, int screenHeight, int displayRotation) {
- Matrix m = new Matrix();
- // TODO(b/151269990): Use a temp matrix
- switch (displayRotation) {
- case Surface.ROTATION_0:
- return m;
- case Surface.ROTATION_90:
- m.setRotate(360 - RotationHelper.getDegreesFromRotation(displayRotation));
- m.postTranslate(0, screenWidth);
- break;
- case Surface.ROTATION_270:
- m.setRotate(360 - RotationHelper.getDegreesFromRotation(displayRotation));
- m.postTranslate(screenHeight, 0);
- break;
- }
- return m;
- }
-
- public static void mapRectFromNormalOrientation(RectF src, int screenWidth, int screenHeight,
- int displayRotation) {
- Matrix m = RotationHelper.getRotationMatrix(screenWidth, screenHeight, displayRotation);
- m.mapRect(src);
- }
-
- public static void mapInverseRectFromNormalOrientation(RectF src, int screenWidth,
- int screenHeight, int displayRotation) {
- Matrix m = RotationHelper.getRotationMatrix(screenWidth, screenHeight, displayRotation);
- Matrix inverse = new Matrix();
- m.invert(inverse);
- inverse.mapRect(src);
- }
-
- public static void getTargetRectForRotation(Rect srcOut, int screenWidth, int screenHeight,
- int displayRotation) {
- RectF wrapped = new RectF(srcOut);
- Matrix m = RotationHelper.getRotationMatrix(screenWidth, screenHeight, displayRotation);
- m.mapRect(wrapped);
- wrapped.round(srcOut);
- }
-
- public static boolean isRotationLandscape(int rotation) {
- return rotation == Surface.ROTATION_270 || rotation == Surface.ROTATION_90;
- }
-
@Override
public String toString() {
return String.format("[mStateHandlerRequest=%d, mCurrentStateRequest=%d,"
diff --git a/src/com/android/launcher3/touch/PagedOrientationHandler.java b/src/com/android/launcher3/touch/PagedOrientationHandler.java
index 24fa815..974e3f3 100644
--- a/src/com/android/launcher3/touch/PagedOrientationHandler.java
+++ b/src/com/android/launcher3/touch/PagedOrientationHandler.java
@@ -39,6 +39,10 @@
*/
public interface PagedOrientationHandler {
+ PagedOrientationHandler PORTRAIT = new PortraitPagedViewHandler();
+ PagedOrientationHandler LANDSCAPE = new LandscapePagedViewHandler();
+ PagedOrientationHandler SEASCAPE = new SeascapePagedViewHandler();
+
interface Int2DAction<T> {
void call(T target, int x, int y);
}