diff options
author | 2016-01-28 14:56:07 -0500 | |
---|---|---|
committer | 2016-01-28 14:56:07 -0500 | |
commit | 66df60fbb6fff711c35b73dac75da45a85a057f8 (patch) | |
tree | 5942c6548ba99436bfa58200690a16f747956efb | |
parent | 46125323fca0d5c99fd3a146a69393cab0b5c71d (diff) |
Consume AbsListView touch events following a successful long-press
This prevents the user from accidentally scrolling the list following a
long-press that, for example, opens a modal window.
Bug: 26799074
Change-Id: I9e4bce9f9fc3edd0a5b0908a868fbf7cdcb73f8c
-rw-r--r-- | core/java/android/widget/AbsListView.java | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/core/java/android/widget/AbsListView.java b/core/java/android/widget/AbsListView.java index df8497070b8a..7b6fa6dab075 100644 --- a/core/java/android/widget/AbsListView.java +++ b/core/java/android/widget/AbsListView.java @@ -565,6 +565,12 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te private Runnable mTouchModeReset; /** + * Whether the most recent touch event stream resulted in a successful + * long-press action. This is reset on TOUCH_DOWN. + */ + private boolean mHasPerformedLongPress; + + /** * This view is in transcript mode -- it shows the bottom of the list when the data * changes */ @@ -3108,7 +3114,9 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te handled = performLongPress(child, longPressPosition, longPressId); } } + if (handled) { + mHasPerformedLongPress = true; mTouchMode = TOUCH_MODE_REST; setPressed(false); child.setPressed(false); @@ -3811,6 +3819,7 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te } private void onTouchDown(MotionEvent ev) { + mHasPerformedLongPress = false; mActivePointerId = ev.getPointerId(0); if (mTouchMode == TOUCH_MODE_OVERFLING) { @@ -3874,6 +3883,11 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te } private void onTouchMove(MotionEvent ev, MotionEvent vtev) { + if (mHasPerformedLongPress) { + // Consume all move events following a successful long press. + return; + } + int pointerIndex = ev.findPointerIndex(mActivePointerId); if (pointerIndex == -1) { pointerIndex = 0; |