summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Alan Viverette <alanv@google.com> 2014-12-01 16:13:32 -0800
committer Alan Viverette <alanv@google.com> 2014-12-01 16:13:32 -0800
commit002f918ceae416ba5c382de499ccff12e642c7b5 (patch)
tree6356a1c0a13c5ae64260f8c49b3759138a48451f
parent9dba10732802bf162c0098d2591aa284e55b7b5e (diff)
Only send haptic events from time picker when time changes
BUG: 18572841 Change-Id: Iaa26e2f0804e301f8754e19a1d03dbd2142bf044
-rw-r--r--core/java/android/widget/RadialTimePickerView.java128
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