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