diff options
| author | 2014-12-01 16:13:32 -0800 | |
|---|---|---|
| committer | 2014-12-01 16:13:32 -0800 | |
| commit | 002f918ceae416ba5c382de499ccff12e642c7b5 (patch) | |
| tree | 6356a1c0a13c5ae64260f8c49b3759138a48451f | |
| parent | 9dba10732802bf162c0098d2591aa284e55b7b5e (diff) | |
Only send haptic events from time picker when time changes
BUG: 18572841
Change-Id: Iaa26e2f0804e301f8754e19a1d03dbd2142bf044
| -rw-r--r-- | core/java/android/widget/RadialTimePickerView.java | 128 |
1 files changed, 73 insertions, 55 deletions
diff --git a/core/java/android/widget/RadialTimePickerView.java b/core/java/android/widget/RadialTimePickerView.java index 8b01dde16f54..04b5616de72d 100644 --- a/core/java/android/widget/RadialTimePickerView.java +++ b/core/java/android/widget/RadialTimePickerView.java @@ -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) { + if (!mInputEnabled) { return true; } - final float eventX = event.getX(); - final float eventY = event.getY(); - - int degrees; - int snapDegrees; - boolean result = false; - - 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; - } - performHapticFeedback(HapticFeedbackConstants.CLOCK_TICK); - if (mListener != null) { - if (mShowHours) { - mListener.onValueSelected(HOURS, getCurrentHour(), false); - } else { - mListener.onValueSelected(MINUTES, getCurrentMinute(), false); - } - } - result = true; - invalidate(); + final int action = event.getActionMasked(); + if (action == MotionEvent.ACTION_MOVE + || action == MotionEvent.ACTION_UP + || action == MotionEvent.ACTION_DOWN) { + boolean forceSelection = false; + boolean autoAdvance = 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; + + // 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; } - 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; - } - if (mListener != null) { - if (mShowHours) { - mListener.onValueSelected(HOURS, getCurrentHour(), true); - } else { - mListener.onValueSelected(MINUTES, getCurrentMinute(), true); - } - } - invalidate(); - result = true; - } - break; + mChangedDuringTouch |= handleTouchInput( + event.getX(), event.getY(), forceSelection, autoAdvance); + } + + return true; + } + + 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; } - return result; + + final int[] selectionDegrees = mSelectionDegrees; + int type = -1; + int newValue = -1; + + if (mShowHours) { + 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 { + final int snapDegrees = snapPrefer30s(degrees) % 360; + if (forceSelection || selectionDegrees[MINUTES] != snapDegrees) { + selectionDegrees[MINUTES] = snapDegrees; + + type = MINUTES; + newValue = getCurrentMinute(); + } + } + + if (newValue != -1) { + if (mListener != null) { + mListener.onValueSelected(type, newValue, autoAdvance); + } + performHapticFeedback(HapticFeedbackConstants.CLOCK_TICK); + invalidate(); + return true; + } + + return false; } @Override |