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.
4
5package org.chromium.ui.picker;
6
7import android.widget.DatePicker;
8import android.widget.DatePicker.OnDateChangedListener;
9
10import java.util.Calendar;
11import java.util.TimeZone;
12
13/**
14 * Normalize a date dialog so that it respect min and max.
15 */
16public class DateDialogNormalizer {
17
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) {
23            return;
24        }
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());
38
39        // Restore the current date, this will keep the min/max settings
40        // previously set into account.
41        picker.updateDate(currentYear, currentMonth, currentDayOfMonth);
42    }
43
44    private static Calendar trimToDate(long time) {
45        Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
46        cal.clear();
47        cal.setTimeInMillis(time);
48        Calendar result = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
49        result.clear();
50        result.set(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), cal.get(Calendar.DAY_OF_MONTH),
51                0, 0, 0);
52        return result;
53    }
54
55    /**
56     * Normalizes an existing DateDialogPicker changing the default date if
57     * needed to comply with the {@code min} and {@code max} attributes.
58     */
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"));
62        calendar.clear();
63        calendar.set(year, month, day, hour, minute, 0);
64        if (calendar.getTimeInMillis() < minMillis) {
65            calendar.clear();
66            calendar.setTimeInMillis(minMillis);
67        } else if (calendar.getTimeInMillis() > maxMillis) {
68            calendar.clear();
69            calendar.setTimeInMillis(maxMillis);
70        }
71        picker.init(
72                calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH),
73                calendar.get(Calendar.DAY_OF_MONTH), listener);
74
75        setLimits(picker, minMillis, maxMillis);
76    }
77}
78