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

Commit fb99ba89 authored by Alan Viverette's avatar Alan Viverette
Browse files

Correctly handle intercepted touch events in FastScroller

Previously we'd return true from onIntercept and assume the DOWN event
was handled, then onTouch would return false and the host view would
receive the DOWN event. Now we consume the event in onTouch.

Bug: 19080751
Change-Id: I1bd35b4c25a0760f4248ade443d09b8ca4b71e7c
parent aba035d2
Loading
Loading
Loading
Loading
+2 −5
Original line number Diff line number Diff line
@@ -3638,12 +3638,9 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te

        startNestedScroll(SCROLL_AXIS_VERTICAL);

        if (mFastScroll != null) {
            boolean intercepted = mFastScroll.onTouchEvent(ev);
            if (intercepted) {
        if (mFastScroll != null && mFastScroll.onTouchEvent(ev)) {
            return true;
        }
        }

        initVelocityTrackerIfNotExists();
        final MotionEvent vtev = MotionEvent.obtain(ev);
+13 −1
Original line number Diff line number Diff line
@@ -1389,7 +1389,8 @@ class FastScroller {
                    // to intercept events. If it does, we will receive a CANCEL
                    // event.
                    if (!mList.isInScrollingContainer()) {
                        beginDrag();
                        // This will get dispatched to onTouchEvent(). Start
                        // dragging there.
                        return true;
                    }

@@ -1406,6 +1407,8 @@ class FastScroller {
                    final float pos = getPosFromMotionEvent(mInitialTouchY);
                    scrollTo(pos);

                    // This may get dispatched to onTouchEvent(), but it
                    // doesn't really matter since we'll already be in a drag.
                    return onTouchEvent(ev);
                }
                break;
@@ -1440,6 +1443,15 @@ class FastScroller {
        }

        switch (me.getActionMasked()) {
            case MotionEvent.ACTION_DOWN: {
                if (isPointInside(me.getX(), me.getY())) {
                    if (!mList.isInScrollingContainer()) {
                        beginDrag();
                        return true;
                    }
                }
            } break;

            case MotionEvent.ACTION_UP: {
                if (mPendingDrag >= 0) {
                    // Allow a tap to scroll.