Loading core/java/android/widget/RadialTimePickerView.java +73 −55 Original line number Diff line number Diff line Loading @@ -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 Loading Loading
core/java/android/widget/RadialTimePickerView.java +73 −55 Original line number Diff line number Diff line Loading @@ -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 Loading