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