Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1292)

Unified Diff: content/public/android/java/src/org/chromium/content/browser/input/MonthPicker.java

Issue 15533003: [Android] Implement min/max on all supported date types (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 7 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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() {

Powered by Google App Engine
This is Rietveld 408576698