ZenModeSettings.java revision 81bef1d74568d623b9db3c5409740dc21c0bbc08
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; 3172438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlockimport android.graphics.Typeface; 327f502bf824955b2b3a43f8f7f32c00cf00f736feJohn Spurlockimport android.net.Uri; 337f502bf824955b2b3a43f8f7f32c00cf00f736feJohn Spurlockimport android.os.AsyncTask; 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; 4872438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlockimport android.view.View; 4972438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlockimport android.view.ViewGroup; 508fb5d4a0ea6408809e00875df049bec117ec27f5Fabrice Di Meglioimport android.widget.Switch; 5172438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlockimport android.widget.TextView; 52cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlockimport android.widget.TimePicker; 534a35051565b0ce6d29313c3e4ffe19e1dde78db0John Spurlock 544a35051565b0ce6d29313c3e4ffe19e1dde78db0John Spurlockimport com.android.settings.R; 558fb5d4a0ea6408809e00875df049bec117ec27f5Fabrice Di Meglioimport com.android.settings.SettingsActivity; 564a35051565b0ce6d29313c3e4ffe19e1dde78db0John Spurlockimport com.android.settings.SettingsPreferenceFragment; 57cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlockimport com.android.settings.search.BaseSearchIndexProvider; 58019b87f17a51fef7fd4b6696dbea5c50fe8b6d07Fabrice Di Meglioimport com.android.settings.search.Indexable; 59019b87f17a51fef7fd4b6696dbea5c50fe8b6d07Fabrice Di Meglioimport com.android.settings.search.SearchIndexableRaw; 608fb5d4a0ea6408809e00875df049bec117ec27f5Fabrice Di Meglioimport com.android.settings.widget.SwitchBar; 6172438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock 62019b87f17a51fef7fd4b6696dbea5c50fe8b6d07Fabrice Di Meglioimport java.util.ArrayList; 63cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlockimport java.util.Calendar; 64019b87f17a51fef7fd4b6696dbea5c50fe8b6d07Fabrice Di Meglioimport java.util.List; 65cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlockimport java.util.Objects; 66019b87f17a51fef7fd4b6696dbea5c50fe8b6d07Fabrice Di Meglio 678fb5d4a0ea6408809e00875df049bec117ec27f5Fabrice Di Megliopublic class ZenModeSettings extends SettingsPreferenceFragment implements Indexable, 688fb5d4a0ea6408809e00875df049bec117ec27f5Fabrice Di Meglio SwitchBar.OnSwitchChangeListener { 6972438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock private static final String TAG = "ZenModeSettings"; 70cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock private static final boolean DEBUG = true; 71cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock 72cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock private static final String KEY_GENERAL = "general"; 73cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock private static final String KEY_CALLS = "phone_calls"; 74cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock private static final String KEY_MESSAGES = "messages"; 75cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock 76cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock private static final String KEY_AUTOMATIC = "automatic"; 77cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock private static final String KEY_WHEN = "when"; 7872438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock 7923e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock private static final String KEY_AUTOMATION = "automation"; 8023e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock private static final String KEY_ENTRY = "entry"; 81c9afadb04b00598f5988101681089290cf14f79cJohn Spurlock private static final String KEY_CONDITION_PROVIDERS = "manage_condition_providers"; 82c9afadb04b00598f5988101681089290cf14f79cJohn Spurlock 837f502bf824955b2b3a43f8f7f32c00cf00f736feJohn Spurlock private final Handler mHandler = new Handler(); 847f502bf824955b2b3a43f8f7f32c00cf00f736feJohn Spurlock private final SettingsObserver mSettingsObserver = new SettingsObserver(); 857f502bf824955b2b3a43f8f7f32c00cf00f736feJohn Spurlock 868fb5d4a0ea6408809e00875df049bec117ec27f5Fabrice Di Meglio private SwitchBar mSwitchBar; 878fb5d4a0ea6408809e00875df049bec117ec27f5Fabrice Di Meglio private Switch mSwitch; 88cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock private Context mContext; 89c9afadb04b00598f5988101681089290cf14f79cJohn Spurlock private PackageManager mPM; 90cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock private ZenModeConfig mConfig; 91cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock private boolean mDisableListeners; 92cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock private SwitchPreference mCalls; 93cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock private SwitchPreference mMessages; 94cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock private DropDownPreference mStarred; 95cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock private DropDownPreference mWhen; 96cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock private TimePickerPreference mStart; 97cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock private TimePickerPreference mEnd; 9823e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock private PreferenceCategory mAutomationCategory; 9923e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock private Preference mEntry; 100c9afadb04b00598f5988101681089290cf14f79cJohn Spurlock private Preference mConditionProviders; 101623a0e9f45c294ea7e714295f41ba2d8bcd7b32eJohn Spurlock private AlertDialog mDialog; 10204a73fe3c0810075b6bf7ec6105baaa9bff4e667John Spurlock private boolean mIgnoreNext; 1037f502bf824955b2b3a43f8f7f32c00cf00f736feJohn Spurlock 1047f502bf824955b2b3a43f8f7f32c00cf00f736feJohn Spurlock @Override 1058fb5d4a0ea6408809e00875df049bec117ec27f5Fabrice Di Meglio public void onSwitchChanged(Switch switchView, final boolean isChecked) { 1068fb5d4a0ea6408809e00875df049bec117ec27f5Fabrice Di Meglio if (DEBUG) Log.d(TAG, "onPreferenceChange isChecked=" + isChecked 1078fb5d4a0ea6408809e00875df049bec117ec27f5Fabrice Di Meglio + " mIgnoreNext=" + mIgnoreNext); 1088fb5d4a0ea6408809e00875df049bec117ec27f5Fabrice Di Meglio if (mIgnoreNext) { 1098fb5d4a0ea6408809e00875df049bec117ec27f5Fabrice Di Meglio mIgnoreNext = false; 1108fb5d4a0ea6408809e00875df049bec117ec27f5Fabrice Di Meglio } 1118fb5d4a0ea6408809e00875df049bec117ec27f5Fabrice Di Meglio AsyncTask.execute(new Runnable() { 1128fb5d4a0ea6408809e00875df049bec117ec27f5Fabrice Di Meglio @Override 1138fb5d4a0ea6408809e00875df049bec117ec27f5Fabrice Di Meglio public void run() { 1148fb5d4a0ea6408809e00875df049bec117ec27f5Fabrice Di Meglio final int v = isChecked ? Global.ZEN_MODE_ON : Global.ZEN_MODE_OFF; 1158fb5d4a0ea6408809e00875df049bec117ec27f5Fabrice Di Meglio putZenModeSetting(v); 1168fb5d4a0ea6408809e00875df049bec117ec27f5Fabrice Di Meglio final int n = ConditionProviderSettings.getEnabledProviderCount(mContext); 1178fb5d4a0ea6408809e00875df049bec117ec27f5Fabrice Di Meglio if (n > 0) { 1188fb5d4a0ea6408809e00875df049bec117ec27f5Fabrice Di Meglio mHandler.post(isChecked ? mShowDialog : mHideDialog); 1198fb5d4a0ea6408809e00875df049bec117ec27f5Fabrice Di Meglio } 1208fb5d4a0ea6408809e00875df049bec117ec27f5Fabrice Di Meglio } 1218fb5d4a0ea6408809e00875df049bec117ec27f5Fabrice Di Meglio }); 1228fb5d4a0ea6408809e00875df049bec117ec27f5Fabrice Di Meglio } 1238fb5d4a0ea6408809e00875df049bec117ec27f5Fabrice Di Meglio 1248fb5d4a0ea6408809e00875df049bec117ec27f5Fabrice Di Meglio @Override 1257f502bf824955b2b3a43f8f7f32c00cf00f736feJohn Spurlock public void onCreate(Bundle icicle) { 1267f502bf824955b2b3a43f8f7f32c00cf00f736feJohn Spurlock super.onCreate(icicle); 127c41dfb4f6ce5de287045ee97a55350ef7cc1a279John Spurlock mContext = getActivity(); 128c9afadb04b00598f5988101681089290cf14f79cJohn Spurlock mPM = mContext.getPackageManager(); 129cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock final Resources res = mContext.getResources(); 130cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock final int p = res.getDimensionPixelSize(R.dimen.content_margin_left); 131cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock 132cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock addPreferencesFromResource(R.xml.zen_mode_settings); 133cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock final PreferenceScreen root = getPreferenceScreen(); 134cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock 135cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mConfig = getZenModeConfig(); 136cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock if (DEBUG) Log.d(TAG, "Loaded mConfig=" + mConfig); 137cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock 1388fb5d4a0ea6408809e00875df049bec117ec27f5Fabrice Di Meglio mSwitchBar = ((SettingsActivity) mContext).getSwitchBar(); 1398fb5d4a0ea6408809e00875df049bec117ec27f5Fabrice Di Meglio mSwitch = mSwitchBar.getSwitch(); 140c41dfb4f6ce5de287045ee97a55350ef7cc1a279John Spurlock 141cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock final PreferenceCategory general = (PreferenceCategory) root.findPreference(KEY_GENERAL); 142cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock 143cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mCalls = (SwitchPreference) root.findPreference(KEY_CALLS); 144cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mCalls.setOnPreferenceChangeListener(new OnPreferenceChangeListener() { 145cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock @Override 146cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock public boolean onPreferenceChange(Preference preference, Object newValue) { 147cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock if (mDisableListeners) return true; 148cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock final boolean val = (Boolean) newValue; 149cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock if (val == mConfig.allowCalls) return true; 150cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock if (DEBUG) Log.d(TAG, "onPrefChange allowCalls=" + val); 151cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock final ZenModeConfig newConfig = mConfig.copy(); 152cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock newConfig.allowCalls = val; 153cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock return setZenModeConfig(newConfig); 154cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } 155cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock }); 156cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock 157cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mMessages = (SwitchPreference) root.findPreference(KEY_MESSAGES); 158cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mMessages.setOnPreferenceChangeListener(new OnPreferenceChangeListener() { 159cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock @Override 160cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock public boolean onPreferenceChange(Preference preference, Object newValue) { 161cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock if (mDisableListeners) return true; 162cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock final boolean val = (Boolean) newValue; 163cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock if (val == mConfig.allowMessages) return true; 164cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock if (DEBUG) Log.d(TAG, "onPrefChange allowMessages=" + val); 165cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock final ZenModeConfig newConfig = mConfig.copy(); 166cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock newConfig.allowMessages = val; 167cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock return setZenModeConfig(newConfig); 168cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } 169cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock }); 170cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock 171cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mStarred = new DropDownPreference(mContext); 172cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mStarred.setEnabled(false); 173cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mStarred.setTitle(R.string.zen_mode_from); 1746d26d10fb3e5e2e491d1da0881eda192d30eec04John Spurlock mStarred.setDropDownWidth(R.dimen.zen_mode_dropdown_width); 17504a73fe3c0810075b6bf7ec6105baaa9bff4e667John Spurlock mStarred.addItem(R.string.zen_mode_from_anyone, null); 17604a73fe3c0810075b6bf7ec6105baaa9bff4e667John Spurlock mStarred.addItem(R.string.zen_mode_from_starred, null); 17704a73fe3c0810075b6bf7ec6105baaa9bff4e667John Spurlock mStarred.addItem(R.string.zen_mode_from_contacts, null); 178cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock general.addPreference(mStarred); 179cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock 180cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock final Preference alarmInfo = new Preference(mContext) { 181cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock @Override 182cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock public View getView(View convertView, ViewGroup parent) { 183cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock final TextView tv = new TextView(mContext); 184cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock tv.setTypeface(Typeface.create(Typeface.DEFAULT, Typeface.ITALIC)); 185cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock tv.setPadding(p, p, p, p); 186cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock tv.setText(R.string.zen_mode_alarm_info); 187cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock return tv; 188cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } 189cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock }; 190cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock alarmInfo.setPersistent(false); 191cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock alarmInfo.setSelectable(false); 192cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock general.addPreference(alarmInfo); 193cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock 194cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock final PreferenceCategory auto = (PreferenceCategory) root.findPreference(KEY_AUTOMATIC); 195cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock 196cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mWhen = new DropDownPreference(mContext); 197cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mWhen.setKey(KEY_WHEN); 198cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mWhen.setTitle(R.string.zen_mode_when); 1996d26d10fb3e5e2e491d1da0881eda192d30eec04John Spurlock mWhen.setDropDownWidth(R.dimen.zen_mode_dropdown_width); 20004a73fe3c0810075b6bf7ec6105baaa9bff4e667John Spurlock mWhen.addItem(R.string.zen_mode_when_every_night, ZenModeConfig.SLEEP_MODE_NIGHTS); 20104a73fe3c0810075b6bf7ec6105baaa9bff4e667John Spurlock mWhen.addItem(R.string.zen_mode_when_weeknights, ZenModeConfig.SLEEP_MODE_WEEKNIGHTS); 20204a73fe3c0810075b6bf7ec6105baaa9bff4e667John Spurlock mWhen.addItem(R.string.zen_mode_when_never, null); 203cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mWhen.setCallback(new DropDownPreference.Callback() { 204cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock @Override 20504a73fe3c0810075b6bf7ec6105baaa9bff4e667John Spurlock public boolean onItemSelected(int pos, Object value) { 206cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock if (mDisableListeners) return true; 20704a73fe3c0810075b6bf7ec6105baaa9bff4e667John Spurlock final String mode = (String) value; 208cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock if (Objects.equals(mode, mConfig.sleepMode)) return true; 209cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock if (DEBUG) Log.d(TAG, "onPrefChange sleepMode=" + mode); 210cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock final ZenModeConfig newConfig = mConfig.copy(); 211cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock newConfig.sleepMode = mode; 212cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock return setZenModeConfig(newConfig); 213cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } 214cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock }); 215cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock auto.addPreference(mWhen); 216cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock 217cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock final FragmentManager mgr = getFragmentManager(); 218cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock 219cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mStart = new TimePickerPreference(mContext, mgr); 220cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mStart.setTitle(R.string.zen_mode_start_time); 221cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mStart.setCallback(new TimePickerPreference.Callback() { 222cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock @Override 223cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock public boolean onSetTime(int hour, int minute) { 224cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock if (mDisableListeners) return true; 225cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock if (!ZenModeConfig.isValidHour(hour)) return false; 226cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock if (!ZenModeConfig.isValidMinute(minute)) return false; 227cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock if (hour == mConfig.sleepStartHour && minute == mConfig.sleepStartMinute) { 228cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock return true; 229cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } 230cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock if (DEBUG) Log.d(TAG, "onPrefChange sleepStart h=" + hour + " m=" + minute); 231cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock final ZenModeConfig newConfig = mConfig.copy(); 232cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock newConfig.sleepStartHour = hour; 233cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock newConfig.sleepStartMinute = minute; 234cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock return setZenModeConfig(newConfig); 235cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } 236cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock }); 237cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock auto.addPreference(mStart); 23804a73fe3c0810075b6bf7ec6105baaa9bff4e667John Spurlock mStart.setDependency(mWhen.getKey()); 239cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock 240cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mEnd = new TimePickerPreference(mContext, mgr); 241cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mEnd.setTitle(R.string.zen_mode_end_time); 242cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mEnd.setSummaryFormat(R.string.zen_mode_end_time_summary_format); 243cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mEnd.setCallback(new TimePickerPreference.Callback() { 244cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock @Override 245cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock public boolean onSetTime(int hour, int minute) { 246cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock if (mDisableListeners) return true; 247cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock if (!ZenModeConfig.isValidHour(hour)) return false; 248cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock if (!ZenModeConfig.isValidMinute(minute)) return false; 249cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock if (hour == mConfig.sleepEndHour && minute == mConfig.sleepEndMinute) { 250cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock return true; 251cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } 252cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock if (DEBUG) Log.d(TAG, "onPrefChange sleepEnd h=" + hour + " m=" + minute); 253cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock final ZenModeConfig newConfig = mConfig.copy(); 254cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock newConfig.sleepEndHour = hour; 255cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock newConfig.sleepEndMinute = minute; 256cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock return setZenModeConfig(newConfig); 257cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } 258cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock }); 259cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock auto.addPreference(mEnd); 260cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mEnd.setDependency(mWhen.getKey()); 261cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock 26223e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock mAutomationCategory = (PreferenceCategory) findPreference(KEY_AUTOMATION); 26323e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock mEntry = findPreference(KEY_ENTRY); 26423e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock mEntry.setOnPreferenceClickListener(new OnPreferenceClickListener() { 26523e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock @Override 26623e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock public boolean onPreferenceClick(Preference preference) { 26723e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock new AlertDialog.Builder(mContext) 26823e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock .setTitle(R.string.zen_mode_entry_conditions_title) 26923e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock .setView(new ZenModeAutomaticConditionSelection(mContext)) 27023e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock .setOnDismissListener(new OnDismissListener() { 27123e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock @Override 27223e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock public void onDismiss(DialogInterface dialog) { 27323e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock refreshAutomationSection(); 27423e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock } 27523e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock }) 27623e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock .setPositiveButton(R.string.dlg_ok, null) 27723e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock .show(); 27823e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock return true; 27923e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock } 28023e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock }); 281c9afadb04b00598f5988101681089290cf14f79cJohn Spurlock mConditionProviders = findPreference(KEY_CONDITION_PROVIDERS); 282c9afadb04b00598f5988101681089290cf14f79cJohn Spurlock 283c41dfb4f6ce5de287045ee97a55350ef7cc1a279John Spurlock updateZenMode(); 284cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock updateControls(); 285cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } 286cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock 287cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock private void updateControls() { 288cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mDisableListeners = true; 289cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mCalls.setChecked(mConfig.allowCalls); 290cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mMessages.setChecked(mConfig.allowMessages); 291cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mStarred.setSelectedItem(0); 29204a73fe3c0810075b6bf7ec6105baaa9bff4e667John Spurlock mWhen.setSelectedValue(mConfig.sleepMode); 293cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mStart.setTime(mConfig.sleepStartHour, mConfig.sleepStartMinute); 294cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mEnd.setTime(mConfig.sleepEndHour, mConfig.sleepEndMinute); 295cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mDisableListeners = false; 29604a73fe3c0810075b6bf7ec6105baaa9bff4e667John Spurlock refreshAutomationSection(); 2977f502bf824955b2b3a43f8f7f32c00cf00f736feJohn Spurlock } 2987f502bf824955b2b3a43f8f7f32c00cf00f736feJohn Spurlock 29923e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock private void refreshAutomationSection() { 300c9afadb04b00598f5988101681089290cf14f79cJohn Spurlock if (mConditionProviders != null) { 301c9afadb04b00598f5988101681089290cf14f79cJohn Spurlock final int total = ConditionProviderSettings.getProviderCount(mPM); 302c9afadb04b00598f5988101681089290cf14f79cJohn Spurlock if (total == 0) { 30323e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock getPreferenceScreen().removePreference(mAutomationCategory); 304c9afadb04b00598f5988101681089290cf14f79cJohn Spurlock } else { 305c9afadb04b00598f5988101681089290cf14f79cJohn Spurlock final int n = ConditionProviderSettings.getEnabledProviderCount(mContext); 306c9afadb04b00598f5988101681089290cf14f79cJohn Spurlock if (n == 0) { 307c9afadb04b00598f5988101681089290cf14f79cJohn Spurlock mConditionProviders.setSummary(getResources().getString( 308c9afadb04b00598f5988101681089290cf14f79cJohn Spurlock R.string.manage_condition_providers_summary_zero)); 309c9afadb04b00598f5988101681089290cf14f79cJohn Spurlock } else { 310c9afadb04b00598f5988101681089290cf14f79cJohn Spurlock mConditionProviders.setSummary(String.format(getResources().getQuantityString( 311c9afadb04b00598f5988101681089290cf14f79cJohn Spurlock R.plurals.manage_condition_providers_summary_nonzero, 312c9afadb04b00598f5988101681089290cf14f79cJohn Spurlock n, n))); 313c9afadb04b00598f5988101681089290cf14f79cJohn Spurlock } 31423e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock final String entrySummary = getEntryConditionSummary(); 31523e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock if (n == 0 || entrySummary == null) { 31623e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock mEntry.setSummary(R.string.zen_mode_entry_conditions_summary_none); 31723e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock } else { 31823e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock mEntry.setSummary(entrySummary); 31923e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock } 320c9afadb04b00598f5988101681089290cf14f79cJohn Spurlock } 321c9afadb04b00598f5988101681089290cf14f79cJohn Spurlock } 322c9afadb04b00598f5988101681089290cf14f79cJohn Spurlock } 32323e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock 32423e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock private String getEntryConditionSummary() { 32523e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock final INotificationManager nm = INotificationManager.Stub.asInterface( 32623e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock ServiceManager.getService(Context.NOTIFICATION_SERVICE)); 32723e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock try { 32823e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock final Condition[] automatic = nm.getAutomaticZenModeConditions(); 32923e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock if (automatic == null || automatic.length == 0) { 33023e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock return null; 33123e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock } 33281bef1d74568d623b9db3c5409740dc21c0bbc08John Spurlock final String divider = getString(R.string.summary_divider_text); 33323e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock final StringBuilder sb = new StringBuilder(); 33423e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock for (int i = 0; i < automatic.length; i++) { 33523e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock if (i > 0) sb.append(divider); 3360e0122a9999eb1a603c99be12846acad29ed0593John Spurlock sb.append(automatic[i].summary); 33723e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock } 33823e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock return sb.toString(); 33923e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock } catch (Exception e) { 34023e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock Log.w(TAG, "Error calling getAutomaticZenModeConditions", e); 34123e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock return null; 34223e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock } 34323e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock } 34423e221cd93a9bf2546709c2f23b1309ea5e23633John Spurlock 3457f502bf824955b2b3a43f8f7f32c00cf00f736feJohn Spurlock @Override 3467f502bf824955b2b3a43f8f7f32c00cf00f736feJohn Spurlock public void onResume() { 3477f502bf824955b2b3a43f8f7f32c00cf00f736feJohn Spurlock super.onResume(); 34804a73fe3c0810075b6bf7ec6105baaa9bff4e667John Spurlock updateControls(); 349cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock updateZenMode(); 3507f502bf824955b2b3a43f8f7f32c00cf00f736feJohn Spurlock mSettingsObserver.register(); 3518fb5d4a0ea6408809e00875df049bec117ec27f5Fabrice Di Meglio mSwitchBar.addOnSwitchChangeListener(this); 3528fb5d4a0ea6408809e00875df049bec117ec27f5Fabrice Di Meglio mSwitchBar.show(); 3533726525d50d480a3d954c103a844f0c4b3c7d3e0John Spurlock } 3543726525d50d480a3d954c103a844f0c4b3c7d3e0John Spurlock 3553726525d50d480a3d954c103a844f0c4b3c7d3e0John Spurlock @Override 3563726525d50d480a3d954c103a844f0c4b3c7d3e0John Spurlock public void onPause() { 3573726525d50d480a3d954c103a844f0c4b3c7d3e0John Spurlock super.onPause(); 3583726525d50d480a3d954c103a844f0c4b3c7d3e0John Spurlock mSettingsObserver.unregister(); 3598fb5d4a0ea6408809e00875df049bec117ec27f5Fabrice Di Meglio mSwitchBar.removeOnSwitchChangeListener(this); 3608fb5d4a0ea6408809e00875df049bec117ec27f5Fabrice Di Meglio mSwitchBar.hide(); 3617f502bf824955b2b3a43f8f7f32c00cf00f736feJohn Spurlock } 3627f502bf824955b2b3a43f8f7f32c00cf00f736feJohn Spurlock 363cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock private void updateZenMode() { 3647f502bf824955b2b3a43f8f7f32c00cf00f736feJohn Spurlock final boolean zenMode = Global.getInt(getContentResolver(), 3657f502bf824955b2b3a43f8f7f32c00cf00f736feJohn Spurlock Global.ZEN_MODE, Global.ZEN_MODE_OFF) != Global.ZEN_MODE_OFF; 36604a73fe3c0810075b6bf7ec6105baaa9bff4e667John Spurlock if (mSwitch.isChecked() != zenMode) { 36704a73fe3c0810075b6bf7ec6105baaa9bff4e667John Spurlock mSwitch.setChecked(zenMode); 36804a73fe3c0810075b6bf7ec6105baaa9bff4e667John Spurlock mIgnoreNext = true; 36904a73fe3c0810075b6bf7ec6105baaa9bff4e667John Spurlock } 3707f502bf824955b2b3a43f8f7f32c00cf00f736feJohn Spurlock } 37172438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock 372cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock private void updateZenModeConfig() { 373cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock final ZenModeConfig config = getZenModeConfig(); 374cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock if (Objects.equals(config, mConfig)) return; 37504a73fe3c0810075b6bf7ec6105baaa9bff4e667John Spurlock mConfig = config; 37604a73fe3c0810075b6bf7ec6105baaa9bff4e667John Spurlock if (DEBUG) Log.d(TAG, "updateZenModeConfig mConfig=" + mConfig); 377cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock updateControls(); 37872438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock } 37972438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock 380cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock private ZenModeConfig getZenModeConfig() { 381cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock final INotificationManager nm = INotificationManager.Stub.asInterface( 382cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock ServiceManager.getService(Context.NOTIFICATION_SERVICE)); 383cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock try { 384cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock return nm.getZenModeConfig(); 385cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } catch (Exception e) { 386cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock Log.w(TAG, "Error calling NoMan", e); 387cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock return new ZenModeConfig(); 388cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } 389cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } 390cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock 391cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock private boolean setZenModeConfig(ZenModeConfig config) { 392cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock final INotificationManager nm = INotificationManager.Stub.asInterface( 393cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock ServiceManager.getService(Context.NOTIFICATION_SERVICE)); 394cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock try { 395cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock final boolean success = nm.setZenModeConfig(config); 396cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock if (success) { 397cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mConfig = config; 398cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock if (DEBUG) Log.d(TAG, "Saved mConfig=" + mConfig); 399cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } 400cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock return success; 401cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } catch (Exception e) { 402cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock Log.w(TAG, "Error calling NoMan", e); 403cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock return false; 404cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } 40572438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock } 40672438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock 407623a0e9f45c294ea7e714295f41ba2d8bcd7b32eJohn Spurlock protected void putZenModeSetting(int value) { 408623a0e9f45c294ea7e714295f41ba2d8bcd7b32eJohn Spurlock Global.putInt(getContentResolver(), Global.ZEN_MODE, value); 409623a0e9f45c294ea7e714295f41ba2d8bcd7b32eJohn Spurlock } 410623a0e9f45c294ea7e714295f41ba2d8bcd7b32eJohn Spurlock 411623a0e9f45c294ea7e714295f41ba2d8bcd7b32eJohn Spurlock protected ZenModeConditionSelection newConditionSelection() { 412623a0e9f45c294ea7e714295f41ba2d8bcd7b32eJohn Spurlock return new ZenModeConditionSelection(mContext); 413623a0e9f45c294ea7e714295f41ba2d8bcd7b32eJohn Spurlock } 414623a0e9f45c294ea7e714295f41ba2d8bcd7b32eJohn Spurlock 415623a0e9f45c294ea7e714295f41ba2d8bcd7b32eJohn Spurlock private final Runnable mHideDialog = new Runnable() { 416623a0e9f45c294ea7e714295f41ba2d8bcd7b32eJohn Spurlock @Override 417623a0e9f45c294ea7e714295f41ba2d8bcd7b32eJohn Spurlock public void run() { 418623a0e9f45c294ea7e714295f41ba2d8bcd7b32eJohn Spurlock if (mDialog != null) { 419623a0e9f45c294ea7e714295f41ba2d8bcd7b32eJohn Spurlock mDialog.dismiss(); 420623a0e9f45c294ea7e714295f41ba2d8bcd7b32eJohn Spurlock mDialog = null; 421623a0e9f45c294ea7e714295f41ba2d8bcd7b32eJohn Spurlock } 422623a0e9f45c294ea7e714295f41ba2d8bcd7b32eJohn Spurlock } 423623a0e9f45c294ea7e714295f41ba2d8bcd7b32eJohn Spurlock }; 424623a0e9f45c294ea7e714295f41ba2d8bcd7b32eJohn Spurlock 425623a0e9f45c294ea7e714295f41ba2d8bcd7b32eJohn Spurlock private final Runnable mShowDialog = new Runnable() { 426623a0e9f45c294ea7e714295f41ba2d8bcd7b32eJohn Spurlock @Override 427623a0e9f45c294ea7e714295f41ba2d8bcd7b32eJohn Spurlock public void run() { 428623a0e9f45c294ea7e714295f41ba2d8bcd7b32eJohn Spurlock mDialog = new AlertDialog.Builder(mContext) 429623a0e9f45c294ea7e714295f41ba2d8bcd7b32eJohn Spurlock .setTitle(R.string.zen_mode_settings_title) 430623a0e9f45c294ea7e714295f41ba2d8bcd7b32eJohn Spurlock .setView(newConditionSelection()) 431623a0e9f45c294ea7e714295f41ba2d8bcd7b32eJohn Spurlock .setNegativeButton(R.string.dlg_cancel, new DialogInterface.OnClickListener() { 432623a0e9f45c294ea7e714295f41ba2d8bcd7b32eJohn Spurlock @Override 433623a0e9f45c294ea7e714295f41ba2d8bcd7b32eJohn Spurlock public void onClick(DialogInterface dialog, int which) { 434623a0e9f45c294ea7e714295f41ba2d8bcd7b32eJohn Spurlock putZenModeSetting(Global.ZEN_MODE_OFF); 435623a0e9f45c294ea7e714295f41ba2d8bcd7b32eJohn Spurlock } 436623a0e9f45c294ea7e714295f41ba2d8bcd7b32eJohn Spurlock }) 437623a0e9f45c294ea7e714295f41ba2d8bcd7b32eJohn Spurlock .setPositiveButton(R.string.dlg_ok, new DialogInterface.OnClickListener() { 438623a0e9f45c294ea7e714295f41ba2d8bcd7b32eJohn Spurlock @Override 439623a0e9f45c294ea7e714295f41ba2d8bcd7b32eJohn Spurlock public void onClick(DialogInterface dialog, int which) { 440623a0e9f45c294ea7e714295f41ba2d8bcd7b32eJohn Spurlock // noop 441623a0e9f45c294ea7e714295f41ba2d8bcd7b32eJohn Spurlock } 442623a0e9f45c294ea7e714295f41ba2d8bcd7b32eJohn Spurlock }) 443623a0e9f45c294ea7e714295f41ba2d8bcd7b32eJohn Spurlock .show(); 444623a0e9f45c294ea7e714295f41ba2d8bcd7b32eJohn Spurlock } 445623a0e9f45c294ea7e714295f41ba2d8bcd7b32eJohn Spurlock }; 446623a0e9f45c294ea7e714295f41ba2d8bcd7b32eJohn Spurlock 447cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock // Enable indexing of searchable data 448cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock public static final Indexable.SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER = 449cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock new BaseSearchIndexProvider() { 450cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock @Override 451cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock public List<SearchIndexableRaw> getRawDataToIndex(Context context, boolean enabled) { 452cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock final List<SearchIndexableRaw> result = new ArrayList<SearchIndexableRaw>(); 453cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock add(result, context, R.string.zen_mode_settings_title); 454cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock add(result, context, R.string.zen_mode_general_category); 455cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock add(result, context, R.string.zen_mode_phone_calls); 456cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock add(result, context, R.string.zen_mode_messages); 457cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock add(result, context, R.string.zen_mode_automatic_category); 458cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock add(result, context, R.string.zen_mode_when); 459cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock add(result, context, R.string.zen_mode_start_time); 460cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock add(result, context, R.string.zen_mode_end_time); 461cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock return result; 462cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } 46372438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock 464cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock private void add(List<SearchIndexableRaw> result, Context context, int title) { 465cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock final Resources res = context.getResources(); 466cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock final SearchIndexableRaw data = new SearchIndexableRaw(context); 467cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock data.title = res.getString(title); 468cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock data.screenTitle = res.getString(R.string.zen_mode_settings_title); 469cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock result.add(data); 470cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } 471cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock }; 47272438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock 473cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock private final class SettingsObserver extends ContentObserver { 474cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock private final Uri ZEN_MODE_URI = Global.getUriFor(Global.ZEN_MODE); 475cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock private final Uri ZEN_MODE_CONFIG_ETAG_URI = Global.getUriFor(Global.ZEN_MODE_CONFIG_ETAG); 47672438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock 477cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock public SettingsObserver() { 478cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock super(mHandler); 47972438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock } 48072438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock 481cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock public void register() { 482cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock getContentResolver().registerContentObserver(ZEN_MODE_URI, false, this); 483cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock getContentResolver().registerContentObserver(ZEN_MODE_CONFIG_ETAG_URI, false, this); 48472438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock } 48572438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock 486cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock public void unregister() { 487cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock getContentResolver().unregisterContentObserver(this); 48872438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock } 48972438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock 490cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock @Override 491cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock public void onChange(boolean selfChange, Uri uri) { 492cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock super.onChange(selfChange, uri); 493cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock if (ZEN_MODE_URI.equals(uri)) { 494cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock updateZenMode(); 495cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } 496cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock if (ZEN_MODE_CONFIG_ETAG_URI.equals(uri)) { 497cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock updateZenModeConfig(); 498cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } 49972438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock } 500cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } 50172438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock 502cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock private static class TimePickerPreference extends Preference { 503cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock private final Context mContext; 50472438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock 505cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock private int mSummaryFormat; 506cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock private int mHourOfDay; 507cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock private int mMinute; 508cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock private Callback mCallback; 509cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock 510cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock public TimePickerPreference(Context context, final FragmentManager mgr) { 511cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock super(context); 512cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mContext = context; 513cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock setPersistent(false); 514cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock setOnPreferenceClickListener(new OnPreferenceClickListener(){ 515cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock @Override 516cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock public boolean onPreferenceClick(Preference preference) { 517cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock final TimePickerFragment frag = new TimePickerFragment(); 518cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock frag.pref = TimePickerPreference.this; 519cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock frag.show(mgr, TimePickerPreference.class.getName()); 520cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock return true; 521cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } 522cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock }); 52372438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock } 52472438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock 525cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock public void setCallback(Callback callback) { 526cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mCallback = callback; 52772438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock } 52872438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock 529cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock public void setSummaryFormat(int resId) { 530cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mSummaryFormat = resId; 531cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock updateSummary(); 532cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } 53372438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock 534cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock public void setTime(int hourOfDay, int minute) { 535cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock if (mCallback != null && !mCallback.onSetTime(hourOfDay, minute)) return; 536cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mHourOfDay = hourOfDay; 537cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mMinute = minute; 538cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock updateSummary(); 539cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } 54072438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock 541cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock private void updateSummary() { 542cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock final Calendar c = Calendar.getInstance(); 543cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock c.set(Calendar.HOUR_OF_DAY, mHourOfDay); 544cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock c.set(Calendar.MINUTE, mMinute); 545cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock String time = DateFormat.getTimeFormat(mContext).format(c.getTime()); 546cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock if (mSummaryFormat != 0) { 547cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock time = mContext.getResources().getString(mSummaryFormat, time); 54872438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock } 549cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock setSummary(time); 55072438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock } 551019b87f17a51fef7fd4b6696dbea5c50fe8b6d07Fabrice Di Meglio 552cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock public static class TimePickerFragment extends DialogFragment implements 553cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock TimePickerDialog.OnTimeSetListener { 554cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock public TimePickerPreference pref; 555019b87f17a51fef7fd4b6696dbea5c50fe8b6d07Fabrice Di Meglio 556cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock @Override 557cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock public Dialog onCreateDialog(Bundle savedInstanceState) { 558cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock final boolean usePref = pref != null && pref.mHourOfDay >= 0 && pref.mMinute >= 0; 559cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock final Calendar c = Calendar.getInstance(); 560cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock final int hour = usePref ? pref.mHourOfDay : c.get(Calendar.HOUR_OF_DAY); 561cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock final int minute = usePref ? pref.mMinute : c.get(Calendar.MINUTE); 562cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock return new TimePickerDialog(getActivity(), this, hour, minute, 563cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock DateFormat.is24HourFormat(getActivity())); 564cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } 565019b87f17a51fef7fd4b6696dbea5c50fe8b6d07Fabrice Di Meglio 566cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock public void onTimeSet(TimePicker view, int hourOfDay, int minute) { 567cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock if (pref != null) { 568cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock pref.setTime(hourOfDay, minute); 569cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } 570cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } 571cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } 572019b87f17a51fef7fd4b6696dbea5c50fe8b6d07Fabrice Di Meglio 573cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock public interface Callback { 574cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock boolean onSetTime(int hour, int minute); 575cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } 576cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } 57772438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock} 578