public RadialPickerLayout(Context context, AttributeSet attrs) { super(context, attrs); setOnTouchListener(this); ViewConfiguration vc = ViewConfiguration.get(context); TOUCH_SLOP = vc.getScaledTouchSlop(); addView(mCircleView); addView(mAmPmCirclesView); addView(mHourRadialTextsView); mMinuteRadialTextsView = new RadialTextsView(context); addView(mMinuteRadialTextsView); addView(mHourRadialSelectorView); mMinuteRadialSelectorView = new RadialSelectorView(context); addView(mMinuteRadialSelectorView); preparePrefer30sMap(); mGrayBox.setLayoutParams(new ViewGroup.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); mGrayBox.setBackgroundColor(getResources().getColor(R.color.transparent_black)); mGrayBox.setVisibility(View.INVISIBLE); addView(mGrayBox);
/** * Announce the currently-selected time when launched. */ @Override public boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event) { if (event.getEventType() == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED) { // Clear the event's current text so that only the current time will be spoken. event.getText().clear(); Time time = new Time(); time.hour = getHours(); time.minute = getMinutes(); long millis = time.normalize(true); int flags = DateUtils.FORMAT_SHOW_TIME; if (mIs24HourMode) { flags |= DateUtils.FORMAT_24HOUR; } String timeString = DateUtils.formatDateTime(getContext(), millis, flags); event.getText().add(timeString); return true; } return super.dispatchPopulateAccessibilityEvent(event); }
mDownDegrees = getDegreesFromCoords(eventX, eventY, forceLegal, isInnerCircle); if (mDownDegrees != -1) { degrees = getDegreesFromCoords(eventX, eventY, true, isInnerCircle); if (degrees != -1) { value = reselectSelector(degrees, isInnerCircle[0], false, true); if (value != mLastValueSelected) { mHapticFeedbackController.tryVibrate(); mLastValueSelected = value; mListener.onValueSelected(getCurrentItemShowing(), value, false); if (getIsCurrentlyAmOrPm() != isTouchingAmOrPm) { mListener.onValueSelected(AMPM_INDEX, mIsTouchingAmOrPm, false); setValueForItem(AMPM_INDEX, isTouchingAmOrPm); degrees = getDegreesFromCoords(eventX, eventY, mDoingMove, isInnerCircle); if (degrees != -1) { value = reselectSelector(degrees, isInnerCircle[0], !mDoingMove, false); if (getCurrentItemShowing() == HOUR_INDEX && !mIs24HourMode) { int amOrPm = getIsCurrentlyAmOrPm(); if (amOrPm == AM && value == 12) { value = 0; setValueForItem(getCurrentItemShowing(), value); mListener.onValueSelected(getCurrentItemShowing(), value, true);
@Override public void onClick(View v) { tryVibrate(); int amOrPm = mTimePicker.getIsCurrentlyAmOrPm(); if (amOrPm == AM) { amOrPm = PM; } else if (amOrPm == PM){ amOrPm = AM; } updateAmPmDisplay(amOrPm); mTimePicker.setAmOrPm(amOrPm); } });
@Override public void onSaveInstanceState(Bundle outState) { if (mTimePicker != null) { outState.putInt(KEY_HOUR_OF_DAY, mTimePicker.getHours()); outState.putInt(KEY_MINUTE, mTimePicker.getMinutes()); outState.putBoolean(KEY_IS_24_HOUR_VIEW, mIs24HourMode); outState.putInt(KEY_CURRENT_ITEM_SHOWING, mTimePicker.getCurrentItemShowing()); outState.putBoolean(KEY_IN_KB_MODE, mInKbMode); if (mInKbMode) { outState.putIntegerArrayList(KEY_TYPED_TIMES, mTypedTimes); } outState.putBoolean(KEY_DARK_THEME, mThemeDark); } }
mTimePicker.setOnValueSelectedListener(this); mTimePicker.setOnKeyListener(keyboardListener); mTimePicker.initialize(getActivity(), mHapticFeedbackController, mInitialHourOfDay, mInitialMinute, mIs24HourMode); mTimePicker.invalidate(); mTimePicker.setTheme(getActivity().getApplicationContext(), mThemeDark); view.findViewById(R.id.line).setBackgroundColor(mThemeDark? darkLine : line); mDoneButton.setTextColor(mThemeDark? darkDoneTextColor : doneTextColor); mTimePicker.setBackgroundColor(mThemeDark? lightGray : circleBackground); mDoneButton.setBackgroundResource(mThemeDark? darkDoneBackground : doneBackground); return view;
private void setCurrentItemShowing(int index, boolean animateCircle, boolean delayLabelAnimate, boolean announce) { mTimePicker.setCurrentItemShowing(index, animateCircle); int hours = mTimePicker.getHours(); if (!mIs24HourMode) { hours = hours % 12; mTimePicker.setContentDescription(mHourPickerDescription + ": " + hours); if (announce) { Utils.tryAccessibilityAnnounce(mTimePicker, mSelectHours); int minutes = mTimePicker.getMinutes(); mTimePicker.setContentDescription(mMinutePickerDescription + ": " + minutes); if (announce) { Utils.tryAccessibilityAnnounce(mTimePicker, mSelectMinutes);
int value = getCurrentlyShowingValue(); int stepSize = 0; int currentItemShowing = getCurrentItemShowing(); if (currentItemShowing == HOUR_INDEX) { stepSize = HOUR_VALUE_TO_DEGREES_STEP_SIZE; degrees = snapOnly30s(degrees, changeMultiplier); value = degrees / stepSize; int maxValue = 0; setItem(currentItemShowing, value); mListener.onValueSelected(currentItemShowing, value, false); return true;
return -1; int currentShowing = getCurrentItemShowing(); degrees = snapPrefer30s(degrees); } else { degrees = snapOnly30s(degrees, 0);
@Override public void onClick(View v) { if (mInKbMode && isTypedTimeFullyLegal()) { finishKbMode(false); } else { tryVibrate(); } if (mCallback != null) { mCallback.onTimeSet(mTimePicker, mTimePicker.getHours(), mTimePicker.getMinutes()); } dismiss(); } });
/** * If the hours are showing, return the current hour. If the minutes are showing, return the * current minute. */ private int getCurrentlyShowingValue() { int currentIndex = getCurrentItemShowing(); if (currentIndex == HOUR_INDEX) { return mCurrentHoursOfDay; } else if (currentIndex == MINUTE_INDEX) { return mCurrentMinutes; } else { return -1; } }
private boolean valueRespectsMinutesConstraint(int value){ int hour = mTimePicker.getHours(); boolean checkedMinMinute = true; boolean checkedMaxMinute = true; if (hour == mMinHour) { checkedMinMinute = (value >= mMinMinute); } if (hour == mMaxHour) { checkedMaxMinute = (value <= mMaxMinute); } return checkedMinMinute && checkedMaxMinute; } }
mTimePicker.setOnValueSelectedListener(this); mTimePicker.setOnKeyListener(keyboardListener); mTimePicker.initialize(getActivity(), mHapticFeedbackController, mInitialHourOfDay, mInitialMinute, mIs24HourMode, mMinHour, mMaxHour, mMinMinute, mMaxMinute); int currentItemShowing = HOUR_INDEX; mTimePicker.invalidate(); mTimePicker.setTheme(getActivity().getApplicationContext(), mThemeDark); view.findViewById(R.id.line).setBackgroundColor(mThemeDark? darkLine : line); mDoneButton.setTextColor(mThemeDark? darkDoneTextColor : doneTextColor); mTimePicker.setBackgroundColor(mThemeDark? lightGray : circleBackground); mDoneButton.setBackgroundResource(mThemeDark? darkDoneBackground : doneBackground); return view;
int hour = mTimePicker.getHours(); int minute = mTimePicker.getMinutes(); setHour(hour, true); setMinute(minute); updateAmPmDisplay(hour < 12? AM : PM); setCurrentItemShowing(mTimePicker.getCurrentItemShowing(), true, true, true); mDoneButton.setEnabled(true); } else {
private void setCurrentItemShowing(int index, boolean animateCircle, boolean delayLabelAnimate, boolean announce) { mTimePicker.setCurrentItemShowing(index, animateCircle); int hours = mTimePicker.getHours(); if (!mIs24HourMode) { hours = hours % 12; mTimePicker.setContentDescription(mHourPickerDescription + ": " + hours); if (announce) { Utils.tryAccessibilityAnnounce(mTimePicker, mSelectHours); int minutes = mTimePicker.getMinutes(); mTimePicker.setContentDescription(mMinutePickerDescription + ": " + minutes); if (announce) { Utils.tryAccessibilityAnnounce(mTimePicker, mSelectMinutes);
int value = getCurrentlyShowingValue(); int stepSize = 0; int currentItemShowing = getCurrentItemShowing(); if (currentItemShowing == HOUR_INDEX) { stepSize = HOUR_VALUE_TO_DEGREES_STEP_SIZE; degrees = snapOnly30s(degrees, changeMultiplier); value = degrees / stepSize; int maxValue = 0; setItem(currentItemShowing, value); mListener.onValueSelected(currentItemShowing, value, false); return true;
return -1; int currentShowing = getCurrentItemShowing(); degrees = snapPrefer30s(degrees); } else { degrees = snapOnly30s(degrees, 0);
mTimePicker.getHours(), mTimePicker.getMinutes());
@Override public void run() { mDoingMove = true; int value = reselectSelector(mDownDegrees, isInnerCircle[0], false, true); mLastValueSelected = value; mListener.onValueSelected(getCurrentItemShowing(), value, false); } }, TAP_TIMEOUT);
@Override public void onClick(View v) { tryVibrate(); int amOrPm = mTimePicker.getIsCurrentlyAmOrPm(); if (amOrPm == AM) { amOrPm = PM; } else if (amOrPm == PM){ amOrPm = AM; } updateAmPmDisplay(amOrPm); mTimePicker.setAmOrPm(amOrPm); } });