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

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

Notify SysUi of NavBar region user interacts with

SysUi can then adjust things like disabling
the edge back gesture region or re-drawing the
home handle in the correct positions.

Fixes: 150250451
Test: Tested quickswitch manually with
test apps fixed to different rotations.
Ensured back only showed when rotation of
touch and display matched.

Change-Id: Ie4ea3063835a09fc12ab1d4f8b504b3a9555fa9b
parent 94c627cf
Loading
Loading
Loading
Loading
+44 −19
Original line number Diff line number Diff line
@@ -60,12 +60,24 @@ class OrientationTouchTransformer {
    private SparseArray<OrientationRectF> 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);
        }

        mCurrentDisplayRotation = region.rotation;
        OrientationRectF regionToKeep = mSwipeTouchRegions.get(mCurrentDisplayRotation);
        mSwipeTouchRegions.clear();
        mSwipeTouchRegions.put(mCurrentDisplayRotation,
                regionToKeep != null ? regionToKeep : createRegionForDisplay(region));
    }

        mCurrentRotation = region.rotation;
    private void resetSwipeRegions() {
        OrientationRectF regionToKeep = mSwipeTouchRegions.get(mCurrentDisplayRotation);
        mSwipeTouchRegions.clear();
        mSwipeTouchRegions.put(mCurrentRotation, createRegionForDisplay(region));
        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);
+10 −2
Original line number Diff line number Diff line
@@ -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() {
+1 −0
Original line number Diff line number Diff line
@@ -334,6 +334,7 @@ public class SystemUiProxy implements ISystemUiProxy {
        }
    }

    @Override
    public void onQuickSwitchToNewTask(int rotation) {
        if (mSystemUiProxy != null) {
            try {