// Copyright 2013 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 org.chromium.content.R; import java.util.Calendar; import java.util.TimeZone; // This class is heavily based on android.widget.DatePicker. public class WeekPicker extends TwoFieldDatePicker { public WeekPicker(Context context, double minValue, double maxValue) { super(context, minValue, maxValue); getPositionInYearSpinner().setContentDescription( getResources().getString(R.string.accessibility_date_picker_week)); // initialize to current date Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("UTC")); cal.setFirstDayOfWeek(Calendar.MONDAY); cal.setMinimalDaysInFirstWeek(4); cal.setTimeInMillis(System.currentTimeMillis()); init(getISOWeekYearForDate(cal), getWeekForDate(cal), null); } /** * Creates a date object from the |year| and |week|. */ public static Calendar createDateFromWeek(int year, int week) { Calendar date = Calendar.getInstance(TimeZone.getTimeZone("UTC")); date.clear(); 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; } /** * Creates a date object from the |value| which is milliseconds since epoch. */ public static Calendar createDateFromValue(double value) { Calendar date = Calendar.getInstance(TimeZone.getTimeZone("UTC")); date.clear(); date.setFirstDayOfWeek(Calendar.MONDAY); date.setMinimalDaysInFirstWeek(4); date.setTimeInMillis((long) value); return date; } @Override protected Calendar getDateForValue(double value) { return WeekPicker.createDateFromValue(value); } 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) { Calendar date = createDateFromWeek(year, week); if (date.before(getMinDate())) { setCurrentDate(getMinDate()); } else if (date.after(getMaxDate())) { setCurrentDate(getMaxDate()); } else { setCurrentDate(date); } } private int getNumberOfWeeks(int year) { // Create a date in the middle of the year, where the week year matches the year. Calendar date = createDateFromWeek(year, 20); return date.getActualMaximum(Calendar.WEEK_OF_YEAR); } /** * @return The selected year. */ @Override public int getYear() { return getISOWeekYearForDate(getCurrentDate()); } /** * @return The selected week. */ public int getWeek() { return getWeekForDate(getCurrentDate()); } @Override public int getPositionInYear() { return getWeek(); } @Override protected int getMaxYear() { return getISOWeekYearForDate(getMaxDate()); } @Override protected int getMinYear() { return getISOWeekYearForDate(getMinDate()); } @Override protected int getMaxPositionInYear(int year) { if (year == getISOWeekYearForDate(getMaxDate())) { return getWeekForDate(getMaxDate()); } return getNumberOfWeeks(year); } @Override protected int getMinPositionInYear(int year) { if (year == getISOWeekYearForDate(getMinDate())) { return getWeekForDate(getMinDate()); } return 1; } }