Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3d0ff09e authored by Adam Powell's avatar Adam Powell Committed by Android (Google) Code Review
Browse files

Merge "VelocityTracker now uses pointer id instead of index when referring to...

Merge "VelocityTracker now uses pointer id instead of index when referring to multiple pointers. VelocityTracker now correctly handles multitouch. Addresses http://b/issue?id=2439030"
parents 70bc2177 73d8fca6
Loading
Loading
Loading
Loading
+37 −22
Original line number Diff line number Diff line
@@ -124,24 +124,37 @@ public final class VelocityTracker implements Poolable<VelocityTracker> {
     * @param ev The MotionEvent you received and would like to track.
     */
    public void addMovement(MotionEvent ev) {
        long time = ev.getEventTime();
        final int N = ev.getHistorySize();
        final int pointerCount = ev.getPointerCount();
        for (int p = 0; p < pointerCount; p++) {
        int touchIndex = (mLastTouch + 1) % NUM_PAST;
        for (int i=0; i<N; i++) {
                addPoint(p, ev.getHistoricalX(p, i), ev.getHistoricalY(p, i),
                        ev.getHistoricalEventTime(i));
            for (int id = 0; id < MotionEvent.BASE_AVAIL_POINTERS; id++) {
                mPastTime[id][touchIndex] = 0;
            }
            for (int p = 0; p < pointerCount; p++) {
                int id = ev.getPointerId(p);
                mPastX[id][touchIndex] = ev.getHistoricalX(p, i);
                mPastY[id][touchIndex] = ev.getHistoricalY(p, i);
                mPastTime[id][touchIndex] = ev.getHistoricalEventTime(i);
            }
            addPoint(p, ev.getX(p), ev.getY(p), time);

            touchIndex = (touchIndex + 1) % NUM_PAST;
        }

        // During calculation any pointer values with a time of 0 are treated
        // as a break in input. Initialize all to 0 for each new touch index.
        for (int id = 0; id < MotionEvent.BASE_AVAIL_POINTERS; id++) {
            mPastTime[id][touchIndex] = 0;
        }
        final long time = ev.getEventTime();
        for (int p = 0; p < pointerCount; p++) {
            int id = ev.getPointerId(p);
            mPastX[id][touchIndex] = ev.getX(p);
            mPastY[id][touchIndex] = ev.getY(p);
            mPastTime[id][touchIndex] = time;
        }

    private void addPoint(int pos, float x, float y, long time) {
        final int lastTouch = (mLastTouch + 1) % NUM_PAST;
        mPastX[pos][lastTouch] = x;
        mPastY[pos][lastTouch] = y;
        mPastTime[pos][lastTouch] = time;
        mLastTouch = lastTouch;
        mLastTouch = touchIndex;
    }

    /**
@@ -177,10 +190,12 @@ public final class VelocityTracker implements Poolable<VelocityTracker> {
            // find oldest acceptable time
            int oldestTouch = lastTouch;
            if (pastTime[lastTouch] > 0) { // cleared ?
                oldestTouch = (lastTouch + 1) % NUM_PAST;
                final float acceptableTime = pastTime[lastTouch] - LONGEST_PAST_TIME;
                while (pastTime[oldestTouch] < acceptableTime) {
                    oldestTouch = (oldestTouch + 1) % NUM_PAST;
                int nextOldestTouch = (NUM_PAST + oldestTouch - 1) % NUM_PAST;
                while (pastTime[nextOldestTouch] >= acceptableTime &&
                        nextOldestTouch != lastTouch) {
                    oldestTouch = nextOldestTouch;
                    nextOldestTouch = (NUM_PAST + oldestTouch - 1) % NUM_PAST;
                }
            }
        
@@ -241,25 +256,25 @@ public final class VelocityTracker implements Poolable<VelocityTracker> {
     * Retrieve the last computed X velocity.  You must first call
     * {@link #computeCurrentVelocity(int)} before calling this function.
     * 
     * @param pos Which pointer's velocity to return.
     * @param id Which pointer's velocity to return.
     * @return The previously computed X velocity.
     * 
     * @hide Pending API approval
     */
    public float getXVelocity(int pos) {
        return mXVelocity[pos];
    public float getXVelocity(int id) {
        return mXVelocity[id];
    }
    
    /**
     * Retrieve the last computed Y velocity.  You must first call
     * {@link #computeCurrentVelocity(int)} before calling this function.
     * 
     * @param pos Which pointer's velocity to return.
     * @param id Which pointer's velocity to return.
     * @return The previously computed Y velocity.
     * 
     * @hide Pending API approval
     */
    public float getYVelocity(int pos) {
        return mYVelocity[pos];
    public float getYVelocity(int id) {
        return mYVelocity[id];
    }
}