diff options
author | Adam Powell <adamp@google.com> | 2013-02-15 11:26:45 -0800 |
---|---|---|
committer | Adam Powell <adamp@google.com> | 2013-02-15 11:27:02 -0800 |
commit | eca3e6065ee6ce26027ef792d106f2f754a3169d (patch) | |
tree | 94cbe5d01e8b2a7fb4f0bd5a2e79ea62662136e9 | |
parent | 00e592272ee44cba41832e3cf0a0ffb2de56585d (diff) | |
download | frameworks_base-eca3e6065ee6ce26027ef792d106f2f754a3169d.zip frameworks_base-eca3e6065ee6ce26027ef792d106f2f754a3169d.tar.gz frameworks_base-eca3e6065ee6ce26027ef792d106f2f754a3169d.tar.bz2 |
Fix missing onSingleTapConfirmed calls in GestureDetector
Eliminate the short period of time between the tap timeout and long
press causing onSingleTapConfirmed not to be dispatched when apps
expect.
Bug 8124095
Change-Id: I9841ab2a8eb3fee7d57e744e1c8e0e42e108d5f6
-rw-r--r-- | core/java/android/view/GestureDetector.java | 17 |
1 files changed, 15 insertions, 2 deletions
diff --git a/core/java/android/view/GestureDetector.java b/core/java/android/view/GestureDetector.java index 9ddb32e..28c1058 100644 --- a/core/java/android/view/GestureDetector.java +++ b/core/java/android/view/GestureDetector.java @@ -213,6 +213,7 @@ public class GestureDetector { private OnDoubleTapListener mDoubleTapListener; private boolean mStillDown; + private boolean mDeferConfirmSingleTap; private boolean mInLongPress; private boolean mAlwaysInTapRegion; private boolean mAlwaysInBiggerTapRegion; @@ -267,8 +268,12 @@ public class GestureDetector { case TAP: // If the user's finger is still down, do not count it as a tap - if (mDoubleTapListener != null && !mStillDown) { - mDoubleTapListener.onSingleTapConfirmed(mCurrentDownEvent); + if (mDoubleTapListener != null) { + if (!mStillDown) { + mDoubleTapListener.onSingleTapConfirmed(mCurrentDownEvent); + } else { + mDeferConfirmSingleTap = true; + } } break; @@ -533,6 +538,7 @@ public class GestureDetector { mAlwaysInBiggerTapRegion = true; mStillDown = true; mInLongPress = false; + mDeferConfirmSingleTap = false; if (mIsLongpressEnabled) { mHandler.removeMessages(LONG_PRESS); @@ -586,6 +592,9 @@ public class GestureDetector { mInLongPress = false; } else if (mAlwaysInTapRegion) { handled = mListener.onSingleTapUp(ev); + if (mDeferConfirmSingleTap && mDoubleTapListener != null) { + mDoubleTapListener.onSingleTapConfirmed(ev); + } } else { // A fling must travel the minimum tap distance @@ -612,6 +621,7 @@ public class GestureDetector { mVelocityTracker = null; } mIsDoubleTapping = false; + mDeferConfirmSingleTap = false; mHandler.removeMessages(SHOW_PRESS); mHandler.removeMessages(LONG_PRESS); break; @@ -637,6 +647,7 @@ public class GestureDetector { mStillDown = false; mAlwaysInTapRegion = false; mAlwaysInBiggerTapRegion = false; + mDeferConfirmSingleTap = false; if (mInLongPress) { mInLongPress = false; } @@ -649,6 +660,7 @@ public class GestureDetector { mIsDoubleTapping = false; mAlwaysInTapRegion = false; mAlwaysInBiggerTapRegion = false; + mDeferConfirmSingleTap = false; if (mInLongPress) { mInLongPress = false; } @@ -671,6 +683,7 @@ public class GestureDetector { private void dispatchLongPress() { mHandler.removeMessages(TAP); + mDeferConfirmSingleTap = false; mInLongPress = true; mListener.onLongPress(mCurrentDownEvent); } |