// 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.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 void setLimits(DatePicker picker, long minMillis, long maxMillis) {
// 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 (maxMillis <= minMillis) {
return;
}
Calendar minCal = trimToDate(minMillis);
Calendar maxCal = trimToDate(maxMillis);
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());
// Restore the current date, this will keep the min/max settings
// previously set into account.
picker.updateDate(currentYear, currentMonth, currentDayOfMonth);
}
private static Calendar trimToDate(long time) {
Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
cal.clear();
cal.setTimeInMillis(time);
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;
}
/**
* Normalizes an existing DateDialogPicker changing the default date if
* needed to comply with the {@code min} and {@code max} attributes.
*/
static void normalize(DatePicker picker, OnDateChangedListener listener,
int year, int month, int day, int hour, int minute, long minMillis, long maxMillis) {
Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
calendar.clear();
calendar.set(year, month, day, hour, minute, 0);
if (calendar.getTimeInMillis() < minMillis) {
calendar.clear();
calendar.setTimeInMillis(minMillis);
} else if (calendar.getTimeInMillis() > maxMillis) {
calendar.clear();
calendar.setTimeInMillis(maxMillis);
}
picker.init(
calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH),
calendar.get(Calendar.DAY_OF_MONTH), listener);
setLimits(picker, minMillis, maxMillis);
}
}