| 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
|
| + .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();
|
| + }
|
| +}
|
|
|