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

Commit 26c5686b authored by Jim Miller's avatar Jim Miller Committed by Android (Google) Code Review
Browse files

Merge "Better handling of multiple touch events in GlowPadView" into jb-mr1-dev

parents 49397ac9 b499884b
Loading
Loading
Loading
Loading
+26 −7
Original line number Original line Diff line number Diff line
@@ -196,6 +196,7 @@ public class GlowPadView extends View {
    private Tweener mBackgroundAnimator;
    private Tweener mBackgroundAnimator;
    private PointCloud mPointCloud;
    private PointCloud mPointCloud;
    private float mInnerRadius;
    private float mInnerRadius;
    private int mPointerId;


    public GlowPadView(Context context) {
    public GlowPadView(Context context) {
        this(context, null);
        this(context, null);
@@ -736,9 +737,10 @@ public class GlowPadView extends View {


    @Override
    @Override
    public boolean onTouchEvent(MotionEvent event) {
    public boolean onTouchEvent(MotionEvent event) {
        final int action = event.getAction();
        final int action = event.getActionMasked();
        boolean handled = false;
        boolean handled = false;
        switch (action) {
        switch (action) {
            case MotionEvent.ACTION_POINTER_DOWN:
            case MotionEvent.ACTION_DOWN:
            case MotionEvent.ACTION_DOWN:
                if (DEBUG) Log.v(TAG, "*** DOWN ***");
                if (DEBUG) Log.v(TAG, "*** DOWN ***");
                handleDown(event);
                handleDown(event);
@@ -752,6 +754,7 @@ public class GlowPadView extends View {
                handled = true;
                handled = true;
                break;
                break;


            case MotionEvent.ACTION_POINTER_UP:
            case MotionEvent.ACTION_UP:
            case MotionEvent.ACTION_UP:
                if (DEBUG) Log.v(TAG, "*** UP ***");
                if (DEBUG) Log.v(TAG, "*** UP ***");
                handleMove(event);
                handleMove(event);
@@ -765,6 +768,7 @@ public class GlowPadView extends View {
                handleCancel(event);
                handleCancel(event);
                handled = true;
                handled = true;
                break;
                break;

        }
        }
        invalidate();
        invalidate();
        return handled ? true : super.onTouchEvent(event);
        return handled ? true : super.onTouchEvent(event);
@@ -776,19 +780,24 @@ public class GlowPadView extends View {
    }
    }


    private void handleDown(MotionEvent event) {
    private void handleDown(MotionEvent event) {
        float eventX = event.getX();
        int actionIndex = event.getActionIndex();
        float eventY = event.getY();
        float eventX = event.getX(actionIndex);
        float eventY = event.getY(actionIndex);
        switchToState(STATE_START, eventX, eventY);
        switchToState(STATE_START, eventX, eventY);
        if (!trySwitchToFirstTouchState(eventX, eventY)) {
        if (!trySwitchToFirstTouchState(eventX, eventY)) {
            mDragging = false;
            mDragging = false;
        } else {
        } else {
            mPointerId = event.getPointerId(actionIndex);
            updateGlowPosition(eventX, eventY);
            updateGlowPosition(eventX, eventY);
        }
        }
    }
    }


    private void handleUp(MotionEvent event) {
    private void handleUp(MotionEvent event) {
        if (DEBUG && mDragging) Log.v(TAG, "** Handle RELEASE");
        if (DEBUG && mDragging) Log.v(TAG, "** Handle RELEASE");
        switchToState(STATE_FINISH, event.getX(), event.getY());
        int actionIndex = event.getActionIndex();
        if (event.getPointerId(actionIndex) == mPointerId) {
            switchToState(STATE_FINISH, event.getX(actionIndex), event.getY(actionIndex));
        }
    }
    }


    private void handleCancel(MotionEvent event) {
    private void handleCancel(MotionEvent event) {
@@ -801,7 +810,9 @@ public class GlowPadView extends View {


        // mActiveTarget = -1; // Drop the active target if canceled.
        // mActiveTarget = -1; // Drop the active target if canceled.


        switchToState(STATE_FINISH, event.getX(), event.getY());
        int actionIndex = event.findPointerIndex(mPointerId);
        actionIndex = actionIndex == -1 ? 0 : actionIndex;
        switchToState(STATE_FINISH, event.getX(actionIndex), event.getY(actionIndex));
    }
    }


    private void handleMove(MotionEvent event) {
    private void handleMove(MotionEvent event) {
@@ -811,9 +822,17 @@ public class GlowPadView extends View {
        int ntargets = targets.size();
        int ntargets = targets.size();
        float x = 0.0f;
        float x = 0.0f;
        float y = 0.0f;
        float y = 0.0f;
        int actionIndex = event.findPointerIndex(mPointerId);

        if (actionIndex == -1) {
            return;  // no data for this pointer
        }

        for (int k = 0; k < historySize + 1; k++) {
        for (int k = 0; k < historySize + 1; k++) {
            float eventX = k < historySize ? event.getHistoricalX(k) : event.getX();
            float eventX = k < historySize ? event.getHistoricalX(actionIndex, k)
            float eventY = k < historySize ? event.getHistoricalY(k) : event.getY();
                    : event.getX(actionIndex);
            float eventY = k < historySize ? event.getHistoricalY(actionIndex, k)
                    : event.getY(actionIndex);
            // tx and ty are relative to wave center
            // tx and ty are relative to wave center
            float tx = eventX - mWaveCenterX;
            float tx = eventX - mWaveCenterX;
            float ty = eventY - mWaveCenterY;
            float ty = eventY - mWaveCenterY;