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 | |
5 | package org.chromium.content.browser.input; |
6 | |
7 | import android.widget.DatePicker; |
8 | import android.widget.DatePicker.OnDateChangedListener; |
9 | |
10 | import java.util.Calendar; |
11 | import java.util.TimeZone; |
12 | |
13 | /** |
14 | * Normalize a date dialog so that it respect min and max. |
15 | */ |
16 | class DateDialogNormalizer { |
17 | |
18 | private static void setLimits(DatePicker picker, long min, long max) { |
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 (max <= min) { |
23 | return; |
24 | } |
25 | Calendar minCal = trimToDate(min); |
26 | Calendar maxCal = trimToDate(max); |
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 | static void normalize(DatePicker picker, OnDateChangedListener listener, |
60 | int year, int month, int day, int hour, int minute, long min, long max) { |
61 | Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT")); |
62 | calendar.clear(); |
63 | calendar.set(year, month, day, hour, minute, 0); |
64 | if (calendar.getTimeInMillis() < min) { |
65 | calendar.clear(); |
66 | calendar.setTimeInMillis(min); |
67 | } else if (calendar.getTimeInMillis() > max) { |
68 | calendar.clear(); |
69 | calendar.setTimeInMillis(max); |
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, min, max); |
76 | } |
77 | } |