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

Commit d1e0c371 authored by Jeff Brown's avatar Jeff Brown
Browse files

Fix PointerLocationView when pointer ids are not zero-based.

Since we support using driver-provided pointer ids (ABS_MT_TRACKING_ID)
there is no guarantee that pointer ids will necessarily start from 0
or be contiguous.

Change-Id: I9609b7a3bb238d7edbcbd68cc839dd6d14baf9df
parent 8abc9e9b
Loading
Loading
Loading
Loading
+21 −8
Original line number Diff line number Diff line
@@ -84,6 +84,7 @@ public class PointerLocationView extends View {
    private boolean mCurDown;
    private int mCurNumPointers;
    private int mMaxNumPointers;
    private int mActivePointerId;
    private final ArrayList<PointerState> mPointers = new ArrayList<PointerState>();
    
    private final VelocityTracker mVelocity;
@@ -123,6 +124,7 @@ public class PointerLocationView extends View {
        
        PointerState ps = new PointerState();
        mPointers.add(ps);
        mActivePointerId = 0;
        
        mVelocity = VelocityTracker.obtain();
        
@@ -183,8 +185,9 @@ public class PointerLocationView extends View {
            final int NP = mPointers.size();
            
            // Labels
            if (NP > 0) {
                final PointerState ps = mPointers.get(0);
            if (mActivePointerId >= 0) {
                final PointerState ps = mPointers.get(mActivePointerId);
                
                canvas.drawRect(0, 0, itemW-1, bottom,mTextBackgroundPaint);
                canvas.drawText(mText.clear()
                        .append("P: ").append(mCurNumPointers)
@@ -355,6 +358,11 @@ public class PointerLocationView extends View {
                    NP++;
                }
                
                if (mActivePointerId < 0 ||
                        ! mPointers.get(mActivePointerId).mCurDown) {
                    mActivePointerId = id;
                }
                
                final PointerState ps = mPointers.get(id);
                ps.mCurDown = true;
                if (mPrintCoords) {
@@ -396,6 +404,7 @@ public class PointerLocationView extends View {
            }
            
            if (action == MotionEvent.ACTION_UP
                    || action == MotionEvent.ACTION_CANCEL
                    || (action & MotionEvent.ACTION_MASK) == MotionEvent.ACTION_POINTER_UP) {
                final int index = (action & MotionEvent.ACTION_POINTER_INDEX_MASK)
                        >> MotionEvent.ACTION_POINTER_INDEX_SHIFT; // will be 0 for UP
@@ -408,9 +417,13 @@ public class PointerLocationView extends View {
                            .append(id + 1).append(": UP").toString());
                }
                
                if (action == MotionEvent.ACTION_UP) {
                if (action == MotionEvent.ACTION_UP
                        || action == MotionEvent.ACTION_CANCEL) {
                    mCurDown = false;
                } else {
                    if (mActivePointerId == id) {
                        mActivePointerId = event.getPointerId(index == 0 ? 1 : 0);
                    }
                    ps.addTrace(Float.NaN, Float.NaN);
                }
            }
@@ -438,9 +451,9 @@ public class PointerLocationView extends View {
    
    // HACK
    // A quick and dirty string builder implementation optimized for GC.
    // Using the basic StringBuilder implementation causes the application grind to a halt when
    // more than a couple of pointers are down due to the number of temporary objects allocated
    // while formatting strings for drawing or logging.
    // Using String.format causes the application grind to a halt when
    // more than a couple of pointers are down due to the number of
    // temporary objects allocated while formatting strings for drawing or logging.
    private static final class FasterStringBuilder {
        private char[] mChars;
        private int mLength;