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
diff --git a/quickstep/src/com/android/quickstep/OrientationTouchTransformer.java b/quickstep/src/com/android/quickstep/OrientationTouchTransformer.java
index 3375c53..cf5659c 100644
--- a/quickstep/src/com/android/quickstep/OrientationTouchTransformer.java
+++ b/quickstep/src/com/android/quickstep/OrientationTouchTransformer.java
@@ -68,13 +68,13 @@
     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,13 +159,27 @@
         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}
      * To be called whenever we want to stop tracking more than one swipe region.
@@ -258,7 +272,7 @@
     }
 
     int getCurrentActiveRotation() {
-        return mLastRectRotation;
+        return mActiveTouchRotation;
     }
 
     int getQuickStepStartingRotation() {
@@ -303,8 +317,9 @@
                             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 79b38f2..0a70bd6 100644
--- a/quickstep/src/com/android/quickstep/RecentsAnimationDeviceState.java
+++ b/quickstep/src/com/android/quickstep/RecentsAnimationDeviceState.java
@@ -151,7 +151,7 @@
      * 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 @@
             @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 @@
         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 @@
      * @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 @@
     }
 
     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 @@
                 // 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 @@
                 // touched nav bar but didn't go anywhere and not quickswitching, do nothing
                 return;
             }
-            notifySysuiForRotation(mOrientationTouchTransformer.getCurrentActiveRotation());
+            notifySysuiOfCurrentRotation(mOrientationTouchTransformer.getCurrentActiveRotation());
         }
     }
 
@@ -697,13 +699,10 @@
     /**
      * 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() {