diff --git a/quickstep/src/com/android/quickstep/OrientationTouchTransformer.java b/quickstep/src/com/android/quickstep/OrientationTouchTransformer.java index 95cd4f2c13..495c09297e 100644 --- a/quickstep/src/com/android/quickstep/OrientationTouchTransformer.java +++ b/quickstep/src/com/android/quickstep/OrientationTouchTransformer.java @@ -60,12 +60,24 @@ class OrientationTouchTransformer { private SparseArray 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 */ @@ -73,6 +85,7 @@ class OrientationTouchTransformer { float getWindowCornerRadius(); } + OrientationTouchTransformer(Resources resources, SysUINavigationMode.Mode mode, QuickStepContractInfo contractInfo) { mResources = resources; @@ -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); } @@ -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; - } } } @@ -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); } - mCurrentRotation = region.rotation; + mCurrentDisplayRotation = region.rotation; + OrientationRectF regionToKeep = mSwipeTouchRegions.get(mCurrentDisplayRotation); mSwipeTouchRegions.clear(); - mSwipeTouchRegions.put(mCurrentRotation, createRegionForDisplay(region)); + mSwipeTouchRegions.put(mCurrentDisplayRotation, + regionToKeep != null ? regionToKeep : createRegionForDisplay(region)); + } + + private void resetSwipeRegions() { + OrientationRectF regionToKeep = mSwipeTouchRegions.get(mCurrentDisplayRotation); + mSwipeTouchRegions.clear(); + 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; @@ -225,6 +241,10 @@ class OrientationTouchTransformer { } } + int getQuickStepStartingRotation() { + return mQuickStepStartingRotation; + } + public void transform(MotionEvent event) { int eventAction = event.getActionMasked(); switch (eventAction) { @@ -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); } @@ -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); diff --git a/quickstep/src/com/android/quickstep/RecentsAnimationDeviceState.java b/quickstep/src/com/android/quickstep/RecentsAnimationDeviceState.java index 491c6110db..8cb27a3889 100644 --- a/quickstep/src/com/android/quickstep/RecentsAnimationDeviceState.java +++ b/quickstep/src/com/android/quickstep/RecentsAnimationDeviceState.java @@ -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; @@ -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); @@ -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() { diff --git a/quickstep/src/com/android/quickstep/SystemUiProxy.java b/quickstep/src/com/android/quickstep/SystemUiProxy.java index f5aaf1dece..20d133c3c6 100644 --- a/quickstep/src/com/android/quickstep/SystemUiProxy.java +++ b/quickstep/src/com/android/quickstep/SystemUiProxy.java @@ -334,6 +334,7 @@ public class SystemUiProxy implements ISystemUiProxy { } } + @Override public void onQuickSwitchToNewTask(int rotation) { if (mSystemUiProxy != null) { try {