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

Commit 86d60772 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Cancelling back gesture in case of multi-touch and long press" into qt-dev

parents f00b63f1 3c317f34
Loading
Loading
Loading
Loading
+38 −21
Original line number Diff line number Diff line
@@ -121,8 +121,8 @@ public class EdgeBackGestureHandler implements DisplayListener {
    private final int mEdgeWidth;
    // The slop to distinguish between horizontal and vertical motion
    private final float mTouchSlop;
    // Minimum distance to move so that is can be considerd as a back swipe
    private final float mSwipeThreshold;
    // Duration after which we consider the event as longpress.
    private final int mLongPressTimeout;
    // The threshold where the touch needs to be at most, such that the arrow is displayed above the
    // finger, otherwise it will be below
    private final int mMinArrowPosition;
@@ -164,8 +164,9 @@ public class EdgeBackGestureHandler implements DisplayListener {
        // TODO: Get this for the current user
        mEdgeWidth = res.getDimensionPixelSize(
                com.android.internal.R.dimen.config_backGestureInset);

        mTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop();
        mSwipeThreshold = res.getDimension(R.dimen.navigation_edge_action_drag_threshold);
        mLongPressTimeout = ViewConfiguration.getLongPressTimeout();

        mNavBarHeight = res.getDimensionPixelSize(R.dimen.navigation_bar_frame_height);
        mMinArrowPosition = res.getDimensionPixelSize(
@@ -308,8 +309,18 @@ public class EdgeBackGestureHandler implements DisplayListener {
        return !isInExcludedRegion;
    }

    private void cancelGesture(MotionEvent ev) {
        // Send action cancel to reset all the touch events
        mAllowGesture = false;
        MotionEvent cancelEv = MotionEvent.obtain(ev);
        cancelEv.setAction(MotionEvent.ACTION_CANCEL);
        mEdgePanel.handleTouch(cancelEv);
        cancelEv.recycle();
    }

    private void onMotionEvent(MotionEvent ev) {
        if (ev.getAction() == MotionEvent.ACTION_DOWN) {
        int action = ev.getActionMasked();
        if (action == MotionEvent.ACTION_DOWN) {
            // Verify if this is in within the touch region and we aren't in immersive mode, and
            // either the bouncer is showing or the notification panel is hidden
            int stateFlags = mOverviewProxyService.getSystemUiStateFlags();
@@ -330,16 +341,20 @@ public class EdgeBackGestureHandler implements DisplayListener {
                mThresholdCrossed = false;
            }
        } else if (mAllowGesture) {
            if (!mThresholdCrossed && ev.getAction() == MotionEvent.ACTION_MOVE) {
            if (!mThresholdCrossed) {
                if (action == MotionEvent.ACTION_POINTER_DOWN) {
                    // We do not support multi touch for back gesture
                    cancelGesture(ev);
                    return;
                } else if (action == MotionEvent.ACTION_MOVE) {
                    if ((ev.getEventTime() - ev.getDownTime()) > mLongPressTimeout) {
                        cancelGesture(ev);
                        return;
                    }
                    float dx = Math.abs(ev.getX() - mDownPoint.x);
                    float dy = Math.abs(ev.getY() - mDownPoint.y);
                    if (dy > dx && dy > mTouchSlop) {
                    // Send action cancel to reset all the touch events
                    mAllowGesture = false;
                    MotionEvent cancelEv = MotionEvent.obtain(ev);
                    cancelEv.setAction(MotionEvent.ACTION_CANCEL);
                    mEdgePanel.handleTouch(cancelEv);
                    cancelEv.recycle();
                        cancelGesture(ev);
                        return;

                    } else if (dx > dy && dx > mTouchSlop) {
@@ -349,10 +364,12 @@ public class EdgeBackGestureHandler implements DisplayListener {
                    }
                }

            }

            // forward touch
            mEdgePanel.handleTouch(ev);

            boolean isUp = ev.getAction() == MotionEvent.ACTION_UP;
            boolean isUp = action == MotionEvent.ACTION_UP;
            if (isUp) {
                boolean performAction = mEdgePanel.shouldTriggerBack();
                if (performAction) {
@@ -363,7 +380,7 @@ public class EdgeBackGestureHandler implements DisplayListener {
                mOverviewProxyService.notifyBackAction(performAction, (int) mDownPoint.x,
                        (int) mDownPoint.y, false /* isButton */, !mIsOnLeftEdge);
            }
            if (isUp || ev.getAction() == MotionEvent.ACTION_CANCEL) {
            if (isUp || action == MotionEvent.ACTION_CANCEL) {
                mRegionSamplingHelper.stop();
            } else {
                updateSamplingRect();