ZenModeSettings.java revision 623a0e9f45c294ea7e714295f41ba2d8bcd7b32e
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; 27019b87f17a51fef7fd4b6696dbea5c50fe8b6d07Fabrice Di Meglioimport android.content.res.Resources; 284a35051565b0ce6d29313c3e4ffe19e1dde78db0John Spurlockimport android.database.ContentObserver; 2972438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlockimport android.graphics.Typeface; 307f502bf824955b2b3a43f8f7f32c00cf00f736feJohn Spurlockimport android.net.Uri; 317f502bf824955b2b3a43f8f7f32c00cf00f736feJohn Spurlockimport android.os.AsyncTask; 3272438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlockimport android.os.Bundle; 337f502bf824955b2b3a43f8f7f32c00cf00f736feJohn Spurlockimport android.os.Handler; 34cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlockimport android.os.ServiceManager; 35cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlockimport android.preference.Preference; 36cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlockimport android.preference.Preference.OnPreferenceChangeListener; 37cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlockimport android.preference.PreferenceCategory; 38cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlockimport android.preference.PreferenceScreen; 39cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlockimport android.preference.SwitchPreference; 407f502bf824955b2b3a43f8f7f32c00cf00f736feJohn Spurlockimport android.provider.Settings.Global; 41cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlockimport android.service.notification.ZenModeConfig; 42cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlockimport android.text.format.DateFormat; 4372438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlockimport android.util.Log; 4472438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlockimport android.view.View; 4572438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlockimport android.view.ViewGroup; 4672438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlockimport android.widget.TextView; 47cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlockimport android.widget.TimePicker; 484a35051565b0ce6d29313c3e4ffe19e1dde78db0John Spurlock 494a35051565b0ce6d29313c3e4ffe19e1dde78db0John Spurlockimport com.android.settings.R; 504a35051565b0ce6d29313c3e4ffe19e1dde78db0John Spurlockimport com.android.settings.SettingsPreferenceFragment; 51cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlockimport com.android.settings.search.BaseSearchIndexProvider; 52019b87f17a51fef7fd4b6696dbea5c50fe8b6d07Fabrice Di Meglioimport com.android.settings.search.Indexable; 53019b87f17a51fef7fd4b6696dbea5c50fe8b6d07Fabrice Di Meglioimport com.android.settings.search.SearchIndexableRaw; 5472438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock 55019b87f17a51fef7fd4b6696dbea5c50fe8b6d07Fabrice Di Meglioimport java.util.ArrayList; 56cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlockimport java.util.Calendar; 57019b87f17a51fef7fd4b6696dbea5c50fe8b6d07Fabrice Di Meglioimport java.util.List; 58cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlockimport java.util.Objects; 59019b87f17a51fef7fd4b6696dbea5c50fe8b6d07Fabrice Di Meglio 60019b87f17a51fef7fd4b6696dbea5c50fe8b6d07Fabrice Di Megliopublic class ZenModeSettings extends SettingsPreferenceFragment implements Indexable { 6172438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock private static final String TAG = "ZenModeSettings"; 62cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock private static final boolean DEBUG = true; 63cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock 64c41dfb4f6ce5de287045ee97a55350ef7cc1a279John Spurlock private static final String KEY_ZEN_MODE = "zen_mode"; 65cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock private static final String KEY_GENERAL = "general"; 66cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock private static final String KEY_CALLS = "phone_calls"; 67cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock private static final String KEY_MESSAGES = "messages"; 68cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock 69cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock private static final String KEY_AUTOMATIC = "automatic"; 70cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock private static final String KEY_WHEN = "when"; 7172438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock 727f502bf824955b2b3a43f8f7f32c00cf00f736feJohn Spurlock private final Handler mHandler = new Handler(); 737f502bf824955b2b3a43f8f7f32c00cf00f736feJohn Spurlock private final SettingsObserver mSettingsObserver = new SettingsObserver(); 747f502bf824955b2b3a43f8f7f32c00cf00f736feJohn Spurlock 75c41dfb4f6ce5de287045ee97a55350ef7cc1a279John Spurlock private SwitchPreference mSwitch; 76cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock private Context mContext; 77cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock private ZenModeConfig mConfig; 78cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock private boolean mDisableListeners; 79cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock private SwitchPreference mCalls; 80cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock private SwitchPreference mMessages; 81cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock private DropDownPreference mStarred; 82cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock private DropDownPreference mWhen; 83cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock private TimePickerPreference mStart; 84cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock private TimePickerPreference mEnd; 85623a0e9f45c294ea7e714295f41ba2d8bcd7b32eJohn Spurlock private AlertDialog mDialog; 867f502bf824955b2b3a43f8f7f32c00cf00f736feJohn Spurlock 877f502bf824955b2b3a43f8f7f32c00cf00f736feJohn Spurlock @Override 887f502bf824955b2b3a43f8f7f32c00cf00f736feJohn Spurlock public void onCreate(Bundle icicle) { 897f502bf824955b2b3a43f8f7f32c00cf00f736feJohn Spurlock super.onCreate(icicle); 90c41dfb4f6ce5de287045ee97a55350ef7cc1a279John Spurlock mContext = getActivity(); 91cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock final Resources res = mContext.getResources(); 92cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock final int p = res.getDimensionPixelSize(R.dimen.content_margin_left); 93cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock 94cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock addPreferencesFromResource(R.xml.zen_mode_settings); 95cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock final PreferenceScreen root = getPreferenceScreen(); 96cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock 97cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mConfig = getZenModeConfig(); 98cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock if (DEBUG) Log.d(TAG, "Loaded mConfig=" + mConfig); 99cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock 100c41dfb4f6ce5de287045ee97a55350ef7cc1a279John Spurlock mSwitch = (SwitchPreference) root.findPreference(KEY_ZEN_MODE); 101c41dfb4f6ce5de287045ee97a55350ef7cc1a279John Spurlock 102cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock final PreferenceCategory general = (PreferenceCategory) root.findPreference(KEY_GENERAL); 103cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock 104cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mCalls = (SwitchPreference) root.findPreference(KEY_CALLS); 105cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mCalls.setOnPreferenceChangeListener(new OnPreferenceChangeListener() { 106cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock @Override 107cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock public boolean onPreferenceChange(Preference preference, Object newValue) { 108cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock if (mDisableListeners) return true; 109cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock final boolean val = (Boolean) newValue; 110cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock if (val == mConfig.allowCalls) return true; 111cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock if (DEBUG) Log.d(TAG, "onPrefChange allowCalls=" + val); 112cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock final ZenModeConfig newConfig = mConfig.copy(); 113cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock newConfig.allowCalls = val; 114cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock return setZenModeConfig(newConfig); 115cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } 116cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock }); 117cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock 118cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mMessages = (SwitchPreference) root.findPreference(KEY_MESSAGES); 119cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mMessages.setOnPreferenceChangeListener(new OnPreferenceChangeListener() { 120cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock @Override 121cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock public boolean onPreferenceChange(Preference preference, Object newValue) { 122cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock if (mDisableListeners) return true; 123cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock final boolean val = (Boolean) newValue; 124cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock if (val == mConfig.allowMessages) return true; 125cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock if (DEBUG) Log.d(TAG, "onPrefChange allowMessages=" + val); 126cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock final ZenModeConfig newConfig = mConfig.copy(); 127cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock newConfig.allowMessages = val; 128cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock return setZenModeConfig(newConfig); 129cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } 130cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock }); 131cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock 132cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mStarred = new DropDownPreference(mContext); 133cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mStarred.setEnabled(false); 134cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mStarred.setTitle(R.string.zen_mode_from); 1356d26d10fb3e5e2e491d1da0881eda192d30eec04John Spurlock mStarred.setDropDownWidth(R.dimen.zen_mode_dropdown_width); 136cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mStarred.addItem(R.string.zen_mode_from_anyone); 137cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mStarred.addItem(R.string.zen_mode_from_starred); 138cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mStarred.addItem(R.string.zen_mode_from_contacts); 139cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock general.addPreference(mStarred); 140cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock 141cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock final Preference alarmInfo = new Preference(mContext) { 142cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock @Override 143cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock public View getView(View convertView, ViewGroup parent) { 144cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock final TextView tv = new TextView(mContext); 145cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock tv.setTypeface(Typeface.create(Typeface.DEFAULT, Typeface.ITALIC)); 146cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock tv.setPadding(p, p, p, p); 147cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock tv.setText(R.string.zen_mode_alarm_info); 148cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock return tv; 149cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } 150cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock }; 151cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock alarmInfo.setPersistent(false); 152cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock alarmInfo.setSelectable(false); 153cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock general.addPreference(alarmInfo); 154cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock 155cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock final PreferenceCategory auto = (PreferenceCategory) root.findPreference(KEY_AUTOMATIC); 156cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock 157cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mWhen = new DropDownPreference(mContext); 158cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mWhen.setKey(KEY_WHEN); 159cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mWhen.setTitle(R.string.zen_mode_when); 1606d26d10fb3e5e2e491d1da0881eda192d30eec04John Spurlock mWhen.setDropDownWidth(R.dimen.zen_mode_dropdown_width); 161cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mWhen.addItem(R.string.zen_mode_when_every_night); 162cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mWhen.addItem(R.string.zen_mode_when_weeknights); 163c41dfb4f6ce5de287045ee97a55350ef7cc1a279John Spurlock mWhen.addItem(R.string.zen_mode_when_never); 164cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mWhen.setCallback(new DropDownPreference.Callback() { 165cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock @Override 166cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock public boolean onItemSelected(int pos) { 167cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock if (mDisableListeners) return true; 168cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock final String mode = pos == 1 ? ZenModeConfig.SLEEP_MODE_NIGHTS : 169cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock pos == 2 ? ZenModeConfig.SLEEP_MODE_WEEKNIGHTS : null; 170cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock if (Objects.equals(mode, mConfig.sleepMode)) return true; 171cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock if (DEBUG) Log.d(TAG, "onPrefChange sleepMode=" + mode); 172cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock final ZenModeConfig newConfig = mConfig.copy(); 173cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock newConfig.sleepMode = mode; 174cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock return setZenModeConfig(newConfig); 175cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } 176cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock }); 177cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock auto.addPreference(mWhen); 178cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock 179cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock final FragmentManager mgr = getFragmentManager(); 180cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock 181cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mStart = new TimePickerPreference(mContext, mgr); 182cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mStart.setTitle(R.string.zen_mode_start_time); 183cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mStart.setCallback(new TimePickerPreference.Callback() { 184cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock @Override 185cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock public boolean onSetTime(int hour, int minute) { 186cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock if (mDisableListeners) return true; 187cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock if (!ZenModeConfig.isValidHour(hour)) return false; 188cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock if (!ZenModeConfig.isValidMinute(minute)) return false; 189cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock if (hour == mConfig.sleepStartHour && minute == mConfig.sleepStartMinute) { 190cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock return true; 191cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } 192cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock if (DEBUG) Log.d(TAG, "onPrefChange sleepStart h=" + hour + " m=" + minute); 193cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock final ZenModeConfig newConfig = mConfig.copy(); 194cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock newConfig.sleepStartHour = hour; 195cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock newConfig.sleepStartMinute = minute; 196cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock return setZenModeConfig(newConfig); 197cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } 198cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock }); 199cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock auto.addPreference(mStart); 200cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock 201cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mEnd = new TimePickerPreference(mContext, mgr); 202cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mEnd.setTitle(R.string.zen_mode_end_time); 203cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mEnd.setSummaryFormat(R.string.zen_mode_end_time_summary_format); 204cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mEnd.setCallback(new TimePickerPreference.Callback() { 205cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock @Override 206cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock public boolean onSetTime(int hour, int minute) { 207cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock if (mDisableListeners) return true; 208cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock if (!ZenModeConfig.isValidHour(hour)) return false; 209cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock if (!ZenModeConfig.isValidMinute(minute)) return false; 210cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock if (hour == mConfig.sleepEndHour && minute == mConfig.sleepEndMinute) { 211cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock return true; 212cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } 213cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock if (DEBUG) Log.d(TAG, "onPrefChange sleepEnd h=" + hour + " m=" + minute); 214cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock final ZenModeConfig newConfig = mConfig.copy(); 215cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock newConfig.sleepEndHour = hour; 216cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock newConfig.sleepEndMinute = minute; 217cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock return setZenModeConfig(newConfig); 218cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } 219cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock }); 220cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock auto.addPreference(mEnd); 221cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock 222cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mStart.setDependency(mWhen.getKey()); 223cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mEnd.setDependency(mWhen.getKey()); 224cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock 225c41dfb4f6ce5de287045ee97a55350ef7cc1a279John Spurlock updateZenMode(); 226cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock updateControls(); 227cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } 228cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock 229cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock private void updateControls() { 230cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mDisableListeners = true; 231cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mCalls.setChecked(mConfig.allowCalls); 232cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mMessages.setChecked(mConfig.allowMessages); 233cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mStarred.setSelectedItem(0); 234cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mWhen.setSelectedItem( 235cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock ZenModeConfig.SLEEP_MODE_NIGHTS.equals(mConfig.sleepMode) ? 1 : 236cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock ZenModeConfig.SLEEP_MODE_WEEKNIGHTS.equals(mConfig.sleepMode) ? 2 : 0); 237cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mStart.setTime(mConfig.sleepStartHour, mConfig.sleepStartMinute); 238cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mEnd.setTime(mConfig.sleepEndHour, mConfig.sleepEndMinute); 239cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mDisableListeners = false; 2407f502bf824955b2b3a43f8f7f32c00cf00f736feJohn Spurlock } 2417f502bf824955b2b3a43f8f7f32c00cf00f736feJohn Spurlock 2427f502bf824955b2b3a43f8f7f32c00cf00f736feJohn Spurlock @Override 2437f502bf824955b2b3a43f8f7f32c00cf00f736feJohn Spurlock public void onResume() { 2447f502bf824955b2b3a43f8f7f32c00cf00f736feJohn Spurlock super.onResume(); 245cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock updateZenMode(); 2467f502bf824955b2b3a43f8f7f32c00cf00f736feJohn Spurlock mSettingsObserver.register(); 2473726525d50d480a3d954c103a844f0c4b3c7d3e0John Spurlock } 2483726525d50d480a3d954c103a844f0c4b3c7d3e0John Spurlock 2493726525d50d480a3d954c103a844f0c4b3c7d3e0John Spurlock @Override 2503726525d50d480a3d954c103a844f0c4b3c7d3e0John Spurlock public void onPause() { 2513726525d50d480a3d954c103a844f0c4b3c7d3e0John Spurlock super.onPause(); 2523726525d50d480a3d954c103a844f0c4b3c7d3e0John Spurlock mSettingsObserver.unregister(); 2537f502bf824955b2b3a43f8f7f32c00cf00f736feJohn Spurlock } 2547f502bf824955b2b3a43f8f7f32c00cf00f736feJohn Spurlock 255cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock private void updateZenMode() { 256c41dfb4f6ce5de287045ee97a55350ef7cc1a279John Spurlock mSwitch.setOnPreferenceChangeListener(null); 2577f502bf824955b2b3a43f8f7f32c00cf00f736feJohn Spurlock final boolean zenMode = Global.getInt(getContentResolver(), 2587f502bf824955b2b3a43f8f7f32c00cf00f736feJohn Spurlock Global.ZEN_MODE, Global.ZEN_MODE_OFF) != Global.ZEN_MODE_OFF; 2597f502bf824955b2b3a43f8f7f32c00cf00f736feJohn Spurlock mSwitch.setChecked(zenMode); 260c41dfb4f6ce5de287045ee97a55350ef7cc1a279John Spurlock mSwitch.setTitle(zenMode ? R.string.zen_mode_option_on : R.string.zen_mode_option_off); 261c41dfb4f6ce5de287045ee97a55350ef7cc1a279John Spurlock mSwitch.setOnPreferenceChangeListener(mSwitchListener); 2627f502bf824955b2b3a43f8f7f32c00cf00f736feJohn Spurlock } 26372438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock 264cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock private void updateZenModeConfig() { 265cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock final ZenModeConfig config = getZenModeConfig(); 266cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock if (Objects.equals(config, mConfig)) return; 267cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock if (DEBUG) Log.d(TAG, "updateZenModeConfig"); 268cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock updateControls(); 26972438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock } 27072438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock 271cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock private ZenModeConfig getZenModeConfig() { 272cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock final INotificationManager nm = INotificationManager.Stub.asInterface( 273cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock ServiceManager.getService(Context.NOTIFICATION_SERVICE)); 274cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock try { 275cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock return nm.getZenModeConfig(); 276cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } catch (Exception e) { 277cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock Log.w(TAG, "Error calling NoMan", e); 278cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock return new ZenModeConfig(); 279cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } 280cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } 281cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock 282cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock private boolean setZenModeConfig(ZenModeConfig config) { 283cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock final INotificationManager nm = INotificationManager.Stub.asInterface( 284cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock ServiceManager.getService(Context.NOTIFICATION_SERVICE)); 285cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock try { 286cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock final boolean success = nm.setZenModeConfig(config); 287cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock if (success) { 288cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mConfig = config; 289cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock if (DEBUG) Log.d(TAG, "Saved mConfig=" + mConfig); 290cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } 291cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock return success; 292cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } catch (Exception e) { 293cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock Log.w(TAG, "Error calling NoMan", e); 294cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock return false; 295cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } 29672438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock } 29772438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock 298623a0e9f45c294ea7e714295f41ba2d8bcd7b32eJohn Spurlock protected void putZenModeSetting(int value) { 299623a0e9f45c294ea7e714295f41ba2d8bcd7b32eJohn Spurlock Global.putInt(getContentResolver(), Global.ZEN_MODE, value); 300623a0e9f45c294ea7e714295f41ba2d8bcd7b32eJohn Spurlock } 301623a0e9f45c294ea7e714295f41ba2d8bcd7b32eJohn Spurlock 302623a0e9f45c294ea7e714295f41ba2d8bcd7b32eJohn Spurlock protected ZenModeConditionSelection newConditionSelection() { 303623a0e9f45c294ea7e714295f41ba2d8bcd7b32eJohn Spurlock return new ZenModeConditionSelection(mContext); 304623a0e9f45c294ea7e714295f41ba2d8bcd7b32eJohn Spurlock } 305623a0e9f45c294ea7e714295f41ba2d8bcd7b32eJohn Spurlock 306623a0e9f45c294ea7e714295f41ba2d8bcd7b32eJohn Spurlock private final Runnable mHideDialog = new Runnable() { 307623a0e9f45c294ea7e714295f41ba2d8bcd7b32eJohn Spurlock @Override 308623a0e9f45c294ea7e714295f41ba2d8bcd7b32eJohn Spurlock public void run() { 309623a0e9f45c294ea7e714295f41ba2d8bcd7b32eJohn Spurlock if (mDialog != null) { 310623a0e9f45c294ea7e714295f41ba2d8bcd7b32eJohn Spurlock mDialog.dismiss(); 311623a0e9f45c294ea7e714295f41ba2d8bcd7b32eJohn Spurlock mDialog = null; 312623a0e9f45c294ea7e714295f41ba2d8bcd7b32eJohn Spurlock } 313623a0e9f45c294ea7e714295f41ba2d8bcd7b32eJohn Spurlock } 314623a0e9f45c294ea7e714295f41ba2d8bcd7b32eJohn Spurlock }; 315623a0e9f45c294ea7e714295f41ba2d8bcd7b32eJohn Spurlock 316623a0e9f45c294ea7e714295f41ba2d8bcd7b32eJohn Spurlock private final Runnable mShowDialog = new Runnable() { 317623a0e9f45c294ea7e714295f41ba2d8bcd7b32eJohn Spurlock @Override 318623a0e9f45c294ea7e714295f41ba2d8bcd7b32eJohn Spurlock public void run() { 319623a0e9f45c294ea7e714295f41ba2d8bcd7b32eJohn Spurlock mDialog = new AlertDialog.Builder(mContext) 320623a0e9f45c294ea7e714295f41ba2d8bcd7b32eJohn Spurlock .setTitle(R.string.zen_mode_settings_title) 321623a0e9f45c294ea7e714295f41ba2d8bcd7b32eJohn Spurlock .setView(newConditionSelection()) 322623a0e9f45c294ea7e714295f41ba2d8bcd7b32eJohn Spurlock .setNegativeButton(R.string.dlg_cancel, new DialogInterface.OnClickListener() { 323623a0e9f45c294ea7e714295f41ba2d8bcd7b32eJohn Spurlock @Override 324623a0e9f45c294ea7e714295f41ba2d8bcd7b32eJohn Spurlock public void onClick(DialogInterface dialog, int which) { 325623a0e9f45c294ea7e714295f41ba2d8bcd7b32eJohn Spurlock putZenModeSetting(Global.ZEN_MODE_OFF); 326623a0e9f45c294ea7e714295f41ba2d8bcd7b32eJohn Spurlock } 327623a0e9f45c294ea7e714295f41ba2d8bcd7b32eJohn Spurlock }) 328623a0e9f45c294ea7e714295f41ba2d8bcd7b32eJohn Spurlock .setPositiveButton(R.string.dlg_ok, new DialogInterface.OnClickListener() { 329623a0e9f45c294ea7e714295f41ba2d8bcd7b32eJohn Spurlock @Override 330623a0e9f45c294ea7e714295f41ba2d8bcd7b32eJohn Spurlock public void onClick(DialogInterface dialog, int which) { 331623a0e9f45c294ea7e714295f41ba2d8bcd7b32eJohn Spurlock // noop 332623a0e9f45c294ea7e714295f41ba2d8bcd7b32eJohn Spurlock } 333623a0e9f45c294ea7e714295f41ba2d8bcd7b32eJohn Spurlock }) 334623a0e9f45c294ea7e714295f41ba2d8bcd7b32eJohn Spurlock .show(); 335623a0e9f45c294ea7e714295f41ba2d8bcd7b32eJohn Spurlock } 336623a0e9f45c294ea7e714295f41ba2d8bcd7b32eJohn Spurlock }; 337623a0e9f45c294ea7e714295f41ba2d8bcd7b32eJohn Spurlock 338c41dfb4f6ce5de287045ee97a55350ef7cc1a279John Spurlock private final OnPreferenceChangeListener mSwitchListener = new OnPreferenceChangeListener() { 3397f502bf824955b2b3a43f8f7f32c00cf00f736feJohn Spurlock @Override 340c41dfb4f6ce5de287045ee97a55350ef7cc1a279John Spurlock public boolean onPreferenceChange(Preference preference, Object newValue) { 341c41dfb4f6ce5de287045ee97a55350ef7cc1a279John Spurlock final boolean isChecked = (Boolean) newValue; 3427f502bf824955b2b3a43f8f7f32c00cf00f736feJohn Spurlock AsyncTask.execute(new Runnable() { 3437f502bf824955b2b3a43f8f7f32c00cf00f736feJohn Spurlock @Override 3447f502bf824955b2b3a43f8f7f32c00cf00f736feJohn Spurlock public void run() { 3457f502bf824955b2b3a43f8f7f32c00cf00f736feJohn Spurlock final int v = isChecked ? Global.ZEN_MODE_ON : Global.ZEN_MODE_OFF; 346623a0e9f45c294ea7e714295f41ba2d8bcd7b32eJohn Spurlock putZenModeSetting(v); 347623a0e9f45c294ea7e714295f41ba2d8bcd7b32eJohn Spurlock mHandler.post(isChecked ? mShowDialog : mHideDialog); 3487f502bf824955b2b3a43f8f7f32c00cf00f736feJohn Spurlock } 3497f502bf824955b2b3a43f8f7f32c00cf00f736feJohn Spurlock }); 350c41dfb4f6ce5de287045ee97a55350ef7cc1a279John Spurlock return true; 3517f502bf824955b2b3a43f8f7f32c00cf00f736feJohn Spurlock } 3527f502bf824955b2b3a43f8f7f32c00cf00f736feJohn Spurlock }; 3537f502bf824955b2b3a43f8f7f32c00cf00f736feJohn Spurlock 354cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock // Enable indexing of searchable data 355cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock public static final Indexable.SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER = 356cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock new BaseSearchIndexProvider() { 357cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock @Override 358cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock public List<SearchIndexableRaw> getRawDataToIndex(Context context, boolean enabled) { 359cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock final List<SearchIndexableRaw> result = new ArrayList<SearchIndexableRaw>(); 360cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock add(result, context, R.string.zen_mode_settings_title); 361cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock add(result, context, R.string.zen_mode_general_category); 362cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock add(result, context, R.string.zen_mode_phone_calls); 363cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock add(result, context, R.string.zen_mode_messages); 364cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock add(result, context, R.string.zen_mode_automatic_category); 365cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock add(result, context, R.string.zen_mode_when); 366cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock add(result, context, R.string.zen_mode_start_time); 367cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock add(result, context, R.string.zen_mode_end_time); 368cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock return result; 369cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } 37072438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock 371cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock private void add(List<SearchIndexableRaw> result, Context context, int title) { 372cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock final Resources res = context.getResources(); 373cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock final SearchIndexableRaw data = new SearchIndexableRaw(context); 374cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock data.title = res.getString(title); 375cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock data.screenTitle = res.getString(R.string.zen_mode_settings_title); 376cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock result.add(data); 377cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } 378cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock }; 37972438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock 380cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock private final class SettingsObserver extends ContentObserver { 381cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock private final Uri ZEN_MODE_URI = Global.getUriFor(Global.ZEN_MODE); 382cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock private final Uri ZEN_MODE_CONFIG_ETAG_URI = Global.getUriFor(Global.ZEN_MODE_CONFIG_ETAG); 38372438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock 384cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock public SettingsObserver() { 385cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock super(mHandler); 38672438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock } 38772438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock 388cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock public void register() { 389cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock getContentResolver().registerContentObserver(ZEN_MODE_URI, false, this); 390cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock getContentResolver().registerContentObserver(ZEN_MODE_CONFIG_ETAG_URI, false, this); 39172438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock } 39272438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock 393cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock public void unregister() { 394cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock getContentResolver().unregisterContentObserver(this); 39572438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock } 39672438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock 397cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock @Override 398cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock public void onChange(boolean selfChange, Uri uri) { 399cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock super.onChange(selfChange, uri); 400cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock if (ZEN_MODE_URI.equals(uri)) { 401cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock updateZenMode(); 402cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } 403cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock if (ZEN_MODE_CONFIG_ETAG_URI.equals(uri)) { 404cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock updateZenModeConfig(); 405cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } 40672438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock } 407cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } 40872438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock 409cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock private static class TimePickerPreference extends Preference { 410cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock private final Context mContext; 41172438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock 412cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock private int mSummaryFormat; 413cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock private int mHourOfDay; 414cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock private int mMinute; 415cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock private Callback mCallback; 416cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock 417cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock public TimePickerPreference(Context context, final FragmentManager mgr) { 418cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock super(context); 419cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mContext = context; 420cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock setPersistent(false); 421cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock setOnPreferenceClickListener(new OnPreferenceClickListener(){ 422cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock @Override 423cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock public boolean onPreferenceClick(Preference preference) { 424cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock final TimePickerFragment frag = new TimePickerFragment(); 425cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock frag.pref = TimePickerPreference.this; 426cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock frag.show(mgr, TimePickerPreference.class.getName()); 427cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock return true; 428cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } 429cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock }); 43072438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock } 43172438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock 432cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock public void setCallback(Callback callback) { 433cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mCallback = callback; 43472438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock } 43572438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock 436cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock public void setSummaryFormat(int resId) { 437cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mSummaryFormat = resId; 438cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock updateSummary(); 439cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } 44072438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock 441cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock public void setTime(int hourOfDay, int minute) { 442cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock if (mCallback != null && !mCallback.onSetTime(hourOfDay, minute)) return; 443cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mHourOfDay = hourOfDay; 444cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mMinute = minute; 445cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock updateSummary(); 446cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } 44772438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock 448cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock private void updateSummary() { 449cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock final Calendar c = Calendar.getInstance(); 450cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock c.set(Calendar.HOUR_OF_DAY, mHourOfDay); 451cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock c.set(Calendar.MINUTE, mMinute); 452cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock String time = DateFormat.getTimeFormat(mContext).format(c.getTime()); 453cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock if (mSummaryFormat != 0) { 454cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock time = mContext.getResources().getString(mSummaryFormat, time); 45572438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock } 456cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock setSummary(time); 45772438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock } 458019b87f17a51fef7fd4b6696dbea5c50fe8b6d07Fabrice Di Meglio 459cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock public static class TimePickerFragment extends DialogFragment implements 460cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock TimePickerDialog.OnTimeSetListener { 461cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock public TimePickerPreference pref; 462019b87f17a51fef7fd4b6696dbea5c50fe8b6d07Fabrice Di Meglio 463cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock @Override 464cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock public Dialog onCreateDialog(Bundle savedInstanceState) { 465cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock final boolean usePref = pref != null && pref.mHourOfDay >= 0 && pref.mMinute >= 0; 466cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock final Calendar c = Calendar.getInstance(); 467cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock final int hour = usePref ? pref.mHourOfDay : c.get(Calendar.HOUR_OF_DAY); 468cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock final int minute = usePref ? pref.mMinute : c.get(Calendar.MINUTE); 469cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock return new TimePickerDialog(getActivity(), this, hour, minute, 470cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock DateFormat.is24HourFormat(getActivity())); 471cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } 472019b87f17a51fef7fd4b6696dbea5c50fe8b6d07Fabrice Di Meglio 473cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock public void onTimeSet(TimePicker view, int hourOfDay, int minute) { 474cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock if (pref != null) { 475cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock pref.setTime(hourOfDay, minute); 476cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } 477cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } 478cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } 479019b87f17a51fef7fd4b6696dbea5c50fe8b6d07Fabrice Di Meglio 480cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock public interface Callback { 481cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock boolean onSetTime(int hour, int minute); 482cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } 483cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } 48472438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock} 485