| Index: content/public/android/java/src/org/chromium/content/browser/input/MonthPicker.java
|
| diff --git a/content/public/android/java/src/org/chromium/content/browser/input/MonthPicker.java b/content/public/android/java/src/org/chromium/content/browser/input/MonthPicker.java
|
| index dd9bc92cf425dbb38b49fcdf8f10083cc0336032..b668c3fc71e6eb6c7aa266273dac11cce61eae98 100644
|
| --- a/content/public/android/java/src/org/chromium/content/browser/input/MonthPicker.java
|
| +++ b/content/public/android/java/src/org/chromium/content/browser/input/MonthPicker.java
|
| @@ -9,7 +9,6 @@ import android.content.res.Configuration;
|
| import android.text.format.DateUtils;
|
| import android.view.LayoutInflater;
|
| import android.view.accessibility.AccessibilityEvent;
|
| -import android.widget.DatePicker;
|
| import android.widget.FrameLayout;
|
| import android.widget.NumberPicker;
|
| import android.widget.NumberPicker.OnValueChangeListener;
|
| @@ -22,23 +21,21 @@ import java.util.TimeZone;
|
|
|
| import org.chromium.content.R;
|
|
|
| -// This class is heavily based on android.widget.DatePicker.
|
| public class MonthPicker extends FrameLayout {
|
| -
|
| private static final int MONTHS_NUMBER = 12;
|
|
|
| - private static final int DEFAULT_START_YEAR = 1900;
|
| -
|
| - private static final int DEFAULT_END_YEAR = 2100;
|
| -
|
| private final NumberPicker mMonthSpinner;
|
|
|
| private final NumberPicker mYearSpinner;
|
|
|
| +
|
| private OnMonthChangedListener mMonthChangedListener;
|
|
|
| private String[] mShortMonths;
|
|
|
| + // It'd be nice to use android.text.Time like in other Dialogs but
|
| + // it suffers from the 2038 effect so it would prevent us from
|
| + // having dates over 2038.
|
| private Calendar mMinDate;
|
|
|
| private Calendar mMaxDate;
|
| @@ -61,16 +58,12 @@ public class MonthPicker extends FrameLayout {
|
| void onMonthChanged(MonthPicker view, int year, int month);
|
| }
|
|
|
| - public MonthPicker(Context context) {
|
| + public MonthPicker(Context context, long minMonth, long maxMonth) {
|
| super(context, null, android.R.attr.datePickerStyle);
|
| - Calendar minCal = Calendar.getInstance();
|
| - minCal.clear();
|
| - minCal.set(DEFAULT_START_YEAR, 0, 1);
|
| - mMinDate = minCal;
|
| - Calendar maxCal = Calendar.getInstance();
|
| - maxCal.clear();
|
| - maxCal.set(DEFAULT_END_YEAR, 0, 1);
|
| - mMaxDate = maxCal;
|
| +
|
| + // initialization based on locale
|
| + mShortMonths =
|
| + DateFormatSymbols.getInstance(Locale.getDefault()).getShortMonths();
|
|
|
| LayoutInflater inflater = (LayoutInflater) context
|
| .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
|
| @@ -82,12 +75,12 @@ public class MonthPicker extends FrameLayout {
|
| int month = mCurrentDate.get(Calendar.MONTH);
|
| int year = mCurrentDate.get(Calendar.YEAR);
|
|
|
| - // take care of wrapping months to update greater fields
|
| + // take care of wrapping of days and months to update greater fields
|
| if (picker == mMonthSpinner) {
|
| month = newVal;
|
| if (oldVal == (MONTHS_NUMBER - 1) && newVal == 0) {
|
| year += 1;
|
| - } else if (oldVal == 0 && newVal == (MONTHS_NUMBER - 1)) {
|
| + } else if (oldVal == 0 && newVal == 11) {
|
| year -=1;
|
| }
|
| } else if (picker == mYearSpinner) {
|
| @@ -103,9 +96,6 @@ public class MonthPicker extends FrameLayout {
|
| }
|
| };
|
|
|
| - mShortMonths =
|
| - DateFormatSymbols.getInstance(Locale.getDefault()).getShortMonths();
|
| -
|
| // month
|
| mMonthSpinner = (NumberPicker) findViewById(R.id.month);
|
| mMonthSpinner.setMinValue(0);
|
| @@ -119,12 +109,36 @@ public class MonthPicker extends FrameLayout {
|
| mYearSpinner.setOnLongPressUpdateInterval(100);
|
| mYearSpinner.setOnValueChangedListener(onChangeListener);
|
|
|
| + mMinDate = monthsToCalendar(minMonth);
|
| + mMaxDate = monthsToCalendar(maxMonth);
|
| +
|
| // initialize to current date
|
| - mCurrentDate = Calendar.getInstance();
|
| - init(mCurrentDate.get(Calendar.YEAR), mCurrentDate.get(Calendar.MONTH), null);
|
| + Calendar cal = Calendar.getInstance();
|
| + init(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), null);
|
| }
|
|
|
| + private void setCurrentDate(int year, int month) {
|
| + if (mCurrentDate == null) {
|
| + mCurrentDate = Calendar.getInstance();
|
| + }
|
| + mCurrentDate.clear();
|
| + mCurrentDate.set(year, month, 1);
|
| + if (mCurrentDate.getTimeInMillis() < mMinDate.getTimeInMillis()) {
|
| + mCurrentDate = (Calendar) mMinDate.clone();
|
| + } else if (mCurrentDate.getTimeInMillis() > mMaxDate.getTimeInMillis()) {
|
| + mCurrentDate = (Calendar) mMaxDate.clone();
|
| + }
|
| + updateSpinners();
|
| + }
|
|
|
| + private static Calendar monthsToCalendar(long months) {
|
| + int year = (int)Math.min(months / 12 + 1970, Integer.MAX_VALUE);
|
| + int month = (int) (months % 12);
|
| + Calendar cal = Calendar.getInstance();
|
| + cal.clear();
|
| + cal.set(year, month, 1);
|
| + return cal;
|
| + }
|
|
|
| @Override
|
| public boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event) {
|
| @@ -162,20 +176,9 @@ public class MonthPicker extends FrameLayout {
|
| mMonthChangedListener = onMonthChangedListener;
|
| }
|
|
|
| - private void setCurrentDate(int year, int month) {
|
| - if (mCurrentDate == null) {
|
| - mCurrentDate = Calendar.getInstance();
|
| - }
|
| - mCurrentDate.clear();
|
| - if (mCurrentDate.getTimeInMillis() < mMinDate.getTimeInMillis()) {
|
| - mCurrentDate.set(mMinDate.get(Calendar.YEAR), mMinDate.get(Calendar.MONTH),
|
| - mMinDate.get(Calendar.DAY_OF_MONTH));
|
| - } else if (mCurrentDate.getTimeInMillis() > mMaxDate.getTimeInMillis()) {
|
| - mCurrentDate.set(mMaxDate.get(Calendar.YEAR), mMaxDate.get(Calendar.MONTH),
|
| - mMaxDate.get(Calendar.DAY_OF_MONTH));
|
| - } else {
|
| - mCurrentDate.set(year, month, 1);
|
| - }
|
| + private boolean isNewDate(int year, int month) {
|
| + return (mCurrentDate.get(Calendar.YEAR) != year
|
| + || mCurrentDate.get(Calendar.MONTH) != month);
|
| }
|
|
|
| private void updateSpinners() {
|
|
|