summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSvetoslav Ganov <svetoslavganov@google.com>2013-09-03 18:02:15 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2013-09-03 18:02:15 +0000
commite1de4b3216055d53e21ace27c0281359847332a2 (patch)
treebdd5f50b67622dab68d1f8aa50551482eea3bfa1
parent90a5df1ee8c89ca17df93d9ecf95652b2ae619f4 (diff)
parent38c992841b5f6bc80359dbf60d31aa7b994160fc (diff)
downloadframeworks_base-e1de4b3216055d53e21ace27c0281359847332a2.zip
frameworks_base-e1de4b3216055d53e21ace27c0281359847332a2.tar.gz
frameworks_base-e1de4b3216055d53e21ace27c0281359847332a2.tar.bz2
Merge "Crashes in TouchExplorer on two finger swipe." into klp-dev
-rw-r--r--services/java/com/android/server/accessibility/TouchExplorer.java36
1 files changed, 21 insertions, 15 deletions
diff --git a/services/java/com/android/server/accessibility/TouchExplorer.java b/services/java/com/android/server/accessibility/TouchExplorer.java
index 8fb3998..1b8876d 100644
--- a/services/java/com/android/server/accessibility/TouchExplorer.java
+++ b/services/java/com/android/server/accessibility/TouchExplorer.java
@@ -417,9 +417,6 @@ class TouchExplorer implements EventStreamTransformation {
mSendTouchInteractionEndDelayed.forceSendAndRemove();
}
- // Cache the event until we discern exploration from gesturing.
- mSendHoverEnterAndMoveDelayed.addEvent(event);
-
// If we have the first tap, schedule a long press and break
// since we do not want to schedule hover enter because
// the delayed callback will kick in before the long click.
@@ -432,11 +429,16 @@ class TouchExplorer implements EventStreamTransformation {
break;
}
if (!mTouchExplorationInProgress) {
- // Deliver hover enter with a delay to have a chance
- // to detect what the user is trying to do.
- final int pointerId = receivedTracker.getPrimaryPointerId();
- final int pointerIdBits = (1 << pointerId);
- mSendHoverEnterAndMoveDelayed.post(event, true, pointerIdBits, policyFlags);
+ if (!mSendHoverEnterAndMoveDelayed.isPending()) {
+ // Deliver hover enter with a delay to have a chance
+ // to detect what the user is trying to do.
+ final int pointerId = receivedTracker.getPrimaryPointerId();
+ final int pointerIdBits = (1 << pointerId);
+ mSendHoverEnterAndMoveDelayed.post(event, true, pointerIdBits,
+ policyFlags);
+ }
+ // Cache the event until we discern exploration from gesturing.
+ mSendHoverEnterAndMoveDelayed.addEvent(event);
}
} break;
case MotionEvent.ACTION_POINTER_DOWN: {
@@ -1719,7 +1721,7 @@ class TouchExplorer implements EventStreamTransformation {
} break;
}
if (DEBUG) {
- Slog.i(LOG_TAG_RECEIVED_POINTER_TRACKER, "Received pointer: " + toString());
+ Slog.i(LOG_TAG_RECEIVED_POINTER_TRACKER, "Received pointer:\n" + toString());
}
}
@@ -1777,7 +1779,7 @@ class TouchExplorer implements EventStreamTransformation {
*/
public int getPrimaryPointerId() {
if (mPrimaryPointerId == INVALID_POINTER_ID) {
- mPrimaryPointerId = findPrimaryPointer();
+ mPrimaryPointerId = findPrimaryPointerId();
}
return mPrimaryPointerId;
}
@@ -1861,17 +1863,21 @@ class TouchExplorer implements EventStreamTransformation {
}
/**
- * @return The primary pointer.
+ * @return The primary pointer id.
*/
- private int findPrimaryPointer() {
+ private int findPrimaryPointerId() {
int primaryPointerId = INVALID_POINTER_ID;
long minDownTime = Long.MAX_VALUE;
+
// Find the pointer that went down first.
- for (int i = 0, count = mReceivedPointerDownTime.length; i < count; i++) {
- final long downPointerTime = mReceivedPointerDownTime[i];
+ int pointerIdBits = mReceivedPointersDown;
+ while (pointerIdBits > 0) {
+ final int pointerId = Integer.numberOfTrailingZeros(pointerIdBits);
+ pointerIdBits &= ~(1 << pointerId);
+ final long downPointerTime = mReceivedPointerDownTime[pointerId];
if (downPointerTime < minDownTime) {
minDownTime = downPointerTime;
- primaryPointerId = i;
+ primaryPointerId = pointerId;
}
}
return primaryPointerId;