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