• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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.TimePickerDialog;
20 import android.app.timedetector.ManualTimeSuggestion;
21 import android.app.timedetector.TimeDetector;
22 import android.content.Context;
23 import android.text.TextUtils;
24 import android.text.format.DateFormat;
25 import android.util.Log;
26 import android.widget.TimePicker;
27 
28 import androidx.preference.Preference;
29 
30 import com.android.settings.core.PreferenceControllerMixin;
31 import com.android.settingslib.RestrictedPreference;
32 import com.android.settingslib.core.AbstractPreferenceController;
33 
34 import java.util.Calendar;
35 
36 public class TimePreferenceController extends AbstractPreferenceController
37         implements PreferenceControllerMixin, TimePickerDialog.OnTimeSetListener {
38 
39     public interface TimePreferenceHost extends UpdateTimeAndDateCallback {
showTimePicker()40         void showTimePicker();
41     }
42 
43     public static final int DIALOG_TIMEPICKER = 1;
44 
45     private static final String TAG = "TimePreferenceController";
46     private static final String KEY_TIME = "time";
47 
48     private final DatePreferenceController mDatePreferenceController;
49     private final TimePreferenceHost mHost;
50 
51 
TimePreferenceController(Context context, TimePreferenceHost callback, DatePreferenceController datePreferenceController)52     public TimePreferenceController(Context context,
53             TimePreferenceHost callback,
54             DatePreferenceController datePreferenceController) {
55         super(context);
56         mHost = callback;
57         mDatePreferenceController = datePreferenceController;
58     }
59 
60     @Override
isAvailable()61     public boolean isAvailable() {
62         return true;
63     }
64 
65     @Override
updateState(Preference preference)66     public void updateState(Preference preference) {
67         if (!(preference instanceof RestrictedPreference)) {
68             return;
69         }
70         final Calendar now = Calendar.getInstance();
71         preference.setSummary(DateFormat.getTimeFormat(mContext).format(now.getTime()));
72         if (!((RestrictedPreference) preference).isDisabledByAdmin()) {
73             boolean enableManualTimeSelection = mDatePreferenceController.isEnabled();
74             preference.setEnabled(enableManualTimeSelection);
75         }
76     }
77 
78     @Override
handlePreferenceTreeClick(Preference preference)79     public boolean handlePreferenceTreeClick(Preference preference) {
80         if (!TextUtils.equals(KEY_TIME, preference.getKey())) {
81             return false;
82         }
83         mHost.showTimePicker();
84         return true;
85     }
86 
87     @Override
getPreferenceKey()88     public String getPreferenceKey() {
89         return KEY_TIME;
90     }
91 
92     @Override
onTimeSet(TimePicker view, int hourOfDay, int minute)93     public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
94         if (mContext != null) {
95             setTime(hourOfDay, minute);
96             mHost.updateTimeAndDateDisplay(mContext);
97         }
98         // We don't need to call timeUpdated() here because the TIME_CHANGED
99         // broadcast is sent by the AlarmManager as a side effect of setting the
100         // SystemClock time.
101     }
102 
103     /**
104      * Builds a {@link TimePickerDialog} that can be used to request the current time from the user.
105      */
buildTimePicker(Context parentContext)106     public TimePickerDialog buildTimePicker(Context parentContext) {
107         final Calendar calendar = Calendar.getInstance();
108         return new TimePickerDialog(
109                 parentContext,
110                 this,
111                 calendar.get(Calendar.HOUR_OF_DAY),
112                 calendar.get(Calendar.MINUTE),
113                 DateFormat.is24HourFormat(parentContext));
114     }
115 
setTime(int hourOfDay, int minute)116     void setTime(int hourOfDay, int minute) {
117         Calendar c = Calendar.getInstance();
118 
119         c.set(Calendar.HOUR_OF_DAY, hourOfDay);
120         c.set(Calendar.MINUTE, minute);
121         c.set(Calendar.SECOND, 0);
122         c.set(Calendar.MILLISECOND, 0);
123         long when = c.getTimeInMillis();
124 
125         TimeDetector timeDetector = mContext.getSystemService(TimeDetector.class);
126         ManualTimeSuggestion manualTimeSuggestion =
127                 TimeDetector.createManualTimeSuggestion(when, "Settings: Set time");
128         boolean success = timeDetector.suggestManualTime(manualTimeSuggestion);
129         if (!success) {
130             // This implies the system server is applying tighter bounds than the settings app or
131             // the date/time cannot be set for other reasons, e.g. perhaps "auto time" is turned on.
132             Log.w(TAG, "Unable to set time with suggestion=" + manualTimeSuggestion);
133         }
134     }
135 }
136