NightDisplaySettings.java revision d60f09edafea67616d574d4421da220b1615e194
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 17package com.android.settings.display; 18 19import android.app.Dialog; 20import android.app.TimePickerDialog; 21import android.content.Context; 22import android.os.Bundle; 23import android.support.v7.preference.DropDownPreference; 24import android.support.v7.preference.Preference; 25import android.widget.Switch; 26import android.widget.TimePicker; 27 28import com.android.internal.app.NightDisplayController; 29import com.android.internal.logging.MetricsProto.MetricsEvent; 30import com.android.settings.R; 31import com.android.settings.SettingsActivity; 32import com.android.settings.SettingsPreferenceFragment; 33import com.android.settings.widget.SwitchBar; 34 35import java.text.DateFormat; 36import java.util.Calendar; 37import java.util.TimeZone; 38 39/** 40 * Settings screen for Night display. 41 */ 42public class NightDisplaySettings extends SettingsPreferenceFragment implements 43 NightDisplayController.Callback, 44 Preference.OnPreferenceChangeListener, 45 SwitchBar.OnSwitchChangeListener { 46 47 private static final String KEY_NIGHT_DISPLAY_AUTO_MODE = "night_display_auto_mode"; 48 private static final String KEY_NIGHT_DISPLAY_START_TIME = "night_display_start_time"; 49 private static final String KEY_NIGHT_DISPLAY_END_TIME = "night_display_end_time"; 50 51 private static final int DIALOG_START_TIME = 0; 52 private static final int DIALOG_END_TIME = 1; 53 54 private NightDisplayController mController; 55 private DateFormat mTimeFormatter; 56 57 private DropDownPreference mAutoModePreference; 58 private Preference mStartTimePreference; 59 private Preference mEndTimePreference; 60 61 private SwitchBar mSwitchBar; 62 63 @Override 64 public void onCreate(Bundle savedInstanceState) { 65 super.onCreate(savedInstanceState); 66 67 final Context context = getContext(); 68 mController = new NightDisplayController(context); 69 70 mTimeFormatter = android.text.format.DateFormat.getTimeFormat(context); 71 mTimeFormatter.setTimeZone(TimeZone.getTimeZone("UTC")); 72 } 73 74 @Override 75 public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { 76 super.onCreatePreferences(savedInstanceState, rootKey); 77 78 // Load the preferences from xml. 79 addPreferencesFromResource(R.xml.night_display_settings); 80 81 mAutoModePreference = (DropDownPreference) findPreference(KEY_NIGHT_DISPLAY_AUTO_MODE); 82 mStartTimePreference = findPreference(KEY_NIGHT_DISPLAY_START_TIME); 83 mEndTimePreference = findPreference(KEY_NIGHT_DISPLAY_END_TIME); 84 85 mAutoModePreference.setEntries(new CharSequence[] { 86 getString(R.string.night_display_auto_mode_never), 87 getString(R.string.night_display_auto_mode_custom), 88 getString(R.string.night_display_auto_mode_twilight) 89 }); 90 mAutoModePreference.setEntryValues(new CharSequence[] { 91 String.valueOf(NightDisplayController.AUTO_MODE_DISABLED), 92 String.valueOf(NightDisplayController.AUTO_MODE_CUSTOM), 93 String.valueOf(NightDisplayController.AUTO_MODE_TWILIGHT) 94 }); 95 mAutoModePreference.setOnPreferenceChangeListener(this); 96 } 97 98 @Override 99 public void onActivityCreated(Bundle savedInstanceState) { 100 super.onActivityCreated(savedInstanceState); 101 102 mSwitchBar = ((SettingsActivity) getActivity()).getSwitchBar(); 103 mSwitchBar.addOnSwitchChangeListener(this); 104 mSwitchBar.show(); 105 } 106 107 @Override 108 public void onStart() { 109 super.onStart(); 110 111 // Listen for changes only while visible. 112 mController.setListener(this); 113 114 // Update the current state since it have changed while not visible. 115 onActivated(mController.isActivated()); 116 onAutoModeChanged(mController.getAutoMode()); 117 onCustomStartTimeChanged(mController.getCustomStartTime()); 118 onCustomEndTimeChanged(mController.getCustomEndTime()); 119 } 120 121 @Override 122 public void onStop() { 123 super.onStop(); 124 125 // Stop listening for state changes. 126 mController.setListener(null); 127 } 128 129 @Override 130 public boolean onPreferenceTreeClick(Preference preference) { 131 if (preference == mStartTimePreference) { 132 showDialog(DIALOG_START_TIME); 133 return true; 134 } else if (preference == mEndTimePreference) { 135 showDialog(DIALOG_END_TIME); 136 return true; 137 } 138 return super.onPreferenceTreeClick(preference); 139 } 140 141 @Override 142 public Dialog onCreateDialog(final int dialogId) { 143 if (dialogId == DIALOG_START_TIME || dialogId == DIALOG_END_TIME) { 144 final NightDisplayController.LocalTime initialTime; 145 if (dialogId == DIALOG_START_TIME) { 146 initialTime = mController.getCustomStartTime(); 147 } else { 148 initialTime = mController.getCustomEndTime(); 149 } 150 151 final Context context = getContext(); 152 final boolean use24HourFormat = android.text.format.DateFormat.is24HourFormat(context); 153 return new TimePickerDialog(context, new TimePickerDialog.OnTimeSetListener() { 154 @Override 155 public void onTimeSet(TimePicker view, int hourOfDay, int minute) { 156 final NightDisplayController.LocalTime time = 157 new NightDisplayController.LocalTime(hourOfDay, minute); 158 if (dialogId == DIALOG_START_TIME) { 159 mController.setCustomStartTime(time); 160 } else { 161 mController.setCustomEndTime(time); 162 } 163 } 164 }, initialTime.hourOfDay, initialTime.minute, use24HourFormat); 165 } 166 return super.onCreateDialog(dialogId); 167 } 168 169 @Override 170 public void onActivated(boolean activated) { 171 mSwitchBar.setChecked(activated); 172 } 173 174 @Override 175 public void onAutoModeChanged(int autoMode) { 176 mAutoModePreference.setValue(String.valueOf(autoMode)); 177 178 final boolean showCustomSchedule = autoMode == NightDisplayController.AUTO_MODE_CUSTOM; 179 mStartTimePreference.setVisible(showCustomSchedule); 180 mEndTimePreference.setVisible(showCustomSchedule); 181 } 182 183 private String getFormattedTimeString(NightDisplayController.LocalTime localTime) { 184 final Calendar c = Calendar.getInstance(); 185 c.setTimeZone(mTimeFormatter.getTimeZone()); 186 c.set(Calendar.HOUR_OF_DAY, localTime.hourOfDay); 187 c.set(Calendar.MINUTE, localTime.minute); 188 c.set(Calendar.SECOND, 0); 189 c.set(Calendar.MILLISECOND, 0); 190 return mTimeFormatter.format(c.getTime()); 191 } 192 193 @Override 194 public void onCustomStartTimeChanged(NightDisplayController.LocalTime startTime) { 195 mStartTimePreference.setSummary(getFormattedTimeString(startTime)); 196 } 197 198 @Override 199 public void onCustomEndTimeChanged(NightDisplayController.LocalTime endTime) { 200 mEndTimePreference.setSummary(getFormattedTimeString(endTime)); 201 } 202 203 @Override 204 public void onSwitchChanged(Switch switchView, boolean isChecked) { 205 // Attempt to update the NIGHT_DISPLAY_ACTIVATED setting if necessary. 206 final boolean isActivated = mController.isActivated(); 207 if (isActivated != isChecked) { 208 if (mController.setActivated(isChecked)) { 209 switchView.setChecked(isActivated); 210 } 211 } 212 } 213 214 @Override 215 public boolean onPreferenceChange(Preference preference, Object newValue) { 216 if (preference == mAutoModePreference) { 217 return mController.setAutoMode(Integer.parseInt((String) newValue)); 218 } 219 return false; 220 } 221 222 @Override 223 protected int getMetricsCategory() { 224 return MetricsEvent.NIGHT_DISPLAY_SETTINGS; 225 } 226} 227