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
19e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynoldsimport android.app.AlertDialog;
20df4c67cc69512491f3aeece1255414e29928871bDoris Lingimport android.app.AutomaticZenRule;
21f02aa0cef40d8d8255fc5049804b533d41931e20Julia Reynoldsimport android.app.NotificationManager;
22f02aa0cef40d8d8255fc5049804b533d41931e20Julia Reynoldsimport android.app.NotificationManager.Policy;
23e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynoldsimport android.content.ComponentName;
2443ce3c0a5750b1b50c8953947833f4a1525bd779Fan Zhangimport android.content.Context;
25e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynoldsimport android.content.DialogInterface;
26e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynoldsimport android.content.Intent;
27e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynoldsimport android.content.pm.ApplicationInfo;
28e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynoldsimport android.content.pm.PackageManager;
29e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynoldsimport android.content.pm.ServiceInfo;
30e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynoldsimport android.content.res.Resources;
31e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynoldsimport android.graphics.drawable.Drawable;
32e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynoldsimport android.os.AsyncTask;
3372438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlockimport android.os.Bundle;
34e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynoldsimport android.provider.Settings;
35e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynoldsimport android.service.notification.ConditionProviderService;
36e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynoldsimport android.service.notification.ZenModeConfig;
37e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynoldsimport com.android.settings.utils.ManagedServiceSettings;
38e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynoldsimport com.android.settings.utils.ZenServiceListing;
3943ce3c0a5750b1b50c8953947833f4a1525bd779Fan Zhangimport android.support.annotation.VisibleForTesting;
4039b467482d1bf256a111c757e9b7621c6f523271Jason Monkimport android.support.v7.preference.Preference;
41e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynoldsimport android.support.v7.preference.PreferenceCategory;
4239b467482d1bf256a111c757e9b7621c6f523271Jason Monkimport android.support.v7.preference.PreferenceScreen;
43e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynoldsimport android.support.v7.preference.PreferenceViewHolder;
44e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynoldsimport android.view.View;
454a35051565b0ce6d29313c3e4ffe19e1dde78db0John Spurlock
46265d3c2a0c36251bf8a9f571d7239b6dd404d942Tamas Berghammerimport com.android.internal.logging.nano.MetricsProto.MetricsEvent;
474a35051565b0ce6d29313c3e4ffe19e1dde78db0John Spurlockimport com.android.settings.R;
48fdd294ef4ce89368a1166244a354393c463d7db8Julia Reynoldsimport com.android.settingslib.TwoTargetPreference;
49e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds
50e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynoldsimport java.lang.ref.WeakReference;
51e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynoldsimport java.util.Arrays;
52e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynoldsimport java.util.Comparator;
53df4c67cc69512491f3aeece1255414e29928871bDoris Lingimport java.util.Map;
54df4c67cc69512491f3aeece1255414e29928871bDoris Lingimport java.util.Map.Entry;
5572438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock
568c0a4238655990094fe444ac8f7b182963497030Julia Reynoldspublic class ZenModeSettings extends ZenModeSettingsBase {
5706976317cb7365affab2e991c1f3456738919098Matthew Fritze
5806976317cb7365affab2e991c1f3456738919098Matthew Fritze    public static final String KEY_VISUAL_SETTINGS = "visual_interruptions_settings";
5906976317cb7365affab2e991c1f3456738919098Matthew Fritze
6048bbd5d1e414abfa7efe21d10f6848f4916d8162John Spurlock    private static final String KEY_PRIORITY_SETTINGS = "priority_settings";
61e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds    private static final String KEY_AUTOMATIC_RULES = "automatic_rules";
62e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds
63e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds    static final ManagedServiceSettings.Config CONFIG = getConditionProviderConfig();
64c9afadb04b00598f5988101681089290cf14f79cJohn Spurlock
65e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds    private PreferenceCategory mAutomaticRules;
66d8b36835707edbeeb9c9fbc30eba855a0b6231c6John Spurlock    private Preference mPrioritySettings;
679bfad94ea370f8b8048c13d16117bc8c01a394c2Julia Reynolds    private Preference mVisualSettings;
689bfad94ea370f8b8048c13d16117bc8c01a394c2Julia Reynolds    private Policy mPolicy;
694d8a9bd8794a5e50f7de7fbbc435b48db50f4a91Doris Ling    private SummaryBuilder mSummaryBuilder;
70e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds    private PackageManager mPm;
71e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds    private ZenServiceListing mServiceListing;
7207f7efba67a5f261fca31890a1b60f23021325f5John Spurlock
73b47b2c3f6af650441f8069b87d0d82549913f7c5John Spurlock    @Override
74b47b2c3f6af650441f8069b87d0d82549913f7c5John Spurlock    public void onCreate(Bundle savedInstanceState) {
75b47b2c3f6af650441f8069b87d0d82549913f7c5John Spurlock        super.onCreate(savedInstanceState);
76b47b2c3f6af650441f8069b87d0d82549913f7c5John Spurlock
77b47b2c3f6af650441f8069b87d0d82549913f7c5John Spurlock        addPreferencesFromResource(R.xml.zen_mode_settings);
78b47b2c3f6af650441f8069b87d0d82549913f7c5John Spurlock        final PreferenceScreen root = getPreferenceScreen();
79b47b2c3f6af650441f8069b87d0d82549913f7c5John Spurlock
80e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds        mAutomaticRules = (PreferenceCategory) root.findPreference(KEY_AUTOMATIC_RULES);
81b47b2c3f6af650441f8069b87d0d82549913f7c5John Spurlock        mPrioritySettings = root.findPreference(KEY_PRIORITY_SETTINGS);
829bfad94ea370f8b8048c13d16117bc8c01a394c2Julia Reynolds        mVisualSettings = root.findPreference(KEY_VISUAL_SETTINGS);
839bfad94ea370f8b8048c13d16117bc8c01a394c2Julia Reynolds        mPolicy = NotificationManager.from(mContext).getNotificationPolicy();
844d8a9bd8794a5e50f7de7fbbc435b48db50f4a91Doris Ling        mSummaryBuilder = new SummaryBuilder(getContext());
85e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds        mPm = mContext.getPackageManager();
86e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds        mServiceListing = new ZenServiceListing(mContext, CONFIG);
87e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds        mServiceListing.reloadApprovedServices();
88b47b2c3f6af650441f8069b87d0d82549913f7c5John Spurlock    }
89b47b2c3f6af650441f8069b87d0d82549913f7c5John Spurlock
90b47b2c3f6af650441f8069b87d0d82549913f7c5John Spurlock    @Override
91b47b2c3f6af650441f8069b87d0d82549913f7c5John Spurlock    public void onResume() {
92b47b2c3f6af650441f8069b87d0d82549913f7c5John Spurlock        super.onResume();
93366d8809c886fd5857f872def96a436a50be2c06Sudheer Shanka        if (isUiRestricted()) {
94366d8809c886fd5857f872def96a436a50be2c06Sudheer Shanka            return;
95366d8809c886fd5857f872def96a436a50be2c06Sudheer Shanka        }
96e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds        updateControls();
97ac1c42f5dcf43b4b7092d4d6ca0c9dbd4f9fbfdeJohn Spurlock    }
98ac1c42f5dcf43b4b7092d4d6ca0c9dbd4f9fbfdeJohn Spurlock
997f502bf824955b2b3a43f8f7f32c00cf00f736feJohn Spurlock    @Override
1006507613ebcd22e4691c2af92a5c161bd327db336Fan Zhang    public int getMetricsCategory() {
1019d1bfd1e8de6e46137a9571507c03526880d6a46Chris Wren        return MetricsEvent.NOTIFICATION_ZEN_MODE;
1028a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren    }
1038a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren
1048a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren    @Override
10548bbd5d1e414abfa7efe21d10f6848f4916d8162John Spurlock    protected void onZenModeChanged() {
106b47b2c3f6af650441f8069b87d0d82549913f7c5John Spurlock        updateControls();
10748bbd5d1e414abfa7efe21d10f6848f4916d8162John Spurlock    }
10848bbd5d1e414abfa7efe21d10f6848f4916d8162John Spurlock
10948bbd5d1e414abfa7efe21d10f6848f4916d8162John Spurlock    @Override
110b47b2c3f6af650441f8069b87d0d82549913f7c5John Spurlock    protected void onZenModeConfigChanged() {
1119bfad94ea370f8b8048c13d16117bc8c01a394c2Julia Reynolds        mPolicy = NotificationManager.from(mContext).getNotificationPolicy();
112b47b2c3f6af650441f8069b87d0d82549913f7c5John Spurlock        updateControls();
113b47b2c3f6af650441f8069b87d0d82549913f7c5John Spurlock    }
114cc819a67f49ab4bfb42e51454bec54c03dd4f595John Spurlock
115b47b2c3f6af650441f8069b87d0d82549913f7c5John Spurlock    private void updateControls() {
11648bbd5d1e414abfa7efe21d10f6848f4916d8162John Spurlock        updatePrioritySettingsSummary();
1179bfad94ea370f8b8048c13d16117bc8c01a394c2Julia Reynolds        updateVisualSettingsSummary();
118e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds        updateAutomaticRules();
1197f502bf824955b2b3a43f8f7f32c00cf00f736feJohn Spurlock    }
1207f502bf824955b2b3a43f8f7f32c00cf00f736feJohn Spurlock
12148bbd5d1e414abfa7efe21d10f6848f4916d8162John Spurlock    private void updatePrioritySettingsSummary() {
1224d8a9bd8794a5e50f7de7fbbc435b48db50f4a91Doris Ling        mPrioritySettings.setSummary(mSummaryBuilder.getPrioritySettingSummary(mPolicy));
1234d8a9bd8794a5e50f7de7fbbc435b48db50f4a91Doris Ling    }
1244d8a9bd8794a5e50f7de7fbbc435b48db50f4a91Doris Ling
1254d8a9bd8794a5e50f7de7fbbc435b48db50f4a91Doris Ling    private void updateVisualSettingsSummary() {
1264d8a9bd8794a5e50f7de7fbbc435b48db50f4a91Doris Ling        mVisualSettings.setSummary(mSummaryBuilder.getVisualSettingSummary(mPolicy));
1274d8a9bd8794a5e50f7de7fbbc435b48db50f4a91Doris Ling    }
1284d8a9bd8794a5e50f7de7fbbc435b48db50f4a91Doris Ling
129e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds    private void updateAutomaticRules() {
130e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds        mAutomaticRules.removeAll();
131e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds        final Map.Entry<String,AutomaticZenRule>[] sortedRules = sortedRules();
132e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds        for (Map.Entry<String,AutomaticZenRule> sortedRule : sortedRules) {
133e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds            ZenRulePreference pref = new ZenRulePreference(getPrefContext(), sortedRule);
134e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds            if (pref.appExists) {
135e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds                mAutomaticRules.addPreference(pref);
136e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds            }
137e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds        }
138e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds        final Preference p = new Preference(getPrefContext());
139fabe7669586e942b954d9c3b778c75cee3b40a6eJulia Reynolds        p.setIcon(R.drawable.ic_menu_add);
140e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds        p.setTitle(R.string.zen_mode_add_rule);
141e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds        p.setPersistent(false);
142e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds        p.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
143e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds            @Override
144e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds            public boolean onPreferenceClick(Preference preference) {
145e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds                mMetricsFeatureProvider.action(mContext, MetricsEvent.ACTION_ZEN_ADD_RULE);
146e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds                showAddRuleDialog();
147e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds                return true;
148e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds            }
149e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds        });
150e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds        mAutomaticRules.addPreference(p);
151e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds    }
152e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds
153e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds    private void showAddRuleDialog() {
154e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds        new ZenRuleSelectionDialog(mContext, mServiceListing) {
155e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds            @Override
156e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds            public void onSystemRuleSelected(ZenRuleInfo ri) {
157e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds                showNameRuleDialog(ri);
158e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds            }
159e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds
160e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds            @Override
161e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds            public void onExternalRuleSelected(ZenRuleInfo ri) {
162e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds                Intent intent = new Intent().setComponent(ri.configurationActivity);
163e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds                startActivity(intent);
164e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds            }
165e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds        }.show();
166e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds    }
167e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds
168e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds    private String computeRuleSummary(AutomaticZenRule rule, boolean isSystemRule,
169e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds            CharSequence providerLabel) {
170e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds        final String mode = computeZenModeCaption(getResources(), rule.getInterruptionFilter());
171e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds        final String ruleState = (rule == null || !rule.isEnabled())
172e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds                ? getString(R.string.switch_off_text)
173e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds                : getString(R.string.zen_mode_rule_summary_enabled_combination, mode);
174e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds
17556b748d68640045ecb4d67591a3a0f94cb3f4000Julia Reynolds        return ruleState;
176e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds    }
177e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds
178e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds    private static ManagedServiceSettings.Config getConditionProviderConfig() {
179e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds        final ManagedServiceSettings.Config c = new ManagedServiceSettings.Config();
180e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds        c.tag = TAG;
181e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds        c.intentAction = ConditionProviderService.SERVICE_INTERFACE;
182e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds        c.permission = android.Manifest.permission.BIND_CONDITION_PROVIDER_SERVICE;
183e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds        c.noun = "condition provider";
184e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds        return c;
185e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds    }
186e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds
187e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds    private static String computeZenModeCaption(Resources res, int zenMode) {
188e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds        switch (zenMode) {
189e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds            case NotificationManager.INTERRUPTION_FILTER_ALARMS:
190e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds                return res.getString(R.string.zen_mode_option_alarms);
191e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds            case NotificationManager.INTERRUPTION_FILTER_PRIORITY:
192e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds                return res.getString(R.string.zen_mode_option_important_interruptions);
193e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds            case NotificationManager.INTERRUPTION_FILTER_NONE:
194e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds                return res.getString(R.string.zen_mode_option_no_interruptions);
195e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds            default:
196e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds                return null;
197e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds        }
198e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds    }
199e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds
200e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds    public static ZenRuleInfo getRuleInfo(PackageManager pm, ServiceInfo si) {
201e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds        if (si == null || si.metaData == null) return null;
202e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds        final String ruleType = si.metaData.getString(ConditionProviderService.META_DATA_RULE_TYPE);
203e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds        final ComponentName configurationActivity = getSettingsActivity(si);
204e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds        if (ruleType != null && !ruleType.trim().isEmpty() && configurationActivity != null) {
205e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds            final ZenRuleInfo ri = new ZenRuleInfo();
206e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds            ri.serviceComponent = new ComponentName(si.packageName, si.name);
207e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds            ri.settingsAction = Settings.ACTION_ZEN_MODE_EXTERNAL_RULE_SETTINGS;
208e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds            ri.title = ruleType;
209e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds            ri.packageName = si.packageName;
210e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds            ri.configurationActivity = getSettingsActivity(si);
211e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds            ri.packageLabel = si.applicationInfo.loadLabel(pm);
212e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds            ri.ruleInstanceLimit =
213e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds                    si.metaData.getInt(ConditionProviderService.META_DATA_RULE_INSTANCE_LIMIT, -1);
214e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds            return ri;
215e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds        }
216e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds        return null;
217e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds    }
218e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds
219e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds    private static ComponentName getSettingsActivity(ServiceInfo si) {
220e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds        if (si == null || si.metaData == null) return null;
221e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds        final String configurationActivity =
222e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds                si.metaData.getString(ConditionProviderService.META_DATA_CONFIGURATION_ACTIVITY);
223e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds        if (configurationActivity != null) {
224e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds            return ComponentName.unflattenFromString(configurationActivity);
225e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds        }
226e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds        return null;
227e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds    }
228e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds
229e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds    private void showNameRuleDialog(final ZenRuleInfo ri) {
230e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds        new ZenRuleNameDialog(mContext, null) {
231e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds            @Override
232e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds            public void onOk(String ruleName) {
233e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds                mMetricsFeatureProvider.action(mContext, MetricsEvent.ACTION_ZEN_ADD_RULE_OK);
234e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds                AutomaticZenRule rule = new AutomaticZenRule(ruleName, ri.serviceComponent,
235e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds                        ri.defaultConditionId, NotificationManager.INTERRUPTION_FILTER_PRIORITY,
236e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds                        true);
237e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds                String savedRuleId = addZenRule(rule);
238e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds                if (savedRuleId != null) {
239e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds                    startActivity(getRuleIntent(ri.settingsAction, null, savedRuleId));
240e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds                }
241e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds            }
242e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds        }.show();
243e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds    }
244e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds
245e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds    private void showDeleteRuleDialog(final String ruleId, final CharSequence ruleName) {
246e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds        new AlertDialog.Builder(mContext)
247e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds                .setMessage(getString(R.string.zen_mode_delete_rule_confirmation, ruleName))
248e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds                .setNegativeButton(R.string.cancel, null)
249e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds                .setPositiveButton(R.string.zen_mode_delete_rule_button,
250e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds                        new DialogInterface.OnClickListener() {
251e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds                            @Override
252e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds                            public void onClick(DialogInterface dialog, int which) {
253e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds                                mMetricsFeatureProvider.action(mContext,
254e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds                                        MetricsEvent.ACTION_ZEN_DELETE_RULE_OK);
255e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds                                removeZenRule(ruleId);
256e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds                            }
257e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds                        })
258e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds                .show();
259e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds    }
260e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds
261e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds    private Intent getRuleIntent(String settingsAction, ComponentName configurationActivity,
262e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds            String ruleId) {
263e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds        Intent intent = new Intent()
264e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds                .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
265e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds                .putExtra(ConditionProviderService.EXTRA_RULE_ID, ruleId);
266e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds        if (configurationActivity != null) {
267e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds            intent.setComponent(configurationActivity);
268e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds        } else {
269e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds            intent.setAction(settingsAction);
270e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds        }
271e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds        return intent;
272e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds    }
273e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds
274e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds    private Map.Entry<String,AutomaticZenRule>[] sortedRules() {
275e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds        final Map.Entry<String,AutomaticZenRule>[] rt =
276e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds                mRules.toArray(new Map.Entry[mRules.size()]);
277e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds        Arrays.sort(rt, RULE_COMPARATOR);
278e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds        return rt;
279e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds    }
280e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds
2814d8a9bd8794a5e50f7de7fbbc435b48db50f4a91Doris Ling    @Override
2824d8a9bd8794a5e50f7de7fbbc435b48db50f4a91Doris Ling    protected int getHelpResource() {
2834d8a9bd8794a5e50f7de7fbbc435b48db50f4a91Doris Ling        return R.string.help_uri_interruptions;
2844d8a9bd8794a5e50f7de7fbbc435b48db50f4a91Doris Ling    }
2854d8a9bd8794a5e50f7de7fbbc435b48db50f4a91Doris Ling
286fdd294ef4ce89368a1166244a354393c463d7db8Julia Reynolds    private class ZenRulePreference extends TwoTargetPreference {
287e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds        final CharSequence mName;
288e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds        final String mId;
289e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds        final boolean appExists;
290e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds
291e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds        public ZenRulePreference(Context context,
292e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds                final Map.Entry<String, AutomaticZenRule> ruleEntry) {
293e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds            super(context);
294e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds
295e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds            final AutomaticZenRule rule = ruleEntry.getValue();
296e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds            mName = rule.getName();
297e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds            mId = ruleEntry.getKey();
298e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds
299e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds            final boolean isSchedule = ZenModeConfig.isValidScheduleConditionId(
300e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds                    rule.getConditionId());
301e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds            final boolean isEvent = ZenModeConfig.isValidEventConditionId(rule.getConditionId());
302e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds            final boolean isSystemRule = isSchedule || isEvent;
303e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds
304e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds            try {
305e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds                ApplicationInfo info = mPm.getApplicationInfo(rule.getOwner().getPackageName(), 0);
306e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds                setSummary(computeRuleSummary(rule, isSystemRule, info.loadLabel(mPm)));
307e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds            } catch (PackageManager.NameNotFoundException e) {
308e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds                appExists = false;
309e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds                return;
310e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds            }
311e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds
312e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds            appExists = true;
313e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds            setTitle(rule.getName());
314e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds            setPersistent(false);
315e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds
316e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds            final String action = isSchedule ? ZenModeScheduleRuleSettings.ACTION
317e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds                    : isEvent ? ZenModeEventRuleSettings.ACTION : "";
318e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds            ServiceInfo si = mServiceListing.findService(rule.getOwner());
319e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds            ComponentName settingsActivity = getSettingsActivity(si);
320e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds            setIntent(getRuleIntent(action, settingsActivity, mId));
321e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds            setSelectable(settingsActivity != null || isSystemRule);
322fdd294ef4ce89368a1166244a354393c463d7db8Julia Reynolds        }
323e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds
324fdd294ef4ce89368a1166244a354393c463d7db8Julia Reynolds        @Override
325fdd294ef4ce89368a1166244a354393c463d7db8Julia Reynolds        protected int getSecondTargetResId() {
326fdd294ef4ce89368a1166244a354393c463d7db8Julia Reynolds            return R.layout.zen_rule_widget;
327e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds        }
328e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds
329e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds        @Override
330e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds        public void onBindViewHolder(PreferenceViewHolder view) {
331e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds            super.onBindViewHolder(view);
332e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds
333e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds            View v = view.findViewById(R.id.delete_zen_rule);
334e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds            if (v != null) {
335e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds                v.setOnClickListener(mDeleteListener);
336e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds            }
337e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds        }
338e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds
339e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds        private final View.OnClickListener mDeleteListener = new View.OnClickListener() {
340e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds            @Override
341e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds            public void onClick(View v) {
342e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds                showDeleteRuleDialog(mId, mName);
343e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds            }
344e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds        };
345e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds    }
346e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds
3474d8a9bd8794a5e50f7de7fbbc435b48db50f4a91Doris Ling    public static class SummaryBuilder {
3484d8a9bd8794a5e50f7de7fbbc435b48db50f4a91Doris Ling
3494d8a9bd8794a5e50f7de7fbbc435b48db50f4a91Doris Ling        private Context mContext;
3504d8a9bd8794a5e50f7de7fbbc435b48db50f4a91Doris Ling
3514d8a9bd8794a5e50f7de7fbbc435b48db50f4a91Doris Ling        public SummaryBuilder(Context context) {
3524d8a9bd8794a5e50f7de7fbbc435b48db50f4a91Doris Ling            mContext = context;
3534d8a9bd8794a5e50f7de7fbbc435b48db50f4a91Doris Ling        }
3544d8a9bd8794a5e50f7de7fbbc435b48db50f4a91Doris Ling
3554d8a9bd8794a5e50f7de7fbbc435b48db50f4a91Doris Ling        String getPrioritySettingSummary(Policy policy) {
3564d8a9bd8794a5e50f7de7fbbc435b48db50f4a91Doris Ling            String s = mContext.getString(R.string.zen_mode_alarms);
35778f612b8233974df12115da77282ba9075c28f3eJulia Reynolds            s = prepend(s, isCategoryEnabled(policy, Policy.PRIORITY_CATEGORY_EVENTS),
35878f612b8233974df12115da77282ba9075c28f3eJulia Reynolds                    R.string.zen_mode_events);
35978f612b8233974df12115da77282ba9075c28f3eJulia Reynolds            s = prepend(s, isCategoryEnabled(policy, Policy.PRIORITY_CATEGORY_REMINDERS),
360f02aa0cef40d8d8255fc5049804b533d41931e20Julia Reynolds                R.string.zen_mode_reminders);
3614d8a9bd8794a5e50f7de7fbbc435b48db50f4a91Doris Ling            if (isCategoryEnabled(policy, Policy.PRIORITY_CATEGORY_MESSAGES)) {
3624d8a9bd8794a5e50f7de7fbbc435b48db50f4a91Doris Ling                if (policy.priorityMessageSenders == Policy.PRIORITY_SENDERS_ANY) {
3634d8a9bd8794a5e50f7de7fbbc435b48db50f4a91Doris Ling                    s = append(s, true, R.string.zen_mode_all_messages);
3644d8a9bd8794a5e50f7de7fbbc435b48db50f4a91Doris Ling                } else {
3654d8a9bd8794a5e50f7de7fbbc435b48db50f4a91Doris Ling                    s = append(s, true, R.string.zen_mode_selected_messages);
3664d8a9bd8794a5e50f7de7fbbc435b48db50f4a91Doris Ling                }
367f02aa0cef40d8d8255fc5049804b533d41931e20Julia Reynolds            }
3684d8a9bd8794a5e50f7de7fbbc435b48db50f4a91Doris Ling            if (isCategoryEnabled(policy, Policy.PRIORITY_CATEGORY_CALLS)) {
3694d8a9bd8794a5e50f7de7fbbc435b48db50f4a91Doris Ling                if (policy.priorityCallSenders == Policy.PRIORITY_SENDERS_ANY) {
3704d8a9bd8794a5e50f7de7fbbc435b48db50f4a91Doris Ling                    s = append(s, true, R.string.zen_mode_all_callers);
3714d8a9bd8794a5e50f7de7fbbc435b48db50f4a91Doris Ling                } else {
3724d8a9bd8794a5e50f7de7fbbc435b48db50f4a91Doris Ling                    s = append(s, true, R.string.zen_mode_selected_callers);
3734d8a9bd8794a5e50f7de7fbbc435b48db50f4a91Doris Ling                }
3744d8a9bd8794a5e50f7de7fbbc435b48db50f4a91Doris Ling            } else if (isCategoryEnabled(policy, Policy.PRIORITY_CATEGORY_REPEAT_CALLERS)) {
3754d8a9bd8794a5e50f7de7fbbc435b48db50f4a91Doris Ling                s = append(s, true, R.string.zen_mode_repeat_callers);
376f02aa0cef40d8d8255fc5049804b533d41931e20Julia Reynolds            }
3774d8a9bd8794a5e50f7de7fbbc435b48db50f4a91Doris Ling            return s;
378f02aa0cef40d8d8255fc5049804b533d41931e20Julia Reynolds        }
37948bbd5d1e414abfa7efe21d10f6848f4916d8162John Spurlock
3804d8a9bd8794a5e50f7de7fbbc435b48db50f4a91Doris Ling        String getVisualSettingSummary(Policy policy) {
3814d8a9bd8794a5e50f7de7fbbc435b48db50f4a91Doris Ling            String s = mContext.getString(R.string.zen_mode_all_visual_interruptions);
3824d8a9bd8794a5e50f7de7fbbc435b48db50f4a91Doris Ling            if (isEffectSuppressed(policy, Policy.SUPPRESSED_EFFECT_SCREEN_ON)
3834d8a9bd8794a5e50f7de7fbbc435b48db50f4a91Doris Ling                && isEffectSuppressed(policy, Policy.SUPPRESSED_EFFECT_SCREEN_OFF)) {
3844d8a9bd8794a5e50f7de7fbbc435b48db50f4a91Doris Ling                s = mContext.getString(R.string.zen_mode_no_visual_interruptions);
3854d8a9bd8794a5e50f7de7fbbc435b48db50f4a91Doris Ling            } else if (isEffectSuppressed(policy, Policy.SUPPRESSED_EFFECT_SCREEN_ON)) {
3864d8a9bd8794a5e50f7de7fbbc435b48db50f4a91Doris Ling                s = mContext.getString(R.string.zen_mode_screen_on_visual_interruptions);
3874d8a9bd8794a5e50f7de7fbbc435b48db50f4a91Doris Ling            } else if (isEffectSuppressed(policy, Policy.SUPPRESSED_EFFECT_SCREEN_OFF)) {
3884d8a9bd8794a5e50f7de7fbbc435b48db50f4a91Doris Ling                s = mContext.getString(R.string.zen_mode_screen_off_visual_interruptions);
3894d8a9bd8794a5e50f7de7fbbc435b48db50f4a91Doris Ling            }
3904d8a9bd8794a5e50f7de7fbbc435b48db50f4a91Doris Ling            return s;
3919bfad94ea370f8b8048c13d16117bc8c01a394c2Julia Reynolds        }
3929bfad94ea370f8b8048c13d16117bc8c01a394c2Julia Reynolds
393df4c67cc69512491f3aeece1255414e29928871bDoris Ling        String getAutomaticRulesSummary() {
394df4c67cc69512491f3aeece1255414e29928871bDoris Ling            final int count = getEnabledAutomaticRulesCount();
395df4c67cc69512491f3aeece1255414e29928871bDoris Ling            return count == 0 ? mContext.getString(R.string.zen_mode_settings_summary_off)
396df4c67cc69512491f3aeece1255414e29928871bDoris Ling                : mContext.getResources().getQuantityString(
397df4c67cc69512491f3aeece1255414e29928871bDoris Ling                    R.plurals.zen_mode_settings_summary_on, count, count);
398df4c67cc69512491f3aeece1255414e29928871bDoris Ling        }
399df4c67cc69512491f3aeece1255414e29928871bDoris Ling
400df4c67cc69512491f3aeece1255414e29928871bDoris Ling        @VisibleForTesting
401df4c67cc69512491f3aeece1255414e29928871bDoris Ling        int getEnabledAutomaticRulesCount() {
402df4c67cc69512491f3aeece1255414e29928871bDoris Ling            int count = 0;
403df4c67cc69512491f3aeece1255414e29928871bDoris Ling            final Map<String, AutomaticZenRule> ruleMap =
404df4c67cc69512491f3aeece1255414e29928871bDoris Ling                NotificationManager.from(mContext).getAutomaticZenRules();
405df4c67cc69512491f3aeece1255414e29928871bDoris Ling            if (ruleMap != null) {
406df4c67cc69512491f3aeece1255414e29928871bDoris Ling                for (Entry<String, AutomaticZenRule> ruleEntry : ruleMap.entrySet()) {
407df4c67cc69512491f3aeece1255414e29928871bDoris Ling                    final AutomaticZenRule rule = ruleEntry.getValue();
408df4c67cc69512491f3aeece1255414e29928871bDoris Ling                    if (rule != null && rule.isEnabled()) {
409df4c67cc69512491f3aeece1255414e29928871bDoris Ling                        count++;
410df4c67cc69512491f3aeece1255414e29928871bDoris Ling                    }
411df4c67cc69512491f3aeece1255414e29928871bDoris Ling                }
412df4c67cc69512491f3aeece1255414e29928871bDoris Ling            }
413df4c67cc69512491f3aeece1255414e29928871bDoris Ling            return count;
414df4c67cc69512491f3aeece1255414e29928871bDoris Ling        }
415df4c67cc69512491f3aeece1255414e29928871bDoris Ling
4164d8a9bd8794a5e50f7de7fbbc435b48db50f4a91Doris Ling        @VisibleForTesting
4174d8a9bd8794a5e50f7de7fbbc435b48db50f4a91Doris Ling        String append(String s, boolean condition, int resId) {
4184d8a9bd8794a5e50f7de7fbbc435b48db50f4a91Doris Ling            if (condition) {
4194d8a9bd8794a5e50f7de7fbbc435b48db50f4a91Doris Ling                return mContext.getString(
4204d8a9bd8794a5e50f7de7fbbc435b48db50f4a91Doris Ling                    R.string.join_many_items_middle, s, mContext.getString(resId));
4214d8a9bd8794a5e50f7de7fbbc435b48db50f4a91Doris Ling            }
4224d8a9bd8794a5e50f7de7fbbc435b48db50f4a91Doris Ling            return s;
4234d8a9bd8794a5e50f7de7fbbc435b48db50f4a91Doris Ling        }
4249bfad94ea370f8b8048c13d16117bc8c01a394c2Julia Reynolds
42578f612b8233974df12115da77282ba9075c28f3eJulia Reynolds        @VisibleForTesting
42678f612b8233974df12115da77282ba9075c28f3eJulia Reynolds        String prepend(String s, boolean condition, int resId) {
42778f612b8233974df12115da77282ba9075c28f3eJulia Reynolds            if (condition) {
42878f612b8233974df12115da77282ba9075c28f3eJulia Reynolds                return mContext.getString(
42978f612b8233974df12115da77282ba9075c28f3eJulia Reynolds                        R.string.join_many_items_middle, mContext.getString(resId), s);
43078f612b8233974df12115da77282ba9075c28f3eJulia Reynolds            }
43178f612b8233974df12115da77282ba9075c28f3eJulia Reynolds            return s;
43278f612b8233974df12115da77282ba9075c28f3eJulia Reynolds        }
43378f612b8233974df12115da77282ba9075c28f3eJulia Reynolds
4344d8a9bd8794a5e50f7de7fbbc435b48db50f4a91Doris Ling        private boolean isCategoryEnabled(Policy policy, int categoryType) {
4354d8a9bd8794a5e50f7de7fbbc435b48db50f4a91Doris Ling            return (policy.priorityCategories & categoryType) != 0;
4364d8a9bd8794a5e50f7de7fbbc435b48db50f4a91Doris Ling        }
437f02aa0cef40d8d8255fc5049804b533d41931e20Julia Reynolds
4384d8a9bd8794a5e50f7de7fbbc435b48db50f4a91Doris Ling        private boolean isEffectSuppressed(Policy policy, int effect) {
4394d8a9bd8794a5e50f7de7fbbc435b48db50f4a91Doris Ling            return (policy.suppressedVisualEffects & effect) != 0;
44048bbd5d1e414abfa7efe21d10f6848f4916d8162John Spurlock        }
44123acc2bb8af7da000d72a8c1d8c28a2792200348Jason Monk    }
442e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds
443e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds    private static final Comparator<Map.Entry<String,AutomaticZenRule>> RULE_COMPARATOR =
444e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds            new Comparator<Map.Entry<String,AutomaticZenRule>>() {
445e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds                @Override
446e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds                public int compare(Map.Entry<String,AutomaticZenRule> lhs,
447e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds                        Map.Entry<String,AutomaticZenRule> rhs) {
448e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds                    int byDate = Long.compare(lhs.getValue().getCreationTime(),
449e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds                            rhs.getValue().getCreationTime());
450e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds                    if (byDate != 0) {
451e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds                        return byDate;
452e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds                    } else {
453e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds                        return key(lhs.getValue()).compareTo(key(rhs.getValue()));
454e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds                    }
455e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds                }
456e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds
457e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds                private String key(AutomaticZenRule rule) {
458e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds                    final int type = ZenModeConfig.isValidScheduleConditionId(rule.getConditionId())
459e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds                            ? 1
460e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds                            : ZenModeConfig.isValidEventConditionId(rule.getConditionId())
461e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds                                    ? 2
462e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds                                    : 3;
463e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds                    return type + rule.getName().toString();
464e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds                }
465e17590271fbeb59b0c13278bc125111b6afd116bJulia Reynolds            };
46672438063453d2141218cf7fa4d8c1da6de6cbf4cJohn Spurlock}
467