Home | History | Annotate | Download | only in datetime
      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.PreferenceControllerMixin;
     30 import com.android.settingslib.RestrictedPreference;
     31 import com.android.settingslib.core.AbstractPreferenceController;
     32 
     33 import java.util.Calendar;
     34 
     35 public class DatePreferenceController extends AbstractPreferenceController
     36         implements PreferenceControllerMixin, DatePickerDialog.OnDateSetListener {
     37 
     38     public interface DatePreferenceHost extends UpdateTimeAndDateCallback {
     39         void showDatePicker();
     40     }
     41 
     42     public static final int DIALOG_DATEPICKER = 0;
     43 
     44     private static final String KEY_DATE = "date";
     45 
     46     private final DatePreferenceHost mHost;
     47     private final AutoTimePreferenceController mAutoTimePreferenceController;
     48 
     49     public DatePreferenceController(Context context, DatePreferenceHost host,
     50             AutoTimePreferenceController autoTimePreferenceController) {
     51         super(context);
     52         mHost = host;
     53         mAutoTimePreferenceController = autoTimePreferenceController;
     54     }
     55 
     56     @Override
     57     public boolean isAvailable() {
     58         return true;
     59     }
     60 
     61     @Override
     62     public void updateState(Preference preference) {
     63         if (!(preference instanceof RestrictedPreference)) {
     64             return;
     65         }
     66         final Calendar now = Calendar.getInstance();
     67         preference.setSummary(DateFormat.getLongDateFormat(mContext).format(now.getTime()));
     68         if (!((RestrictedPreference) preference).isDisabledByAdmin()) {
     69             preference.setEnabled(!mAutoTimePreferenceController.isEnabled());
     70         }
     71     }
     72 
     73     @Override
     74     public boolean handlePreferenceTreeClick(Preference preference) {
     75         if (!TextUtils.equals(preference.getKey(), KEY_DATE)) {
     76             return false;
     77         }
     78         mHost.showDatePicker();
     79         return true;
     80     }
     81 
     82     @Override
     83     public String getPreferenceKey() {
     84         return KEY_DATE;
     85     }
     86 
     87     @Override
     88     public void onDateSet(DatePicker view, int year, int month, int day) {
     89         setDate(year, month, day);
     90         mHost.updateTimeAndDateDisplay(mContext);
     91     }
     92 
     93     public DatePickerDialog buildDatePicker(Activity activity) {
     94         final Calendar calendar = Calendar.getInstance();
     95         final DatePickerDialog d = new DatePickerDialog(
     96                 activity,
     97                 this,
     98                 calendar.get(Calendar.YEAR),
     99                 calendar.get(Calendar.MONTH),
    100                 calendar.get(Calendar.DAY_OF_MONTH));
    101         // The system clock can't represent dates outside this range.
    102         calendar.clear();
    103         calendar.set(2007, Calendar.JANUARY, 1);
    104         d.getDatePicker().setMinDate(calendar.getTimeInMillis());
    105         calendar.clear();
    106         calendar.set(2037, Calendar.DECEMBER, 31);
    107         d.getDatePicker().setMaxDate(calendar.getTimeInMillis());
    108         return d;
    109     }
    110 
    111     @VisibleForTesting
    112     void setDate(int year, int month, int day) {
    113         Calendar c = Calendar.getInstance();
    114 
    115         c.set(Calendar.YEAR, year);
    116         c.set(Calendar.MONTH, month);
    117         c.set(Calendar.DAY_OF_MONTH, day);
    118         long when = Math.max(c.getTimeInMillis(), DatePreferenceHost.MIN_DATE);
    119 
    120         if (when / 1000 < Integer.MAX_VALUE) {
    121             ((AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE)).setTime(when);
    122         }
    123     }
    124 }
    125