Loading quickstep/src/com/android/quickstep/OrientationTouchTransformer.java +44 −19 Original line number Diff line number Diff line Loading @@ -60,12 +60,24 @@ class OrientationTouchTransformer { private SparseArray<OrientationRectF> mSwipeTouchRegions = new SparseArray<>(MAX_ORIENTATIONS); private final RectF mAssistantLeftRegion = new RectF(); private final RectF mAssistantRightRegion = new RectF(); private int mCurrentRotation; private int mCurrentDisplayRotation; private boolean mEnableMultipleRegions; private Resources mResources; private OrientationRectF mLastRectTouched; private SysUINavigationMode.Mode mMode; private QuickStepContractInfo mContractInfo; /** * Represents if we're currently in a swipe "session" of sorts. If value is -1, then user * has not tapped on an active nav region. Otherwise it will be the rotation of the display * when the user first interacted with the active nav bar region. * The "session" ends when {@link #enableMultipleRegions(boolean, DefaultDisplay.Info)} is * called - usually from a timeout or if user starts interacting w/ the foreground app. * * This is different than {@link #mLastRectTouched} as it can get reset by the system whereas * the rect is purely used for tracking touch interactions and usually this "session" will * outlast the touch interaction. */ private int mQuickStepStartingRotation = -1; /** For testability */ Loading @@ -73,6 +85,7 @@ class OrientationTouchTransformer { float getWindowCornerRadius(); } OrientationTouchTransformer(Resources resources, SysUINavigationMode.Mode mode, QuickStepContractInfo contractInfo) { mResources = resources; Loading @@ -97,20 +110,21 @@ class OrientationTouchTransformer { * @see #enableMultipleRegions(boolean, DefaultDisplay.Info) */ void createOrAddTouchRegion(DefaultDisplay.Info info) { mCurrentRotation = info.rotation; if (mQuickStepStartingRotation > -1 && mCurrentRotation == mQuickStepStartingRotation) { // Ignore nav bars in other rotations except for the one we started out in mCurrentDisplayRotation = info.rotation; if (mQuickStepStartingRotation > -1 && mCurrentDisplayRotation == mQuickStepStartingRotation) { // User already was swiping and the current screen is same rotation as the starting one // Remove active nav bars in other rotations except for the one we started out in resetSwipeRegions(info); return; } OrientationRectF region = mSwipeTouchRegions.get(mCurrentRotation); OrientationRectF region = mSwipeTouchRegions.get(mCurrentDisplayRotation); if (region != null) { return; } if (mEnableMultipleRegions) { mSwipeTouchRegions.put(mCurrentRotation, createRegionForDisplay(info)); mSwipeTouchRegions.put(mCurrentDisplayRotation, createRegionForDisplay(info)); } else { resetSwipeRegions(info); } Loading @@ -128,12 +142,6 @@ class OrientationTouchTransformer { if (!enableMultipleRegions) { mQuickStepStartingRotation = -1; resetSwipeRegions(info); } else { if (mLastRectTouched != null) { // mLastRectTouched can be null if gesture type is changed (ex. from settings) // but nav bar hasn't been interacted with yet. mQuickStepStartingRotation = mLastRectTouched.mRotation; } } } Loading @@ -145,17 +153,25 @@ class OrientationTouchTransformer { */ private void resetSwipeRegions(DefaultDisplay.Info region) { if (DEBUG) { Log.d(TAG, "clearing all regions except rotation: " + mCurrentRotation); Log.d(TAG, "clearing all regions except rotation: " + mCurrentDisplayRotation); } mCurrentDisplayRotation = region.rotation; OrientationRectF regionToKeep = mSwipeTouchRegions.get(mCurrentDisplayRotation); mSwipeTouchRegions.clear(); mSwipeTouchRegions.put(mCurrentDisplayRotation, regionToKeep != null ? regionToKeep : createRegionForDisplay(region)); } mCurrentRotation = region.rotation; private void resetSwipeRegions() { OrientationRectF regionToKeep = mSwipeTouchRegions.get(mCurrentDisplayRotation); mSwipeTouchRegions.clear(); mSwipeTouchRegions.put(mCurrentRotation, createRegionForDisplay(region)); mSwipeTouchRegions.put(mCurrentDisplayRotation, regionToKeep); } private OrientationRectF createRegionForDisplay(DefaultDisplay.Info display) { if (DEBUG) { Log.d(TAG, "creating rotation region for: " + mCurrentRotation); Log.d(TAG, "creating rotation region for: " + mCurrentDisplayRotation); } Point size = display.realSize; Loading Loading @@ -225,6 +241,10 @@ class OrientationTouchTransformer { } } int getQuickStepStartingRotation() { return mQuickStepStartingRotation; } public void transform(MotionEvent event) { int eventAction = event.getActionMasked(); switch (eventAction) { Loading Loading @@ -257,6 +277,11 @@ class OrientationTouchTransformer { } if (rect.applyTransform(event, false)) { mLastRectTouched = rect; if (mCurrentDisplayRotation == mLastRectTouched.mRotation) { // Start a touch session for the default nav region for the display mQuickStepStartingRotation = mLastRectTouched.mRotation; resetSwipeRegions(); } if (DEBUG) { Log.d(TAG, "set active region: " + rect); } Loading Loading @@ -310,12 +335,12 @@ class OrientationTouchTransformer { boolean applyTransform(MotionEvent event, boolean forceTransform) { mTmpMatrix.reset(); postDisplayRotation(deltaRotation(mCurrentRotation, mRotation), postDisplayRotation(deltaRotation(mCurrentDisplayRotation, mRotation), mHeight, mWidth, mTmpMatrix); if (forceTransform) { if (DEBUG) { Log.d(TAG, "Transforming rotation due to forceTransform, " + "mCurrentRotation: " + mCurrentRotation + "mCurrentRotation: " + mCurrentDisplayRotation + "mRotation: " + mRotation); } event.transform(mTmpMatrix); Loading quickstep/src/com/android/quickstep/RecentsAnimationDeviceState.java +10 −2 Original line number Diff line number Diff line Loading @@ -17,6 +17,7 @@ package com.android.quickstep; import static android.content.Intent.ACTION_USER_UNLOCKED; import static com.android.launcher3.util.Executors.UI_HELPER_EXECUTOR; import static com.android.quickstep.SysUINavigationMode.Mode.NO_BUTTON; import static com.android.quickstep.SysUINavigationMode.Mode.THREE_BUTTONS; import static com.android.quickstep.SysUINavigationMode.Mode.TWO_BUTTONS; Loading Loading @@ -120,7 +121,6 @@ public class RecentsAnimationDeviceState implements private Runnable mOnDestroyFrozenTaskRunnable; public RecentsAnimationDeviceState(Context context) { final ContentResolver resolver = context.getContentResolver(); mContext = context; mSysUiNavMode = SysUINavigationMode.INSTANCE.get(context); mDefaultDisplay = DefaultDisplay.INSTANCE.get(context); Loading Loading @@ -511,8 +511,16 @@ public class RecentsAnimationDeviceState implements mOrientationTouchTransformer.transform(event); } public void enableMultipleRegions(boolean enable) { void enableMultipleRegions(boolean enable) { mOrientationTouchTransformer.enableMultipleRegions(enable, mDefaultDisplay.getInfo()); if (enable) { UI_HELPER_EXECUTOR.execute(() -> { int quickStepStartingRotation = mOrientationTouchTransformer.getQuickStepStartingRotation(); SystemUiProxy.INSTANCE.get(mContext) .onQuickSwitchToNewTask(quickStepStartingRotation); }); } } public int getCurrentActiveRotation() { Loading quickstep/src/com/android/quickstep/SystemUiProxy.java +1 −0 Original line number Diff line number Diff line Loading @@ -334,6 +334,7 @@ public class SystemUiProxy implements ISystemUiProxy { } } @Override public void onQuickSwitchToNewTask(int rotation) { if (mSystemUiProxy != null) { try { Loading Loading
quickstep/src/com/android/quickstep/OrientationTouchTransformer.java +44 −19 Original line number Diff line number Diff line Loading @@ -60,12 +60,24 @@ class OrientationTouchTransformer { private SparseArray<OrientationRectF> mSwipeTouchRegions = new SparseArray<>(MAX_ORIENTATIONS); private final RectF mAssistantLeftRegion = new RectF(); private final RectF mAssistantRightRegion = new RectF(); private int mCurrentRotation; private int mCurrentDisplayRotation; private boolean mEnableMultipleRegions; private Resources mResources; private OrientationRectF mLastRectTouched; private SysUINavigationMode.Mode mMode; private QuickStepContractInfo mContractInfo; /** * Represents if we're currently in a swipe "session" of sorts. If value is -1, then user * has not tapped on an active nav region. Otherwise it will be the rotation of the display * when the user first interacted with the active nav bar region. * The "session" ends when {@link #enableMultipleRegions(boolean, DefaultDisplay.Info)} is * called - usually from a timeout or if user starts interacting w/ the foreground app. * * This is different than {@link #mLastRectTouched} as it can get reset by the system whereas * the rect is purely used for tracking touch interactions and usually this "session" will * outlast the touch interaction. */ private int mQuickStepStartingRotation = -1; /** For testability */ Loading @@ -73,6 +85,7 @@ class OrientationTouchTransformer { float getWindowCornerRadius(); } OrientationTouchTransformer(Resources resources, SysUINavigationMode.Mode mode, QuickStepContractInfo contractInfo) { mResources = resources; Loading @@ -97,20 +110,21 @@ class OrientationTouchTransformer { * @see #enableMultipleRegions(boolean, DefaultDisplay.Info) */ void createOrAddTouchRegion(DefaultDisplay.Info info) { mCurrentRotation = info.rotation; if (mQuickStepStartingRotation > -1 && mCurrentRotation == mQuickStepStartingRotation) { // Ignore nav bars in other rotations except for the one we started out in mCurrentDisplayRotation = info.rotation; if (mQuickStepStartingRotation > -1 && mCurrentDisplayRotation == mQuickStepStartingRotation) { // User already was swiping and the current screen is same rotation as the starting one // Remove active nav bars in other rotations except for the one we started out in resetSwipeRegions(info); return; } OrientationRectF region = mSwipeTouchRegions.get(mCurrentRotation); OrientationRectF region = mSwipeTouchRegions.get(mCurrentDisplayRotation); if (region != null) { return; } if (mEnableMultipleRegions) { mSwipeTouchRegions.put(mCurrentRotation, createRegionForDisplay(info)); mSwipeTouchRegions.put(mCurrentDisplayRotation, createRegionForDisplay(info)); } else { resetSwipeRegions(info); } Loading @@ -128,12 +142,6 @@ class OrientationTouchTransformer { if (!enableMultipleRegions) { mQuickStepStartingRotation = -1; resetSwipeRegions(info); } else { if (mLastRectTouched != null) { // mLastRectTouched can be null if gesture type is changed (ex. from settings) // but nav bar hasn't been interacted with yet. mQuickStepStartingRotation = mLastRectTouched.mRotation; } } } Loading @@ -145,17 +153,25 @@ class OrientationTouchTransformer { */ private void resetSwipeRegions(DefaultDisplay.Info region) { if (DEBUG) { Log.d(TAG, "clearing all regions except rotation: " + mCurrentRotation); Log.d(TAG, "clearing all regions except rotation: " + mCurrentDisplayRotation); } mCurrentDisplayRotation = region.rotation; OrientationRectF regionToKeep = mSwipeTouchRegions.get(mCurrentDisplayRotation); mSwipeTouchRegions.clear(); mSwipeTouchRegions.put(mCurrentDisplayRotation, regionToKeep != null ? regionToKeep : createRegionForDisplay(region)); } mCurrentRotation = region.rotation; private void resetSwipeRegions() { OrientationRectF regionToKeep = mSwipeTouchRegions.get(mCurrentDisplayRotation); mSwipeTouchRegions.clear(); mSwipeTouchRegions.put(mCurrentRotation, createRegionForDisplay(region)); mSwipeTouchRegions.put(mCurrentDisplayRotation, regionToKeep); } private OrientationRectF createRegionForDisplay(DefaultDisplay.Info display) { if (DEBUG) { Log.d(TAG, "creating rotation region for: " + mCurrentRotation); Log.d(TAG, "creating rotation region for: " + mCurrentDisplayRotation); } Point size = display.realSize; Loading Loading @@ -225,6 +241,10 @@ class OrientationTouchTransformer { } } int getQuickStepStartingRotation() { return mQuickStepStartingRotation; } public void transform(MotionEvent event) { int eventAction = event.getActionMasked(); switch (eventAction) { Loading Loading @@ -257,6 +277,11 @@ class OrientationTouchTransformer { } if (rect.applyTransform(event, false)) { mLastRectTouched = rect; if (mCurrentDisplayRotation == mLastRectTouched.mRotation) { // Start a touch session for the default nav region for the display mQuickStepStartingRotation = mLastRectTouched.mRotation; resetSwipeRegions(); } if (DEBUG) { Log.d(TAG, "set active region: " + rect); } Loading Loading @@ -310,12 +335,12 @@ class OrientationTouchTransformer { boolean applyTransform(MotionEvent event, boolean forceTransform) { mTmpMatrix.reset(); postDisplayRotation(deltaRotation(mCurrentRotation, mRotation), postDisplayRotation(deltaRotation(mCurrentDisplayRotation, mRotation), mHeight, mWidth, mTmpMatrix); if (forceTransform) { if (DEBUG) { Log.d(TAG, "Transforming rotation due to forceTransform, " + "mCurrentRotation: " + mCurrentRotation + "mCurrentRotation: " + mCurrentDisplayRotation + "mRotation: " + mRotation); } event.transform(mTmpMatrix); Loading
quickstep/src/com/android/quickstep/RecentsAnimationDeviceState.java +10 −2 Original line number Diff line number Diff line Loading @@ -17,6 +17,7 @@ package com.android.quickstep; import static android.content.Intent.ACTION_USER_UNLOCKED; import static com.android.launcher3.util.Executors.UI_HELPER_EXECUTOR; import static com.android.quickstep.SysUINavigationMode.Mode.NO_BUTTON; import static com.android.quickstep.SysUINavigationMode.Mode.THREE_BUTTONS; import static com.android.quickstep.SysUINavigationMode.Mode.TWO_BUTTONS; Loading Loading @@ -120,7 +121,6 @@ public class RecentsAnimationDeviceState implements private Runnable mOnDestroyFrozenTaskRunnable; public RecentsAnimationDeviceState(Context context) { final ContentResolver resolver = context.getContentResolver(); mContext = context; mSysUiNavMode = SysUINavigationMode.INSTANCE.get(context); mDefaultDisplay = DefaultDisplay.INSTANCE.get(context); Loading Loading @@ -511,8 +511,16 @@ public class RecentsAnimationDeviceState implements mOrientationTouchTransformer.transform(event); } public void enableMultipleRegions(boolean enable) { void enableMultipleRegions(boolean enable) { mOrientationTouchTransformer.enableMultipleRegions(enable, mDefaultDisplay.getInfo()); if (enable) { UI_HELPER_EXECUTOR.execute(() -> { int quickStepStartingRotation = mOrientationTouchTransformer.getQuickStepStartingRotation(); SystemUiProxy.INSTANCE.get(mContext) .onQuickSwitchToNewTask(quickStepStartingRotation); }); } } public int getCurrentActiveRotation() { Loading
quickstep/src/com/android/quickstep/SystemUiProxy.java +1 −0 Original line number Diff line number Diff line Loading @@ -334,6 +334,7 @@ public class SystemUiProxy implements ISystemUiProxy { } } @Override public void onQuickSwitchToNewTask(int rotation) { if (mSystemUiProxy != null) { try { Loading