14a35051565b0ce6d29313c3e4ffe19e1dde78db0John Spurlock/* 24a35051565b0ce6d29313c3e4ffe19e1dde78db0John Spurlock * Copyright (C) 2014 The Android Open Source Project 34a35051565b0ce6d29313c3e4ffe19e1dde78db0John Spurlock * 44a35051565b0ce6d29313c3e4ffe19e1dde78db0John Spurlock * Licensed under the Apache License, Version 2.0 (the "License"); 54a35051565b0ce6d29313c3e4ffe19e1dde78db0John Spurlock * you may not use this file except in compliance with the License. 64a35051565b0ce6d29313c3e4ffe19e1dde78db0John Spurlock * You may obtain a copy of the License at 74a35051565b0ce6d29313c3e4ffe19e1dde78db0John Spurlock * 84a35051565b0ce6d29313c3e4ffe19e1dde78db0John Spurlock * http://www.apache.org/licenses/LICENSE-2.0 94a35051565b0ce6d29313c3e4ffe19e1dde78db0John Spurlock * 104a35051565b0ce6d29313c3e4ffe19e1dde78db0John Spurlock * Unless required by applicable law or agreed to in writing, software 114a35051565b0ce6d29313c3e4ffe19e1dde78db0John Spurlock * distributed under the License is distributed on an "AS IS" BASIS, 124a35051565b0ce6d29313c3e4ffe19e1dde78db0John Spurlock * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 134a35051565b0ce6d29313c3e4ffe19e1dde78db0John Spurlock * See the License for the specific language governing permissions and 144a35051565b0ce6d29313c3e4ffe19e1dde78db0John Spurlock * limitations under the License. 154a35051565b0ce6d29313c3e4ffe19e1dde78db0John Spurlock */ 164a35051565b0ce6d29313c3e4ffe19e1dde78db0John Spurlock 174a35051565b0ce6d29313c3e4ffe19e1dde78db0John Spurlockpackage com.android.settings.notification; 184a35051565b0ce6d29313c3e4ffe19e1dde78db0John Spurlock 19584b2b2bc17a4ccf42952b188722de1091c101beJason Monkimport android.app.Notification; 20ed5c50a9cb5b67c8eed9661221f8825b69dd4da8Julia Reynoldsimport android.app.NotificationManager; 214a35051565b0ce6d29313c3e4ffe19e1dde78db0John Spurlockimport android.content.Intent; 22584b2b2bc17a4ccf42952b188722de1091c101beJason Monkimport android.content.pm.ActivityInfo; 23584b2b2bc17a4ccf42952b188722de1091c101beJason Monkimport android.content.pm.ApplicationInfo; 24584b2b2bc17a4ccf42952b188722de1091c101beJason Monkimport android.content.pm.ResolveInfo; 2521fd269ea36601238317ace4f236e9157826f466Julia Reynoldsimport android.content.pm.UserInfo; 264a35051565b0ce6d29313c3e4ffe19e1dde78db0John Spurlockimport android.os.Bundle; 27ed5c50a9cb5b67c8eed9661221f8825b69dd4da8Julia Reynoldsimport android.os.UserHandle; 28a7accd20649de0dc310d9d20f0ecaee0923f7e41Julia Reynoldsimport android.service.notification.NotificationListenerService.Ranking; 294a35051565b0ce6d29313c3e4ffe19e1dde78db0John Spurlockimport android.util.ArrayMap; 304a35051565b0ce6d29313c3e4ffe19e1dde78db0John Spurlockimport android.util.Log; 314a35051565b0ce6d29313c3e4ffe19e1dde78db0John Spurlock 329d1bfd1e8de6e46137a9571507c03526880d6a46Chris Wrenimport com.android.internal.logging.MetricsProto.MetricsEvent; 33ed5c50a9cb5b67c8eed9661221f8825b69dd4da8Julia Reynoldsimport com.android.internal.widget.LockPatternUtils; 34cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monkimport com.android.settings.AppHeader; 354a35051565b0ce6d29313c3e4ffe19e1dde78db0John Spurlockimport com.android.settings.R; 36584b2b2bc17a4ccf42952b188722de1091c101beJason Monkimport com.android.settings.notification.NotificationBackend.AppRow; 3733e9656a532baf1633a4236b83ccc5603300b3a9Andrei Stingaceanuimport com.android.settingslib.RestrictedSwitchPreference; 3833e9656a532baf1633a4236b83ccc5603300b3a9Andrei Stingaceanu 39584b2b2bc17a4ccf42952b188722de1091c101beJason Monk 40584b2b2bc17a4ccf42952b188722de1091c101beJason Monkimport java.util.List; 414a35051565b0ce6d29313c3e4ffe19e1dde78db0John Spurlock 42802ddf99f57e316d0fd87c2cfeed5dc3a0cfa8feJohn Spurlock/** These settings are per app, so should not be returned in global search results. */ 4392ea89c3569233d2bbcb9ce0923bee5dc6e12a3bJulia Reynoldspublic class AppNotificationSettings extends NotificationSettingsBase { 444a35051565b0ce6d29313c3e4ffe19e1dde78db0John Spurlock private static final String TAG = "AppNotificationSettings"; 45b8ec34346495245043933ac0f1b78781ae5054dbJohn Spurlock private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG); 4690f8035ea58cd3beace27c3549dcdb3f3d6b8c19Dan Sandler 47584b2b2bc17a4ccf42952b188722de1091c101beJason Monk private static final Intent APP_NOTIFICATION_PREFS_CATEGORY_INTENT 48584b2b2bc17a4ccf42952b188722de1091c101beJason Monk = new Intent(Intent.ACTION_MAIN) 49584b2b2bc17a4ccf42952b188722de1091c101beJason Monk .addCategory(Notification.INTENT_CATEGORY_NOTIFICATION_PREFERENCES); 50584b2b2bc17a4ccf42952b188722de1091c101beJason Monk 51802ddf99f57e316d0fd87c2cfeed5dc3a0cfa8feJohn Spurlock private AppRow mAppRow; 52ed5c50a9cb5b67c8eed9661221f8825b69dd4da8Julia Reynolds private boolean mDndVisualEffectsSuppressed; 53a6145a656af1241fd771038715cf839a8fce76e1Alexandra Gherghina 54a6145a656af1241fd771038715cf839a8fce76e1Alexandra Gherghina @Override 554a35051565b0ce6d29313c3e4ffe19e1dde78db0John Spurlock public void onActivityCreated(Bundle savedInstanceState) { 564a35051565b0ce6d29313c3e4ffe19e1dde78db0John Spurlock super.onActivityCreated(savedInstanceState); 57802ddf99f57e316d0fd87c2cfeed5dc3a0cfa8feJohn Spurlock if (mAppRow == null) return; 58fe22e8998b839967c555f3d77a00cfa2c8368729Julia Reynolds AppHeader.createAppHeader(this, mAppRow.icon, mAppRow.label, mAppRow.pkg, mAppRow.uid, 59fe22e8998b839967c555f3d77a00cfa2c8368729Julia Reynolds mAppRow.settingsIntent); 60802ddf99f57e316d0fd87c2cfeed5dc3a0cfa8feJohn Spurlock } 614a35051565b0ce6d29313c3e4ffe19e1dde78db0John Spurlock 62802ddf99f57e316d0fd87c2cfeed5dc3a0cfa8feJohn Spurlock @Override 638a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren protected int getMetricsCategory() { 649d1bfd1e8de6e46137a9571507c03526880d6a46Chris Wren return MetricsEvent.NOTIFICATION_APP_NOTIFICATION; 658a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren } 668a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren 678a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren @Override 68802ddf99f57e316d0fd87c2cfeed5dc3a0cfa8feJohn Spurlock public void onCreate(Bundle savedInstanceState) { 69802ddf99f57e316d0fd87c2cfeed5dc3a0cfa8feJohn Spurlock super.onCreate(savedInstanceState); 70802ddf99f57e316d0fd87c2cfeed5dc3a0cfa8feJohn Spurlock 71802ddf99f57e316d0fd87c2cfeed5dc3a0cfa8feJohn Spurlock addPreferencesFromResource(R.xml.app_notification_settings); 72a7accd20649de0dc310d9d20f0ecaee0923f7e41Julia Reynolds mImportance = (ImportanceSeekBarPreference) findPreference(KEY_IMPORTANCE); 73a7accd20649de0dc310d9d20f0ecaee0923f7e41Julia Reynolds mPriority = 74a7accd20649de0dc310d9d20f0ecaee0923f7e41Julia Reynolds (RestrictedSwitchPreference) getPreferenceScreen().findPreference(KEY_BYPASS_DND); 7560e90ac07cd165bcc004040356f29e0dc7d78973Julia Reynolds mVisibilityOverride = 762ad6adbd58514cc28974f7562145b1e5bd9a9b5fSudheer Shanka (RestrictedDropDownPreference) getPreferenceScreen().findPreference( 7760e90ac07cd165bcc004040356f29e0dc7d78973Julia Reynolds KEY_VISIBILITY_OVERRIDE); 78d4559a8035f4f0787df5d4ff1d744d7aa54e39fbJulia Reynolds mBlock = (RestrictedSwitchPreference) getPreferenceScreen().findPreference(KEY_BLOCK); 79d4559a8035f4f0787df5d4ff1d744d7aa54e39fbJulia Reynolds mSilent = (RestrictedSwitchPreference) getPreferenceScreen().findPreference(KEY_SILENT); 80a7accd20649de0dc310d9d20f0ecaee0923f7e41Julia Reynolds 81175bba9ed9390466f8cc7bae48eae50ac051d408Julia Reynolds if (mPkgInfo != null) { 82175bba9ed9390466f8cc7bae48eae50ac051d408Julia Reynolds mAppRow = mBackend.loadAppRow(mContext, mPm, mPkgInfo); 83175bba9ed9390466f8cc7bae48eae50ac051d408Julia Reynolds 84175bba9ed9390466f8cc7bae48eae50ac051d408Julia Reynolds NotificationManager.Policy policy = 85175bba9ed9390466f8cc7bae48eae50ac051d408Julia Reynolds NotificationManager.from(mContext).getNotificationPolicy(); 86175bba9ed9390466f8cc7bae48eae50ac051d408Julia Reynolds mDndVisualEffectsSuppressed = policy == null ? false : policy.suppressedVisualEffects != 0; 87175bba9ed9390466f8cc7bae48eae50ac051d408Julia Reynolds 88175bba9ed9390466f8cc7bae48eae50ac051d408Julia Reynolds // load settings intent 89175bba9ed9390466f8cc7bae48eae50ac051d408Julia Reynolds ArrayMap<String, AppRow> rows = new ArrayMap<String, AppRow>(); 90175bba9ed9390466f8cc7bae48eae50ac051d408Julia Reynolds rows.put(mAppRow.pkg, mAppRow); 91175bba9ed9390466f8cc7bae48eae50ac051d408Julia Reynolds collectConfigActivities(rows); 92175bba9ed9390466f8cc7bae48eae50ac051d408Julia Reynolds 93acf763e996d368bab4e7c424c3934b733c41d3d5Dan Sandler setupImportancePrefs(mAppRow.cantBlock, mAppRow.cantSilence, 94acf763e996d368bab4e7c424c3934b733c41d3d5Dan Sandler mAppRow.appImportance, mAppRow.banned); 95175bba9ed9390466f8cc7bae48eae50ac051d408Julia Reynolds setupPriorityPref(mAppRow.appBypassDnd); 96175bba9ed9390466f8cc7bae48eae50ac051d408Julia Reynolds setupVisOverridePref(mAppRow.appVisOverride); 97175bba9ed9390466f8cc7bae48eae50ac051d408Julia Reynolds updateDependents(mAppRow.appImportance); 98175bba9ed9390466f8cc7bae48eae50ac051d408Julia Reynolds } 993fb88d743edeb7841306cbfd8745d34fbd9ec93bJohn Spurlock } 1003fb88d743edeb7841306cbfd8745d34fbd9ec93bJohn Spurlock 10138f1889fea1a8ef7f4160044f4fd7e57a9bccd23Jason Monk @Override 102ed5c50a9cb5b67c8eed9661221f8825b69dd4da8Julia Reynolds protected void updateDependents(int importance) { 10321fd269ea36601238317ace4f236e9157826f466Julia Reynolds LockPatternUtils utils = new LockPatternUtils(getActivity()); 10421fd269ea36601238317ace4f236e9157826f466Julia Reynolds boolean lockscreenSecure = utils.isSecure(UserHandle.myUserId()); 10521fd269ea36601238317ace4f236e9157826f466Julia Reynolds UserInfo parentUser = mUm.getProfileParent(UserHandle.myUserId()); 10621fd269ea36601238317ace4f236e9157826f466Julia Reynolds if (parentUser != null){ 10721fd269ea36601238317ace4f236e9157826f466Julia Reynolds lockscreenSecure |= utils.isSecure(parentUser.id); 10821fd269ea36601238317ace4f236e9157826f466Julia Reynolds } 109ed5c50a9cb5b67c8eed9661221f8825b69dd4da8Julia Reynolds 110d4559a8035f4f0787df5d4ff1d744d7aa54e39fbJulia Reynolds if (getPreferenceScreen().findPreference(mBlock.getKey()) != null) { 111518b93f5652bf483b4fb2316a78f3139bdfeb538Julia Reynolds setVisible(mSilent, checkCanBeVisible(Ranking.IMPORTANCE_MIN, importance)); 112518b93f5652bf483b4fb2316a78f3139bdfeb538Julia Reynolds mSilent.setChecked(importance == Ranking.IMPORTANCE_LOW); 113d4559a8035f4f0787df5d4ff1d744d7aa54e39fbJulia Reynolds } 114518b93f5652bf483b4fb2316a78f3139bdfeb538Julia Reynolds setVisible(mPriority, checkCanBeVisible(Ranking.IMPORTANCE_DEFAULT, importance) 1152c1eb80b1ddaf125b0c1b0765e7713fa4e97b867Julia Reynolds || (checkCanBeVisible(Ranking.IMPORTANCE_LOW, importance) 1162c1eb80b1ddaf125b0c1b0765e7713fa4e97b867Julia Reynolds && mDndVisualEffectsSuppressed)); 11760e90ac07cd165bcc004040356f29e0dc7d78973Julia Reynolds setVisible(mVisibilityOverride, 11860e90ac07cd165bcc004040356f29e0dc7d78973Julia Reynolds checkCanBeVisible(Ranking.IMPORTANCE_MIN, importance) && lockscreenSecure); 119a7accd20649de0dc310d9d20f0ecaee0923f7e41Julia Reynolds } 120a7accd20649de0dc310d9d20f0ecaee0923f7e41Julia Reynolds 121ed5c50a9cb5b67c8eed9661221f8825b69dd4da8Julia Reynolds protected boolean checkCanBeVisible(int minImportanceVisible, int importance) { 122ed5c50a9cb5b67c8eed9661221f8825b69dd4da8Julia Reynolds if (importance == Ranking.IMPORTANCE_UNSPECIFIED) { 123ed5c50a9cb5b67c8eed9661221f8825b69dd4da8Julia Reynolds return true; 124ed5c50a9cb5b67c8eed9661221f8825b69dd4da8Julia Reynolds } 125d4559a8035f4f0787df5d4ff1d744d7aa54e39fbJulia Reynolds return importance >= minImportanceVisible; 12638f1889fea1a8ef7f4160044f4fd7e57a9bccd23Jason Monk } 12738f1889fea1a8ef7f4160044f4fd7e57a9bccd23Jason Monk 12892ea89c3569233d2bbcb9ce0923bee5dc6e12a3bJulia Reynolds private List<ResolveInfo> queryNotificationConfigActivities() { 129584b2b2bc17a4ccf42952b188722de1091c101beJason Monk if (DEBUG) Log.d(TAG, "APP_NOTIFICATION_PREFS_CATEGORY_INTENT is " 130584b2b2bc17a4ccf42952b188722de1091c101beJason Monk + APP_NOTIFICATION_PREFS_CATEGORY_INTENT); 13192ea89c3569233d2bbcb9ce0923bee5dc6e12a3bJulia Reynolds final List<ResolveInfo> resolveInfos = mPm.queryIntentActivities( 132584b2b2bc17a4ccf42952b188722de1091c101beJason Monk APP_NOTIFICATION_PREFS_CATEGORY_INTENT, 133584b2b2bc17a4ccf42952b188722de1091c101beJason Monk 0 //PackageManager.MATCH_DEFAULT_ONLY 134584b2b2bc17a4ccf42952b188722de1091c101beJason Monk ); 135584b2b2bc17a4ccf42952b188722de1091c101beJason Monk return resolveInfos; 136584b2b2bc17a4ccf42952b188722de1091c101beJason Monk } 137584b2b2bc17a4ccf42952b188722de1091c101beJason Monk 13892ea89c3569233d2bbcb9ce0923bee5dc6e12a3bJulia Reynolds private void collectConfigActivities(ArrayMap<String, AppRow> rows) { 13992ea89c3569233d2bbcb9ce0923bee5dc6e12a3bJulia Reynolds final List<ResolveInfo> resolveInfos = queryNotificationConfigActivities(); 14092ea89c3569233d2bbcb9ce0923bee5dc6e12a3bJulia Reynolds applyConfigActivities(rows, resolveInfos); 141584b2b2bc17a4ccf42952b188722de1091c101beJason Monk } 142584b2b2bc17a4ccf42952b188722de1091c101beJason Monk 14392ea89c3569233d2bbcb9ce0923bee5dc6e12a3bJulia Reynolds private void applyConfigActivities(ArrayMap<String, AppRow> rows, 144584b2b2bc17a4ccf42952b188722de1091c101beJason Monk List<ResolveInfo> resolveInfos) { 145584b2b2bc17a4ccf42952b188722de1091c101beJason Monk if (DEBUG) Log.d(TAG, "Found " + resolveInfos.size() + " preference activities" 146584b2b2bc17a4ccf42952b188722de1091c101beJason Monk + (resolveInfos.size() == 0 ? " ;_;" : "")); 147584b2b2bc17a4ccf42952b188722de1091c101beJason Monk for (ResolveInfo ri : resolveInfos) { 148584b2b2bc17a4ccf42952b188722de1091c101beJason Monk final ActivityInfo activityInfo = ri.activityInfo; 149584b2b2bc17a4ccf42952b188722de1091c101beJason Monk final ApplicationInfo appInfo = activityInfo.applicationInfo; 150584b2b2bc17a4ccf42952b188722de1091c101beJason Monk final AppRow row = rows.get(appInfo.packageName); 151584b2b2bc17a4ccf42952b188722de1091c101beJason Monk if (row == null) { 152584b2b2bc17a4ccf42952b188722de1091c101beJason Monk if (DEBUG) Log.v(TAG, "Ignoring notification preference activity (" 153584b2b2bc17a4ccf42952b188722de1091c101beJason Monk + activityInfo.name + ") for unknown package " 154584b2b2bc17a4ccf42952b188722de1091c101beJason Monk + activityInfo.packageName); 155584b2b2bc17a4ccf42952b188722de1091c101beJason Monk continue; 156584b2b2bc17a4ccf42952b188722de1091c101beJason Monk } 157584b2b2bc17a4ccf42952b188722de1091c101beJason Monk if (row.settingsIntent != null) { 158584b2b2bc17a4ccf42952b188722de1091c101beJason Monk if (DEBUG) Log.v(TAG, "Ignoring duplicate notification preference activity (" 159584b2b2bc17a4ccf42952b188722de1091c101beJason Monk + activityInfo.name + ") for package " 160584b2b2bc17a4ccf42952b188722de1091c101beJason Monk + activityInfo.packageName); 161584b2b2bc17a4ccf42952b188722de1091c101beJason Monk continue; 162584b2b2bc17a4ccf42952b188722de1091c101beJason Monk } 163584b2b2bc17a4ccf42952b188722de1091c101beJason Monk row.settingsIntent = new Intent(APP_NOTIFICATION_PREFS_CATEGORY_INTENT) 164584b2b2bc17a4ccf42952b188722de1091c101beJason Monk .setClassName(activityInfo.packageName, activityInfo.name); 165584b2b2bc17a4ccf42952b188722de1091c101beJason Monk } 166584b2b2bc17a4ccf42952b188722de1091c101beJason Monk } 1674a35051565b0ce6d29313c3e4ffe19e1dde78db0John Spurlock} 168