1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 package org.chromium.ui.picker;
7 import android.widget.DatePicker;
8 import android.widget.DatePicker.OnDateChangedListener;
10 import java.util.Calendar;
11 import java.util.TimeZone;
14 * Normalize a date dialog so that it respect min and max.
16 public class DateDialogNormalizer {
18 private static void setLimits(DatePicker picker, long minMillis, long maxMillis) {
19 // DatePicker intervals are non inclusive, the DatePicker will throw an
20 // exception when setting the min/max attribute to the current date
21 // so make sure this never happens
22 if (maxMillis <= minMillis) {
25 Calendar minCal = trimToDate(minMillis);
26 Calendar maxCal = trimToDate(maxMillis);
27 int currentYear = picker.getYear();
28 int currentMonth = picker.getMonth();
29 int currentDayOfMonth = picker.getDayOfMonth();
30 picker.updateDate(maxCal.get(Calendar.YEAR),
31 maxCal.get(Calendar.MONTH),
32 maxCal.get(Calendar.DAY_OF_MONTH));
33 picker.setMinDate(minCal.getTimeInMillis());
34 picker.updateDate(minCal.get(Calendar.YEAR),
35 minCal.get(Calendar.MONTH),
36 minCal.get(Calendar.DAY_OF_MONTH));
37 picker.setMaxDate(maxCal.getTimeInMillis());
39 // Restore the current date, this will keep the min/max settings
40 // previously set into account.
41 picker.updateDate(currentYear, currentMonth, currentDayOfMonth);
44 private static Calendar trimToDate(long time) {
45 Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
47 cal.setTimeInMillis(time);
48 Calendar result = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
50 result.set(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), cal.get(Calendar.DAY_OF_MONTH),
56 * Normalizes an existing DateDialogPicker changing the default date if
57 * needed to comply with the {@code min} and {@code max} attributes.
59 public static void normalize(DatePicker picker, OnDateChangedListener listener,
60 int year, int month, int day, int hour, int minute, long minMillis, long maxMillis) {
61 Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
63 calendar.set(year, month, day, hour, minute, 0);
64 if (calendar.getTimeInMillis() < minMillis) {
66 calendar.setTimeInMillis(minMillis);
67 } else if (calendar.getTimeInMillis() > maxMillis) {
69 calendar.setTimeInMillis(maxMillis);
72 calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH),
73 calendar.get(Calendar.DAY_OF_MONTH), listener);
75 setLimits(picker, minMillis, maxMillis);