ZenModeSettings.java revision de99ccf18b6f8810f2743b5b9fef513304d0ed4f
172438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock/* 272438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock * Copyright (C) 2014 The Android Open Source Project 372438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock * 472438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock * Licensed under the Apache License, Version 2.0 (the "License"); 572438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock * you may not use this file except in compliance with the License. 672438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock * You may obtain a copy of the License at 772438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock * 872438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock * http://www.apache.org/licenses/LICENSE-2.0 972438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock * 1072438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock * Unless required by applicable law or agreed to in writing, software 1172438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock * distributed under the License is distributed on an "AS IS" BASIS, 1272438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1372438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock * See the License for the specific language governing permissions and 1472438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock * limitations under the License. 1572438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock */ 1672438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock 174a35051565b0ce6d29313c3e4ffe19e1dde78db0John Spurlockpackage com.android.settings.notification; 1872438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock 19623a0e9f45c294ea7e714295f41ba2d8bcd7b32eJohn Spurlockimport android.app.AlertDialog; 20cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlockimport android.app.Dialog; 21cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlockimport android.app.DialogFragment; 22cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlockimport android.app.FragmentManager; 23cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlockimport android.app.INotificationManager; 24cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlockimport android.app.TimePickerDialog; 2572438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlockimport android.content.Context; 26623a0e9f45c294ea7e714295f41ba2d8bcd7b32eJohn Spurlockimport android.content.DialogInterface; 2723e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlockimport android.content.DialogInterface.OnDismissListener; 28c9afadb04b00598f5988101681089290cf14f79cJohn Spurlockimport android.content.pm.PackageManager; 29019b87f17a51fef7fd4b6696dbea5c50fe8b6d07Fabrice Di Meglioimport android.content.res.Resources; 304a35051565b0ce6d29313c3e4ffe19e1dde78db0John Spurlockimport android.database.ContentObserver; 317f502bf824955b2b3a43f8f7f32c00cf00f736feJohn Spurlockimport android.net.Uri; 3272438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlockimport android.os.Bundle; 337f502bf824955b2b3a43f8f7f32c00cf00f736feJohn Spurlockimport android.os.Handler; 34cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlockimport android.os.ServiceManager; 35cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlockimport android.preference.Preference; 36cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlockimport android.preference.Preference.OnPreferenceChangeListener; 3723e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlockimport android.preference.Preference.OnPreferenceClickListener; 38cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlockimport android.preference.PreferenceCategory; 39cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlockimport android.preference.PreferenceScreen; 40cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlockimport android.preference.SwitchPreference; 417f502bf824955b2b3a43f8f7f32c00cf00f736feJohn Spurlockimport android.provider.Settings.Global; 4223e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlockimport android.service.notification.Condition; 43cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlockimport android.service.notification.ZenModeConfig; 44cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlockimport android.text.format.DateFormat; 4572438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlockimport android.util.Log; 46ac1c42f5dcf43b4b7092d4d6ca0c9dbd4f9fbfdeJohn Spurlockimport android.util.SparseArray; 47cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlockimport android.widget.TimePicker; 484a35051565b0ce6d29313c3e4ffe19e1dde78db0John Spurlock 494a35051565b0ce6d29313c3e4ffe19e1dde78db0John Spurlockimport com.android.settings.R; 504a35051565b0ce6d29313c3e4ffe19e1dde78db0John Spurlockimport com.android.settings.SettingsPreferenceFragment; 5157c713d1d92f64a558115e5aff212ebc54a19151John Spurlockimport com.android.settings.Utils; 52cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlockimport com.android.settings.search.BaseSearchIndexProvider; 53019b87f17a51fef7fd4b6696dbea5c50fe8b6d07Fabrice Di Meglioimport com.android.settings.search.Indexable; 54019b87f17a51fef7fd4b6696dbea5c50fe8b6d07Fabrice Di Meglioimport com.android.settings.search.SearchIndexableRaw; 5572438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock 5607f7efba67a5f261fca31890a1b60f23021325f5John Spurlockimport java.text.SimpleDateFormat; 57019b87f17a51fef7fd4b6696dbea5c50fe8b6d07Fabrice Di Meglioimport java.util.ArrayList; 58cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlockimport java.util.Calendar; 59019b87f17a51fef7fd4b6696dbea5c50fe8b6d07Fabrice Di Meglioimport java.util.List; 60cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlockimport java.util.Objects; 61019b87f17a51fef7fd4b6696dbea5c50fe8b6d07Fabrice Di Meglio 6207f7efba67a5f261fca31890a1b60f23021325f5John Spurlockpublic class ZenModeSettings extends SettingsPreferenceFragment implements Indexable { 6372438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock private static final String TAG = "ZenModeSettings"; 64cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock private static final boolean DEBUG = true; 65cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock 6607f7efba67a5f261fca31890a1b60f23021325f5John Spurlock private static final String KEY_ZEN_MODE = "zen_mode"; 6707f7efba67a5f261fca31890a1b60f23021325f5John Spurlock private static final String KEY_IMPORTANT = "important"; 68cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock private static final String KEY_CALLS = "phone_calls"; 69cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock private static final String KEY_MESSAGES = "messages"; 707ad86dce1c1dd07bb06bd996b0daa6b059eeca21Chris Wren private static final String KEY_STARRED = "starred"; 7154612391878a2300fc44ea3f4befc171b3d5e737John Spurlock private static final String KEY_ALARM_INFO = "alarm_info"; 72cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock 7307f7efba67a5f261fca31890a1b60f23021325f5John Spurlock private static final String KEY_DOWNTIME = "downtime"; 7407f7efba67a5f261fca31890a1b60f23021325f5John Spurlock private static final String KEY_DAYS = "days"; 75ac1c42f5dcf43b4b7092d4d6ca0c9dbd4f9fbfdeJohn Spurlock private static final String KEY_START_TIME = "start_time"; 76ac1c42f5dcf43b4b7092d4d6ca0c9dbd4f9fbfdeJohn Spurlock private static final String KEY_END_TIME = "end_time"; 7772438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock 7823e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock private static final String KEY_AUTOMATION = "automation"; 7923e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock private static final String KEY_ENTRY = "entry"; 80c9afadb04b00598f5988101681089290cf14f79cJohn Spurlock private static final String KEY_CONDITION_PROVIDERS = "manage_condition_providers"; 81c9afadb04b00598f5988101681089290cf14f79cJohn Spurlock 8207f7efba67a5f261fca31890a1b60f23021325f5John Spurlock private static final SettingPref PREF_ZEN_MODE = new SettingPref(SettingPref.TYPE_GLOBAL, 8307f7efba67a5f261fca31890a1b60f23021325f5John Spurlock KEY_ZEN_MODE, Global.ZEN_MODE, Global.ZEN_MODE_OFF, Global.ZEN_MODE_OFF, 8407f7efba67a5f261fca31890a1b60f23021325f5John Spurlock Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS, Global.ZEN_MODE_NO_INTERRUPTIONS) { 8507f7efba67a5f261fca31890a1b60f23021325f5John Spurlock protected String getCaption(Resources res, int value) { 8607f7efba67a5f261fca31890a1b60f23021325f5John Spurlock switch (value) { 8707f7efba67a5f261fca31890a1b60f23021325f5John Spurlock case Global.ZEN_MODE_NO_INTERRUPTIONS: 8807f7efba67a5f261fca31890a1b60f23021325f5John Spurlock return res.getString(R.string.zen_mode_option_no_interruptions); 8907f7efba67a5f261fca31890a1b60f23021325f5John Spurlock case Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS: 9007f7efba67a5f261fca31890a1b60f23021325f5John Spurlock return res.getString(R.string.zen_mode_option_important_interruptions); 9107f7efba67a5f261fca31890a1b60f23021325f5John Spurlock default: 9207f7efba67a5f261fca31890a1b60f23021325f5John Spurlock return res.getString(R.string.zen_mode_option_off); 9307f7efba67a5f261fca31890a1b60f23021325f5John Spurlock } 9407f7efba67a5f261fca31890a1b60f23021325f5John Spurlock } 9507f7efba67a5f261fca31890a1b60f23021325f5John Spurlock }; 9607f7efba67a5f261fca31890a1b60f23021325f5John Spurlock 9707f7efba67a5f261fca31890a1b60f23021325f5John Spurlock private static final SimpleDateFormat DAY_FORMAT = new SimpleDateFormat("EEE"); 9807f7efba67a5f261fca31890a1b60f23021325f5John Spurlock 9957c713d1d92f64a558115e5aff212ebc54a19151John Spurlock private static SparseArray<String> allKeyTitles(Context context) { 100ac1c42f5dcf43b4b7092d4d6ca0c9dbd4f9fbfdeJohn Spurlock final SparseArray<String> rt = new SparseArray<String>(); 10107f7efba67a5f261fca31890a1b60f23021325f5John Spurlock rt.put(R.string.zen_mode_important_category, KEY_IMPORTANT); 10257c713d1d92f64a558115e5aff212ebc54a19151John Spurlock if (Utils.isVoiceCapable(context)) { 10357c713d1d92f64a558115e5aff212ebc54a19151John Spurlock rt.put(R.string.zen_mode_phone_calls, KEY_CALLS); 10407f7efba67a5f261fca31890a1b60f23021325f5John Spurlock rt.put(R.string.zen_mode_option_title, KEY_ZEN_MODE); 10507f7efba67a5f261fca31890a1b60f23021325f5John Spurlock } else { 10607f7efba67a5f261fca31890a1b60f23021325f5John Spurlock rt.put(R.string.zen_mode_option_title_novoice, KEY_ZEN_MODE); 10757c713d1d92f64a558115e5aff212ebc54a19151John Spurlock } 108ac1c42f5dcf43b4b7092d4d6ca0c9dbd4f9fbfdeJohn Spurlock rt.put(R.string.zen_mode_messages, KEY_MESSAGES); 1097ad86dce1c1dd07bb06bd996b0daa6b059eeca21Chris Wren rt.put(R.string.zen_mode_from_starred, KEY_STARRED); 11054612391878a2300fc44ea3f4befc171b3d5e737John Spurlock rt.put(R.string.zen_mode_alarm_info, KEY_ALARM_INFO); 11107f7efba67a5f261fca31890a1b60f23021325f5John Spurlock rt.put(R.string.zen_mode_downtime_category, KEY_DOWNTIME); 11207f7efba67a5f261fca31890a1b60f23021325f5John Spurlock rt.put(R.string.zen_mode_downtime_days, KEY_DAYS); 113ac1c42f5dcf43b4b7092d4d6ca0c9dbd4f9fbfdeJohn Spurlock rt.put(R.string.zen_mode_start_time, KEY_START_TIME); 114ac1c42f5dcf43b4b7092d4d6ca0c9dbd4f9fbfdeJohn Spurlock rt.put(R.string.zen_mode_end_time, KEY_END_TIME); 115ac1c42f5dcf43b4b7092d4d6ca0c9dbd4f9fbfdeJohn Spurlock rt.put(R.string.zen_mode_automation_category, KEY_AUTOMATION); 116ac1c42f5dcf43b4b7092d4d6ca0c9dbd4f9fbfdeJohn Spurlock rt.put(R.string.manage_condition_providers, KEY_CONDITION_PROVIDERS); 117ac1c42f5dcf43b4b7092d4d6ca0c9dbd4f9fbfdeJohn Spurlock return rt; 118ac1c42f5dcf43b4b7092d4d6ca0c9dbd4f9fbfdeJohn Spurlock } 119ac1c42f5dcf43b4b7092d4d6ca0c9dbd4f9fbfdeJohn Spurlock 1207f502bf824955b2b3a43f8f7f32c00cf00f736feJohn Spurlock private final Handler mHandler = new Handler(); 1217f502bf824955b2b3a43f8f7f32c00cf00f736feJohn Spurlock private final SettingsObserver mSettingsObserver = new SettingsObserver(); 1227f502bf824955b2b3a43f8f7f32c00cf00f736feJohn Spurlock 123cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock private Context mContext; 124c9afadb04b00598f5988101681089290cf14f79cJohn Spurlock private PackageManager mPM; 125cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock private ZenModeConfig mConfig; 126cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock private boolean mDisableListeners; 127cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock private SwitchPreference mCalls; 128cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock private SwitchPreference mMessages; 129cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock private DropDownPreference mStarred; 13007f7efba67a5f261fca31890a1b60f23021325f5John Spurlock private Preference mDays; 131cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock private TimePickerPreference mStart; 132cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock private TimePickerPreference mEnd; 13323e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock private PreferenceCategory mAutomationCategory; 13423e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock private Preference mEntry; 135c9afadb04b00598f5988101681089290cf14f79cJohn Spurlock private Preference mConditionProviders; 1367f502bf824955b2b3a43f8f7f32c00cf00f736feJohn Spurlock 1377f502bf824955b2b3a43f8f7f32c00cf00f736feJohn Spurlock @Override 13807f7efba67a5f261fca31890a1b60f23021325f5John Spurlock public void onCreate(Bundle savedInstanceState) { 13907f7efba67a5f261fca31890a1b60f23021325f5John Spurlock super.onCreate(savedInstanceState); 140c41dfb4f6ce5de287045ee97a55350ef7cc1a279John Spurlock mContext = getActivity(); 141c9afadb04b00598f5988101681089290cf14f79cJohn Spurlock mPM = mContext.getPackageManager(); 142cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock 143cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock addPreferencesFromResource(R.xml.zen_mode_settings); 144cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock final PreferenceScreen root = getPreferenceScreen(); 145cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock 146cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mConfig = getZenModeConfig(); 147cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock if (DEBUG) Log.d(TAG, "Loaded mConfig=" + mConfig); 148cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock 14907f7efba67a5f261fca31890a1b60f23021325f5John Spurlock final Preference zenMode = PREF_ZEN_MODE.init(this); 15007f7efba67a5f261fca31890a1b60f23021325f5John Spurlock if (!Utils.isVoiceCapable(mContext)) { 15107f7efba67a5f261fca31890a1b60f23021325f5John Spurlock zenMode.setTitle(R.string.zen_mode_option_title_novoice); 15207f7efba67a5f261fca31890a1b60f23021325f5John Spurlock } 153c41dfb4f6ce5de287045ee97a55350ef7cc1a279John Spurlock 15407f7efba67a5f261fca31890a1b60f23021325f5John Spurlock final PreferenceCategory important = 15507f7efba67a5f261fca31890a1b60f23021325f5John Spurlock (PreferenceCategory) root.findPreference(KEY_IMPORTANT); 15654612391878a2300fc44ea3f4befc171b3d5e737John Spurlock final Preference alarmInfo = important.findPreference(KEY_ALARM_INFO); 15754612391878a2300fc44ea3f4befc171b3d5e737John Spurlock important.removePreference(alarmInfo); 158cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock 15907f7efba67a5f261fca31890a1b60f23021325f5John Spurlock mCalls = (SwitchPreference) important.findPreference(KEY_CALLS); 16057c713d1d92f64a558115e5aff212ebc54a19151John Spurlock if (Utils.isVoiceCapable(mContext)) { 16157c713d1d92f64a558115e5aff212ebc54a19151John Spurlock mCalls.setOnPreferenceChangeListener(new OnPreferenceChangeListener() { 16257c713d1d92f64a558115e5aff212ebc54a19151John Spurlock @Override 16357c713d1d92f64a558115e5aff212ebc54a19151John Spurlock public boolean onPreferenceChange(Preference preference, Object newValue) { 16457c713d1d92f64a558115e5aff212ebc54a19151John Spurlock if (mDisableListeners) return true; 16557c713d1d92f64a558115e5aff212ebc54a19151John Spurlock final boolean val = (Boolean) newValue; 16657c713d1d92f64a558115e5aff212ebc54a19151John Spurlock if (val == mConfig.allowCalls) return true; 16757c713d1d92f64a558115e5aff212ebc54a19151John Spurlock if (DEBUG) Log.d(TAG, "onPrefChange allowCalls=" + val); 16857c713d1d92f64a558115e5aff212ebc54a19151John Spurlock final ZenModeConfig newConfig = mConfig.copy(); 16957c713d1d92f64a558115e5aff212ebc54a19151John Spurlock newConfig.allowCalls = val; 17057c713d1d92f64a558115e5aff212ebc54a19151John Spurlock return setZenModeConfig(newConfig); 17157c713d1d92f64a558115e5aff212ebc54a19151John Spurlock } 17257c713d1d92f64a558115e5aff212ebc54a19151John Spurlock }); 17357c713d1d92f64a558115e5aff212ebc54a19151John Spurlock } else { 17407f7efba67a5f261fca31890a1b60f23021325f5John Spurlock important.removePreference(mCalls); 17557c713d1d92f64a558115e5aff212ebc54a19151John Spurlock mCalls = null; 17657c713d1d92f64a558115e5aff212ebc54a19151John Spurlock } 177cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock 17807f7efba67a5f261fca31890a1b60f23021325f5John Spurlock mMessages = (SwitchPreference) important.findPreference(KEY_MESSAGES); 179cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mMessages.setOnPreferenceChangeListener(new OnPreferenceChangeListener() { 180cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock @Override 181cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock public boolean onPreferenceChange(Preference preference, Object newValue) { 182cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock if (mDisableListeners) return true; 183cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock final boolean val = (Boolean) newValue; 184cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock if (val == mConfig.allowMessages) return true; 185cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock if (DEBUG) Log.d(TAG, "onPrefChange allowMessages=" + val); 186cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock final ZenModeConfig newConfig = mConfig.copy(); 187cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock newConfig.allowMessages = val; 188cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock return setZenModeConfig(newConfig); 189cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } 190cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock }); 191cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock 192cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mStarred = new DropDownPreference(mContext); 1937ad86dce1c1dd07bb06bd996b0daa6b059eeca21Chris Wren mStarred.setKey(KEY_STARRED); 194cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mStarred.setTitle(R.string.zen_mode_from); 1956d26d10fb3e5e2e491d1da0881eda192d30eec04John Spurlock mStarred.setDropDownWidth(R.dimen.zen_mode_dropdown_width); 1967ad86dce1c1dd07bb06bd996b0daa6b059eeca21Chris Wren mStarred.addItem(R.string.zen_mode_from_anyone, ZenModeConfig.SOURCE_ANYONE); 1977ad86dce1c1dd07bb06bd996b0daa6b059eeca21Chris Wren mStarred.addItem(R.string.zen_mode_from_starred, ZenModeConfig.SOURCE_STAR); 1987ad86dce1c1dd07bb06bd996b0daa6b059eeca21Chris Wren mStarred.addItem(R.string.zen_mode_from_contacts, ZenModeConfig.SOURCE_CONTACT); 1997ad86dce1c1dd07bb06bd996b0daa6b059eeca21Chris Wren mStarred.setCallback(new DropDownPreference.Callback() { 2007ad86dce1c1dd07bb06bd996b0daa6b059eeca21Chris Wren @Override 2017ad86dce1c1dd07bb06bd996b0daa6b059eeca21Chris Wren public boolean onItemSelected(int pos, Object newValue) { 2027ad86dce1c1dd07bb06bd996b0daa6b059eeca21Chris Wren if (mDisableListeners) return true; 2037ad86dce1c1dd07bb06bd996b0daa6b059eeca21Chris Wren final int val = (Integer) newValue; 2047ad86dce1c1dd07bb06bd996b0daa6b059eeca21Chris Wren if (val == mConfig.allowFrom) return true; 2057ad86dce1c1dd07bb06bd996b0daa6b059eeca21Chris Wren if (DEBUG) Log.d(TAG, "onPrefChange allowFrom=" + 2067ad86dce1c1dd07bb06bd996b0daa6b059eeca21Chris Wren ZenModeConfig.sourceToString(val)); 2077ad86dce1c1dd07bb06bd996b0daa6b059eeca21Chris Wren final ZenModeConfig newConfig = mConfig.copy(); 2087ad86dce1c1dd07bb06bd996b0daa6b059eeca21Chris Wren newConfig.allowFrom = val; 2097ad86dce1c1dd07bb06bd996b0daa6b059eeca21Chris Wren return setZenModeConfig(newConfig); 2107ad86dce1c1dd07bb06bd996b0daa6b059eeca21Chris Wren } 2117ad86dce1c1dd07bb06bd996b0daa6b059eeca21Chris Wren }); 21207f7efba67a5f261fca31890a1b60f23021325f5John Spurlock important.addPreference(mStarred); 213cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock 21407f7efba67a5f261fca31890a1b60f23021325f5John Spurlock important.addPreference(alarmInfo); 21507f7efba67a5f261fca31890a1b60f23021325f5John Spurlock 21607f7efba67a5f261fca31890a1b60f23021325f5John Spurlock final PreferenceCategory downtime = (PreferenceCategory) root.findPreference(KEY_DOWNTIME); 21707f7efba67a5f261fca31890a1b60f23021325f5John Spurlock 21807f7efba67a5f261fca31890a1b60f23021325f5John Spurlock mDays = downtime.findPreference(KEY_DAYS); 21907f7efba67a5f261fca31890a1b60f23021325f5John Spurlock mDays.setOnPreferenceClickListener(new OnPreferenceClickListener() { 220cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock @Override 22107f7efba67a5f261fca31890a1b60f23021325f5John Spurlock public boolean onPreferenceClick(Preference preference) { 22207f7efba67a5f261fca31890a1b60f23021325f5John Spurlock new AlertDialog.Builder(mContext) 22307f7efba67a5f261fca31890a1b60f23021325f5John Spurlock .setTitle(R.string.zen_mode_downtime_days) 22407f7efba67a5f261fca31890a1b60f23021325f5John Spurlock .setView(new ZenModeDowntimeDaysSelection(mContext, mConfig.sleepMode) { 22507f7efba67a5f261fca31890a1b60f23021325f5John Spurlock @Override 22607f7efba67a5f261fca31890a1b60f23021325f5John Spurlock protected void onChanged(String mode) { 22707f7efba67a5f261fca31890a1b60f23021325f5John Spurlock if (mDisableListeners) return; 22807f7efba67a5f261fca31890a1b60f23021325f5John Spurlock if (Objects.equals(mode, mConfig.sleepMode)) return; 22907f7efba67a5f261fca31890a1b60f23021325f5John Spurlock if (DEBUG) Log.d(TAG, "days.onChanged sleepMode=" + mode); 23007f7efba67a5f261fca31890a1b60f23021325f5John Spurlock final ZenModeConfig newConfig = mConfig.copy(); 23107f7efba67a5f261fca31890a1b60f23021325f5John Spurlock newConfig.sleepMode = mode; 23207f7efba67a5f261fca31890a1b60f23021325f5John Spurlock setZenModeConfig(newConfig); 23307f7efba67a5f261fca31890a1b60f23021325f5John Spurlock } 23407f7efba67a5f261fca31890a1b60f23021325f5John Spurlock }) 23507f7efba67a5f261fca31890a1b60f23021325f5John Spurlock .setOnDismissListener(new OnDismissListener() { 23607f7efba67a5f261fca31890a1b60f23021325f5John Spurlock @Override 23707f7efba67a5f261fca31890a1b60f23021325f5John Spurlock public void onDismiss(DialogInterface dialog) { 23807f7efba67a5f261fca31890a1b60f23021325f5John Spurlock updateDays(); 23907f7efba67a5f261fca31890a1b60f23021325f5John Spurlock } 24007f7efba67a5f261fca31890a1b60f23021325f5John Spurlock }) 24107f7efba67a5f261fca31890a1b60f23021325f5John Spurlock .setPositiveButton(R.string.done_button, null) 24207f7efba67a5f261fca31890a1b60f23021325f5John Spurlock .show(); 24307f7efba67a5f261fca31890a1b60f23021325f5John Spurlock return true; 244cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } 245cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock }); 246cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock 247cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock final FragmentManager mgr = getFragmentManager(); 248cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock 249cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mStart = new TimePickerPreference(mContext, mgr); 250ac1c42f5dcf43b4b7092d4d6ca0c9dbd4f9fbfdeJohn Spurlock mStart.setKey(KEY_START_TIME); 251cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mStart.setTitle(R.string.zen_mode_start_time); 252cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mStart.setCallback(new TimePickerPreference.Callback() { 253cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock @Override 254cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock public boolean onSetTime(int hour, int minute) { 255cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock if (mDisableListeners) return true; 256cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock if (!ZenModeConfig.isValidHour(hour)) return false; 257cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock if (!ZenModeConfig.isValidMinute(minute)) return false; 258cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock if (hour == mConfig.sleepStartHour && minute == mConfig.sleepStartMinute) { 259cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock return true; 260cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } 261cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock if (DEBUG) Log.d(TAG, "onPrefChange sleepStart h=" + hour + " m=" + minute); 262cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock final ZenModeConfig newConfig = mConfig.copy(); 263cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock newConfig.sleepStartHour = hour; 264cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock newConfig.sleepStartMinute = minute; 265cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock return setZenModeConfig(newConfig); 266cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } 267cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock }); 26807f7efba67a5f261fca31890a1b60f23021325f5John Spurlock downtime.addPreference(mStart); 26907f7efba67a5f261fca31890a1b60f23021325f5John Spurlock mStart.setDependency(mDays.getKey()); 270cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock 271cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mEnd = new TimePickerPreference(mContext, mgr); 272ac1c42f5dcf43b4b7092d4d6ca0c9dbd4f9fbfdeJohn Spurlock mEnd.setKey(KEY_END_TIME); 273cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mEnd.setTitle(R.string.zen_mode_end_time); 274cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mEnd.setCallback(new TimePickerPreference.Callback() { 275cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock @Override 276cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock public boolean onSetTime(int hour, int minute) { 277cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock if (mDisableListeners) return true; 278cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock if (!ZenModeConfig.isValidHour(hour)) return false; 279cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock if (!ZenModeConfig.isValidMinute(minute)) return false; 280cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock if (hour == mConfig.sleepEndHour && minute == mConfig.sleepEndMinute) { 281cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock return true; 282cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } 283cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock if (DEBUG) Log.d(TAG, "onPrefChange sleepEnd h=" + hour + " m=" + minute); 284cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock final ZenModeConfig newConfig = mConfig.copy(); 285cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock newConfig.sleepEndHour = hour; 286cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock newConfig.sleepEndMinute = minute; 287cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock return setZenModeConfig(newConfig); 288cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } 289cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock }); 29007f7efba67a5f261fca31890a1b60f23021325f5John Spurlock downtime.addPreference(mEnd); 29107f7efba67a5f261fca31890a1b60f23021325f5John Spurlock mEnd.setDependency(mDays.getKey()); 292cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock 29323e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock mAutomationCategory = (PreferenceCategory) findPreference(KEY_AUTOMATION); 29423e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock mEntry = findPreference(KEY_ENTRY); 29523e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock mEntry.setOnPreferenceClickListener(new OnPreferenceClickListener() { 29623e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock @Override 29723e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock public boolean onPreferenceClick(Preference preference) { 29823e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock new AlertDialog.Builder(mContext) 29923e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock .setTitle(R.string.zen_mode_entry_conditions_title) 30023e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock .setView(new ZenModeAutomaticConditionSelection(mContext)) 30123e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock .setOnDismissListener(new OnDismissListener() { 30223e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock @Override 30323e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock public void onDismiss(DialogInterface dialog) { 30423e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock refreshAutomationSection(); 30523e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock } 30623e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock }) 30723e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock .setPositiveButton(R.string.dlg_ok, null) 30823e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock .show(); 30923e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock return true; 31023e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock } 31123e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock }); 312c9afadb04b00598f5988101681089290cf14f79cJohn Spurlock mConditionProviders = findPreference(KEY_CONDITION_PROVIDERS); 313c9afadb04b00598f5988101681089290cf14f79cJohn Spurlock 314cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock updateControls(); 315cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } 316cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock 31707f7efba67a5f261fca31890a1b60f23021325f5John Spurlock private void updateDays() { 31807f7efba67a5f261fca31890a1b60f23021325f5John Spurlock if (mConfig != null) { 31907f7efba67a5f261fca31890a1b60f23021325f5John Spurlock final int[] days = ZenModeConfig.tryParseDays(mConfig.sleepMode); 32007f7efba67a5f261fca31890a1b60f23021325f5John Spurlock if (days != null && days.length != 0) { 32107f7efba67a5f261fca31890a1b60f23021325f5John Spurlock final StringBuilder sb = new StringBuilder(); 32207f7efba67a5f261fca31890a1b60f23021325f5John Spurlock final Calendar c = Calendar.getInstance(); 32307f7efba67a5f261fca31890a1b60f23021325f5John Spurlock for (int i = 0; i < ZenModeConfig.ALL_DAYS.length; i++) { 32407f7efba67a5f261fca31890a1b60f23021325f5John Spurlock final int day = ZenModeConfig.ALL_DAYS[i]; 32507f7efba67a5f261fca31890a1b60f23021325f5John Spurlock for (int j = 0; j < days.length; j++) { 32607f7efba67a5f261fca31890a1b60f23021325f5John Spurlock if (day == days[j]) { 32707f7efba67a5f261fca31890a1b60f23021325f5John Spurlock c.set(Calendar.DAY_OF_WEEK, day); 32807f7efba67a5f261fca31890a1b60f23021325f5John Spurlock if (sb.length() > 0) { 32907f7efba67a5f261fca31890a1b60f23021325f5John Spurlock sb.append(mContext.getString(R.string.summary_divider_text)); 33007f7efba67a5f261fca31890a1b60f23021325f5John Spurlock } 33107f7efba67a5f261fca31890a1b60f23021325f5John Spurlock sb.append(DAY_FORMAT.format(c.getTime())); 33207f7efba67a5f261fca31890a1b60f23021325f5John Spurlock break; 33307f7efba67a5f261fca31890a1b60f23021325f5John Spurlock } 33407f7efba67a5f261fca31890a1b60f23021325f5John Spurlock } 33507f7efba67a5f261fca31890a1b60f23021325f5John Spurlock } 33607f7efba67a5f261fca31890a1b60f23021325f5John Spurlock if (sb.length() > 0) { 33707f7efba67a5f261fca31890a1b60f23021325f5John Spurlock mDays.setSummary(sb); 33807f7efba67a5f261fca31890a1b60f23021325f5John Spurlock mDays.notifyDependencyChange(false); 33907f7efba67a5f261fca31890a1b60f23021325f5John Spurlock return; 34007f7efba67a5f261fca31890a1b60f23021325f5John Spurlock } 34107f7efba67a5f261fca31890a1b60f23021325f5John Spurlock } 34207f7efba67a5f261fca31890a1b60f23021325f5John Spurlock } 34307f7efba67a5f261fca31890a1b60f23021325f5John Spurlock mDays.setSummary(R.string.zen_mode_downtime_days_none); 34407f7efba67a5f261fca31890a1b60f23021325f5John Spurlock mDays.notifyDependencyChange(true); 34507f7efba67a5f261fca31890a1b60f23021325f5John Spurlock } 34607f7efba67a5f261fca31890a1b60f23021325f5John Spurlock 347c2f06e06c2fbe3192da4c48045058206649b902eJohn Spurlock private void updateEndSummary() { 348c2f06e06c2fbe3192da4c48045058206649b902eJohn Spurlock final int startMin = 60 * mConfig.sleepStartHour + mConfig.sleepStartMinute; 349c2f06e06c2fbe3192da4c48045058206649b902eJohn Spurlock final int endMin = 60 * mConfig.sleepEndHour + mConfig.sleepEndMinute; 350c2f06e06c2fbe3192da4c48045058206649b902eJohn Spurlock final boolean nextDay = startMin >= endMin; 351c2f06e06c2fbe3192da4c48045058206649b902eJohn Spurlock mEnd.setSummaryFormat(nextDay ? R.string.zen_mode_end_time_summary_format : 0); 352c2f06e06c2fbe3192da4c48045058206649b902eJohn Spurlock } 353c2f06e06c2fbe3192da4c48045058206649b902eJohn Spurlock 354cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock private void updateControls() { 355cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mDisableListeners = true; 35657c713d1d92f64a558115e5aff212ebc54a19151John Spurlock if (mCalls != null) { 35757c713d1d92f64a558115e5aff212ebc54a19151John Spurlock mCalls.setChecked(mConfig.allowCalls); 35857c713d1d92f64a558115e5aff212ebc54a19151John Spurlock } 359cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mMessages.setChecked(mConfig.allowMessages); 3607ad86dce1c1dd07bb06bd996b0daa6b059eeca21Chris Wren mStarred.setSelectedValue(mConfig.allowFrom); 361de99ccf18b6f8810f2743b5b9fef513304d0ed4fJohn Spurlock updateStarredEnabled(); 36207f7efba67a5f261fca31890a1b60f23021325f5John Spurlock updateDays(); 363cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mStart.setTime(mConfig.sleepStartHour, mConfig.sleepStartMinute); 364cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mEnd.setTime(mConfig.sleepEndHour, mConfig.sleepEndMinute); 365cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mDisableListeners = false; 36604a73fe3c0810075b6bf7ec6105baaa9bff4e667John Spurlock refreshAutomationSection(); 367c2f06e06c2fbe3192da4c48045058206649b902eJohn Spurlock updateEndSummary(); 3687f502bf824955b2b3a43f8f7f32c00cf00f736feJohn Spurlock } 3697f502bf824955b2b3a43f8f7f32c00cf00f736feJohn Spurlock 370de99ccf18b6f8810f2743b5b9fef513304d0ed4fJohn Spurlock private void updateStarredEnabled() { 371de99ccf18b6f8810f2743b5b9fef513304d0ed4fJohn Spurlock mStarred.setEnabled(mConfig.allowCalls || mConfig.allowMessages); 372de99ccf18b6f8810f2743b5b9fef513304d0ed4fJohn Spurlock } 373de99ccf18b6f8810f2743b5b9fef513304d0ed4fJohn Spurlock 37423e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock private void refreshAutomationSection() { 375c9afadb04b00598f5988101681089290cf14f79cJohn Spurlock if (mConditionProviders != null) { 376c9afadb04b00598f5988101681089290cf14f79cJohn Spurlock final int total = ConditionProviderSettings.getProviderCount(mPM); 377c9afadb04b00598f5988101681089290cf14f79cJohn Spurlock if (total == 0) { 37823e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock getPreferenceScreen().removePreference(mAutomationCategory); 379c9afadb04b00598f5988101681089290cf14f79cJohn Spurlock } else { 380c9afadb04b00598f5988101681089290cf14f79cJohn Spurlock final int n = ConditionProviderSettings.getEnabledProviderCount(mContext); 381c9afadb04b00598f5988101681089290cf14f79cJohn Spurlock if (n == 0) { 382c9afadb04b00598f5988101681089290cf14f79cJohn Spurlock mConditionProviders.setSummary(getResources().getString( 383c9afadb04b00598f5988101681089290cf14f79cJohn Spurlock R.string.manage_condition_providers_summary_zero)); 384c9afadb04b00598f5988101681089290cf14f79cJohn Spurlock } else { 385c9afadb04b00598f5988101681089290cf14f79cJohn Spurlock mConditionProviders.setSummary(String.format(getResources().getQuantityString( 386c9afadb04b00598f5988101681089290cf14f79cJohn Spurlock R.plurals.manage_condition_providers_summary_nonzero, 387c9afadb04b00598f5988101681089290cf14f79cJohn Spurlock n, n))); 388c9afadb04b00598f5988101681089290cf14f79cJohn Spurlock } 38923e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock final String entrySummary = getEntryConditionSummary(); 39023e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock if (n == 0 || entrySummary == null) { 39123e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock mEntry.setSummary(R.string.zen_mode_entry_conditions_summary_none); 39223e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock } else { 39323e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock mEntry.setSummary(entrySummary); 39423e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock } 395c9afadb04b00598f5988101681089290cf14f79cJohn Spurlock } 396c9afadb04b00598f5988101681089290cf14f79cJohn Spurlock } 397c9afadb04b00598f5988101681089290cf14f79cJohn Spurlock } 39823e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock 39923e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock private String getEntryConditionSummary() { 40023e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock final INotificationManager nm = INotificationManager.Stub.asInterface( 40123e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock ServiceManager.getService(Context.NOTIFICATION_SERVICE)); 40223e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock try { 40323e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock final Condition[] automatic = nm.getAutomaticZenModeConditions(); 40423e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock if (automatic == null || automatic.length == 0) { 40523e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock return null; 40623e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock } 40781bef1d74568d623b9db3c5409740dc21c0bbc08John Spurlock final String divider = getString(R.string.summary_divider_text); 40823e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock final StringBuilder sb = new StringBuilder(); 40923e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock for (int i = 0; i < automatic.length; i++) { 41023e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock if (i > 0) sb.append(divider); 4110e0122a9999eb1a603c99be12846acad29ed0593John Spurlock sb.append(automatic[i].summary); 41223e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock } 41323e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock return sb.toString(); 41423e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock } catch (Exception e) { 41523e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock Log.w(TAG, "Error calling getAutomaticZenModeConditions", e); 41623e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock return null; 41723e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock } 41823e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock } 41923e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock 4207f502bf824955b2b3a43f8f7f32c00cf00f736feJohn Spurlock @Override 4217f502bf824955b2b3a43f8f7f32c00cf00f736feJohn Spurlock public void onResume() { 4227f502bf824955b2b3a43f8f7f32c00cf00f736feJohn Spurlock super.onResume(); 42304a73fe3c0810075b6bf7ec6105baaa9bff4e667John Spurlock updateControls(); 4247f502bf824955b2b3a43f8f7f32c00cf00f736feJohn Spurlock mSettingsObserver.register(); 4253726525d50d480a3d954c103a844f0c4b3c7d3e0John Spurlock } 4263726525d50d480a3d954c103a844f0c4b3c7d3e0John Spurlock 4273726525d50d480a3d954c103a844f0c4b3c7d3e0John Spurlock @Override 4283726525d50d480a3d954c103a844f0c4b3c7d3e0John Spurlock public void onPause() { 4293726525d50d480a3d954c103a844f0c4b3c7d3e0John Spurlock super.onPause(); 4303726525d50d480a3d954c103a844f0c4b3c7d3e0John Spurlock mSettingsObserver.unregister(); 431138ff8c0457c6e1345015973668d652fa17c7c3bFabrice Di Meglio } 432138ff8c0457c6e1345015973668d652fa17c7c3bFabrice Di Meglio 433cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock private void updateZenModeConfig() { 434cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock final ZenModeConfig config = getZenModeConfig(); 435cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock if (Objects.equals(config, mConfig)) return; 43604a73fe3c0810075b6bf7ec6105baaa9bff4e667John Spurlock mConfig = config; 43704a73fe3c0810075b6bf7ec6105baaa9bff4e667John Spurlock if (DEBUG) Log.d(TAG, "updateZenModeConfig mConfig=" + mConfig); 438cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock updateControls(); 43972438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock } 44072438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock 441cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock private ZenModeConfig getZenModeConfig() { 442cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock final INotificationManager nm = INotificationManager.Stub.asInterface( 443cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock ServiceManager.getService(Context.NOTIFICATION_SERVICE)); 444cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock try { 445cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock return nm.getZenModeConfig(); 446cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } catch (Exception e) { 447cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock Log.w(TAG, "Error calling NoMan", e); 448cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock return new ZenModeConfig(); 449cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } 450cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } 451cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock 452cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock private boolean setZenModeConfig(ZenModeConfig config) { 453cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock final INotificationManager nm = INotificationManager.Stub.asInterface( 454cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock ServiceManager.getService(Context.NOTIFICATION_SERVICE)); 455cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock try { 456cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock final boolean success = nm.setZenModeConfig(config); 457cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock if (success) { 458cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mConfig = config; 459cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock if (DEBUG) Log.d(TAG, "Saved mConfig=" + mConfig); 460c2f06e06c2fbe3192da4c48045058206649b902eJohn Spurlock updateEndSummary(); 461de99ccf18b6f8810f2743b5b9fef513304d0ed4fJohn Spurlock updateStarredEnabled(); 462cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } 463cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock return success; 464cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } catch (Exception e) { 465cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock Log.w(TAG, "Error calling NoMan", e); 466cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock return false; 467cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } 46872438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock } 46972438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock 470623a0e9f45c294ea7e714295f41ba2d8bcd7b32eJohn Spurlock protected void putZenModeSetting(int value) { 471623a0e9f45c294ea7e714295f41ba2d8bcd7b32eJohn Spurlock Global.putInt(getContentResolver(), Global.ZEN_MODE, value); 472623a0e9f45c294ea7e714295f41ba2d8bcd7b32eJohn Spurlock } 473623a0e9f45c294ea7e714295f41ba2d8bcd7b32eJohn Spurlock 474623a0e9f45c294ea7e714295f41ba2d8bcd7b32eJohn Spurlock protected ZenModeConditionSelection newConditionSelection() { 475623a0e9f45c294ea7e714295f41ba2d8bcd7b32eJohn Spurlock return new ZenModeConditionSelection(mContext); 476623a0e9f45c294ea7e714295f41ba2d8bcd7b32eJohn Spurlock } 477623a0e9f45c294ea7e714295f41ba2d8bcd7b32eJohn Spurlock 478cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock // Enable indexing of searchable data 479cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock public static final Indexable.SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER = 480cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock new BaseSearchIndexProvider() { 481cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock @Override 482cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock public List<SearchIndexableRaw> getRawDataToIndex(Context context, boolean enabled) { 48357c713d1d92f64a558115e5aff212ebc54a19151John Spurlock final SparseArray<String> keyTitles = allKeyTitles(context); 48457c713d1d92f64a558115e5aff212ebc54a19151John Spurlock final int N = keyTitles.size(); 485ac1c42f5dcf43b4b7092d4d6ca0c9dbd4f9fbfdeJohn Spurlock final List<SearchIndexableRaw> result = new ArrayList<SearchIndexableRaw>(N); 486cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock final Resources res = context.getResources(); 487ac1c42f5dcf43b4b7092d4d6ca0c9dbd4f9fbfdeJohn Spurlock for (int i = 0; i < N; i++) { 488ac1c42f5dcf43b4b7092d4d6ca0c9dbd4f9fbfdeJohn Spurlock final SearchIndexableRaw data = new SearchIndexableRaw(context); 48957c713d1d92f64a558115e5aff212ebc54a19151John Spurlock data.key = keyTitles.valueAt(i); 49057c713d1d92f64a558115e5aff212ebc54a19151John Spurlock data.title = res.getString(keyTitles.keyAt(i)); 491ac1c42f5dcf43b4b7092d4d6ca0c9dbd4f9fbfdeJohn Spurlock data.screenTitle = res.getString(R.string.zen_mode_settings_title); 492ac1c42f5dcf43b4b7092d4d6ca0c9dbd4f9fbfdeJohn Spurlock result.add(data); 493ac1c42f5dcf43b4b7092d4d6ca0c9dbd4f9fbfdeJohn Spurlock } 494ac1c42f5dcf43b4b7092d4d6ca0c9dbd4f9fbfdeJohn Spurlock return result; 495cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } 49657c713d1d92f64a558115e5aff212ebc54a19151John Spurlock 49757c713d1d92f64a558115e5aff212ebc54a19151John Spurlock public List<String> getNonIndexableKeys(Context context) { 49857c713d1d92f64a558115e5aff212ebc54a19151John Spurlock final ArrayList<String> rt = new ArrayList<String>(); 49957c713d1d92f64a558115e5aff212ebc54a19151John Spurlock if (!Utils.isVoiceCapable(context)) { 50057c713d1d92f64a558115e5aff212ebc54a19151John Spurlock rt.add(KEY_CALLS); 50157c713d1d92f64a558115e5aff212ebc54a19151John Spurlock } 50257c713d1d92f64a558115e5aff212ebc54a19151John Spurlock return rt; 50357c713d1d92f64a558115e5aff212ebc54a19151John Spurlock } 504cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock }; 50572438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock 506cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock private final class SettingsObserver extends ContentObserver { 507cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock private final Uri ZEN_MODE_URI = Global.getUriFor(Global.ZEN_MODE); 508cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock private final Uri ZEN_MODE_CONFIG_ETAG_URI = Global.getUriFor(Global.ZEN_MODE_CONFIG_ETAG); 50972438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock 510cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock public SettingsObserver() { 511cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock super(mHandler); 51272438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock } 51372438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock 514cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock public void register() { 515cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock getContentResolver().registerContentObserver(ZEN_MODE_URI, false, this); 516cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock getContentResolver().registerContentObserver(ZEN_MODE_CONFIG_ETAG_URI, false, this); 51772438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock } 51872438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock 519cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock public void unregister() { 520cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock getContentResolver().unregisterContentObserver(this); 52172438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock } 52272438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock 523cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock @Override 524cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock public void onChange(boolean selfChange, Uri uri) { 525cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock super.onChange(selfChange, uri); 526cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock if (ZEN_MODE_URI.equals(uri)) { 52707f7efba67a5f261fca31890a1b60f23021325f5John Spurlock PREF_ZEN_MODE.update(mContext); 528cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } 529cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock if (ZEN_MODE_CONFIG_ETAG_URI.equals(uri)) { 530cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock updateZenModeConfig(); 531cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } 53272438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock } 533cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } 53472438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock 535cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock private static class TimePickerPreference extends Preference { 536cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock private final Context mContext; 53772438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock 538cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock private int mSummaryFormat; 539cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock private int mHourOfDay; 540cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock private int mMinute; 541cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock private Callback mCallback; 542cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock 543cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock public TimePickerPreference(Context context, final FragmentManager mgr) { 544cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock super(context); 545cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mContext = context; 546cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock setPersistent(false); 547cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock setOnPreferenceClickListener(new OnPreferenceClickListener(){ 548cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock @Override 549cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock public boolean onPreferenceClick(Preference preference) { 550cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock final TimePickerFragment frag = new TimePickerFragment(); 551cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock frag.pref = TimePickerPreference.this; 552cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock frag.show(mgr, TimePickerPreference.class.getName()); 553cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock return true; 554cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } 555cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock }); 55672438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock } 55772438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock 558cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock public void setCallback(Callback callback) { 559cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mCallback = callback; 56072438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock } 56172438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock 562cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock public void setSummaryFormat(int resId) { 563cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mSummaryFormat = resId; 564cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock updateSummary(); 565cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } 56672438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock 567cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock public void setTime(int hourOfDay, int minute) { 568cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock if (mCallback != null && !mCallback.onSetTime(hourOfDay, minute)) return; 569cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mHourOfDay = hourOfDay; 570cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mMinute = minute; 571cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock updateSummary(); 572cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } 57372438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock 574cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock private void updateSummary() { 575cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock final Calendar c = Calendar.getInstance(); 576cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock c.set(Calendar.HOUR_OF_DAY, mHourOfDay); 577cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock c.set(Calendar.MINUTE, mMinute); 578cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock String time = DateFormat.getTimeFormat(mContext).format(c.getTime()); 579cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock if (mSummaryFormat != 0) { 580cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock time = mContext.getResources().getString(mSummaryFormat, time); 58172438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock } 582cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock setSummary(time); 58372438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock } 584019b87f17a51fef7fd4b6696dbea5c50fe8b6d07Fabrice Di Meglio 585cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock public static class TimePickerFragment extends DialogFragment implements 586cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock TimePickerDialog.OnTimeSetListener { 587cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock public TimePickerPreference pref; 588019b87f17a51fef7fd4b6696dbea5c50fe8b6d07Fabrice Di Meglio 589cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock @Override 590cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock public Dialog onCreateDialog(Bundle savedInstanceState) { 591cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock final boolean usePref = pref != null && pref.mHourOfDay >= 0 && pref.mMinute >= 0; 592cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock final Calendar c = Calendar.getInstance(); 593cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock final int hour = usePref ? pref.mHourOfDay : c.get(Calendar.HOUR_OF_DAY); 594cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock final int minute = usePref ? pref.mMinute : c.get(Calendar.MINUTE); 595cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock return new TimePickerDialog(getActivity(), this, hour, minute, 596cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock DateFormat.is24HourFormat(getActivity())); 597cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } 598019b87f17a51fef7fd4b6696dbea5c50fe8b6d07Fabrice Di Meglio 599cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock public void onTimeSet(TimePicker view, int hourOfDay, int minute) { 600cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock if (pref != null) { 601cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock pref.setTime(hourOfDay, minute); 602cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } 603cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } 604cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } 605019b87f17a51fef7fd4b6696dbea5c50fe8b6d07Fabrice Di Meglio 606cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock public interface Callback { 607cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock boolean onSetTime(int hour, int minute); 608cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } 609cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } 61072438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock} 611