diff options
author | Jeff Brown <jeffbrown@google.com> | 2012-05-14 18:44:17 -0700 |
---|---|---|
committer | Jeff Brown <jeffbrown@google.com> | 2012-05-14 18:44:17 -0700 |
commit | dcab190bd23f632f278af448b0c85b4cadcc6692 (patch) | |
tree | a5ef26d407c976a8d6cc5504393a54636b68b834 /libs/androidfw | |
parent | 7174a491bc1f89da65eaef3be25f3ea3f3e3bab5 (diff) | |
download | frameworks_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.cpp | 19 |
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); } |