1 /*
2  * Copyright (C) 2016 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.settings.datetime;
18 
19 import android.app.Activity;
20 import android.app.AlarmManager;
21 import android.app.DatePickerDialog;
22 import android.content.Context;
23 import android.support.annotation.VisibleForTesting;
24 import android.support.v7.preference.Preference;
25 import android.text.TextUtils;
26 import android.text.format.DateFormat;
27 import android.widget.DatePicker;
28 
29 import com.android.settings.core.PreferenceController;
30 
31 import java.util.Calendar;
32 
33 public class DatePreferenceController extends PreferenceController implements
34         DatePickerDialog.OnDateSetListener {
35 
36     public interface DatePreferenceHost extends UpdateTimeAndDateCallback {
showDatePicker()37         void showDatePicker();
38     }
39 
40     public static final int DIALOG_DATEPICKER = 0;
41 
42     private static final String KEY_DATE = "date";
43 
44     private final DatePreferenceHost mHost;
45     private final AutoTimePreferenceController mAutoTimePreferenceController;
46 
DatePreferenceController(Context context, DatePreferenceHost host, AutoTimePreferenceController autoTimePreferenceController)47     public DatePreferenceController(Context context, DatePreferenceHost host,
48             AutoTimePreferenceController autoTimePreferenceController) {
49         super(context);
50         mHost = host;
51         mAutoTimePreferenceController = autoTimePreferenceController;
52     }
53 
54     @Override
isAvailable()55     public boolean isAvailable() {
56         return true;
57     }
58 
59     @Override
updateState(Preference preference)60     public void updateState(Preference preference) {
61         final Calendar now = Calendar.getInstance();
62         preference.setSummary(DateFormat.getLongDateFormat(mContext).format(now.getTime()));
63         preference.setEnabled(!mAutoTimePreferenceController.isEnabled());
64     }
65 
66     @Override
handlePreferenceTreeClick(Preference preference)67     public boolean handlePreferenceTreeClick(Preference preference) {
68         if (!TextUtils.equals(preference.getKey(), KEY_DATE)) {
69             return false;
70         }
71         mHost.showDatePicker();
72         return true;
73     }
74 
75     @Override
getPreferenceKey()76     public String getPreferenceKey() {
77         return KEY_DATE;
78     }
79 
80     @Override
onDateSet(DatePicker view, int year, int month, int day)81     public void onDateSet(DatePicker view, int year, int month, int day) {
82         setDate(year, month, day);
83         mHost.updateTimeAndDateDisplay(mContext);
84     }
85 
buildDatePicker(Activity activity)86     public DatePickerDialog buildDatePicker(Activity activity) {
87         final Calendar calendar = Calendar.getInstance();
88         final DatePickerDialog d = new DatePickerDialog(
89                 activity,
90                 this,
91                 calendar.get(Calendar.YEAR),
92                 calendar.get(Calendar.MONTH),
93                 calendar.get(Calendar.DAY_OF_MONTH));
94         // The system clock can't represent dates outside this range.
95         calendar.clear();
96         calendar.set(2007, Calendar.JANUARY, 1);
97         d.getDatePicker().setMinDate(calendar.getTimeInMillis());
98         calendar.clear();
99         calendar.set(2037, Calendar.DECEMBER, 31);
100         d.getDatePicker().setMaxDate(calendar.getTimeInMillis());
101         return d;
102     }
103 
104     @VisibleForTesting
setDate(int year, int month, int day)105     void setDate(int year, int month, int day) {
106         Calendar c = Calendar.getInstance();
107 
108         c.set(Calendar.YEAR, year);
109         c.set(Calendar.MONTH, month);
110         c.set(Calendar.DAY_OF_MONTH, day);
111         long when = Math.max(c.getTimeInMillis(), DatePreferenceHost.MIN_DATE);
112 
113         if (when / 1000 < Integer.MAX_VALUE) {
114             ((AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE)).setTime(when);
115         }
116     }
117 }
118