ZenModeRuleSettingsBase.java revision 49b6103b56d777cb41f280e0dc636f738f6ba56d
1/* 2 * Copyright (C) 2015 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17package com.android.settings.notification; 18 19import android.app.AlertDialog; 20import android.content.Context; 21import android.content.DialogInterface; 22import android.content.DialogInterface.OnClickListener; 23import android.content.Intent; 24import android.net.Uri; 25import android.os.Bundle; 26import android.preference.Preference; 27import android.preference.Preference.OnPreferenceChangeListener; 28import android.preference.Preference.OnPreferenceClickListener; 29import android.preference.PreferenceScreen; 30import android.provider.Settings.Global; 31import android.service.notification.ZenModeConfig; 32import android.service.notification.ZenModeConfig.ZenRule; 33import android.util.Log; 34import android.view.Menu; 35import android.view.MenuInflater; 36import android.view.MenuItem; 37import android.view.View; 38import android.widget.Switch; 39import android.widget.Toast; 40 41import com.android.internal.logging.MetricsLogger; 42import com.android.settings.DropDownPreference; 43import com.android.settings.R; 44import com.android.settings.SettingsActivity; 45import com.android.settings.widget.SwitchBar; 46 47public abstract class ZenModeRuleSettingsBase extends ZenModeSettingsBase 48 implements SwitchBar.OnSwitchChangeListener { 49 protected static final String TAG = ZenModeSettingsBase.TAG; 50 protected static final boolean DEBUG = ZenModeSettingsBase.DEBUG; 51 52 public static final String EXTRA_RULE_ID = "rule_id"; 53 private static final String KEY_RULE_NAME = "rule_name"; 54 private static final String KEY_ZEN_MODE = "zen_mode"; 55 56 protected Context mContext; 57 protected boolean mDisableListeners; 58 protected ZenRule mRule; 59 60 private String mRuleId; 61 private boolean mDeleting; 62 private Preference mRuleName; 63 private SwitchBar mSwitchBar; 64 private DropDownPreference mZenMode; 65 private Toast mEnabledToast; 66 67 abstract protected void onCreateInternal(); 68 abstract protected boolean setRule(ZenRule rule); 69 abstract protected String getZenModeDependency(); 70 abstract protected void updateControlsInternal(); 71 abstract protected int getEnabledToastText(); 72 73 @Override 74 public void onCreate(Bundle icicle) { 75 super.onCreate(icicle); 76 77 mContext = getActivity(); 78 79 final Intent intent = getActivity().getIntent(); 80 if (DEBUG) Log.d(TAG, "onCreate getIntent()=" + intent); 81 if (intent == null) { 82 Log.w(TAG, "No intent"); 83 toastAndFinish(); 84 return; 85 } 86 87 mRuleId = intent.getStringExtra(EXTRA_RULE_ID); 88 if (DEBUG) Log.d(TAG, "mRuleId=" + mRuleId); 89 if (refreshRuleOrFinish()) { 90 return; 91 } 92 93 setHasOptionsMenu(true); 94 95 onCreateInternal(); 96 97 final PreferenceScreen root = getPreferenceScreen(); 98 mRuleName = root.findPreference(KEY_RULE_NAME); 99 mRuleName.setOnPreferenceClickListener(new OnPreferenceClickListener() { 100 @Override 101 public boolean onPreferenceClick(Preference preference) { 102 showRuleNameDialog(); 103 return true; 104 } 105 }); 106 107 mZenMode = (DropDownPreference) root.findPreference(KEY_ZEN_MODE); 108 mZenMode.setEntries(new CharSequence[] { 109 getString(R.string.zen_mode_option_important_interruptions), 110 getString(R.string.zen_mode_option_alarms), 111 getString(R.string.zen_mode_option_no_interruptions), 112 }); 113 mZenMode.setEntryValues(new CharSequence[] { 114 Integer.toString(Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS), 115 Integer.toString(Global.ZEN_MODE_ALARMS), 116 Integer.toString(Global.ZEN_MODE_NO_INTERRUPTIONS), 117 }); 118 mZenMode.setOnPreferenceChangeListener(new OnPreferenceChangeListener() { 119 @Override 120 public boolean onPreferenceChange(Preference preference, Object newValue) { 121 if (mDisableListeners) return false; 122 final int zenMode = Integer.parseInt((String) newValue); 123 if (zenMode == mRule.zenMode) return false; 124 if (DEBUG) Log.d(TAG, "onPrefChange zenMode=" + zenMode); 125 mRule.zenMode = zenMode; 126 setZenModeConfig(mConfig); 127 return true; 128 } 129 }); 130 mZenMode.setOrder(10); // sort at the bottom of the category 131 mZenMode.setDependency(getZenModeDependency()); 132 } 133 134 @Override 135 public void onResume() { 136 super.onResume(); 137 updateControls(); 138 } 139 140 @Override 141 public void onActivityCreated(Bundle savedInstanceState) { 142 super.onActivityCreated(savedInstanceState); 143 144 final SettingsActivity activity = (SettingsActivity) getActivity(); 145 mSwitchBar = activity.getSwitchBar(); 146 mSwitchBar.addOnSwitchChangeListener(this); 147 mSwitchBar.show(); 148 } 149 150 @Override 151 public void onDestroyView() { 152 super.onDestroyView(); 153 mSwitchBar.removeOnSwitchChangeListener(this); 154 mSwitchBar.hide(); 155 } 156 157 @Override 158 public void onSwitchChanged(Switch switchView, boolean isChecked) { 159 if (DEBUG) Log.d(TAG, "onSwitchChanged " + isChecked); 160 if (mDisableListeners) return; 161 final boolean enabled = isChecked; 162 if (enabled == mRule.enabled) return; 163 MetricsLogger.action(mContext, MetricsLogger.ACTION_ZEN_ENABLE_RULE, enabled); 164 if (DEBUG) Log.d(TAG, "onSwitchChanged enabled=" + enabled); 165 mRule.enabled = enabled; 166 mRule.snoozing = false; 167 setZenModeConfig(mConfig); 168 if (enabled) { 169 final int toastText = getEnabledToastText(); 170 if (toastText != 0) { 171 mEnabledToast = Toast.makeText(mContext, toastText, Toast.LENGTH_SHORT); 172 mEnabledToast.show(); 173 } 174 } else { 175 if (mEnabledToast != null) { 176 mEnabledToast.cancel(); 177 } 178 } 179 } 180 181 protected void updateRule(Uri newConditionId) { 182 mRule.conditionId = newConditionId; 183 mRule.condition = null; 184 mRule.snoozing = false; 185 setZenModeConfig(mConfig); 186 } 187 188 @Override 189 protected void onZenModeChanged() { 190 // noop 191 } 192 193 @Override 194 protected void onZenModeConfigChanged() { 195 if (!refreshRuleOrFinish()) { 196 updateControls(); 197 } 198 } 199 200 @Override 201 public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 202 if (DEBUG) Log.d(TAG, "onCreateOptionsMenu"); 203 inflater.inflate(R.menu.zen_mode_rule, menu); 204 } 205 206 @Override 207 public boolean onOptionsItemSelected(MenuItem item) { 208 if (DEBUG) Log.d(TAG, "onOptionsItemSelected " + item.getItemId()); 209 if (item.getItemId() == R.id.delete) { 210 MetricsLogger.action(mContext, MetricsLogger.ACTION_ZEN_DELETE_RULE); 211 showDeleteRuleDialog(); 212 return true; 213 } 214 return super.onOptionsItemSelected(item); 215 } 216 217 private void showRuleNameDialog() { 218 new ZenRuleNameDialog(mContext, null, mRule.name, mConfig.getAutomaticRuleNames()) { 219 @Override 220 public void onOk(String ruleName, RuleInfo type) { 221 final ZenModeConfig newConfig = mConfig.copy(); 222 final ZenRule rule = newConfig.automaticRules.get(mRuleId); 223 if (rule == null) return; 224 rule.name = ruleName; 225 setZenModeConfig(newConfig); 226 } 227 }.show(); 228 } 229 230 private boolean refreshRuleOrFinish() { 231 mRule = mConfig.automaticRules.get(mRuleId); 232 if (DEBUG) Log.d(TAG, "mRule=" + mRule); 233 if (!setRule(mRule)) { 234 toastAndFinish(); 235 return true; 236 } 237 return false; 238 } 239 240 private void showDeleteRuleDialog() { 241 final AlertDialog dialog = new AlertDialog.Builder(mContext) 242 .setMessage(getString(R.string.zen_mode_delete_rule_confirmation, mRule.name)) 243 .setNegativeButton(R.string.cancel, null) 244 .setPositiveButton(R.string.zen_mode_delete_rule_button, new OnClickListener() { 245 @Override 246 public void onClick(DialogInterface dialog, int which) { 247 MetricsLogger.action(mContext, MetricsLogger.ACTION_ZEN_DELETE_RULE_OK); 248 mDeleting = true; 249 mConfig.automaticRules.remove(mRuleId); 250 setZenModeConfig(mConfig); 251 } 252 }) 253 .show(); 254 final View messageView = dialog.findViewById(android.R.id.message); 255 if (messageView != null) { 256 messageView.setTextDirection(View.TEXT_DIRECTION_LOCALE); 257 } 258 } 259 260 private void toastAndFinish() { 261 if (!mDeleting) { 262 Toast.makeText(mContext, R.string.zen_mode_rule_not_found_text, Toast.LENGTH_SHORT) 263 .show(); 264 } 265 getActivity().finish(); 266 } 267 268 private void updateRuleName() { 269 getActivity().setTitle(mRule.name); 270 mRuleName.setSummary(mRule.name); 271 } 272 273 private void updateControls() { 274 mDisableListeners = true; 275 updateRuleName(); 276 updateControlsInternal(); 277 mZenMode.setValue(Integer.toString(mRule.zenMode)); 278 if (mSwitchBar != null) { 279 mSwitchBar.setChecked(mRule.enabled); 280 } 281 mDisableListeners = false; 282 } 283 284} 285