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

Commit 002f918c authored by Alan Viverette's avatar Alan Viverette
Browse files

Only send haptic events from time picker when time changes

BUG: 18572841
Change-Id: Iaa26e2f0804e301f8754e19a1d03dbd2142bf044
parent 9dba1073
Loading
Loading
Loading
Loading
+73 −55
Original line number Diff line number Diff line
@@ -1200,69 +1200,87 @@ public class RadialTimePickerView extends View implements View.OnTouchListener {
        return degrees;
    }

    boolean mChangedDuringTouch = false;

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        if (!mInputEnabled) {
            return true;
        }

        final float eventX = event.getX();
        final float eventY = event.getY();
        final int action = event.getActionMasked();
        if (action == MotionEvent.ACTION_MOVE
                || action == MotionEvent.ACTION_UP
                || action == MotionEvent.ACTION_DOWN) {
            boolean forceSelection = false;
            boolean autoAdvance = false;

        int degrees;
        int snapDegrees;
        boolean result = false;
            if (action == MotionEvent.ACTION_DOWN) {
                // This is a new event stream, reset whether the value changed.
                mChangedDuringTouch = false;
            } else if (action == MotionEvent.ACTION_UP) {
                autoAdvance = true;

        switch(event.getAction()) {
            case MotionEvent.ACTION_DOWN:
            case MotionEvent.ACTION_MOVE:
                degrees = getDegreesFromXY(eventX, eventY);
                if (degrees != -1) {
                    snapDegrees = (mShowHours ?
                            snapOnly30s(degrees, 0) : snapPrefer30s(degrees)) % 360;
                    if (mShowHours) {
                        mSelectionDegrees[HOURS] = snapDegrees;
                        mSelectionDegrees[HOURS_INNER] = snapDegrees;
                    } else {
                        mSelectionDegrees[MINUTES] = snapDegrees;
                // If we saw a down/up pair without the value changing, assume
                // this is a single-tap selection and force a change.
                if (!mChangedDuringTouch) {
                    forceSelection = true;
                }
                    performHapticFeedback(HapticFeedbackConstants.CLOCK_TICK);
                    if (mListener != null) {
                        if (mShowHours) {
                            mListener.onValueSelected(HOURS, getCurrentHour(), false);
                        } else  {
                            mListener.onValueSelected(MINUTES, getCurrentMinute(), false);
            }

            mChangedDuringTouch |= handleTouchInput(
                    event.getX(), event.getY(), forceSelection, autoAdvance);
        }
                    result = true;
                    invalidate();

        return true;
    }
                break;

            case MotionEvent.ACTION_UP:
                degrees = getDegreesFromXY(eventX, eventY);
                if (degrees != -1) {
                    snapDegrees = (mShowHours ?
                            snapOnly30s(degrees, 0) : snapPrefer30s(degrees)) % 360;
                    if (mShowHours) {
                        mSelectionDegrees[HOURS] = snapDegrees;
                        mSelectionDegrees[HOURS_INNER] = snapDegrees;
                    } else {
                        mSelectionDegrees[MINUTES] = snapDegrees;
    private boolean handleTouchInput(
            float x, float y, boolean forceSelection, boolean autoAdvance) {
        // Calling getDegreesFromXY has side effects, so cache
        // whether we used to be on the inner circle.
        final boolean wasOnInnerCircle = mIsOnInnerCircle;
        final int degrees = getDegreesFromXY(x, y);
        if (degrees == -1) {
            return false;
        }
                    if (mListener != null) {

        final int[] selectionDegrees = mSelectionDegrees;
        int type = -1;
        int newValue = -1;

        if (mShowHours) {
                            mListener.onValueSelected(HOURS, getCurrentHour(), true);
            final int snapDegrees = snapOnly30s(degrees, 0) % 360;
            if (forceSelection
                    || selectionDegrees[HOURS] != snapDegrees
                    || selectionDegrees[HOURS_INNER] != snapDegrees
                    || wasOnInnerCircle != mIsOnInnerCircle) {
                selectionDegrees[HOURS] = snapDegrees;
                selectionDegrees[HOURS_INNER] = snapDegrees;

                type = HOURS;
                newValue = getCurrentHour();
            }
        } else {
                            mListener.onValueSelected(MINUTES, getCurrentMinute(), true);
            final int snapDegrees = snapPrefer30s(degrees) % 360;
            if (forceSelection || selectionDegrees[MINUTES] != snapDegrees) {
                selectionDegrees[MINUTES] = snapDegrees;

                type = MINUTES;
                newValue = getCurrentMinute();
            }
        }
                    invalidate();
                    result = true;

        if (newValue != -1) {
            if (mListener != null) {
                mListener.onValueSelected(type, newValue, autoAdvance);
            }
                break;
            performHapticFeedback(HapticFeedbackConstants.CLOCK_TICK);
            invalidate();
            return true;
        }
        return result;

        return false;
    }

    @Override