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

Commit c6222fab authored by Ameer Armaly's avatar Ameer Armaly
Browse files

Fix issues with swiping on some devices.

Some devices will send ACTION_MOVE events with the same coordinates as ACTION_DOWN. If so, we ignore them in order to correctly interpret the rest of the gesture.
Fix: 146472448
Test: Run talkback and swipe in all directions.
Test: atest AccessibilityGestureDetectorTest TouchExplorerTest GestureManifoldTest
Change-Id: I7c6ee32aa64cd9558afef4caf690f822f2541c5b
parent 848cc353
Loading
Loading
Loading
Loading
+10 −1
Original line number Diff line number Diff line
@@ -26,6 +26,7 @@ import android.util.DisplayMetrics;
import android.util.Slog;
import android.util.TypedValue;
import android.view.MotionEvent;
import android.view.ViewConfiguration;

import java.util.ArrayList;

@@ -85,6 +86,10 @@ class Swipe extends GestureMatcher {
    private static final float MIN_CM_BETWEEN_SAMPLES = 0.25f;
    private final float mMinPixelsBetweenSamplesX;
    private final float mMinPixelsBetweenSamplesY;
    // The minmimum distance the finger must travel before we evaluate the initial direction of the
    // swipe.
    // Anything less is still considered a touch.
    private int mTouchSlop;

    // Constants for separating gesture segments
    private static final float ANGLE_THRESHOLD = 0.0f;
@@ -122,6 +127,7 @@ class Swipe extends GestureMatcher {
        final float pixelsPerCmY = displayMetrics.ydpi / 2.54f;
        mMinPixelsBetweenSamplesX = MIN_CM_BETWEEN_SAMPLES * pixelsPerCmX;
        mMinPixelsBetweenSamplesY = MIN_CM_BETWEEN_SAMPLES * pixelsPerCmY;
        mTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop();
        clear();
    }

@@ -165,7 +171,10 @@ class Swipe extends GestureMatcher {
                            + Float.toString(mGestureDetectionThreshold));
        }
        if (getState() == STATE_CLEAR) {
            if (mStrokeBuffer.size() == 0) {
            if (moveDelta < mTouchSlop) {
                // This still counts as a touch not a swipe.
                return;
            } else if (mStrokeBuffer.size() == 0) {
                // First, make sure the pointer is going in the right direction.
                cancelAfterDelay(event, rawEvent, policyFlags);
                int direction = toDirection(x - mBaseX, y - mBaseY);