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