diff options
author | miguelg@chromium.org <miguelg@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-07-17 21:50:23 +0000 |
---|---|---|
committer | miguelg@chromium.org <miguelg@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-07-17 21:50:23 +0000 |
commit | a9022d2777da2e87ba4b2caad3d42778280bf31e (patch) | |
tree | cae719de181110fcb1fd6f665e80ba4b074c59eb /content/public/android | |
parent | 0b209be864a525edb87fe6e83095bb38799b20ac (diff) | |
download | chromium_src-a9022d2777da2e87ba4b2caad3d42778280bf31e.zip chromium_src-a9022d2777da2e87ba4b2caad3d42778280bf31e.tar.gz chromium_src-a9022d2777da2e87ba4b2caad3d42778280bf31e.tar.bz2 |
- Use GMT calendars to avoid daylight savings in Jan 1970 which affects the calculation of time only fields
- Work around an android issue where min and max attributes are not inclusive
- Use Calendar.HOUR_OF_DAY instead of Calendar.HOUR to persist 24h information
- Bail out early if min >= max instead of crashing
BUG=256201,260238,256159,247020
Review URL: https://chromiumcodereview.appspot.com/19561002
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@212136 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'content/public/android')
3 files changed, 56 insertions, 57 deletions
diff --git a/content/public/android/java/src/org/chromium/content/browser/input/DateDialogNormalizer.java b/content/public/android/java/src/org/chromium/content/browser/input/DateDialogNormalizer.java index 35592b6..1dbc6c7 100644 --- a/content/public/android/java/src/org/chromium/content/browser/input/DateDialogNormalizer.java +++ b/content/public/android/java/src/org/chromium/content/browser/input/DateDialogNormalizer.java @@ -8,43 +8,48 @@ import android.widget.DatePicker; import android.widget.DatePicker.OnDateChangedListener; import java.util.Calendar; +import java.util.TimeZone; /** * Normalize a date dialog so that it respect min and max. */ class DateDialogNormalizer { - private static final long ONE_DAY_MILLIS = 24 * 60 * 60 * 1000; - private static void setLimits(DatePicker picker, long min, long max) { - // DatePicker intervals are non inclusive. - long minTime = min > 0 ? min - 1 : 0; - long maxTime = (max - ONE_DAY_MILLIS) >= (Long.MAX_VALUE - ONE_DAY_MILLIS) ? - Long.MAX_VALUE : max + ONE_DAY_MILLIS; + private static void setLimits(DatePicker picker, long min, long max) { + // DatePicker intervals are non inclusive, the DatePicker will throw an + // exception when setting the min/max attribute to the current date + // so make sure this never happens + if (max <= min) { + return; + } + Calendar minCal = trimToDate(min); + Calendar maxCal = trimToDate(max); + int currentYear = picker.getYear(); + int currentMonth = picker.getMonth(); + int currentDayOfMonth = picker.getDayOfMonth(); + picker.updateDate(maxCal.get(Calendar.YEAR), + maxCal.get(Calendar.MONTH), + maxCal.get(Calendar.DAY_OF_MONTH)); + picker.setMinDate(minCal.getTimeInMillis()); + picker.updateDate(minCal.get(Calendar.YEAR), + minCal.get(Calendar.MONTH), + minCal.get(Calendar.DAY_OF_MONTH)); + picker.setMaxDate(maxCal.getTimeInMillis()); - // While the widget is only able to display date, min/max can also contain time - // information. - // Trim min/max to date before adjusting the picker. - Calendar cal = Calendar.getInstance(); - cal.clear(); - cal.setTimeInMillis(max); - - picker.setMaxDate(trimToDate(maxTime)); - picker.setMinDate(trimToDate(minTime)); - } + // Restore the current date, this will keep the min/max settings + // previously set into account. + picker.updateDate(currentYear, currentMonth, currentDayOfMonth); + } - /** - * Resets the hour, minute, second piece of a time stamp to 0, maintaining the remaining - * components (year, month, day). - */ - private static long trimToDate(long time) { - Calendar cal = Calendar.getInstance(); + private static Calendar trimToDate(long time) { + Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("GMT")); cal.clear(); cal.setTimeInMillis(time); - Calendar result = Calendar.getInstance(); + Calendar result = Calendar.getInstance(TimeZone.getTimeZone("GMT")); result.clear(); result.set(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), cal.get(Calendar.DAY_OF_MONTH), 0, 0, 0); - return result.getTimeInMillis(); + return result; } /** @@ -53,7 +58,7 @@ class DateDialogNormalizer { */ static void normalize(DatePicker picker, OnDateChangedListener listener, int year, int month, int day, int hour, int minute, long min, long max) { - Calendar calendar = Calendar.getInstance(); + Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT")); calendar.clear(); calendar.set(year, month, day, hour, minute, 0); if (calendar.getTimeInMillis() < min) { diff --git a/content/public/android/java/src/org/chromium/content/browser/input/InputDialogContainer.java b/content/public/android/java/src/org/chromium/content/browser/input/InputDialogContainer.java index f2f9b66..07dd7e0 100644 --- a/content/public/android/java/src/org/chromium/content/browser/input/InputDialogContainer.java +++ b/content/public/android/java/src/org/chromium/content/browser/input/InputDialogContainer.java @@ -99,7 +99,7 @@ public class InputDialogContainer { minute == 0 && second == 0) { Calendar cal = Calendar.getInstance(); result.set(cal.get(Calendar.SECOND), cal.get(Calendar.MINUTE), - cal.get(Calendar.HOUR), cal.get(Calendar.DATE), + cal.get(Calendar.HOUR_OF_DAY), cal.get(Calendar.DATE), cal.get(Calendar.MONTH), cal.get(Calendar.YEAR)); } else { result.set(second, minute, hour, monthDay, month, year); @@ -130,7 +130,7 @@ public class InputDialogContainer { mDialog = dialog; } else if (dialogType == sTextInputTypeTime) { mDialog = TimeDialog.create(mContext, new TimeListener(dialogType), - 1970, 0, 1, time.hour, time.minute, DateFormat.is24HourFormat(mContext), + time.hour, time.minute, DateFormat.is24HourFormat(mContext), minTime, maxTime); } else if (dialogType == sTextInputTypeDateTime || dialogType == sTextInputTypeDateTimeLocal) { diff --git a/content/public/android/java/src/org/chromium/content/browser/input/TimeDialog.java b/content/public/android/java/src/org/chromium/content/browser/input/TimeDialog.java index 2a6015e..c417102 100644 --- a/content/public/android/java/src/org/chromium/content/browser/input/TimeDialog.java +++ b/content/public/android/java/src/org/chromium/content/browser/input/TimeDialog.java @@ -17,55 +17,49 @@ public class TimeDialog extends TimePickerDialog { private Time mMinTime; private Time mMaxTime; - private int mYear; - private int mMonth; - private int mDay; - public static TimeDialog create(Context context, OnTimeSetListener callBack, - int year, int month, int day, int hour, - int minute, boolean is24HourView, long min, long max) { - Time time = getBoundedTime(year, month, day, hour, minute, min, max); - return new TimeDialog(context, callBack, year, month, day, time.hour, time.minute, + int hour, int minute, boolean is24HourView, long min, long max) { + Time time = getBoundedTime(hour, minute, min, max); + return new TimeDialog(context, callBack, time.hour, time.minute, is24HourView, min, max); } private TimeDialog( - Context context, OnTimeSetListener callBack, int year, int month, int day, + Context context, OnTimeSetListener callBack, int hourOfDay, int minute, boolean is24HourView, long min, long max) { super(context, callBack, hourOfDay, minute, is24HourView); - mYear = year; - mMonth = month; - mDay = day; - Time time = new Time(); - time.set(min); - mMinTime = new Time(time); - time.set(max); - mMaxTime = new Time(time); + mMinTime = getTimeForMillis(min); + mMaxTime = getTimeForMillis(max); } - public void updateBaseDate(int year, int month, int day) { - mYear = year; - mMonth = month; - mDay = day; - } - @Override public void onTimeChanged(TimePicker view, int hourOfDay, int minute) { - Time time = getBoundedTime(mYear, mMonth, mDay, hourOfDay, minute, + Time time = getBoundedTime(hourOfDay, minute, mMinTime.toMillis(true), mMaxTime.toMillis(true)); super.onTimeChanged(view, time.hour, time.minute); updateTime(time.hour, time.minute); } - private static Time getBoundedTime(int year, int month, int day, int hour, - int minute, long min, long max) { - Time time = new Time(); - time.set(0, minute, hour, day, month, year); + private static Time getBoundedTime(int hour, int minute, + long min, long max) { + Time time = getTimeForHourAndMinute(hour, minute); if (time.toMillis(true) < min) { - time.set(min); + return getTimeForMillis(min); } else if (time.toMillis(true) > max) { - time.set(max); + return getTimeForMillis(max); } return time; } + + private static Time getTimeForMillis(long millis) { + Time time = new Time("GMT"); + time.set(millis); + return time; + } + + private static Time getTimeForHourAndMinute(int hour, int minute) { + Time time = new Time("GMT"); + time.set(0, minute, hour, 1, 0, 1970); + return time; + } } |