Chromium Code Reviews| Index: content/public/android/java/src/org/chromium/content/browser/input/WeekPicker.java |
| diff --git a/content/public/android/java/src/org/chromium/content/browser/input/WeekPicker.java b/content/public/android/java/src/org/chromium/content/browser/input/WeekPicker.java |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..ca1a72eaa4f20db544f7a2a0d6548af2467277e9 |
| --- /dev/null |
| +++ b/content/public/android/java/src/org/chromium/content/browser/input/WeekPicker.java |
| @@ -0,0 +1,168 @@ |
| +// Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +package org.chromium.content.browser.input; |
| + |
| +import android.content.Context; |
| +import android.view.LayoutInflater; |
| +import android.widget.NumberPicker; |
| +import android.widget.NumberPicker.OnValueChangeListener; |
| + |
| +import java.util.Calendar; |
| + |
| +import org.chromium.content.R; |
| + |
| +// This class is heavily based on android.widget.DatePicker. |
| +public class WeekPicker extends TwoFieldDatePicker { |
| + |
| + public WeekPicker(Context context, long minValue, long maxValue) { |
| + super(context); |
| + |
| + LayoutInflater inflater = (LayoutInflater) context |
|
Miguel Garcia
2013/06/11 13:02:52
yeah it seems you can move the inflation to the pa
keishi
2013/06/12 13:23:07
Done.
|
| + .getSystemService(Context.LAYOUT_INFLATER_SERVICE); |
| + inflater.inflate(R.layout.week_picker, this, true); |
| + |
| + OnValueChangeListener onChangeListener = new OnValueChangeListener() { |
| + @Override |
| + public void onValueChange(NumberPicker picker, int oldVal, int newVal) { |
| + // take care of wrapping of weeks to update greater fields |
| + if (picker == mPositionInYearSpinner) { |
| + Calendar tempDate = (Calendar) mCurrentDate.clone(); |
| + if (oldVal == mPositionInYearSpinner.getMaxValue() |
| + && newVal == mPositionInYearSpinner.getMinValue()) { |
| + tempDate.add(Calendar.WEEK_OF_YEAR, 1); |
| + } else if (oldVal == mPositionInYearSpinner.getMinValue() |
| + && newVal == mPositionInYearSpinner.getMaxValue()) { |
| + tempDate.add(Calendar.WEEK_OF_YEAR, -1); |
| + } else { |
| + tempDate.add(Calendar.WEEK_OF_YEAR, newVal - oldVal); |
| + } |
| + // now set the date to the adjusted one |
| + setCurrentDate(getISOWeekYearForDate(tempDate), |
| + getWeekForDate(tempDate)); |
| + } else if (picker == mYearSpinner) { |
| + setCurrentDate(newVal, getWeekForDate(mCurrentDate)); |
| + } else { |
| + throw new IllegalArgumentException(); |
| + } |
| + |
| + updateSpinners(); |
| + notifyDateChanged(); |
| + } |
| + }; |
| + |
| + // week |
| + mPositionInYearSpinner = (NumberPicker) findViewById(R.id.week); |
| + mPositionInYearSpinner.setOnLongPressUpdateInterval(200); |
| + mPositionInYearSpinner.setOnValueChangedListener(onChangeListener); |
| + |
| + // year |
| + mYearSpinner = (NumberPicker) findViewById(R.id.year); |
| + mYearSpinner.setOnLongPressUpdateInterval(100); |
| + mYearSpinner.setOnValueChangedListener(onChangeListener); |
| + |
| + mMinDate = Calendar.getInstance(); |
| + mMinDate.setFirstDayOfWeek(Calendar.MONDAY); |
| + mMinDate.setMinimalDaysInFirstWeek(4); |
| + mMinDate.setTimeInMillis(minValue); |
| + |
| + mMaxDate = Calendar.getInstance(); |
| + mMaxDate.setFirstDayOfWeek(Calendar.MONDAY); |
| + mMaxDate.setMinimalDaysInFirstWeek(4); |
| + mMaxDate.setTimeInMillis(maxValue); |
| + |
| + // initialize to current date |
| + mCurrentDate.setTimeInMillis(System.currentTimeMillis()); |
| + init(getISOWeekYearForDate(mCurrentDate), getWeekForDate(mCurrentDate), null); |
| + } |
| + |
| + private Calendar createDateFromWeek(int year, int week) { |
| + Calendar date = Calendar.getInstance(); |
| + date.setFirstDayOfWeek(Calendar.MONDAY); |
| + date.setMinimalDaysInFirstWeek(4); |
| + date.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY); |
| + date.set(Calendar.YEAR, year); |
| + date.set(Calendar.WEEK_OF_YEAR, week); |
| + return date; |
| + } |
| + |
| + public static int getISOWeekYearForDate(Calendar date) { |
| + int year = date.get(Calendar.YEAR); |
| + int month = date.get(Calendar.MONTH); |
| + int week = date.get(Calendar.WEEK_OF_YEAR); |
| + if (month == 0 && week > 51) { |
| + year--; |
| + } else if (month == 11 && week == 1) { |
| + year++; |
| + } |
| + return year; |
| + } |
| + |
| + public static int getWeekForDate(Calendar date) { |
| + return date.get(Calendar.WEEK_OF_YEAR); |
| + } |
| + |
| + @Override |
| + protected void setCurrentDate(int year, int week) { |
| + mCurrentDate = createDateFromWeek(year, week); |
| + if (mCurrentDate.before(mMinDate)) { |
| + mCurrentDate.setTimeInMillis(mMinDate.getTimeInMillis()); |
| + } else if (mCurrentDate.after(mMaxDate)) { |
| + mCurrentDate.setTimeInMillis(mMaxDate.getTimeInMillis()); |
| + } |
| + } |
| + |
| + private int getNumberOfWeeks() { |
| + // Create a date in the middle of the year, where the week year matches the year. |
| + Calendar date = createDateFromWeek(getYear(), 20); |
| + return date.getActualMaximum(Calendar.WEEK_OF_YEAR); |
| + } |
| + |
| + @Override |
| + protected void updateSpinners() { |
| + // set the spinner ranges respecting the min and max dates |
| + if (mCurrentDate.equals(mMinDate)) { |
| + mPositionInYearSpinner.setMinValue(getWeekForDate(mCurrentDate)); |
| + mPositionInYearSpinner.setMaxValue(getNumberOfWeeks()); |
| + mPositionInYearSpinner.setWrapSelectorWheel(false); |
| + } else if (mCurrentDate.equals(mMaxDate)) { |
| + mPositionInYearSpinner.setMinValue(getNumberOfWeeks()); |
| + mPositionInYearSpinner.setMaxValue(getWeekForDate(mCurrentDate)); |
| + mPositionInYearSpinner.setWrapSelectorWheel(false); |
| + } else { |
| + mPositionInYearSpinner.setMinValue(1); |
| + mPositionInYearSpinner.setMaxValue(getNumberOfWeeks()); |
| + mPositionInYearSpinner.setWrapSelectorWheel(true); |
| + } |
| + |
| + // year spinner range does not change based on the current date |
| + mYearSpinner.setMinValue(getISOWeekYearForDate(mMinDate)); |
| + mYearSpinner.setMaxValue(getISOWeekYearForDate(mMaxDate)); |
| + mYearSpinner.setWrapSelectorWheel(false); |
| + |
| + // set the spinner values |
| + mYearSpinner.setValue(getISOWeekYearForDate(mCurrentDate)); |
| + mPositionInYearSpinner.setValue(getWeekForDate(mCurrentDate)); |
| + } |
| + |
| + /** |
| + * @return The selected year. |
| + */ |
| + @Override |
| + public int getYear() { |
| + return getISOWeekYearForDate(mCurrentDate); |
| + } |
| + |
| + /** |
| + * @return The selected week. |
| + */ |
| + public int getWeek() { |
| + return getWeekForDate(mCurrentDate); |
| + } |
| + |
| + @Override |
| + public int getMonthOrWeek() { |
| + return getWeek(); |
| + } |
| +} |