ZenModeSettings.java revision cc819a67f49ab4bfb42e51454bec54c03dd4f595
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 197f502bf824955b2b3a43f8f7f32c00cf00f736feJohn Spurlockimport android.app.ActionBar; 207f502bf824955b2b3a43f8f7f32c00cf00f736feJohn Spurlockimport android.app.Activity; 21cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlockimport android.app.Dialog; 22cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlockimport android.app.DialogFragment; 23cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlockimport android.app.FragmentManager; 24cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlockimport android.app.INotificationManager; 25cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlockimport android.app.TimePickerDialog; 2672438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlockimport android.content.Context; 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.Gravity; 453726525d50d480a3d954c103a844f0c4b3c7d3e0John Spurlockimport android.view.Menu; 463726525d50d480a3d954c103a844f0c4b3c7d3e0John Spurlockimport android.view.MenuInflater; 473726525d50d480a3d954c103a844f0c4b3c7d3e0John Spurlockimport android.view.MenuItem; 4872438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlockimport android.view.View; 4972438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlockimport android.view.ViewGroup; 50cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlockimport android.widget.AdapterView; 51cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlockimport android.widget.AdapterView.OnItemSelectedListener; 52cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlockimport android.widget.ArrayAdapter; 5372438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlockimport android.widget.CompoundButton; 5472438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlockimport android.widget.CompoundButton.OnCheckedChangeListener; 55cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlockimport android.widget.Spinner; 567f502bf824955b2b3a43f8f7f32c00cf00f736feJohn Spurlockimport android.widget.Switch; 5772438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlockimport android.widget.TextView; 58cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlockimport android.widget.TimePicker; 594a35051565b0ce6d29313c3e4ffe19e1dde78db0John Spurlock 604a35051565b0ce6d29313c3e4ffe19e1dde78db0John Spurlockimport com.android.settings.R; 614a35051565b0ce6d29313c3e4ffe19e1dde78db0John Spurlockimport com.android.settings.SettingsPreferenceFragment; 62cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlockimport com.android.settings.search.BaseSearchIndexProvider; 63019b87f17a51fef7fd4b6696dbea5c50fe8b6d07Fabrice Di Meglioimport com.android.settings.search.Indexable; 64019b87f17a51fef7fd4b6696dbea5c50fe8b6d07Fabrice Di Meglioimport com.android.settings.search.SearchIndexableRaw; 6572438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock 66019b87f17a51fef7fd4b6696dbea5c50fe8b6d07Fabrice Di Meglioimport java.util.ArrayList; 67cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlockimport java.util.Calendar; 68019b87f17a51fef7fd4b6696dbea5c50fe8b6d07Fabrice Di Meglioimport java.util.List; 69cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlockimport java.util.Objects; 70019b87f17a51fef7fd4b6696dbea5c50fe8b6d07Fabrice Di Meglio 71019b87f17a51fef7fd4b6696dbea5c50fe8b6d07Fabrice Di Megliopublic class ZenModeSettings extends SettingsPreferenceFragment implements Indexable { 7272438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock private static final String TAG = "ZenModeSettings"; 73cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock private static final boolean DEBUG = true; 74cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock 75cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock private static final String KEY_GENERAL = "general"; 76cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock private static final String KEY_CALLS = "phone_calls"; 77cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock private static final String KEY_MESSAGES = "messages"; 78cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock 79cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock private static final String KEY_AUTOMATIC = "automatic"; 80cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock private static final String KEY_WHEN = "when"; 8172438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock 827f502bf824955b2b3a43f8f7f32c00cf00f736feJohn Spurlock private final Handler mHandler = new Handler(); 837f502bf824955b2b3a43f8f7f32c00cf00f736feJohn Spurlock private final SettingsObserver mSettingsObserver = new SettingsObserver(); 847f502bf824955b2b3a43f8f7f32c00cf00f736feJohn Spurlock 857f502bf824955b2b3a43f8f7f32c00cf00f736feJohn Spurlock private Switch mSwitch; 863726525d50d480a3d954c103a844f0c4b3c7d3e0John Spurlock private Activity mActivity; 87cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock private Context mContext; 883726525d50d480a3d954c103a844f0c4b3c7d3e0John Spurlock private MenuItem mSearch; 89cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock private ZenModeConfig mConfig; 90cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock private boolean mDisableListeners; 91cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock private SwitchPreference mCalls; 92cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock private SwitchPreference mMessages; 93cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock private DropDownPreference mStarred; 94cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock private DropDownPreference mWhen; 95cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock private TimePickerPreference mStart; 96cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock private TimePickerPreference mEnd; 977f502bf824955b2b3a43f8f7f32c00cf00f736feJohn Spurlock 987f502bf824955b2b3a43f8f7f32c00cf00f736feJohn Spurlock @Override 997f502bf824955b2b3a43f8f7f32c00cf00f736feJohn Spurlock public void onCreate(Bundle icicle) { 1007f502bf824955b2b3a43f8f7f32c00cf00f736feJohn Spurlock super.onCreate(icicle); 101cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mContext = mActivity = getActivity(); 102ede14355180b84c634cade7e3f02d67be64cbff4Fabrice Di Meglio mSwitch = new Switch(mActivity.getActionBar().getThemedContext()); 103cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock final Resources res = mContext.getResources(); 104cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock final int p = res.getDimensionPixelSize(R.dimen.content_margin_left); 1053726525d50d480a3d954c103a844f0c4b3c7d3e0John Spurlock mSwitch.setPadding(0, 0, p, 0); 1063726525d50d480a3d954c103a844f0c4b3c7d3e0John Spurlock setHasOptionsMenu(true); 107cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock 108cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock addPreferencesFromResource(R.xml.zen_mode_settings); 109cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock final PreferenceScreen root = getPreferenceScreen(); 110cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock 111cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mConfig = getZenModeConfig(); 112cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock if (DEBUG) Log.d(TAG, "Loaded mConfig=" + mConfig); 113cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock 114cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock final PreferenceCategory general = (PreferenceCategory) root.findPreference(KEY_GENERAL); 115cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock 116cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mCalls = (SwitchPreference) root.findPreference(KEY_CALLS); 117cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mCalls.setOnPreferenceChangeListener(new OnPreferenceChangeListener() { 118cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock @Override 119cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock public boolean onPreferenceChange(Preference preference, Object newValue) { 120cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock if (mDisableListeners) return true; 121cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock final boolean val = (Boolean) newValue; 122cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock if (val == mConfig.allowCalls) return true; 123cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock if (DEBUG) Log.d(TAG, "onPrefChange allowCalls=" + val); 124cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock final ZenModeConfig newConfig = mConfig.copy(); 125cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock newConfig.allowCalls = val; 126cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock return setZenModeConfig(newConfig); 127cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } 128cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock }); 129cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock 130cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mMessages = (SwitchPreference) root.findPreference(KEY_MESSAGES); 131cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mMessages.setOnPreferenceChangeListener(new OnPreferenceChangeListener() { 132cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock @Override 133cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock public boolean onPreferenceChange(Preference preference, Object newValue) { 134cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock if (mDisableListeners) return true; 135cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock final boolean val = (Boolean) newValue; 136cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock if (val == mConfig.allowMessages) return true; 137cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock if (DEBUG) Log.d(TAG, "onPrefChange allowMessages=" + val); 138cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock final ZenModeConfig newConfig = mConfig.copy(); 139cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock newConfig.allowMessages = val; 140cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock return setZenModeConfig(newConfig); 141cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } 142cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock }); 143cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock 144cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mStarred = new DropDownPreference(mContext); 145cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mStarred.setEnabled(false); 146cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mStarred.setTitle(R.string.zen_mode_from); 147cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mStarred.addItem(R.string.zen_mode_from_anyone); 148cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mStarred.addItem(R.string.zen_mode_from_starred); 149cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mStarred.addItem(R.string.zen_mode_from_contacts); 150cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock general.addPreference(mStarred); 151cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock 152cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock final Preference alarmInfo = new Preference(mContext) { 153cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock @Override 154cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock public View getView(View convertView, ViewGroup parent) { 155cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock final TextView tv = new TextView(mContext); 156cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock tv.setTypeface(Typeface.create(Typeface.DEFAULT, Typeface.ITALIC)); 157cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock tv.setPadding(p, p, p, p); 158cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock tv.setText(R.string.zen_mode_alarm_info); 159cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock return tv; 160cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } 161cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock }; 162cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock alarmInfo.setPersistent(false); 163cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock alarmInfo.setSelectable(false); 164cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock general.addPreference(alarmInfo); 165cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock 166cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock final PreferenceCategory auto = (PreferenceCategory) root.findPreference(KEY_AUTOMATIC); 167cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock 168cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mWhen = new DropDownPreference(mContext); 169cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mWhen.setKey(KEY_WHEN); 170cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mWhen.setTitle(R.string.zen_mode_when); 171cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mWhen.addItem(R.string.zen_mode_when_never); 172cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mWhen.addItem(R.string.zen_mode_when_every_night); 173cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mWhen.addItem(R.string.zen_mode_when_weeknights); 174cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mWhen.setCallback(new DropDownPreference.Callback() { 175cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock @Override 176cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock public boolean onItemSelected(int pos) { 177cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock if (mDisableListeners) return true; 178cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock final String mode = pos == 1 ? ZenModeConfig.SLEEP_MODE_NIGHTS : 179cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock pos == 2 ? ZenModeConfig.SLEEP_MODE_WEEKNIGHTS : null; 180cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock if (Objects.equals(mode, mConfig.sleepMode)) return true; 181cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock if (DEBUG) Log.d(TAG, "onPrefChange sleepMode=" + mode); 182cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock final ZenModeConfig newConfig = mConfig.copy(); 183cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock newConfig.sleepMode = mode; 184cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock return setZenModeConfig(newConfig); 185cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } 186cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock }); 187cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock auto.addPreference(mWhen); 188cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock 189cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock final FragmentManager mgr = getFragmentManager(); 190cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock 191cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mStart = new TimePickerPreference(mContext, mgr); 192cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mStart.setTitle(R.string.zen_mode_start_time); 193cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mStart.setCallback(new TimePickerPreference.Callback() { 194cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock @Override 195cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock public boolean onSetTime(int hour, int minute) { 196cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock if (mDisableListeners) return true; 197cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock if (!ZenModeConfig.isValidHour(hour)) return false; 198cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock if (!ZenModeConfig.isValidMinute(minute)) return false; 199cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock if (hour == mConfig.sleepStartHour && minute == mConfig.sleepStartMinute) { 200cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock return true; 201cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } 202cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock if (DEBUG) Log.d(TAG, "onPrefChange sleepStart h=" + hour + " m=" + minute); 203cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock final ZenModeConfig newConfig = mConfig.copy(); 204cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock newConfig.sleepStartHour = hour; 205cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock newConfig.sleepStartMinute = minute; 206cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock return setZenModeConfig(newConfig); 207cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } 208cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock }); 209cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock auto.addPreference(mStart); 210cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock 211cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mEnd = new TimePickerPreference(mContext, mgr); 212cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mEnd.setTitle(R.string.zen_mode_end_time); 213cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mEnd.setSummaryFormat(R.string.zen_mode_end_time_summary_format); 214cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mEnd.setCallback(new TimePickerPreference.Callback() { 215cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock @Override 216cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock public boolean onSetTime(int hour, int minute) { 217cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock if (mDisableListeners) return true; 218cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock if (!ZenModeConfig.isValidHour(hour)) return false; 219cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock if (!ZenModeConfig.isValidMinute(minute)) return false; 220cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock if (hour == mConfig.sleepEndHour && minute == mConfig.sleepEndMinute) { 221cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock return true; 222cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } 223cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock if (DEBUG) Log.d(TAG, "onPrefChange sleepEnd h=" + hour + " m=" + minute); 224cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock final ZenModeConfig newConfig = mConfig.copy(); 225cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock newConfig.sleepEndHour = hour; 226cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock newConfig.sleepEndMinute = minute; 227cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock return setZenModeConfig(newConfig); 228cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } 229cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock }); 230cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock auto.addPreference(mEnd); 231cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock 232cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mStart.setDependency(mWhen.getKey()); 233cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mEnd.setDependency(mWhen.getKey()); 234cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock 235cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock updateControls(); 236cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } 237cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock 238cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock private void updateControls() { 239cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mDisableListeners = true; 240cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mCalls.setChecked(mConfig.allowCalls); 241cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mMessages.setChecked(mConfig.allowMessages); 242cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mStarred.setSelectedItem(0); 243cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mWhen.setSelectedItem( 244cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock ZenModeConfig.SLEEP_MODE_NIGHTS.equals(mConfig.sleepMode) ? 1 : 245cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock ZenModeConfig.SLEEP_MODE_WEEKNIGHTS.equals(mConfig.sleepMode) ? 2 : 0); 246cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mStart.setTime(mConfig.sleepStartHour, mConfig.sleepStartMinute); 247cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mEnd.setTime(mConfig.sleepEndHour, mConfig.sleepEndMinute); 248cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mDisableListeners = false; 2497f502bf824955b2b3a43f8f7f32c00cf00f736feJohn Spurlock } 2507f502bf824955b2b3a43f8f7f32c00cf00f736feJohn Spurlock 2517f502bf824955b2b3a43f8f7f32c00cf00f736feJohn Spurlock @Override 2523726525d50d480a3d954c103a844f0c4b3c7d3e0John Spurlock public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 2533726525d50d480a3d954c103a844f0c4b3c7d3e0John Spurlock super.onCreateOptionsMenu(menu, inflater); 2543726525d50d480a3d954c103a844f0c4b3c7d3e0John Spurlock mSearch = menu.findItem(R.id.search); 2553726525d50d480a3d954c103a844f0c4b3c7d3e0John Spurlock if (mSearch != null) mSearch.setVisible(false); 2567f502bf824955b2b3a43f8f7f32c00cf00f736feJohn Spurlock } 2577f502bf824955b2b3a43f8f7f32c00cf00f736feJohn Spurlock 2587f502bf824955b2b3a43f8f7f32c00cf00f736feJohn Spurlock @Override 2597f502bf824955b2b3a43f8f7f32c00cf00f736feJohn Spurlock public void onResume() { 2607f502bf824955b2b3a43f8f7f32c00cf00f736feJohn Spurlock super.onResume(); 261cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock updateZenMode(); 2627f502bf824955b2b3a43f8f7f32c00cf00f736feJohn Spurlock mSettingsObserver.register(); 2633726525d50d480a3d954c103a844f0c4b3c7d3e0John Spurlock mActivity.getActionBar().setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM, 2643726525d50d480a3d954c103a844f0c4b3c7d3e0John Spurlock ActionBar.DISPLAY_SHOW_CUSTOM); 2653726525d50d480a3d954c103a844f0c4b3c7d3e0John Spurlock mActivity.getActionBar().setCustomView(mSwitch, new ActionBar.LayoutParams( 2663726525d50d480a3d954c103a844f0c4b3c7d3e0John Spurlock ActionBar.LayoutParams.WRAP_CONTENT, 2673726525d50d480a3d954c103a844f0c4b3c7d3e0John Spurlock ActionBar.LayoutParams.WRAP_CONTENT, 2683726525d50d480a3d954c103a844f0c4b3c7d3e0John Spurlock Gravity.CENTER_VERTICAL | Gravity.END)); 2693726525d50d480a3d954c103a844f0c4b3c7d3e0John Spurlock if (mSearch != null) mSearch.setVisible(false); 2703726525d50d480a3d954c103a844f0c4b3c7d3e0John Spurlock } 2713726525d50d480a3d954c103a844f0c4b3c7d3e0John Spurlock 2723726525d50d480a3d954c103a844f0c4b3c7d3e0John Spurlock @Override 2733726525d50d480a3d954c103a844f0c4b3c7d3e0John Spurlock public void onPause() { 2743726525d50d480a3d954c103a844f0c4b3c7d3e0John Spurlock super.onPause(); 2753726525d50d480a3d954c103a844f0c4b3c7d3e0John Spurlock mSettingsObserver.unregister(); 2763726525d50d480a3d954c103a844f0c4b3c7d3e0John Spurlock mActivity.getActionBar().setDisplayOptions(0, ActionBar.DISPLAY_SHOW_CUSTOM); 2773726525d50d480a3d954c103a844f0c4b3c7d3e0John Spurlock if (mSearch != null) mSearch.setVisible(true); 2787f502bf824955b2b3a43f8f7f32c00cf00f736feJohn Spurlock } 2797f502bf824955b2b3a43f8f7f32c00cf00f736feJohn Spurlock 280cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock private void updateZenMode() { 2817f502bf824955b2b3a43f8f7f32c00cf00f736feJohn Spurlock mSwitch.setOnCheckedChangeListener(null); 2827f502bf824955b2b3a43f8f7f32c00cf00f736feJohn Spurlock final boolean zenMode = Global.getInt(getContentResolver(), 2837f502bf824955b2b3a43f8f7f32c00cf00f736feJohn Spurlock Global.ZEN_MODE, Global.ZEN_MODE_OFF) != Global.ZEN_MODE_OFF; 2847f502bf824955b2b3a43f8f7f32c00cf00f736feJohn Spurlock mSwitch.setChecked(zenMode); 2857f502bf824955b2b3a43f8f7f32c00cf00f736feJohn Spurlock mSwitch.setOnCheckedChangeListener(mSwitchListener); 2867f502bf824955b2b3a43f8f7f32c00cf00f736feJohn Spurlock } 28772438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock 288cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock private void updateZenModeConfig() { 289cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock final ZenModeConfig config = getZenModeConfig(); 290cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock if (Objects.equals(config, mConfig)) return; 291cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock if (DEBUG) Log.d(TAG, "updateZenModeConfig"); 292cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock updateControls(); 29372438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock } 29472438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock 295cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock private ZenModeConfig getZenModeConfig() { 296cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock final INotificationManager nm = INotificationManager.Stub.asInterface( 297cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock ServiceManager.getService(Context.NOTIFICATION_SERVICE)); 298cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock try { 299cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock return nm.getZenModeConfig(); 300cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } catch (Exception e) { 301cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock Log.w(TAG, "Error calling NoMan", e); 302cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock return new ZenModeConfig(); 303cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } 304cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } 305cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock 306cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock private boolean setZenModeConfig(ZenModeConfig config) { 307cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock final INotificationManager nm = INotificationManager.Stub.asInterface( 308cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock ServiceManager.getService(Context.NOTIFICATION_SERVICE)); 309cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock try { 310cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock final boolean success = nm.setZenModeConfig(config); 311cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock if (success) { 312cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mConfig = config; 313cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock if (DEBUG) Log.d(TAG, "Saved mConfig=" + mConfig); 314cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } 315cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock return success; 316cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } catch (Exception e) { 317cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock Log.w(TAG, "Error calling NoMan", e); 318cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock return false; 319cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } 32072438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock } 32172438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock 3227f502bf824955b2b3a43f8f7f32c00cf00f736feJohn Spurlock private final OnCheckedChangeListener mSwitchListener = new OnCheckedChangeListener() { 3237f502bf824955b2b3a43f8f7f32c00cf00f736feJohn Spurlock @Override 3247f502bf824955b2b3a43f8f7f32c00cf00f736feJohn Spurlock public void onCheckedChanged(CompoundButton buttonView, final boolean isChecked) { 3257f502bf824955b2b3a43f8f7f32c00cf00f736feJohn Spurlock AsyncTask.execute(new Runnable() { 3267f502bf824955b2b3a43f8f7f32c00cf00f736feJohn Spurlock @Override 3277f502bf824955b2b3a43f8f7f32c00cf00f736feJohn Spurlock public void run() { 3287f502bf824955b2b3a43f8f7f32c00cf00f736feJohn Spurlock final int v = isChecked ? Global.ZEN_MODE_ON : Global.ZEN_MODE_OFF; 3297f502bf824955b2b3a43f8f7f32c00cf00f736feJohn Spurlock Global.putInt(getContentResolver(), Global.ZEN_MODE, v); 3307f502bf824955b2b3a43f8f7f32c00cf00f736feJohn Spurlock } 3317f502bf824955b2b3a43f8f7f32c00cf00f736feJohn Spurlock }); 3327f502bf824955b2b3a43f8f7f32c00cf00f736feJohn Spurlock } 3337f502bf824955b2b3a43f8f7f32c00cf00f736feJohn Spurlock }; 3347f502bf824955b2b3a43f8f7f32c00cf00f736feJohn Spurlock 335cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock // Enable indexing of searchable data 336cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock public static final Indexable.SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER = 337cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock new BaseSearchIndexProvider() { 338cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock @Override 339cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock public List<SearchIndexableRaw> getRawDataToIndex(Context context, boolean enabled) { 340cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock final List<SearchIndexableRaw> result = new ArrayList<SearchIndexableRaw>(); 341cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock add(result, context, R.string.zen_mode_settings_title); 342cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock add(result, context, R.string.zen_mode_general_category); 343cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock add(result, context, R.string.zen_mode_phone_calls); 344cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock add(result, context, R.string.zen_mode_messages); 345cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock add(result, context, R.string.zen_mode_automatic_category); 346cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock add(result, context, R.string.zen_mode_when); 347cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock add(result, context, R.string.zen_mode_start_time); 348cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock add(result, context, R.string.zen_mode_end_time); 349cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock return result; 350cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } 35172438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock 352cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock private void add(List<SearchIndexableRaw> result, Context context, int title) { 353cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock final Resources res = context.getResources(); 354cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock final SearchIndexableRaw data = new SearchIndexableRaw(context); 355cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock data.title = res.getString(title); 356cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock data.screenTitle = res.getString(R.string.zen_mode_settings_title); 357cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock result.add(data); 358cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } 359cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock }; 36072438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock 361cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock private final class SettingsObserver extends ContentObserver { 362cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock private final Uri ZEN_MODE_URI = Global.getUriFor(Global.ZEN_MODE); 363cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock private final Uri ZEN_MODE_CONFIG_ETAG_URI = Global.getUriFor(Global.ZEN_MODE_CONFIG_ETAG); 36472438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock 365cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock public SettingsObserver() { 366cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock super(mHandler); 36772438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock } 36872438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock 369cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock public void register() { 370cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock getContentResolver().registerContentObserver(ZEN_MODE_URI, false, this); 371cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock getContentResolver().registerContentObserver(ZEN_MODE_CONFIG_ETAG_URI, false, this); 37272438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock } 37372438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock 374cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock public void unregister() { 375cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock getContentResolver().unregisterContentObserver(this); 37672438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock } 37772438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock 378cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock @Override 379cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock public void onChange(boolean selfChange, Uri uri) { 380cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock super.onChange(selfChange, uri); 381cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock if (ZEN_MODE_URI.equals(uri)) { 382cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock updateZenMode(); 383cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } 384cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock if (ZEN_MODE_CONFIG_ETAG_URI.equals(uri)) { 385cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock updateZenModeConfig(); 386cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } 38772438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock } 388cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } 38972438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock 390cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock private static class TimePickerPreference extends Preference { 391cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock private final Context mContext; 39272438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock 393cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock private int mSummaryFormat; 394cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock private int mHourOfDay; 395cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock private int mMinute; 396cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock private Callback mCallback; 397cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock 398cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock public TimePickerPreference(Context context, final FragmentManager mgr) { 399cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock super(context); 400cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mContext = context; 401cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock setPersistent(false); 402cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock setOnPreferenceClickListener(new OnPreferenceClickListener(){ 403cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock @Override 404cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock public boolean onPreferenceClick(Preference preference) { 405cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock final TimePickerFragment frag = new TimePickerFragment(); 406cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock frag.pref = TimePickerPreference.this; 407cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock frag.show(mgr, TimePickerPreference.class.getName()); 408cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock return true; 409cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } 410cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock }); 41172438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock } 41272438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock 413cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock public void setCallback(Callback callback) { 414cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mCallback = callback; 41572438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock } 41672438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock 417cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock public void setSummaryFormat(int resId) { 418cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mSummaryFormat = resId; 419cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock updateSummary(); 420cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } 42172438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock 422cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock public void setTime(int hourOfDay, int minute) { 423cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock if (mCallback != null && !mCallback.onSetTime(hourOfDay, minute)) return; 424cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mHourOfDay = hourOfDay; 425cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mMinute = minute; 426cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock updateSummary(); 427cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } 42872438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock 429cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock private void updateSummary() { 430cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock final Calendar c = Calendar.getInstance(); 431cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock c.set(Calendar.HOUR_OF_DAY, mHourOfDay); 432cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock c.set(Calendar.MINUTE, mMinute); 433cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock String time = DateFormat.getTimeFormat(mContext).format(c.getTime()); 434cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock if (mSummaryFormat != 0) { 435cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock time = mContext.getResources().getString(mSummaryFormat, time); 43672438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock } 437cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock setSummary(time); 43872438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock } 439019b87f17a51fef7fd4b6696dbea5c50fe8b6d07Fabrice Di Meglio 440cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock public static class TimePickerFragment extends DialogFragment implements 441cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock TimePickerDialog.OnTimeSetListener { 442cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock public TimePickerPreference pref; 443019b87f17a51fef7fd4b6696dbea5c50fe8b6d07Fabrice Di Meglio 444cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock @Override 445cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock public Dialog onCreateDialog(Bundle savedInstanceState) { 446cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock final boolean usePref = pref != null && pref.mHourOfDay >= 0 && pref.mMinute >= 0; 447cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock final Calendar c = Calendar.getInstance(); 448cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock final int hour = usePref ? pref.mHourOfDay : c.get(Calendar.HOUR_OF_DAY); 449cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock final int minute = usePref ? pref.mMinute : c.get(Calendar.MINUTE); 450cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock return new TimePickerDialog(getActivity(), this, hour, minute, 451cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock DateFormat.is24HourFormat(getActivity())); 452cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } 453019b87f17a51fef7fd4b6696dbea5c50fe8b6d07Fabrice Di Meglio 454cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock public void onTimeSet(TimePicker view, int hourOfDay, int minute) { 455cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock if (pref != null) { 456cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock pref.setTime(hourOfDay, minute); 457cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } 458cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } 459cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } 460019b87f17a51fef7fd4b6696dbea5c50fe8b6d07Fabrice Di Meglio 461cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock public interface Callback { 462cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock boolean onSetTime(int hour, int minute); 463cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } 464cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } 465019b87f17a51fef7fd4b6696dbea5c50fe8b6d07Fabrice Di Meglio 466cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock private static class DropDownPreference extends Preference { 467cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock private final Context mContext; 468cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock private final ArrayAdapter<String> mAdapter; 469cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock private final Spinner mSpinner; 470019b87f17a51fef7fd4b6696dbea5c50fe8b6d07Fabrice Di Meglio 471cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock private Callback mCallback; 472019b87f17a51fef7fd4b6696dbea5c50fe8b6d07Fabrice Di Meglio 473cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock public DropDownPreference(Context context) { 474cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock super(context); 475cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mContext = context; 476cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mAdapter = new ArrayAdapter<String>(mContext, 477cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock android.R.layout.simple_spinner_dropdown_item); 478cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock 479cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mSpinner = new Spinner(mContext); 480cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mSpinner.setDropDownWidth(mContext.getResources() 481cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock .getDimensionPixelSize(R.dimen.zen_mode_dropdown_width)); 482cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mSpinner.setVisibility(View.INVISIBLE); 483cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mSpinner.setAdapter(mAdapter); 484cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mSpinner.setOnItemSelectedListener(new OnItemSelectedListener() { 485cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock @Override 486cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock public void onItemSelected(AdapterView<?> parent, View v, int position, long id) { 487cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock setSelectedItem(position); 488cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } 489019b87f17a51fef7fd4b6696dbea5c50fe8b6d07Fabrice Di Meglio 490cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock @Override 491cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock public void onNothingSelected(AdapterView<?> parent) { 492cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock // noop 493cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } 494cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock }); 495cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock setPersistent(false); 496cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock setOnPreferenceClickListener(new OnPreferenceClickListener() { 497cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock @Override 498cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock public boolean onPreferenceClick(Preference preference) { 499cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mSpinner.performClick(); 500cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock return true; 501cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } 502cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock }); 503cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } 504019b87f17a51fef7fd4b6696dbea5c50fe8b6d07Fabrice Di Meglio 505cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock public void setCallback(Callback callback) { 506cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mCallback = callback; 507cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } 508019b87f17a51fef7fd4b6696dbea5c50fe8b6d07Fabrice Di Meglio 509cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock public void setSelectedItem(int position) { 510cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock if (mCallback != null && !mCallback.onItemSelected(position)) { 511cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock return; 512cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } 513cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mSpinner.setSelection(position); 514cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock setSummary(mAdapter.getItem(position)); 515cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock final boolean disableDependents = position == 0; 516cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock notifyDependencyChange(disableDependents); 517cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } 518019b87f17a51fef7fd4b6696dbea5c50fe8b6d07Fabrice Di Meglio 519cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock public void addItem(int resId) { 520cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mAdapter.add(mContext.getResources().getString(resId)); 521cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } 522019b87f17a51fef7fd4b6696dbea5c50fe8b6d07Fabrice Di Meglio 523cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock @Override 524cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock protected void onBindView(View view) { 525cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock super.onBindView(view); 526cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock if (view.equals(mSpinner.getParent())) return; 527cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock if (mSpinner.getParent() != null) { 528cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock ((ViewGroup)mSpinner.getParent()).removeView(mSpinner); 529019b87f17a51fef7fd4b6696dbea5c50fe8b6d07Fabrice Di Meglio } 530cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock final ViewGroup vg = (ViewGroup)view; 531cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock vg.addView(mSpinner, 0); 532cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock final ViewGroup.LayoutParams lp = mSpinner.getLayoutParams(); 533cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock lp.width = 0; 534cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock mSpinner.setLayoutParams(lp); 535cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } 536019b87f17a51fef7fd4b6696dbea5c50fe8b6d07Fabrice Di Meglio 537cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock public interface Callback { 538cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock boolean onItemSelected(int pos); 539cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } 540cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock } 54172438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock} 542