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

Commit 4515f785 authored by Alan Viverette's avatar Alan Viverette Committed by Android (Google) Code Review
Browse files

Merge "Only send haptic events from time picker when time changes" into lmp-mr1-dev

parents 217814bf 002f918c
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