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

Commit da25b230 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Automerger Merge Worker
Browse files

Merge "Prevent premature resetting of quickswitch mode" into ub-launcher3-rvc-dev am: 359a28e9

Original change: https://googleplex-android-review.googlesource.com/c/platform/packages/apps/Launcher3/+/11931812

Change-Id: I0c139e6381b85d723997d6cf6135e12b7d64ff9f
parents 7e47e05f 359a28e9
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() {