From f2daafcdf8b2ef54ca4f8654b124c5cc4a644782 Mon Sep 17 00:00:00 2001 From: Vinit Nayak Date: Fri, 19 Jun 2020 19:10:31 -0700 Subject: [PATCH] Prevent premature resetting of quickswitch mode Previously, whenever a user returned to the same rotation that they had started quickswitch in, we were sending sysui the reset flag(-1) indicating that quickstep was complete instead of sending the rotation of the device the user was in. This was intentional and it worked, however we now always send the active rotation while the user is in a quickswitch session because sysui needs to show the fake home handle for immersive apps, which can occur in any rotation. This state is distinct from not being in quickswitch at all, in which no fake handles are shown. Fixes: 158677967 Change-Id: I910324abf781b4b30fe981139712bcb5b653c318 --- .../OrientationTouchTransformer.java | 35 ++++++++---- .../RecentsAnimationDeviceState.java | 57 +++++++++---------- 2 files changed, 53 insertions(+), 39 deletions(-) diff --git a/quickstep/src/com/android/quickstep/OrientationTouchTransformer.java b/quickstep/src/com/android/quickstep/OrientationTouchTransformer.java index 3375c53124..cf5659c7d4 100644 --- a/quickstep/src/com/android/quickstep/OrientationTouchTransformer.java +++ b/quickstep/src/com/android/quickstep/OrientationTouchTransformer.java @@ -68,13 +68,13 @@ class OrientationTouchTransformer { private Resources mResources; private OrientationRectF mLastRectTouched; /** - * The rotation of the last touched nav bar. Derived from {@link #mLastRectTouched}, but has a - * longer lifetime than the rect. Note this is different than {@link #mQuickStepStartingRotation} - * as it always updates its value on every touch whereas mQuickstepStartingRotation only - * updates when device rotation matches touch rotation. Maybe this will be only one necessary - * after TODO(b/154580671) is in. TBD. + * The rotation of the last touched nav bar, whether that be through the last region the user + * touched down on or valid rotation user turned their device to. + * Note this is different than + * {@link #mQuickStepStartingRotation} as it always updates its value on every touch whereas + * mQuickstepStartingRotation only updates when device rotation matches touch rotation. */ - private int mLastRectRotation; + private int mActiveTouchRotation; private SysUINavigationMode.Mode mMode; private QuickStepContractInfo mContractInfo; @@ -159,12 +159,26 @@ class OrientationTouchTransformer { if (mEnableMultipleRegions) { mQuickStepStartingRotation = info.rotation; } else { - mLastRectRotation = 0; + mActiveTouchRotation = 0; mQuickStepStartingRotation = QUICKSTEP_ROTATION_UNINITIALIZED; } resetSwipeRegions(info); } + /** + * Call when removing multiple regions to swipe from, but still in active quickswitch mode (task + * list is still frozen). + * Ex. This would be called when user has quickswitched to the same app rotation that + * they started quickswitching in, indicating that extra nav regions can be ignored. Calling + * this will update the value of {@link #mActiveTouchRotation} + * + * @param displayInfo The display whos rotation will be used as the current active rotation + */ + void setSingleActiveRegion(DefaultDisplay.Info displayInfo) { + mActiveTouchRotation = displayInfo.rotation; + resetSwipeRegions(displayInfo); + } + /** * Only saves the swipe region represented by {@param region}, clears the * rest from {@link #mSwipeTouchRegions} @@ -258,7 +272,7 @@ class OrientationTouchTransformer { } int getCurrentActiveRotation() { - return mLastRectRotation; + return mActiveTouchRotation; } int getQuickStepStartingRotation() { @@ -303,8 +317,9 @@ class OrientationTouchTransformer { Log.d(TestProtocol.NO_SWIPE_TO_HOME, "setting mLastRectTouched"); } mLastRectTouched = rect; - mLastRectRotation = rect.mRotation; - if (mEnableMultipleRegions && mCurrentDisplayRotation == mLastRectRotation) { + mActiveTouchRotation = rect.mRotation; + if (mEnableMultipleRegions + && mCurrentDisplayRotation == mActiveTouchRotation) { // TODO(b/154580671) might make this block unnecessary // Start a touch session for the default nav region for the display mQuickStepStartingRotation = mLastRectTouched.mRotation; diff --git a/quickstep/src/com/android/quickstep/RecentsAnimationDeviceState.java b/quickstep/src/com/android/quickstep/RecentsAnimationDeviceState.java index 79b38f23e1..0a70bd6cfe 100644 --- a/quickstep/src/com/android/quickstep/RecentsAnimationDeviceState.java +++ b/quickstep/src/com/android/quickstep/RecentsAnimationDeviceState.java @@ -151,7 +151,7 @@ public class RecentsAnimationDeviceState implements * sysui to adjust the navbar. */ private OrientationEventListener mOrientationListener; - private int mPreviousRotation = ROTATION_0; + private int mSensorRotation = ROTATION_0; /** * This is the configuration of the foreground app or the app that will be in the foreground * once a quickstep gesture finishes. @@ -246,18 +246,18 @@ public class RecentsAnimationDeviceState implements @Override public void onOrientationChanged(int degrees) { int newRotation = RecentsOrientedState.getRotationForUserDegreesRotated(degrees, - mPreviousRotation); - if (newRotation == mPreviousRotation) { + mSensorRotation); + if (newRotation == mSensorRotation) { return; } - mPreviousRotation = newRotation; + mSensorRotation = newRotation; mPrioritizeDeviceRotation = true; if (newRotation == mCurrentAppRotation) { // When user rotates device to the orientation of the foreground app after // quickstepping - toggleSecondaryNavBarsForRotation(false); + toggleSecondaryNavBarsForRotation(); } } }; @@ -339,14 +339,16 @@ public class RecentsAnimationDeviceState implements mCurrentAppRotation = mDisplayRotation; /* Update nav bars on the following: - * a) if we're not expecting quickswitch, this is coming from an activity rotation - * b) we launch an app in the orientation that user is already in - * c) We're not in overview, since overview will always be portrait (w/o home rotation) + * a) if this is coming from an activity rotation OR + * aa) we launch an app in the orientation that user is already in + * b) We're not in overview, since overview will always be portrait (w/o home rotation) + * c) We're actively in quickswitch mode */ if ((mPrioritizeDeviceRotation - || mCurrentAppRotation == mPreviousRotation) // switch to an app of orientation user is in - && !mInOverview) { - toggleSecondaryNavBarsForRotation(false); + || mCurrentAppRotation == mSensorRotation) // switch to an app of orientation user is in + && !mInOverview + && mTaskListFrozen) { + toggleSecondaryNavBarsForRotation(); } } @@ -461,7 +463,9 @@ public class RecentsAnimationDeviceState implements * @return whether SystemUI is in a state where we can start a system gesture. */ public boolean canStartSystemGesture() { - return (mSystemUiStateFlags & SYSUI_STATE_NAV_BAR_HIDDEN) == 0 + boolean canStartWithNavHidden = (mSystemUiStateFlags & SYSUI_STATE_NAV_BAR_HIDDEN) == 0 + || mTaskListFrozen; + return canStartWithNavHidden && (mSystemUiStateFlags & SYSUI_STATE_NOTIFICATION_PANEL_EXPANDED) == 0 && (mSystemUiStateFlags & SYSUI_STATE_QUICK_SETTINGS_EXPANDED) == 0 && ((mSystemUiStateFlags & SYSUI_STATE_HOME_DISABLED) == 0 @@ -634,29 +638,26 @@ public class RecentsAnimationDeviceState implements } private void enableMultipleRegions(boolean enable) { - toggleSecondaryNavBarsForRotation(enable); - if (enable && !TestProtocol.sDisableSensorRotation) { + mOrientationTouchTransformer.enableMultipleRegions(enable, mDefaultDisplay.getInfo()); + notifySysuiOfCurrentRotation(mOrientationTouchTransformer.getQuickStepStartingRotation()); + if (enable && !mInOverview && !TestProtocol.sDisableSensorRotation) { + // Clear any previous state from sensor manager + mSensorRotation = mCurrentAppRotation; mOrientationListener.enable(); } else { mOrientationListener.disable(); } } - private void notifySysuiForRotation(int rotation) { - UI_HELPER_EXECUTOR.execute(() -> - SystemUiProxy.INSTANCE.get(mContext).onQuickSwitchToNewTask(rotation)); - } - public void onStartGesture() { if (mTaskListFrozen) { // Prioritize whatever nav bar user touches once in quickstep // This case is specifically when user changes what nav bar they are using mid // quickswitch session before tasks list is unfrozen - notifySysuiForRotation(mOrientationTouchTransformer.getCurrentActiveRotation()); + notifySysuiOfCurrentRotation(mOrientationTouchTransformer.getCurrentActiveRotation()); } } - void onEndTargetCalculated(GestureState.GestureEndTarget endTarget, BaseActivityInterface activityInterface) { if (endTarget == GestureState.GestureEndTarget.RECENTS) { @@ -673,7 +674,8 @@ public class RecentsAnimationDeviceState implements // First gesture to start quickswitch enableMultipleRegions(true); } else { - notifySysuiForRotation(mOrientationTouchTransformer.getCurrentActiveRotation()); + notifySysuiOfCurrentRotation( + mOrientationTouchTransformer.getCurrentActiveRotation()); } // A new gesture is starting, reset the current device rotation @@ -685,7 +687,7 @@ public class RecentsAnimationDeviceState implements // touched nav bar but didn't go anywhere and not quickswitching, do nothing return; } - notifySysuiForRotation(mOrientationTouchTransformer.getCurrentActiveRotation()); + notifySysuiOfCurrentRotation(mOrientationTouchTransformer.getCurrentActiveRotation()); } } @@ -697,13 +699,10 @@ public class RecentsAnimationDeviceState implements /** * Disables/Enables multiple nav bars on {@link OrientationTouchTransformer} and then * notifies system UI of the primary rotation the user is interacting with - * - * @param enable if {@code true}, this will report to sysUI the navbar of the region the gesture - * started in (during ACTION_DOWN), otherwise will report {@param displayRotation} */ - private void toggleSecondaryNavBarsForRotation(boolean enable) { - mOrientationTouchTransformer.enableMultipleRegions(enable, mDefaultDisplay.getInfo()); - notifySysuiOfCurrentRotation(mOrientationTouchTransformer.getQuickStepStartingRotation()); + private void toggleSecondaryNavBarsForRotation() { + mOrientationTouchTransformer.setSingleActiveRegion(mDefaultDisplay.getInfo()); + notifySysuiOfCurrentRotation(mOrientationTouchTransformer.getCurrentActiveRotation()); } public int getCurrentActiveRotation() {