From fb99ba895e9921f46af38d5fe8c27c88676f7a65 Mon Sep 17 00:00:00 2001 From: Alan Viverette Date: Fri, 1 May 2015 10:10:15 -0700 Subject: [PATCH] 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 --- core/java/android/widget/AbsListView.java | 7 ++----- core/java/android/widget/FastScroller.java | 14 +++++++++++++- 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/core/java/android/widget/AbsListView.java b/core/java/android/widget/AbsListView.java index c9d9a8c0513a9..1df43d058040f 100644 --- a/core/java/android/widget/AbsListView.java +++ b/core/java/android/widget/AbsListView.java @@ -3638,11 +3638,8 @@ public abstract class AbsListView extends AdapterView implements Te startNestedScroll(SCROLL_AXIS_VERTICAL); - if (mFastScroll != null) { - boolean intercepted = mFastScroll.onTouchEvent(ev); - if (intercepted) { - return true; - } + if (mFastScroll != null && mFastScroll.onTouchEvent(ev)) { + return true; } initVelocityTrackerIfNotExists(); diff --git a/core/java/android/widget/FastScroller.java b/core/java/android/widget/FastScroller.java index 552b274065f9a..f06f3c2182764 100644 --- a/core/java/android/widget/FastScroller.java +++ b/core/java/android/widget/FastScroller.java @@ -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.