summaryrefslogtreecommitdiffstats
path: root/libs/androidfw
diff options
context:
space:
mode:
authorJeff Brown <jeffbrown@google.com>2012-05-14 18:44:17 -0700
committerJeff Brown <jeffbrown@google.com>2012-05-14 18:44:17 -0700
commitdcab190bd23f632f278af448b0c85b4cadcc6692 (patch)
treea5ef26d407c976a8d6cc5504393a54636b68b834 /libs/androidfw
parent7174a491bc1f89da65eaef3be25f3ea3f3e3bab5 (diff)
downloadframeworks_base-dcab190bd23f632f278af448b0c85b4cadcc6692.zip
frameworks_base-dcab190bd23f632f278af448b0c85b4cadcc6692.tar.gz
frameworks_base-dcab190bd23f632f278af448b0c85b4cadcc6692.tar.bz2
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
Diffstat (limited to 'libs/androidfw')
-rw-r--r--libs/androidfw/VelocityTracker.cpp19
1 files changed, 13 insertions, 6 deletions
diff --git a/libs/androidfw/VelocityTracker.cpp b/libs/androidfw/VelocityTracker.cpp
index de214f8..a212948 100644
--- a/libs/androidfw/VelocityTracker.cpp
+++ b/libs/androidfw/VelocityTracker.cpp
@@ -145,8 +145,8 @@ void VelocityTracker::addMovement(nsecs_t eventTime, BitSet32 idBits, const Posi
"estimator (degree=%d, xCoeff=%s, yCoeff=%s, confidence=%f)",
id, positions[index].x, positions[index].y,
int(estimator.degree),
- vectorToString(estimator.xCoeff, estimator.degree).string(),
- vectorToString(estimator.yCoeff, estimator.degree).string(),
+ vectorToString(estimator.xCoeff, estimator.degree + 1).string(),
+ vectorToString(estimator.yCoeff, estimator.degree + 1).string(),
estimator.confidence);
}
#endif
@@ -195,6 +195,11 @@ void VelocityTracker::addMovement(const MotionEvent* event) {
idBits.markBit(event->getPointerId(i));
}
+ uint32_t pointerIndex[MAX_POINTERS];
+ for (size_t i = 0; i < pointerCount; i++) {
+ pointerIndex[i] = idBits.getIndexOfBit(event->getPointerId(i));
+ }
+
nsecs_t eventTime;
Position positions[pointerCount];
@@ -202,16 +207,18 @@ void VelocityTracker::addMovement(const MotionEvent* event) {
for (size_t h = 0; h < historySize; h++) {
eventTime = event->getHistoricalEventTime(h);
for (size_t i = 0; i < pointerCount; i++) {
- positions[i].x = event->getHistoricalX(i, h);
- positions[i].y = event->getHistoricalY(i, h);
+ uint32_t index = pointerIndex[i];
+ positions[index].x = event->getHistoricalX(i, h);
+ positions[index].y = event->getHistoricalY(i, h);
}
addMovement(eventTime, idBits, positions);
}
eventTime = event->getEventTime();
for (size_t i = 0; i < pointerCount; i++) {
- positions[i].x = event->getX(i);
- positions[i].y = event->getY(i);
+ uint32_t index = pointerIndex[i];
+ positions[index].x = event->getX(i);
+ positions[index].y = event->getY(i);
}
addMovement(eventTime, idBits, positions);
}