// 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;
}
}