summaryrefslogtreecommitdiffstats
path: root/content/public/android
diff options
context:
space:
mode:
authormiguelg@chromium.org <miguelg@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-07-17 21:50:23 +0000
committermiguelg@chromium.org <miguelg@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-07-17 21:50:23 +0000
commita9022d2777da2e87ba4b2caad3d42778280bf31e (patch)
treecae719de181110fcb1fd6f665e80ba4b074c59eb /content/public/android
parent0b209be864a525edb87fe6e83095bb38799b20ac (diff)
downloadchromium_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')
-rw-r--r--content/public/android/java/src/org/chromium/content/browser/input/DateDialogNormalizer.java55
-rw-r--r--content/public/android/java/src/org/chromium/content/browser/input/InputDialogContainer.java4
-rw-r--r--content/public/android/java/src/org/chromium/content/browser/input/TimeDialog.java54
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;
+ }
}