Skip to content

Commit dcab190

Browse files
author
Jeff Brown
committed
Fix pointer indexing issue in VelocityTracker.
VelocityTracker was implicitly assuming that the pointer ids in a MotionEvent were ordered. That is not necessarily the case so we need to be careful while copying the pointer coordinates out. Bug: 6413587 Change-Id: I3b23a954f893eebdf786f2a94207149b092ef036
1 parent 7174a49 commit dcab190

File tree

1 file changed

+13
-6
lines changed

1 file changed

+13
-6
lines changed

libs/androidfw/VelocityTracker.cpp

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -145,8 +145,8 @@ void VelocityTracker::addMovement(nsecs_t eventTime, BitSet32 idBits, const Posi
145145
"estimator (degree=%d, xCoeff=%s, yCoeff=%s, confidence=%f)",
146146
id, positions[index].x, positions[index].y,
147147
int(estimator.degree),
148-
vectorToString(estimator.xCoeff, estimator.degree).string(),
149-
vectorToString(estimator.yCoeff, estimator.degree).string(),
148+
vectorToString(estimator.xCoeff, estimator.degree + 1).string(),
149+
vectorToString(estimator.yCoeff, estimator.degree + 1).string(),
150150
estimator.confidence);
151151
}
152152
#endif
@@ -195,23 +195,30 @@ void VelocityTracker::addMovement(const MotionEvent* event) {
195195
idBits.markBit(event->getPointerId(i));
196196
}
197197

198+
uint32_t pointerIndex[MAX_POINTERS];
199+
for (size_t i = 0; i < pointerCount; i++) {
200+
pointerIndex[i] = idBits.getIndexOfBit(event->getPointerId(i));
201+
}
202+
198203
nsecs_t eventTime;
199204
Position positions[pointerCount];
200205

201206
size_t historySize = event->getHistorySize();
202207
for (size_t h = 0; h < historySize; h++) {
203208
eventTime = event->getHistoricalEventTime(h);
204209
for (size_t i = 0; i < pointerCount; i++) {
205-
positions[i].x = event->getHistoricalX(i, h);
206-
positions[i].y = event->getHistoricalY(i, h);
210+
uint32_t index = pointerIndex[i];
211+
positions[index].x = event->getHistoricalX(i, h);
212+
positions[index].y = event->getHistoricalY(i, h);
207213
}
208214
addMovement(eventTime, idBits, positions);
209215
}
210216

211217
eventTime = event->getEventTime();
212218
for (size_t i = 0; i < pointerCount; i++) {
213-
positions[i].x = event->getX(i);
214-
positions[i].y = event->getY(i);
219+
uint32_t index = pointerIndex[i];
220+
positions[index].x = event->getX(i);
221+
positions[index].y = event->getY(i);
215222
}
216223
addMovement(eventTime, idBits, positions);
217224
}

0 commit comments

Comments
 (0)