From dcab190bd23f632f278af448b0c85b4cadcc6692 Mon Sep 17 00:00:00 2001 From: Jeff Brown Date: Mon, 14 May 2012 18:44:17 -0700 Subject: [PATCH] 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 --- libs/androidfw/VelocityTracker.cpp | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/libs/androidfw/VelocityTracker.cpp b/libs/androidfw/VelocityTracker.cpp index de214f8fc799..a212948f5631 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); } -- 2.11.0