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 191e7dbd455eade6e6d8f1abd7969dd096972ed84fJohn Spurlockimport static com.android.settings.notification.ZenModeDowntimeDaysSelection.DAYS; 201e7dbd455eade6e6d8f1abd7969dd096972ed84fJohn Spurlock 21623a0e9f45c294ea7e714295f41ba2d8bcd7b32eJohn Spurlockimport android.app.AlertDialog; 22cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlockimport android.app.Dialog; 23cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlockimport android.app.DialogFragment; 24cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlockimport android.app.FragmentManager; 25cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlockimport android.app.INotificationManager; 26cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlockimport android.app.TimePickerDialog; 2772438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlockimport android.content.Context; 28623a0e9f45c294ea7e714295f41ba2d8bcd7b32eJohn Spurlockimport android.content.DialogInterface; 2923e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlockimport android.content.DialogInterface.OnDismissListener; 30c9afadb04b00598f5988101681089290cf14f79cJohn Spurlockimport android.content.pm.PackageManager; 31019b87f17a51fef7fd4b6696dbea5c50fe8b6d07Fabrice Di Meglioimport android.content.res.Resources; 324a35051565b0ce6d29313c3e4ffe19e1dde78db0John Spurlockimport android.database.ContentObserver; 337f502bf824955b2b3a43f8f7f32c00cf00f736feJohn Spurlockimport android.net.Uri; 3472438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlockimport android.os.Bundle; 357f502bf824955b2b3a43f8f7f32c00cf00f736feJohn Spurlockimport android.os.Handler; 36cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlockimport android.os.ServiceManager; 37cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlockimport android.preference.Preference; 38cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlockimport android.preference.Preference.OnPreferenceChangeListener; 3923e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlockimport android.preference.Preference.OnPreferenceClickListener; 40cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlockimport android.preference.PreferenceCategory; 41cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlockimport android.preference.PreferenceScreen; 42cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlockimport android.preference.SwitchPreference; 437f502bf824955b2b3a43f8f7f32c00cf00f736feJohn Spurlockimport android.provider.Settings.Global; 4423e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlockimport android.service.notification.Condition; 45cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlockimport android.service.notification.ZenModeConfig; 46cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlockimport android.text.format.DateFormat; 4772438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlockimport android.util.Log; 48ac1c42f5dcf43b4b7092d4d6ca0c9dbd4f9fbfdeJohn Spurlockimport android.util.SparseArray; 49062f736c8bfda9ac6ac7476ad51e52ca077f1505Jason Monkimport android.widget.ScrollView; 50cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlockimport android.widget.TimePicker; 514a35051565b0ce6d29313c3e4ffe19e1dde78db0John Spurlock 524a35051565b0ce6d29313c3e4ffe19e1dde78db0John Spurlockimport com.android.settings.R; 534a35051565b0ce6d29313c3e4ffe19e1dde78db0John Spurlockimport com.android.settings.SettingsPreferenceFragment; 5457c713d1d92f64a558115e5aff212ebc54a19151John Spurlockimport com.android.settings.Utils; 55062f736c8bfda9ac6ac7476ad51e52ca077f1505Jason Monkimport com.android.settings.notification.DropDownPreference.Callback; 56cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlockimport com.android.settings.search.BaseSearchIndexProvider; 57019b87f17a51fef7fd4b6696dbea5c50fe8b6d07Fabrice Di Meglioimport com.android.settings.search.Indexable; 58019b87f17a51fef7fd4b6696dbea5c50fe8b6d07Fabrice Di Meglioimport com.android.settings.search.SearchIndexableRaw; 5972438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock 6007f7efba67a5f261fca31890a1b60f23021325f5John Spurlockimport java.text.SimpleDateFormat; 61019b87f17a51fef7fd4b6696dbea5c50fe8b6d07Fabrice Di Meglioimport java.util.ArrayList; 62cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlockimport java.util.Calendar; 63019b87f17a51fef7fd4b6696dbea5c50fe8b6d07Fabrice Di Meglioimport java.util.List; 64cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlockimport java.util.Objects; 65019b87f17a51fef7fd4b6696dbea5c50fe8b6d07Fabrice Di Meglio 6607f7efba67a5f261fca31890a1b60f23021325f5John Spurlockpublic class ZenModeSettings extends SettingsPreferenceFragment implements Indexable { 6772438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock private static final String TAG = "ZenModeSettings"; 68cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock private static final boolean DEBUG = true; 69cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock 7007f7efba67a5f261fca31890a1b60f23021325f5John Spurlock private static final String KEY_ZEN_MODE = "zen_mode"; 7107f7efba67a5f261fca31890a1b60f23021325f5John Spurlock private static final String KEY_IMPORTANT = "important"; 72cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock private static final String KEY_CALLS = "phone_calls"; 73cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock private static final String KEY_MESSAGES = "messages"; 747ad86dce1c1dd07bb06bd996b0daa6b059eeca21Chris Wren private static final String KEY_STARRED = "starred"; 757e90548836b3e7c4ec8132d9965ba11f055f6931John Spurlock private static final String KEY_EVENTS = "events"; 7654612391878a2300fc44ea3f4befc171b3d5e737John Spurlock private static final String KEY_ALARM_INFO = "alarm_info"; 77cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock 7807f7efba67a5f261fca31890a1b60f23021325f5John Spurlock private static final String KEY_DOWNTIME = "downtime"; 7907f7efba67a5f261fca31890a1b60f23021325f5John Spurlock private static final String KEY_DAYS = "days"; 80ac1c42f5dcf43b4b7092d4d6ca0c9dbd4f9fbfdeJohn Spurlock private static final String KEY_START_TIME = "start_time"; 81ac1c42f5dcf43b4b7092d4d6ca0c9dbd4f9fbfdeJohn Spurlock private static final String KEY_END_TIME = "end_time"; 8272438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock 8323e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock private static final String KEY_AUTOMATION = "automation"; 8423e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock private static final String KEY_ENTRY = "entry"; 85c9afadb04b00598f5988101681089290cf14f79cJohn Spurlock private static final String KEY_CONDITION_PROVIDERS = "manage_condition_providers"; 86c9afadb04b00598f5988101681089290cf14f79cJohn Spurlock 87062f736c8bfda9ac6ac7476ad51e52ca077f1505Jason Monk private static final SettingPrefWithCallback PREF_ZEN_MODE = new SettingPrefWithCallback( 88062f736c8bfda9ac6ac7476ad51e52ca077f1505Jason Monk SettingPref.TYPE_GLOBAL, KEY_ZEN_MODE, Global.ZEN_MODE, Global.ZEN_MODE_OFF, 89062f736c8bfda9ac6ac7476ad51e52ca077f1505Jason Monk Global.ZEN_MODE_OFF, Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS, 90062f736c8bfda9ac6ac7476ad51e52ca077f1505Jason Monk Global.ZEN_MODE_NO_INTERRUPTIONS) { 9107f7efba67a5f261fca31890a1b60f23021325f5John Spurlock protected String getCaption(Resources res, int value) { 9207f7efba67a5f261fca31890a1b60f23021325f5John Spurlock switch (value) { 9307f7efba67a5f261fca31890a1b60f23021325f5John Spurlock case Global.ZEN_MODE_NO_INTERRUPTIONS: 9407f7efba67a5f261fca31890a1b60f23021325f5John Spurlock return res.getString(R.string.zen_mode_option_no_interruptions); 9507f7efba67a5f261fca31890a1b60f23021325f5John Spurlock case Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS: 9607f7efba67a5f261fca31890a1b60f23021325f5John Spurlock return res.getString(R.string.zen_mode_option_important_interruptions); 9707f7efba67a5f261fca31890a1b60f23021325f5John Spurlock default: 9807f7efba67a5f261fca31890a1b60f23021325f5John Spurlock return res.getString(R.string.zen_mode_option_off); 9907f7efba67a5f261fca31890a1b60f23021325f5John Spurlock } 10007f7efba67a5f261fca31890a1b60f23021325f5John Spurlock } 10107f7efba67a5f261fca31890a1b60f23021325f5John Spurlock }; 10207f7efba67a5f261fca31890a1b60f23021325f5John Spurlock 10307f7efba67a5f261fca31890a1b60f23021325f5John Spurlock private static final SimpleDateFormat DAY_FORMAT = new SimpleDateFormat("EEE"); 10407f7efba67a5f261fca31890a1b60f23021325f5John Spurlock 10557c713d1d92f64a558115e5aff212ebc54a19151John Spurlock private static SparseArray<String> allKeyTitles(Context context) { 106ac1c42f5dcf43b4b7092d4d6ca0c9dbd4f9fbfdeJohn Spurlock final SparseArray<String> rt = new SparseArray<String>(); 10707f7efba67a5f261fca31890a1b60f23021325f5John Spurlock rt.put(R.string.zen_mode_important_category, KEY_IMPORTANT); 10857c713d1d92f64a558115e5aff212ebc54a19151John Spurlock if (Utils.isVoiceCapable(context)) { 10957c713d1d92f64a558115e5aff212ebc54a19151John Spurlock rt.put(R.string.zen_mode_phone_calls, KEY_CALLS); 11007f7efba67a5f261fca31890a1b60f23021325f5John Spurlock rt.put(R.string.zen_mode_option_title, KEY_ZEN_MODE); 11107f7efba67a5f261fca31890a1b60f23021325f5John Spurlock } else { 11207f7efba67a5f261fca31890a1b60f23021325f5John Spurlock rt.put(R.string.zen_mode_option_title_novoice, KEY_ZEN_MODE); 11357c713d1d92f64a558115e5aff212ebc54a19151John Spurlock } 114ac1c42f5dcf43b4b7092d4d6ca0c9dbd4f9fbfdeJohn Spurlock rt.put(R.string.zen_mode_messages, KEY_MESSAGES); 1157ad86dce1c1dd07bb06bd996b0daa6b059eeca21Chris Wren rt.put(R.string.zen_mode_from_starred, KEY_STARRED); 1167e90548836b3e7c4ec8132d9965ba11f055f6931John Spurlock rt.put(R.string.zen_mode_events, KEY_EVENTS); 11754612391878a2300fc44ea3f4befc171b3d5e737John Spurlock rt.put(R.string.zen_mode_alarm_info, KEY_ALARM_INFO); 11807f7efba67a5f261fca31890a1b60f23021325f5John Spurlock rt.put(R.string.zen_mode_downtime_category, KEY_DOWNTIME); 11907f7efba67a5f261fca31890a1b60f23021325f5John Spurlock rt.put(R.string.zen_mode_downtime_days, KEY_DAYS); 120ac1c42f5dcf43b4b7092d4d6ca0c9dbd4f9fbfdeJohn Spurlock rt.put(R.string.zen_mode_start_time, KEY_START_TIME); 121ac1c42f5dcf43b4b7092d4d6ca0c9dbd4f9fbfdeJohn Spurlock rt.put(R.string.zen_mode_end_time, KEY_END_TIME); 122ac1c42f5dcf43b4b7092d4d6ca0c9dbd4f9fbfdeJohn Spurlock rt.put(R.string.zen_mode_automation_category, KEY_AUTOMATION); 123ac1c42f5dcf43b4b7092d4d6ca0c9dbd4f9fbfdeJohn Spurlock rt.put(R.string.manage_condition_providers, KEY_CONDITION_PROVIDERS); 124ac1c42f5dcf43b4b7092d4d6ca0c9dbd4f9fbfdeJohn Spurlock return rt; 125ac1c42f5dcf43b4b7092d4d6ca0c9dbd4f9fbfdeJohn Spurlock } 126ac1c42f5dcf43b4b7092d4d6ca0c9dbd4f9fbfdeJohn Spurlock 1277f502bf824955b2b3a43f8f7f32c00cf00f736feJohn Spurlock private final Handler mHandler = new Handler(); 1287f502bf824955b2b3a43f8f7f32c00cf00f736feJohn Spurlock private final SettingsObserver mSettingsObserver = new SettingsObserver(); 1297f502bf824955b2b3a43f8f7f32c00cf00f736feJohn Spurlock 130cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock private Context mContext; 131c9afadb04b00598f5988101681089290cf14f79cJohn Spurlock private PackageManager mPM; 132cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock private ZenModeConfig mConfig; 133cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock private boolean mDisableListeners; 134cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock private SwitchPreference mCalls; 135cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock private SwitchPreference mMessages; 136cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock private DropDownPreference mStarred; 1377e90548836b3e7c4ec8132d9965ba11f055f6931John Spurlock private SwitchPreference mEvents; 13807f7efba67a5f261fca31890a1b60f23021325f5John Spurlock private Preference mDays; 139cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock private TimePickerPreference mStart; 140cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock private TimePickerPreference mEnd; 14123e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock private PreferenceCategory mAutomationCategory; 14223e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock private Preference mEntry; 143c9afadb04b00598f5988101681089290cf14f79cJohn Spurlock private Preference mConditionProviders; 144062f736c8bfda9ac6ac7476ad51e52ca077f1505Jason Monk private AlertDialog mDialog; 1457f502bf824955b2b3a43f8f7f32c00cf00f736feJohn Spurlock 1467f502bf824955b2b3a43f8f7f32c00cf00f736feJohn Spurlock @Override 14707f7efba67a5f261fca31890a1b60f23021325f5John Spurlock public void onCreate(Bundle savedInstanceState) { 14807f7efba67a5f261fca31890a1b60f23021325f5John Spurlock super.onCreate(savedInstanceState); 149c41dfb4f6ce5de287045ee97a55350ef7cc1a279John Spurlock mContext = getActivity(); 150c9afadb04b00598f5988101681089290cf14f79cJohn Spurlock mPM = mContext.getPackageManager(); 151cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock 152cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock addPreferencesFromResource(R.xml.zen_mode_settings); 153cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock final PreferenceScreen root = getPreferenceScreen(); 154cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock 155cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mConfig = getZenModeConfig(); 156cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock if (DEBUG) Log.d(TAG, "Loaded mConfig=" + mConfig); 157cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock 15807f7efba67a5f261fca31890a1b60f23021325f5John Spurlock final Preference zenMode = PREF_ZEN_MODE.init(this); 159062f736c8bfda9ac6ac7476ad51e52ca077f1505Jason Monk PREF_ZEN_MODE.setCallback(new SettingPrefWithCallback.Callback() { 160062f736c8bfda9ac6ac7476ad51e52ca077f1505Jason Monk @Override 161062f736c8bfda9ac6ac7476ad51e52ca077f1505Jason Monk public void onSettingSelected(int value) { 162062f736c8bfda9ac6ac7476ad51e52ca077f1505Jason Monk if (value != Global.ZEN_MODE_OFF) { 163062f736c8bfda9ac6ac7476ad51e52ca077f1505Jason Monk showConditionSelection(value); 164062f736c8bfda9ac6ac7476ad51e52ca077f1505Jason Monk } 165062f736c8bfda9ac6ac7476ad51e52ca077f1505Jason Monk } 166062f736c8bfda9ac6ac7476ad51e52ca077f1505Jason Monk }); 16707f7efba67a5f261fca31890a1b60f23021325f5John Spurlock if (!Utils.isVoiceCapable(mContext)) { 16807f7efba67a5f261fca31890a1b60f23021325f5John Spurlock zenMode.setTitle(R.string.zen_mode_option_title_novoice); 16907f7efba67a5f261fca31890a1b60f23021325f5John Spurlock } 170c41dfb4f6ce5de287045ee97a55350ef7cc1a279John Spurlock 17107f7efba67a5f261fca31890a1b60f23021325f5John Spurlock final PreferenceCategory important = 17207f7efba67a5f261fca31890a1b60f23021325f5John Spurlock (PreferenceCategory) root.findPreference(KEY_IMPORTANT); 173cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock 17407f7efba67a5f261fca31890a1b60f23021325f5John Spurlock mCalls = (SwitchPreference) important.findPreference(KEY_CALLS); 17557c713d1d92f64a558115e5aff212ebc54a19151John Spurlock if (Utils.isVoiceCapable(mContext)) { 17657c713d1d92f64a558115e5aff212ebc54a19151John Spurlock mCalls.setOnPreferenceChangeListener(new OnPreferenceChangeListener() { 17757c713d1d92f64a558115e5aff212ebc54a19151John Spurlock @Override 17857c713d1d92f64a558115e5aff212ebc54a19151John Spurlock public boolean onPreferenceChange(Preference preference, Object newValue) { 17957c713d1d92f64a558115e5aff212ebc54a19151John Spurlock if (mDisableListeners) return true; 18057c713d1d92f64a558115e5aff212ebc54a19151John Spurlock final boolean val = (Boolean) newValue; 18157c713d1d92f64a558115e5aff212ebc54a19151John Spurlock if (val == mConfig.allowCalls) return true; 18257c713d1d92f64a558115e5aff212ebc54a19151John Spurlock if (DEBUG) Log.d(TAG, "onPrefChange allowCalls=" + val); 18357c713d1d92f64a558115e5aff212ebc54a19151John Spurlock final ZenModeConfig newConfig = mConfig.copy(); 18457c713d1d92f64a558115e5aff212ebc54a19151John Spurlock newConfig.allowCalls = val; 18557c713d1d92f64a558115e5aff212ebc54a19151John Spurlock return setZenModeConfig(newConfig); 18657c713d1d92f64a558115e5aff212ebc54a19151John Spurlock } 18757c713d1d92f64a558115e5aff212ebc54a19151John Spurlock }); 18857c713d1d92f64a558115e5aff212ebc54a19151John Spurlock } else { 18907f7efba67a5f261fca31890a1b60f23021325f5John Spurlock important.removePreference(mCalls); 19057c713d1d92f64a558115e5aff212ebc54a19151John Spurlock mCalls = null; 19157c713d1d92f64a558115e5aff212ebc54a19151John Spurlock } 192cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock 19307f7efba67a5f261fca31890a1b60f23021325f5John Spurlock mMessages = (SwitchPreference) important.findPreference(KEY_MESSAGES); 194cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mMessages.setOnPreferenceChangeListener(new OnPreferenceChangeListener() { 195cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock @Override 196cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock public boolean onPreferenceChange(Preference preference, Object newValue) { 197cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock if (mDisableListeners) return true; 198cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock final boolean val = (Boolean) newValue; 199cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock if (val == mConfig.allowMessages) return true; 200cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock if (DEBUG) Log.d(TAG, "onPrefChange allowMessages=" + val); 201cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock final ZenModeConfig newConfig = mConfig.copy(); 202cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock newConfig.allowMessages = val; 203cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock return setZenModeConfig(newConfig); 204cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } 205cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock }); 206cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock 2078ef00dfe4b83cd4aa302946b9b986fa6b9921701John Spurlock mStarred = (DropDownPreference) important.findPreference(KEY_STARRED); 2087ad86dce1c1dd07bb06bd996b0daa6b059eeca21Chris Wren mStarred.addItem(R.string.zen_mode_from_anyone, ZenModeConfig.SOURCE_ANYONE); 2097ad86dce1c1dd07bb06bd996b0daa6b059eeca21Chris Wren mStarred.addItem(R.string.zen_mode_from_starred, ZenModeConfig.SOURCE_STAR); 2107ad86dce1c1dd07bb06bd996b0daa6b059eeca21Chris Wren mStarred.addItem(R.string.zen_mode_from_contacts, ZenModeConfig.SOURCE_CONTACT); 2117ad86dce1c1dd07bb06bd996b0daa6b059eeca21Chris Wren mStarred.setCallback(new DropDownPreference.Callback() { 2127ad86dce1c1dd07bb06bd996b0daa6b059eeca21Chris Wren @Override 2137ad86dce1c1dd07bb06bd996b0daa6b059eeca21Chris Wren public boolean onItemSelected(int pos, Object newValue) { 2147ad86dce1c1dd07bb06bd996b0daa6b059eeca21Chris Wren if (mDisableListeners) return true; 2157ad86dce1c1dd07bb06bd996b0daa6b059eeca21Chris Wren final int val = (Integer) newValue; 2167ad86dce1c1dd07bb06bd996b0daa6b059eeca21Chris Wren if (val == mConfig.allowFrom) return true; 2177ad86dce1c1dd07bb06bd996b0daa6b059eeca21Chris Wren if (DEBUG) Log.d(TAG, "onPrefChange allowFrom=" + 2187ad86dce1c1dd07bb06bd996b0daa6b059eeca21Chris Wren ZenModeConfig.sourceToString(val)); 2197ad86dce1c1dd07bb06bd996b0daa6b059eeca21Chris Wren final ZenModeConfig newConfig = mConfig.copy(); 2207ad86dce1c1dd07bb06bd996b0daa6b059eeca21Chris Wren newConfig.allowFrom = val; 2217ad86dce1c1dd07bb06bd996b0daa6b059eeca21Chris Wren return setZenModeConfig(newConfig); 2227ad86dce1c1dd07bb06bd996b0daa6b059eeca21Chris Wren } 2237ad86dce1c1dd07bb06bd996b0daa6b059eeca21Chris Wren }); 22407f7efba67a5f261fca31890a1b60f23021325f5John Spurlock important.addPreference(mStarred); 225cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock 2267e90548836b3e7c4ec8132d9965ba11f055f6931John Spurlock mEvents = (SwitchPreference) important.findPreference(KEY_EVENTS); 2277e90548836b3e7c4ec8132d9965ba11f055f6931John Spurlock mEvents.setOnPreferenceChangeListener(new OnPreferenceChangeListener() { 2287e90548836b3e7c4ec8132d9965ba11f055f6931John Spurlock @Override 2297e90548836b3e7c4ec8132d9965ba11f055f6931John Spurlock public boolean onPreferenceChange(Preference preference, Object newValue) { 2307e90548836b3e7c4ec8132d9965ba11f055f6931John Spurlock if (mDisableListeners) return true; 2317e90548836b3e7c4ec8132d9965ba11f055f6931John Spurlock final boolean val = (Boolean) newValue; 2327e90548836b3e7c4ec8132d9965ba11f055f6931John Spurlock if (val == mConfig.allowEvents) return true; 2337e90548836b3e7c4ec8132d9965ba11f055f6931John Spurlock if (DEBUG) Log.d(TAG, "onPrefChange allowEvents=" + val); 2347e90548836b3e7c4ec8132d9965ba11f055f6931John Spurlock final ZenModeConfig newConfig = mConfig.copy(); 2357e90548836b3e7c4ec8132d9965ba11f055f6931John Spurlock newConfig.allowEvents = val; 2367e90548836b3e7c4ec8132d9965ba11f055f6931John Spurlock return setZenModeConfig(newConfig); 2377e90548836b3e7c4ec8132d9965ba11f055f6931John Spurlock } 2387e90548836b3e7c4ec8132d9965ba11f055f6931John Spurlock }); 2397e90548836b3e7c4ec8132d9965ba11f055f6931John Spurlock 24007f7efba67a5f261fca31890a1b60f23021325f5John Spurlock final PreferenceCategory downtime = (PreferenceCategory) root.findPreference(KEY_DOWNTIME); 24107f7efba67a5f261fca31890a1b60f23021325f5John Spurlock 24207f7efba67a5f261fca31890a1b60f23021325f5John Spurlock mDays = downtime.findPreference(KEY_DAYS); 24307f7efba67a5f261fca31890a1b60f23021325f5John Spurlock mDays.setOnPreferenceClickListener(new OnPreferenceClickListener() { 244cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock @Override 24507f7efba67a5f261fca31890a1b60f23021325f5John Spurlock public boolean onPreferenceClick(Preference preference) { 24607f7efba67a5f261fca31890a1b60f23021325f5John Spurlock new AlertDialog.Builder(mContext) 24707f7efba67a5f261fca31890a1b60f23021325f5John Spurlock .setTitle(R.string.zen_mode_downtime_days) 24807f7efba67a5f261fca31890a1b60f23021325f5John Spurlock .setView(new ZenModeDowntimeDaysSelection(mContext, mConfig.sleepMode) { 24907f7efba67a5f261fca31890a1b60f23021325f5John Spurlock @Override 25007f7efba67a5f261fca31890a1b60f23021325f5John Spurlock protected void onChanged(String mode) { 25107f7efba67a5f261fca31890a1b60f23021325f5John Spurlock if (mDisableListeners) return; 25207f7efba67a5f261fca31890a1b60f23021325f5John Spurlock if (Objects.equals(mode, mConfig.sleepMode)) return; 25307f7efba67a5f261fca31890a1b60f23021325f5John Spurlock if (DEBUG) Log.d(TAG, "days.onChanged sleepMode=" + mode); 25407f7efba67a5f261fca31890a1b60f23021325f5John Spurlock final ZenModeConfig newConfig = mConfig.copy(); 25507f7efba67a5f261fca31890a1b60f23021325f5John Spurlock newConfig.sleepMode = mode; 25607f7efba67a5f261fca31890a1b60f23021325f5John Spurlock setZenModeConfig(newConfig); 25707f7efba67a5f261fca31890a1b60f23021325f5John Spurlock } 25807f7efba67a5f261fca31890a1b60f23021325f5John Spurlock }) 25907f7efba67a5f261fca31890a1b60f23021325f5John Spurlock .setOnDismissListener(new OnDismissListener() { 26007f7efba67a5f261fca31890a1b60f23021325f5John Spurlock @Override 26107f7efba67a5f261fca31890a1b60f23021325f5John Spurlock public void onDismiss(DialogInterface dialog) { 26207f7efba67a5f261fca31890a1b60f23021325f5John Spurlock updateDays(); 26307f7efba67a5f261fca31890a1b60f23021325f5John Spurlock } 26407f7efba67a5f261fca31890a1b60f23021325f5John Spurlock }) 26507f7efba67a5f261fca31890a1b60f23021325f5John Spurlock .setPositiveButton(R.string.done_button, null) 26607f7efba67a5f261fca31890a1b60f23021325f5John Spurlock .show(); 26707f7efba67a5f261fca31890a1b60f23021325f5John Spurlock return true; 268cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } 269cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock }); 270cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock 271cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock final FragmentManager mgr = getFragmentManager(); 272cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock 273cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mStart = new TimePickerPreference(mContext, mgr); 274ac1c42f5dcf43b4b7092d4d6ca0c9dbd4f9fbfdeJohn Spurlock mStart.setKey(KEY_START_TIME); 275cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mStart.setTitle(R.string.zen_mode_start_time); 276cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mStart.setCallback(new TimePickerPreference.Callback() { 277cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock @Override 278cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock public boolean onSetTime(int hour, int minute) { 279cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock if (mDisableListeners) return true; 280cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock if (!ZenModeConfig.isValidHour(hour)) return false; 281cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock if (!ZenModeConfig.isValidMinute(minute)) return false; 282cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock if (hour == mConfig.sleepStartHour && minute == mConfig.sleepStartMinute) { 283cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock return true; 284cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } 285cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock if (DEBUG) Log.d(TAG, "onPrefChange sleepStart h=" + hour + " m=" + minute); 286cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock final ZenModeConfig newConfig = mConfig.copy(); 287cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock newConfig.sleepStartHour = hour; 288cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock newConfig.sleepStartMinute = minute; 289cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock return setZenModeConfig(newConfig); 290cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } 291cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock }); 29207f7efba67a5f261fca31890a1b60f23021325f5John Spurlock downtime.addPreference(mStart); 29307f7efba67a5f261fca31890a1b60f23021325f5John Spurlock mStart.setDependency(mDays.getKey()); 294cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock 295cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mEnd = new TimePickerPreference(mContext, mgr); 296ac1c42f5dcf43b4b7092d4d6ca0c9dbd4f9fbfdeJohn Spurlock mEnd.setKey(KEY_END_TIME); 297cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mEnd.setTitle(R.string.zen_mode_end_time); 298cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mEnd.setCallback(new TimePickerPreference.Callback() { 299cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock @Override 300cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock public boolean onSetTime(int hour, int minute) { 301cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock if (mDisableListeners) return true; 302cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock if (!ZenModeConfig.isValidHour(hour)) return false; 303cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock if (!ZenModeConfig.isValidMinute(minute)) return false; 304cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock if (hour == mConfig.sleepEndHour && minute == mConfig.sleepEndMinute) { 305cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock return true; 306cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } 307cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock if (DEBUG) Log.d(TAG, "onPrefChange sleepEnd h=" + hour + " m=" + minute); 308cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock final ZenModeConfig newConfig = mConfig.copy(); 309cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock newConfig.sleepEndHour = hour; 310cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock newConfig.sleepEndMinute = minute; 311cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock return setZenModeConfig(newConfig); 312cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } 313cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock }); 31407f7efba67a5f261fca31890a1b60f23021325f5John Spurlock downtime.addPreference(mEnd); 31507f7efba67a5f261fca31890a1b60f23021325f5John Spurlock mEnd.setDependency(mDays.getKey()); 316cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock 31723e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock mAutomationCategory = (PreferenceCategory) findPreference(KEY_AUTOMATION); 31823e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock mEntry = findPreference(KEY_ENTRY); 31923e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock mEntry.setOnPreferenceClickListener(new OnPreferenceClickListener() { 32023e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock @Override 32123e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock public boolean onPreferenceClick(Preference preference) { 32223e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock new AlertDialog.Builder(mContext) 32323e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock .setTitle(R.string.zen_mode_entry_conditions_title) 32423e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock .setView(new ZenModeAutomaticConditionSelection(mContext)) 32523e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock .setOnDismissListener(new OnDismissListener() { 32623e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock @Override 32723e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock public void onDismiss(DialogInterface dialog) { 32823e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock refreshAutomationSection(); 32923e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock } 33023e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock }) 33123e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock .setPositiveButton(R.string.dlg_ok, null) 33223e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock .show(); 33323e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock return true; 33423e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock } 33523e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock }); 336c9afadb04b00598f5988101681089290cf14f79cJohn Spurlock mConditionProviders = findPreference(KEY_CONDITION_PROVIDERS); 337c9afadb04b00598f5988101681089290cf14f79cJohn Spurlock 338cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock updateControls(); 339cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } 340cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock 34107f7efba67a5f261fca31890a1b60f23021325f5John Spurlock private void updateDays() { 34207f7efba67a5f261fca31890a1b60f23021325f5John Spurlock if (mConfig != null) { 34307f7efba67a5f261fca31890a1b60f23021325f5John Spurlock final int[] days = ZenModeConfig.tryParseDays(mConfig.sleepMode); 34407f7efba67a5f261fca31890a1b60f23021325f5John Spurlock if (days != null && days.length != 0) { 34507f7efba67a5f261fca31890a1b60f23021325f5John Spurlock final StringBuilder sb = new StringBuilder(); 34607f7efba67a5f261fca31890a1b60f23021325f5John Spurlock final Calendar c = Calendar.getInstance(); 3471e7dbd455eade6e6d8f1abd7969dd096972ed84fJohn Spurlock for (int i = 0; i < DAYS.length; i++) { 3481e7dbd455eade6e6d8f1abd7969dd096972ed84fJohn Spurlock final int day = DAYS[i]; 34907f7efba67a5f261fca31890a1b60f23021325f5John Spurlock for (int j = 0; j < days.length; j++) { 35007f7efba67a5f261fca31890a1b60f23021325f5John Spurlock if (day == days[j]) { 35107f7efba67a5f261fca31890a1b60f23021325f5John Spurlock c.set(Calendar.DAY_OF_WEEK, day); 35207f7efba67a5f261fca31890a1b60f23021325f5John Spurlock if (sb.length() > 0) { 35307f7efba67a5f261fca31890a1b60f23021325f5John Spurlock sb.append(mContext.getString(R.string.summary_divider_text)); 35407f7efba67a5f261fca31890a1b60f23021325f5John Spurlock } 35507f7efba67a5f261fca31890a1b60f23021325f5John Spurlock sb.append(DAY_FORMAT.format(c.getTime())); 35607f7efba67a5f261fca31890a1b60f23021325f5John Spurlock break; 35707f7efba67a5f261fca31890a1b60f23021325f5John Spurlock } 35807f7efba67a5f261fca31890a1b60f23021325f5John Spurlock } 35907f7efba67a5f261fca31890a1b60f23021325f5John Spurlock } 36007f7efba67a5f261fca31890a1b60f23021325f5John Spurlock if (sb.length() > 0) { 36107f7efba67a5f261fca31890a1b60f23021325f5John Spurlock mDays.setSummary(sb); 36207f7efba67a5f261fca31890a1b60f23021325f5John Spurlock mDays.notifyDependencyChange(false); 36307f7efba67a5f261fca31890a1b60f23021325f5John Spurlock return; 36407f7efba67a5f261fca31890a1b60f23021325f5John Spurlock } 36507f7efba67a5f261fca31890a1b60f23021325f5John Spurlock } 36607f7efba67a5f261fca31890a1b60f23021325f5John Spurlock } 36707f7efba67a5f261fca31890a1b60f23021325f5John Spurlock mDays.setSummary(R.string.zen_mode_downtime_days_none); 36807f7efba67a5f261fca31890a1b60f23021325f5John Spurlock mDays.notifyDependencyChange(true); 36907f7efba67a5f261fca31890a1b60f23021325f5John Spurlock } 37007f7efba67a5f261fca31890a1b60f23021325f5John Spurlock 371c2f06e06c2fbe3192da4c48045058206649b902eJohn Spurlock private void updateEndSummary() { 372c2f06e06c2fbe3192da4c48045058206649b902eJohn Spurlock final int startMin = 60 * mConfig.sleepStartHour + mConfig.sleepStartMinute; 373c2f06e06c2fbe3192da4c48045058206649b902eJohn Spurlock final int endMin = 60 * mConfig.sleepEndHour + mConfig.sleepEndMinute; 374c2f06e06c2fbe3192da4c48045058206649b902eJohn Spurlock final boolean nextDay = startMin >= endMin; 375c2f06e06c2fbe3192da4c48045058206649b902eJohn Spurlock mEnd.setSummaryFormat(nextDay ? R.string.zen_mode_end_time_summary_format : 0); 376c2f06e06c2fbe3192da4c48045058206649b902eJohn Spurlock } 377c2f06e06c2fbe3192da4c48045058206649b902eJohn Spurlock 378cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock private void updateControls() { 379cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mDisableListeners = true; 38057c713d1d92f64a558115e5aff212ebc54a19151John Spurlock if (mCalls != null) { 38157c713d1d92f64a558115e5aff212ebc54a19151John Spurlock mCalls.setChecked(mConfig.allowCalls); 38257c713d1d92f64a558115e5aff212ebc54a19151John Spurlock } 383cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mMessages.setChecked(mConfig.allowMessages); 3847ad86dce1c1dd07bb06bd996b0daa6b059eeca21Chris Wren mStarred.setSelectedValue(mConfig.allowFrom); 3857e90548836b3e7c4ec8132d9965ba11f055f6931John Spurlock mEvents.setChecked(mConfig.allowEvents); 386de99ccf18b6f8810f2743b5b9fef513304d0ed4fJohn Spurlock updateStarredEnabled(); 38707f7efba67a5f261fca31890a1b60f23021325f5John Spurlock updateDays(); 388cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mStart.setTime(mConfig.sleepStartHour, mConfig.sleepStartMinute); 389cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mEnd.setTime(mConfig.sleepEndHour, mConfig.sleepEndMinute); 390cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mDisableListeners = false; 39104a73fe3c0810075b6bf7ec6105baaa9bff4e667John Spurlock refreshAutomationSection(); 392c2f06e06c2fbe3192da4c48045058206649b902eJohn Spurlock updateEndSummary(); 3937f502bf824955b2b3a43f8f7f32c00cf00f736feJohn Spurlock } 3947f502bf824955b2b3a43f8f7f32c00cf00f736feJohn Spurlock 395de99ccf18b6f8810f2743b5b9fef513304d0ed4fJohn Spurlock private void updateStarredEnabled() { 396de99ccf18b6f8810f2743b5b9fef513304d0ed4fJohn Spurlock mStarred.setEnabled(mConfig.allowCalls || mConfig.allowMessages); 397de99ccf18b6f8810f2743b5b9fef513304d0ed4fJohn Spurlock } 398de99ccf18b6f8810f2743b5b9fef513304d0ed4fJohn Spurlock 39923e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock private void refreshAutomationSection() { 400c9afadb04b00598f5988101681089290cf14f79cJohn Spurlock if (mConditionProviders != null) { 401c9afadb04b00598f5988101681089290cf14f79cJohn Spurlock final int total = ConditionProviderSettings.getProviderCount(mPM); 402c9afadb04b00598f5988101681089290cf14f79cJohn Spurlock if (total == 0) { 40323e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock getPreferenceScreen().removePreference(mAutomationCategory); 404c9afadb04b00598f5988101681089290cf14f79cJohn Spurlock } else { 405c9afadb04b00598f5988101681089290cf14f79cJohn Spurlock final int n = ConditionProviderSettings.getEnabledProviderCount(mContext); 406c9afadb04b00598f5988101681089290cf14f79cJohn Spurlock if (n == 0) { 407c9afadb04b00598f5988101681089290cf14f79cJohn Spurlock mConditionProviders.setSummary(getResources().getString( 408c9afadb04b00598f5988101681089290cf14f79cJohn Spurlock R.string.manage_condition_providers_summary_zero)); 409c9afadb04b00598f5988101681089290cf14f79cJohn Spurlock } else { 410c9afadb04b00598f5988101681089290cf14f79cJohn Spurlock mConditionProviders.setSummary(String.format(getResources().getQuantityString( 411c9afadb04b00598f5988101681089290cf14f79cJohn Spurlock R.plurals.manage_condition_providers_summary_nonzero, 412c9afadb04b00598f5988101681089290cf14f79cJohn Spurlock n, n))); 413c9afadb04b00598f5988101681089290cf14f79cJohn Spurlock } 41423e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock final String entrySummary = getEntryConditionSummary(); 41523e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock if (n == 0 || entrySummary == null) { 41623e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock mEntry.setSummary(R.string.zen_mode_entry_conditions_summary_none); 41723e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock } else { 41823e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock mEntry.setSummary(entrySummary); 41923e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock } 420c9afadb04b00598f5988101681089290cf14f79cJohn Spurlock } 421c9afadb04b00598f5988101681089290cf14f79cJohn Spurlock } 422c9afadb04b00598f5988101681089290cf14f79cJohn Spurlock } 42323e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock 42423e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock private String getEntryConditionSummary() { 42523e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock final INotificationManager nm = INotificationManager.Stub.asInterface( 42623e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock ServiceManager.getService(Context.NOTIFICATION_SERVICE)); 42723e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock try { 42823e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock final Condition[] automatic = nm.getAutomaticZenModeConditions(); 42923e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock if (automatic == null || automatic.length == 0) { 43023e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock return null; 43123e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock } 43281bef1d74568d623b9db3c5409740dc21c0bbc08John Spurlock final String divider = getString(R.string.summary_divider_text); 43323e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock final StringBuilder sb = new StringBuilder(); 43423e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock for (int i = 0; i < automatic.length; i++) { 43523e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock if (i > 0) sb.append(divider); 4360e0122a9999eb1a603c99be12846acad29ed0593John Spurlock sb.append(automatic[i].summary); 43723e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock } 43823e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock return sb.toString(); 43923e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock } catch (Exception e) { 44023e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock Log.w(TAG, "Error calling getAutomaticZenModeConditions", e); 44123e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock return null; 44223e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock } 44323e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock } 44423e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock 4457f502bf824955b2b3a43f8f7f32c00cf00f736feJohn Spurlock @Override 4467f502bf824955b2b3a43f8f7f32c00cf00f736feJohn Spurlock public void onResume() { 4477f502bf824955b2b3a43f8f7f32c00cf00f736feJohn Spurlock super.onResume(); 44804a73fe3c0810075b6bf7ec6105baaa9bff4e667John Spurlock updateControls(); 4497f502bf824955b2b3a43f8f7f32c00cf00f736feJohn Spurlock mSettingsObserver.register(); 4503726525d50d480a3d954c103a844f0c4b3c7d3e0John Spurlock } 4513726525d50d480a3d954c103a844f0c4b3c7d3e0John Spurlock 4523726525d50d480a3d954c103a844f0c4b3c7d3e0John Spurlock @Override 4533726525d50d480a3d954c103a844f0c4b3c7d3e0John Spurlock public void onPause() { 4543726525d50d480a3d954c103a844f0c4b3c7d3e0John Spurlock super.onPause(); 4553726525d50d480a3d954c103a844f0c4b3c7d3e0John Spurlock mSettingsObserver.unregister(); 456138ff8c0457c6e1345015973668d652fa17c7c3bFabrice Di Meglio } 457138ff8c0457c6e1345015973668d652fa17c7c3bFabrice Di Meglio 458cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock private void updateZenModeConfig() { 459cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock final ZenModeConfig config = getZenModeConfig(); 460cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock if (Objects.equals(config, mConfig)) return; 46104a73fe3c0810075b6bf7ec6105baaa9bff4e667John Spurlock mConfig = config; 46204a73fe3c0810075b6bf7ec6105baaa9bff4e667John Spurlock if (DEBUG) Log.d(TAG, "updateZenModeConfig mConfig=" + mConfig); 463cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock updateControls(); 46472438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock } 46572438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock 466cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock private ZenModeConfig getZenModeConfig() { 467cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock final INotificationManager nm = INotificationManager.Stub.asInterface( 468cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock ServiceManager.getService(Context.NOTIFICATION_SERVICE)); 469cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock try { 470cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock return nm.getZenModeConfig(); 471cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } catch (Exception e) { 472cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock Log.w(TAG, "Error calling NoMan", e); 473cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock return new ZenModeConfig(); 474cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } 475cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } 476cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock 477cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock private boolean setZenModeConfig(ZenModeConfig config) { 478cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock final INotificationManager nm = INotificationManager.Stub.asInterface( 479cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock ServiceManager.getService(Context.NOTIFICATION_SERVICE)); 480cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock try { 481cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock final boolean success = nm.setZenModeConfig(config); 482cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock if (success) { 483cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mConfig = config; 484cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock if (DEBUG) Log.d(TAG, "Saved mConfig=" + mConfig); 485c2f06e06c2fbe3192da4c48045058206649b902eJohn Spurlock updateEndSummary(); 486de99ccf18b6f8810f2743b5b9fef513304d0ed4fJohn Spurlock updateStarredEnabled(); 487cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } 488cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock return success; 489cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } catch (Exception e) { 490cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock Log.w(TAG, "Error calling NoMan", e); 491cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock return false; 492cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } 49372438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock } 49472438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock 495623a0e9f45c294ea7e714295f41ba2d8bcd7b32eJohn Spurlock protected void putZenModeSetting(int value) { 496623a0e9f45c294ea7e714295f41ba2d8bcd7b32eJohn Spurlock Global.putInt(getContentResolver(), Global.ZEN_MODE, value); 497623a0e9f45c294ea7e714295f41ba2d8bcd7b32eJohn Spurlock } 498623a0e9f45c294ea7e714295f41ba2d8bcd7b32eJohn Spurlock 499062f736c8bfda9ac6ac7476ad51e52ca077f1505Jason Monk protected void showConditionSelection(final int newSettingsValue) { 500062f736c8bfda9ac6ac7476ad51e52ca077f1505Jason Monk if (mDialog != null) return; 501062f736c8bfda9ac6ac7476ad51e52ca077f1505Jason Monk 502062f736c8bfda9ac6ac7476ad51e52ca077f1505Jason Monk final ZenModeConditionSelection zenModeConditionSelection = 503062f736c8bfda9ac6ac7476ad51e52ca077f1505Jason Monk new ZenModeConditionSelection(mContext); 504062f736c8bfda9ac6ac7476ad51e52ca077f1505Jason Monk DialogInterface.OnClickListener positiveListener = new DialogInterface.OnClickListener() { 505062f736c8bfda9ac6ac7476ad51e52ca077f1505Jason Monk @Override 506062f736c8bfda9ac6ac7476ad51e52ca077f1505Jason Monk public void onClick(DialogInterface dialog, int which) { 507062f736c8bfda9ac6ac7476ad51e52ca077f1505Jason Monk zenModeConditionSelection.confirmCondition(); 508062f736c8bfda9ac6ac7476ad51e52ca077f1505Jason Monk mDialog = null; 509062f736c8bfda9ac6ac7476ad51e52ca077f1505Jason Monk } 510062f736c8bfda9ac6ac7476ad51e52ca077f1505Jason Monk }; 511062f736c8bfda9ac6ac7476ad51e52ca077f1505Jason Monk final int oldSettingsValue = PREF_ZEN_MODE.getValue(mContext); 512062f736c8bfda9ac6ac7476ad51e52ca077f1505Jason Monk ScrollView scrollView = new ScrollView(mContext); 513062f736c8bfda9ac6ac7476ad51e52ca077f1505Jason Monk scrollView.addView(zenModeConditionSelection); 514062f736c8bfda9ac6ac7476ad51e52ca077f1505Jason Monk mDialog = new AlertDialog.Builder(getActivity()) 515062f736c8bfda9ac6ac7476ad51e52ca077f1505Jason Monk .setTitle(PREF_ZEN_MODE.getCaption(getResources(), newSettingsValue)) 516062f736c8bfda9ac6ac7476ad51e52ca077f1505Jason Monk .setView(scrollView) 517062f736c8bfda9ac6ac7476ad51e52ca077f1505Jason Monk .setPositiveButton(R.string.okay, positiveListener) 518062f736c8bfda9ac6ac7476ad51e52ca077f1505Jason Monk .setNegativeButton(R.string.cancel_all_caps, new DialogInterface.OnClickListener() { 519062f736c8bfda9ac6ac7476ad51e52ca077f1505Jason Monk @Override 520062f736c8bfda9ac6ac7476ad51e52ca077f1505Jason Monk public void onClick(DialogInterface dialog, int which) { 521062f736c8bfda9ac6ac7476ad51e52ca077f1505Jason Monk cancelDialog(oldSettingsValue); 522062f736c8bfda9ac6ac7476ad51e52ca077f1505Jason Monk } 523062f736c8bfda9ac6ac7476ad51e52ca077f1505Jason Monk }) 524062f736c8bfda9ac6ac7476ad51e52ca077f1505Jason Monk .setOnCancelListener(new DialogInterface.OnCancelListener() { 525062f736c8bfda9ac6ac7476ad51e52ca077f1505Jason Monk @Override 526062f736c8bfda9ac6ac7476ad51e52ca077f1505Jason Monk public void onCancel(DialogInterface dialog) { 527062f736c8bfda9ac6ac7476ad51e52ca077f1505Jason Monk cancelDialog(oldSettingsValue); 528062f736c8bfda9ac6ac7476ad51e52ca077f1505Jason Monk } 529062f736c8bfda9ac6ac7476ad51e52ca077f1505Jason Monk }).create(); 530062f736c8bfda9ac6ac7476ad51e52ca077f1505Jason Monk mDialog.show(); 531062f736c8bfda9ac6ac7476ad51e52ca077f1505Jason Monk } 532062f736c8bfda9ac6ac7476ad51e52ca077f1505Jason Monk 533062f736c8bfda9ac6ac7476ad51e52ca077f1505Jason Monk protected void cancelDialog(int oldSettingsValue) { 534062f736c8bfda9ac6ac7476ad51e52ca077f1505Jason Monk // If not making a decision, reset drop down to current setting. 535062f736c8bfda9ac6ac7476ad51e52ca077f1505Jason Monk PREF_ZEN_MODE.setValueWithoutCallback(mContext, oldSettingsValue); 536062f736c8bfda9ac6ac7476ad51e52ca077f1505Jason Monk mDialog = null; 537623a0e9f45c294ea7e714295f41ba2d8bcd7b32eJohn Spurlock } 538623a0e9f45c294ea7e714295f41ba2d8bcd7b32eJohn Spurlock 539cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock // Enable indexing of searchable data 540cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock public static final Indexable.SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER = 541cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock new BaseSearchIndexProvider() { 542cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock @Override 543cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock public List<SearchIndexableRaw> getRawDataToIndex(Context context, boolean enabled) { 54457c713d1d92f64a558115e5aff212ebc54a19151John Spurlock final SparseArray<String> keyTitles = allKeyTitles(context); 54557c713d1d92f64a558115e5aff212ebc54a19151John Spurlock final int N = keyTitles.size(); 546ac1c42f5dcf43b4b7092d4d6ca0c9dbd4f9fbfdeJohn Spurlock final List<SearchIndexableRaw> result = new ArrayList<SearchIndexableRaw>(N); 547cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock final Resources res = context.getResources(); 548ac1c42f5dcf43b4b7092d4d6ca0c9dbd4f9fbfdeJohn Spurlock for (int i = 0; i < N; i++) { 549ac1c42f5dcf43b4b7092d4d6ca0c9dbd4f9fbfdeJohn Spurlock final SearchIndexableRaw data = new SearchIndexableRaw(context); 55057c713d1d92f64a558115e5aff212ebc54a19151John Spurlock data.key = keyTitles.valueAt(i); 55157c713d1d92f64a558115e5aff212ebc54a19151John Spurlock data.title = res.getString(keyTitles.keyAt(i)); 552ac1c42f5dcf43b4b7092d4d6ca0c9dbd4f9fbfdeJohn Spurlock data.screenTitle = res.getString(R.string.zen_mode_settings_title); 553ac1c42f5dcf43b4b7092d4d6ca0c9dbd4f9fbfdeJohn Spurlock result.add(data); 554ac1c42f5dcf43b4b7092d4d6ca0c9dbd4f9fbfdeJohn Spurlock } 555ac1c42f5dcf43b4b7092d4d6ca0c9dbd4f9fbfdeJohn Spurlock return result; 556cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } 55757c713d1d92f64a558115e5aff212ebc54a19151John Spurlock 55857c713d1d92f64a558115e5aff212ebc54a19151John Spurlock public List<String> getNonIndexableKeys(Context context) { 55957c713d1d92f64a558115e5aff212ebc54a19151John Spurlock final ArrayList<String> rt = new ArrayList<String>(); 56057c713d1d92f64a558115e5aff212ebc54a19151John Spurlock if (!Utils.isVoiceCapable(context)) { 56157c713d1d92f64a558115e5aff212ebc54a19151John Spurlock rt.add(KEY_CALLS); 56257c713d1d92f64a558115e5aff212ebc54a19151John Spurlock } 56357c713d1d92f64a558115e5aff212ebc54a19151John Spurlock return rt; 56457c713d1d92f64a558115e5aff212ebc54a19151John Spurlock } 565cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock }; 56672438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock 567062f736c8bfda9ac6ac7476ad51e52ca077f1505Jason Monk private static class SettingPrefWithCallback extends SettingPref { 568062f736c8bfda9ac6ac7476ad51e52ca077f1505Jason Monk 569062f736c8bfda9ac6ac7476ad51e52ca077f1505Jason Monk private Callback mCallback; 570062f736c8bfda9ac6ac7476ad51e52ca077f1505Jason Monk private int mValue; 571062f736c8bfda9ac6ac7476ad51e52ca077f1505Jason Monk 572062f736c8bfda9ac6ac7476ad51e52ca077f1505Jason Monk public SettingPrefWithCallback(int type, String key, String setting, int def, 573062f736c8bfda9ac6ac7476ad51e52ca077f1505Jason Monk int... values) { 574062f736c8bfda9ac6ac7476ad51e52ca077f1505Jason Monk super(type, key, setting, def, values); 575062f736c8bfda9ac6ac7476ad51e52ca077f1505Jason Monk } 576062f736c8bfda9ac6ac7476ad51e52ca077f1505Jason Monk 577062f736c8bfda9ac6ac7476ad51e52ca077f1505Jason Monk public void setCallback(Callback callback) { 578062f736c8bfda9ac6ac7476ad51e52ca077f1505Jason Monk mCallback = callback; 579062f736c8bfda9ac6ac7476ad51e52ca077f1505Jason Monk } 580062f736c8bfda9ac6ac7476ad51e52ca077f1505Jason Monk 581062f736c8bfda9ac6ac7476ad51e52ca077f1505Jason Monk @Override 582062f736c8bfda9ac6ac7476ad51e52ca077f1505Jason Monk public void update(Context context) { 583062f736c8bfda9ac6ac7476ad51e52ca077f1505Jason Monk // Avoid callbacks from non-user changes. 584062f736c8bfda9ac6ac7476ad51e52ca077f1505Jason Monk mValue = getValue(context); 585062f736c8bfda9ac6ac7476ad51e52ca077f1505Jason Monk super.update(context); 586062f736c8bfda9ac6ac7476ad51e52ca077f1505Jason Monk } 587062f736c8bfda9ac6ac7476ad51e52ca077f1505Jason Monk 588062f736c8bfda9ac6ac7476ad51e52ca077f1505Jason Monk @Override 589062f736c8bfda9ac6ac7476ad51e52ca077f1505Jason Monk protected boolean setSetting(Context context, int value) { 590062f736c8bfda9ac6ac7476ad51e52ca077f1505Jason Monk if (value == mValue) return true; 591062f736c8bfda9ac6ac7476ad51e52ca077f1505Jason Monk mValue = value; 592062f736c8bfda9ac6ac7476ad51e52ca077f1505Jason Monk if (mCallback != null) { 593062f736c8bfda9ac6ac7476ad51e52ca077f1505Jason Monk mCallback.onSettingSelected(value); 594062f736c8bfda9ac6ac7476ad51e52ca077f1505Jason Monk } 595062f736c8bfda9ac6ac7476ad51e52ca077f1505Jason Monk return super.setSetting(context, value); 596062f736c8bfda9ac6ac7476ad51e52ca077f1505Jason Monk } 597062f736c8bfda9ac6ac7476ad51e52ca077f1505Jason Monk 598062f736c8bfda9ac6ac7476ad51e52ca077f1505Jason Monk @Override 599062f736c8bfda9ac6ac7476ad51e52ca077f1505Jason Monk public Preference init(SettingsPreferenceFragment settings) { 600062f736c8bfda9ac6ac7476ad51e52ca077f1505Jason Monk Preference ret = super.init(settings); 601062f736c8bfda9ac6ac7476ad51e52ca077f1505Jason Monk mValue = getValue(settings.getActivity()); 602062f736c8bfda9ac6ac7476ad51e52ca077f1505Jason Monk 603062f736c8bfda9ac6ac7476ad51e52ca077f1505Jason Monk return ret; 604062f736c8bfda9ac6ac7476ad51e52ca077f1505Jason Monk } 605062f736c8bfda9ac6ac7476ad51e52ca077f1505Jason Monk 606062f736c8bfda9ac6ac7476ad51e52ca077f1505Jason Monk public boolean setValueWithoutCallback(Context context, int value) { 607062f736c8bfda9ac6ac7476ad51e52ca077f1505Jason Monk // Set the current value ahead of time, this way we won't trigger a callback. 608062f736c8bfda9ac6ac7476ad51e52ca077f1505Jason Monk mValue = value; 609062f736c8bfda9ac6ac7476ad51e52ca077f1505Jason Monk return putInt(mType, context.getContentResolver(), mSetting, value); 610062f736c8bfda9ac6ac7476ad51e52ca077f1505Jason Monk } 611062f736c8bfda9ac6ac7476ad51e52ca077f1505Jason Monk 612062f736c8bfda9ac6ac7476ad51e52ca077f1505Jason Monk public int getValue(Context context) { 613062f736c8bfda9ac6ac7476ad51e52ca077f1505Jason Monk return getInt(mType, context.getContentResolver(), mSetting, mDefault); 614062f736c8bfda9ac6ac7476ad51e52ca077f1505Jason Monk } 615062f736c8bfda9ac6ac7476ad51e52ca077f1505Jason Monk 616062f736c8bfda9ac6ac7476ad51e52ca077f1505Jason Monk public interface Callback { 617062f736c8bfda9ac6ac7476ad51e52ca077f1505Jason Monk void onSettingSelected(int value); 618062f736c8bfda9ac6ac7476ad51e52ca077f1505Jason Monk } 619062f736c8bfda9ac6ac7476ad51e52ca077f1505Jason Monk } 620062f736c8bfda9ac6ac7476ad51e52ca077f1505Jason Monk 621cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock private final class SettingsObserver extends ContentObserver { 622cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock private final Uri ZEN_MODE_URI = Global.getUriFor(Global.ZEN_MODE); 623cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock private final Uri ZEN_MODE_CONFIG_ETAG_URI = Global.getUriFor(Global.ZEN_MODE_CONFIG_ETAG); 62472438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock 625cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock public SettingsObserver() { 626cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock super(mHandler); 62772438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock } 62872438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock 629cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock public void register() { 630cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock getContentResolver().registerContentObserver(ZEN_MODE_URI, false, this); 631cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock getContentResolver().registerContentObserver(ZEN_MODE_CONFIG_ETAG_URI, false, this); 63272438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock } 63372438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock 634cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock public void unregister() { 635cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock getContentResolver().unregisterContentObserver(this); 63672438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock } 63772438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock 638cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock @Override 639cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock public void onChange(boolean selfChange, Uri uri) { 640cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock super.onChange(selfChange, uri); 641cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock if (ZEN_MODE_URI.equals(uri)) { 64207f7efba67a5f261fca31890a1b60f23021325f5John Spurlock PREF_ZEN_MODE.update(mContext); 643cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } 644cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock if (ZEN_MODE_CONFIG_ETAG_URI.equals(uri)) { 645cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock updateZenModeConfig(); 646cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } 64772438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock } 648cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } 64972438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock 650cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock private static class TimePickerPreference extends Preference { 651cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock private final Context mContext; 65272438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock 653cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock private int mSummaryFormat; 654cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock private int mHourOfDay; 655cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock private int mMinute; 656cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock private Callback mCallback; 657cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock 658cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock public TimePickerPreference(Context context, final FragmentManager mgr) { 659cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock super(context); 660cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mContext = context; 661cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock setPersistent(false); 662cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock setOnPreferenceClickListener(new OnPreferenceClickListener(){ 663cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock @Override 664cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock public boolean onPreferenceClick(Preference preference) { 665cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock final TimePickerFragment frag = new TimePickerFragment(); 666cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock frag.pref = TimePickerPreference.this; 667cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock frag.show(mgr, TimePickerPreference.class.getName()); 668cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock return true; 669cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } 670cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock }); 67172438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock } 67272438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock 673cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock public void setCallback(Callback callback) { 674cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mCallback = callback; 67572438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock } 67672438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock 677cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock public void setSummaryFormat(int resId) { 678cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mSummaryFormat = resId; 679cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock updateSummary(); 680cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } 68172438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock 682cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock public void setTime(int hourOfDay, int minute) { 683cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock if (mCallback != null && !mCallback.onSetTime(hourOfDay, minute)) return; 684cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mHourOfDay = hourOfDay; 685cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mMinute = minute; 686cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock updateSummary(); 687cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } 68872438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock 689cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock private void updateSummary() { 690cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock final Calendar c = Calendar.getInstance(); 691cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock c.set(Calendar.HOUR_OF_DAY, mHourOfDay); 692cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock c.set(Calendar.MINUTE, mMinute); 693cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock String time = DateFormat.getTimeFormat(mContext).format(c.getTime()); 694cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock if (mSummaryFormat != 0) { 695cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock time = mContext.getResources().getString(mSummaryFormat, time); 69672438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock } 697cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock setSummary(time); 69872438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock } 699019b87f17a51fef7fd4b6696dbea5c50fe8b6d07Fabrice Di Meglio 700cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock public static class TimePickerFragment extends DialogFragment implements 701cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock TimePickerDialog.OnTimeSetListener { 702cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock public TimePickerPreference pref; 703019b87f17a51fef7fd4b6696dbea5c50fe8b6d07Fabrice Di Meglio 704cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock @Override 705cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock public Dialog onCreateDialog(Bundle savedInstanceState) { 706cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock final boolean usePref = pref != null && pref.mHourOfDay >= 0 && pref.mMinute >= 0; 707cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock final Calendar c = Calendar.getInstance(); 708cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock final int hour = usePref ? pref.mHourOfDay : c.get(Calendar.HOUR_OF_DAY); 709cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock final int minute = usePref ? pref.mMinute : c.get(Calendar.MINUTE); 710cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock return new TimePickerDialog(getActivity(), this, hour, minute, 711cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock DateFormat.is24HourFormat(getActivity())); 712cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } 713019b87f17a51fef7fd4b6696dbea5c50fe8b6d07Fabrice Di Meglio 714cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock public void onTimeSet(TimePicker view, int hourOfDay, int minute) { 715cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock if (pref != null) { 716cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock pref.setTime(hourOfDay, minute); 717cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } 718cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } 719cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } 720019b87f17a51fef7fd4b6696dbea5c50fe8b6d07Fabrice Di Meglio 721cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock public interface Callback { 722cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock boolean onSetTime(int hour, int minute); 723cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } 724cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } 72572438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock} 726