summaryrefslogtreecommitdiffstats
path: root/src/com/android/launcher3/touch
diff options
context:
space:
mode:
authorHyunyoung Song <hyunyoungs@google.com>2018-10-04 12:00:36 -0700
committerHyunyoung Song <hyunyoungs@google.com>2018-10-04 12:41:00 -0700
commit6b82a0843e0cec1092d3660d32dbb6f99fed2c00 (patch)
tree53b8c44dc21831ab97cbb4b52c9c0bc1376c23d9 /src/com/android/launcher3/touch
parentff2d0d0a9eb51ea10262e51e87fd9fb1992900aa (diff)
downloadandroid_packages_apps_Trebuchet-6b82a0843e0cec1092d3660d32dbb6f99fed2c00.tar.gz
android_packages_apps_Trebuchet-6b82a0843e0cec1092d3660d32dbb6f99fed2c00.tar.bz2
android_packages_apps_Trebuchet-6b82a0843e0cec1092d3660d32dbb6f99fed2c00.zip
Fix issue where pointer id was being used to set as action index
Bug: 117157432 Bug: 116744159 Context: In vary rare case, Pointer id can be higher than MotionEvent.getPointerCount. When I was fabricating ACTION_POINTER_DOWN event, I was using pointer id instead of index to create MotionEvent. This resulted in stack trace as seen in the bug. Change-Id: I802c2a45a274f0dda5984f1d266334fc8b6b0bea
Diffstat (limited to 'src/com/android/launcher3/touch')
-rw-r--r--src/com/android/launcher3/touch/TouchEventTranslator.java18
1 files changed, 11 insertions, 7 deletions
diff --git a/src/com/android/launcher3/touch/TouchEventTranslator.java b/src/com/android/launcher3/touch/TouchEventTranslator.java
index 8a5c93264..55a88ee0f 100644
--- a/src/com/android/launcher3/touch/TouchEventTranslator.java
+++ b/src/com/android/launcher3/touch/TouchEventTranslator.java
@@ -77,7 +77,7 @@ public class TouchEventTranslator {
public void dispatchDownEvents(MotionEvent ev) {
for(int i = 0; i < ev.getPointerCount() && i < mDownEvents.size(); i++) {
int pid = ev.getPointerId(i);
- put(pid, ev.getX(i), 0, mDownEvents.get(i).timeStamp, ev);
+ put(pid, i, ev.getX(i), 0, mDownEvents.get(i).timeStamp, ev);
}
}
@@ -98,7 +98,7 @@ public class TouchEventTranslator {
}
generateEvent(ev.getAction(), ev);
} else {
- put(pid, x, y, ev);
+ put(pid, index, x, y, ev);
}
break;
case MotionEvent.ACTION_MOVE:
@@ -123,11 +123,11 @@ public class TouchEventTranslator {
}
}
- private TouchEventTranslator put(int id, float x, float y, MotionEvent ev) {
- return put(id, x, y, ev.getEventTime(), ev);
+ private TouchEventTranslator put(int id, int index, float x, float y, MotionEvent ev) {
+ return put(id, index, x, y, ev.getEventTime(), ev);
}
- private TouchEventTranslator put(int id, float x, float y, long ms, MotionEvent ev) {
+ private TouchEventTranslator put(int id, int index, float x, float y, long ms, MotionEvent ev) {
checkFingerExistence(id, false);
boolean isInitialDown = (mFingers.size() == 0);
@@ -150,7 +150,7 @@ public class TouchEventTranslator {
} else {
action = MotionEvent.ACTION_POINTER_DOWN;
// Set the id of the changed pointer.
- action |= id << MotionEvent.ACTION_POINTER_INDEX_SHIFT;
+ action |= index << MotionEvent.ACTION_POINTER_INDEX_SHIFT;
}
generateEvent(action, ms, ev);
return this;
@@ -204,7 +204,7 @@ public class TouchEventTranslator {
public void printSamples(String msg, MotionEvent ev) {
System.out.printf("%s %s", msg, MotionEvent.actionToString(ev.getActionMasked()));
final int pointerCount = ev.getPointerCount();
- System.out.printf("#%d/%d", ev.getPointerId(ev.getActionIndex()), pointerCount);
+ System.out.printf("#%d/%d", ev.getActionIndex(), pointerCount);
System.out.printf(" t=%d:", ev.getEventTime());
for (int p = 0; p < pointerCount; p++) {
System.out.printf(" id=%d: (%f,%f)",
@@ -237,6 +237,10 @@ public class TouchEventTranslator {
if (DEBUG) {
printSamples(TAG + " generateEvent", event);
}
+ if (event.getPointerId(event.getActionIndex()) < 0) {
+ printSamples(TAG + "generateEvent", event);
+ throw new IllegalStateException(event.getActionIndex() + " not found in MotionEvent");
+ }
mListener.accept(event);
event.recycle();
}