summaryrefslogtreecommitdiffstats
path: root/core/java/android
diff options
context:
space:
mode:
authorAdam Powell <adamp@google.com>2013-02-15 11:26:45 -0800
committerAdam Powell <adamp@google.com>2013-02-15 11:27:02 -0800
commiteca3e6065ee6ce26027ef792d106f2f754a3169d (patch)
tree94cbe5d01e8b2a7fb4f0bd5a2e79ea62662136e9 /core/java/android
parent00e592272ee44cba41832e3cf0a0ffb2de56585d (diff)
downloadframeworks_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
Diffstat (limited to 'core/java/android')
-rw-r--r--core/java/android/view/GestureDetector.java17
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);
}