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

Commit b35e372b authored by Jim Miller's avatar Jim Miller
Browse files

Handle dropped motion events in MultiWaveView due to high system activity

This change causes MultWaveView to look at historical motion events to make
unlocking easier during high system load.

Updated after review.

Change-Id: Ibfc3cb513936e3b8488aa4390164bf5e214c982f
parent b2af97e9
Loading
Loading
Loading
Loading
+60 −54
Original line number Original line Diff line number Diff line
@@ -449,27 +449,25 @@ public class MultiWaveView extends View implements AnimatorUpdateListener {
        final int action = event.getAction();
        final int action = event.getAction();


        boolean handled = false;
        boolean handled = false;
        float x = event.getX();
        float y = event.getY();
        switch (action) {
        switch (action) {
            case MotionEvent.ACTION_DOWN:
            case MotionEvent.ACTION_DOWN:
                handleDown(x, y);
                handleDown(event);
                handled = true;
                handled = true;
                break;
                break;


            case MotionEvent.ACTION_MOVE:
            case MotionEvent.ACTION_MOVE:
                handleMove(x, y);
                handleMove(event);
                handled = true;
                handled = true;
                break;
                break;


            case MotionEvent.ACTION_UP:
            case MotionEvent.ACTION_UP:
                handleUp(x, y);
                handleMove(event);
                handleMove(x, y);
                handleUp(event);
                handled = true;
                handled = true;
                break;
                break;


            case MotionEvent.ACTION_CANCEL:
            case MotionEvent.ACTION_CANCEL:
                handleMove(x, y);
                handleMove(event);
                handled = true;
                handled = true;
                break;
                break;
        }
        }
@@ -483,7 +481,9 @@ public class MultiWaveView extends View implements AnimatorUpdateListener {
        mHandleDrawable.setY(y);
        mHandleDrawable.setY(y);
    }
    }


    private void handleDown(float x, float y) {
    private void handleDown(MotionEvent event) {
        final float x = event.getX();
        final float y = event.getY();
        final float dx = x - mWaveCenterX;
        final float dx = x - mWaveCenterX;
        final float dy = y - mWaveCenterY;
        final float dy = y - mWaveCenterY;
        if (dist2(dx,dy) <= square(mTapRadius)) {
        if (dist2(dx,dy) <= square(mTapRadius)) {
@@ -498,16 +498,21 @@ public class MultiWaveView extends View implements AnimatorUpdateListener {
        }
        }
    }
    }


    private void handleUp(float x, float y) {
    private void handleUp(MotionEvent event) {
        if (DEBUG && mDragging) Log.v(TAG, "** Handle RELEASE");
        if (DEBUG && mDragging) Log.v(TAG, "** Handle RELEASE");
        switchToState(STATE_FINISH, x, y);
        switchToState(STATE_FINISH, event.getX(), event.getY());
    }
    }


    private void handleMove(float x, float y) {
    private void handleMove(MotionEvent event) {
        if (!mDragging) {
        if (!mDragging) {
            return;
            return;
        }
        }


        int activeTarget = -1;
        final int historySize = event.getHistorySize();
        for (int k = 0; k < historySize + 1; k++) {
            float x = k < historySize ? event.getHistoricalX(k) : event.getX();
            float y = k < historySize ? event.getHistoricalY(k) : event.getY();
            float tx = x - mWaveCenterX;
            float tx = x - mWaveCenterX;
            float ty = y - mWaveCenterY;
            float ty = y - mWaveCenterY;
            float touchRadius = (float) Math.sqrt(dist2(tx, ty));
            float touchRadius = (float) Math.sqrt(dist2(tx, ty));
@@ -515,7 +520,6 @@ public class MultiWaveView extends View implements AnimatorUpdateListener {
            float limitX = mWaveCenterX + tx * scale;
            float limitX = mWaveCenterX + tx * scale;
            float limitY = mWaveCenterY + ty * scale;
            float limitY = mWaveCenterY + ty * scale;


        int activeTarget = -1;
            boolean singleTarget = mTargetDrawables.size() == 1;
            boolean singleTarget = mTargetDrawables.size() == 1;
            if (singleTarget) {
            if (singleTarget) {
                // Snap to outer ring if there's only one target
                // Snap to outer ring if there's only one target
@@ -558,6 +562,8 @@ public class MultiWaveView extends View implements AnimatorUpdateListener {
                moveHandleTo(x, y, false);
                moveHandleTo(x, y, false);
                mHandleDrawable.setAlpha(1.0f);
                mHandleDrawable.setAlpha(1.0f);
            }
            }
        }

        // Draw handle outside parent's bounds
        // Draw handle outside parent's bounds
        invalidateGlobalRegion(mHandleDrawable);
        invalidateGlobalRegion(mHandleDrawable);