Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f2daafcd authored by Vinit Nayak's avatar Vinit Nayak
Browse files

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
parent b1e003c1
Loading
Loading
Loading
Loading
+25 −10
Original line number Diff line number Diff line
@@ -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;
+28 −29
Original line number Diff line number Diff line
@@ -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() {