1584b2b2bc17a4ccf42952b188722de1091c101beJason Monk/*
2584b2b2bc17a4ccf42952b188722de1091c101beJason Monk * Copyright (C) 2015 The Android Open Source Project
3584b2b2bc17a4ccf42952b188722de1091c101beJason Monk *
4584b2b2bc17a4ccf42952b188722de1091c101beJason Monk * Licensed under the Apache License, Version 2.0 (the "License");
5584b2b2bc17a4ccf42952b188722de1091c101beJason Monk * you may not use this file except in compliance with the License.
6584b2b2bc17a4ccf42952b188722de1091c101beJason Monk * You may obtain a copy of the License at
7584b2b2bc17a4ccf42952b188722de1091c101beJason Monk *
8584b2b2bc17a4ccf42952b188722de1091c101beJason Monk *      http://www.apache.org/licenses/LICENSE-2.0
9584b2b2bc17a4ccf42952b188722de1091c101beJason Monk *
10584b2b2bc17a4ccf42952b188722de1091c101beJason Monk * Unless required by applicable law or agreed to in writing, software
11584b2b2bc17a4ccf42952b188722de1091c101beJason Monk * distributed under the License is distributed on an "AS IS" BASIS,
12584b2b2bc17a4ccf42952b188722de1091c101beJason Monk * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13584b2b2bc17a4ccf42952b188722de1091c101beJason Monk * See the License for the specific language governing permissions and
14584b2b2bc17a4ccf42952b188722de1091c101beJason Monk * limitations under the License.
15584b2b2bc17a4ccf42952b188722de1091c101beJason Monk */
16584b2b2bc17a4ccf42952b188722de1091c101beJason Monkpackage com.android.settings.notification;
17584b2b2bc17a4ccf42952b188722de1091c101beJason Monk
18584b2b2bc17a4ccf42952b188722de1091c101beJason Monkimport android.app.INotificationManager;
19584b2b2bc17a4ccf42952b188722de1091c101beJason Monkimport android.app.Notification;
20584b2b2bc17a4ccf42952b188722de1091c101beJason Monkimport android.content.Context;
21584b2b2bc17a4ccf42952b188722de1091c101beJason Monkimport android.content.Intent;
22584b2b2bc17a4ccf42952b188722de1091c101beJason Monkimport android.content.pm.ApplicationInfo;
23c9a1884ed87ed15756f62988e4758fd88f59eff0Julia Reynoldsimport android.content.pm.PackageInfo;
24584b2b2bc17a4ccf42952b188722de1091c101beJason Monkimport android.content.pm.PackageManager;
25584b2b2bc17a4ccf42952b188722de1091c101beJason Monkimport android.graphics.drawable.Drawable;
26584b2b2bc17a4ccf42952b188722de1091c101beJason Monkimport android.os.ServiceManager;
273e912e7ea537ae34234ccbe6fef9b2519a4da51bJulia Reynoldsimport android.os.UserHandle;
28584b2b2bc17a4ccf42952b188722de1091c101beJason Monkimport android.service.notification.NotificationListenerService;
29584b2b2bc17a4ccf42952b188722de1091c101beJason Monkimport android.util.Log;
303e912e7ea537ae34234ccbe6fef9b2519a4da51bJulia Reynolds
313e912e7ea537ae34234ccbe6fef9b2519a4da51bJulia Reynoldsimport com.android.internal.widget.LockPatternUtils;
32c9a1884ed87ed15756f62988e4758fd88f59eff0Julia Reynoldsimport com.android.settingslib.Utils;
33584b2b2bc17a4ccf42952b188722de1091c101beJason Monk
34584b2b2bc17a4ccf42952b188722de1091c101beJason Monkpublic class NotificationBackend {
35584b2b2bc17a4ccf42952b188722de1091c101beJason Monk    private static final String TAG = "NotificationBackend";
36584b2b2bc17a4ccf42952b188722de1091c101beJason Monk
37584b2b2bc17a4ccf42952b188722de1091c101beJason Monk    static INotificationManager sINM = INotificationManager.Stub.asInterface(
38584b2b2bc17a4ccf42952b188722de1091c101beJason Monk            ServiceManager.getService(Context.NOTIFICATION_SERVICE));
39584b2b2bc17a4ccf42952b188722de1091c101beJason Monk
403e912e7ea537ae34234ccbe6fef9b2519a4da51bJulia Reynolds    public AppRow loadAppRow(Context context, PackageManager pm, ApplicationInfo app) {
41584b2b2bc17a4ccf42952b188722de1091c101beJason Monk        final AppRow row = new AppRow();
42584b2b2bc17a4ccf42952b188722de1091c101beJason Monk        row.pkg = app.packageName;
43584b2b2bc17a4ccf42952b188722de1091c101beJason Monk        row.uid = app.uid;
44584b2b2bc17a4ccf42952b188722de1091c101beJason Monk        try {
45584b2b2bc17a4ccf42952b188722de1091c101beJason Monk            row.label = app.loadLabel(pm);
46584b2b2bc17a4ccf42952b188722de1091c101beJason Monk        } catch (Throwable t) {
47584b2b2bc17a4ccf42952b188722de1091c101beJason Monk            Log.e(TAG, "Error loading application label for " + row.pkg, t);
48584b2b2bc17a4ccf42952b188722de1091c101beJason Monk            row.label = row.pkg;
49584b2b2bc17a4ccf42952b188722de1091c101beJason Monk        }
50584b2b2bc17a4ccf42952b188722de1091c101beJason Monk        row.icon = app.loadIcon(pm);
51584b2b2bc17a4ccf42952b188722de1091c101beJason Monk        row.banned = getNotificationsBanned(row.pkg, row.uid);
52ed5c50a9cb5b67c8eed9661221f8825b69dd4da8Julia Reynolds        row.appImportance = getImportance(row.pkg, row.uid);
53ed5c50a9cb5b67c8eed9661221f8825b69dd4da8Julia Reynolds        row.appBypassDnd = getBypassZenMode(row.pkg, row.uid);
5460e90ac07cd165bcc004040356f29e0dc7d78973Julia Reynolds        row.appVisOverride = getVisibilityOverride(row.pkg, row.uid);
553e912e7ea537ae34234ccbe6fef9b2519a4da51bJulia Reynolds        row.lockScreenSecure = new LockPatternUtils(context).isSecure(
563e912e7ea537ae34234ccbe6fef9b2519a4da51bJulia Reynolds                UserHandle.myUserId());
576f526fcaf3dc83a5988a522bfa2b542390ece234Julia Reynolds        return row;
586f526fcaf3dc83a5988a522bfa2b542390ece234Julia Reynolds    }
596f526fcaf3dc83a5988a522bfa2b542390ece234Julia Reynolds
603e912e7ea537ae34234ccbe6fef9b2519a4da51bJulia Reynolds    public AppRow loadAppRow(Context context, PackageManager pm, PackageInfo app) {
613e912e7ea537ae34234ccbe6fef9b2519a4da51bJulia Reynolds        final AppRow row = loadAppRow(context, pm, app.applicationInfo);
62acf763e996d368bab4e7c424c3934b733c41d3d5Dan Sandler        row.cantBlock = Utils.isSystemPackage(context.getResources(), pm, app);
6377b1f525744350f8416c96f78145f8d3aaae5afbJulia Reynolds        final String[] nonBlockablePkgs = context.getResources().getStringArray(
6477b1f525744350f8416c96f78145f8d3aaae5afbJulia Reynolds                    com.android.internal.R.array.config_nonBlockableNotificationPackages);
6577b1f525744350f8416c96f78145f8d3aaae5afbJulia Reynolds        if (nonBlockablePkgs != null) {
6677b1f525744350f8416c96f78145f8d3aaae5afbJulia Reynolds            int N = nonBlockablePkgs.length;
6777b1f525744350f8416c96f78145f8d3aaae5afbJulia Reynolds            for (int i = 0; i < N; i++) {
6877b1f525744350f8416c96f78145f8d3aaae5afbJulia Reynolds                if (app.packageName.equals(nonBlockablePkgs[i])) {
69acf763e996d368bab4e7c424c3934b733c41d3d5Dan Sandler                    row.cantBlock = row.cantSilence = true;
7077b1f525744350f8416c96f78145f8d3aaae5afbJulia Reynolds                }
7177b1f525744350f8416c96f78145f8d3aaae5afbJulia Reynolds            }
7277b1f525744350f8416c96f78145f8d3aaae5afbJulia Reynolds        }
73c9a1884ed87ed15756f62988e4758fd88f59eff0Julia Reynolds        return row;
74c9a1884ed87ed15756f62988e4758fd88f59eff0Julia Reynolds    }
75c9a1884ed87ed15756f62988e4758fd88f59eff0Julia Reynolds
76584b2b2bc17a4ccf42952b188722de1091c101beJason Monk    public boolean getNotificationsBanned(String pkg, int uid) {
77584b2b2bc17a4ccf42952b188722de1091c101beJason Monk        try {
78584b2b2bc17a4ccf42952b188722de1091c101beJason Monk            final boolean enabled = sINM.areNotificationsEnabledForPackage(pkg, uid);
79584b2b2bc17a4ccf42952b188722de1091c101beJason Monk            return !enabled;
80584b2b2bc17a4ccf42952b188722de1091c101beJason Monk        } catch (Exception e) {
81584b2b2bc17a4ccf42952b188722de1091c101beJason Monk            Log.w(TAG, "Error calling NoMan", e);
82584b2b2bc17a4ccf42952b188722de1091c101beJason Monk            return false;
83584b2b2bc17a4ccf42952b188722de1091c101beJason Monk        }
84584b2b2bc17a4ccf42952b188722de1091c101beJason Monk    }
85584b2b2bc17a4ccf42952b188722de1091c101beJason Monk
86ed5c50a9cb5b67c8eed9661221f8825b69dd4da8Julia Reynolds    public boolean getBypassZenMode(String pkg, int uid) {
87584b2b2bc17a4ccf42952b188722de1091c101beJason Monk        try {
88ed5c50a9cb5b67c8eed9661221f8825b69dd4da8Julia Reynolds            return sINM.getPriority(pkg, uid) == Notification.PRIORITY_MAX;
89584b2b2bc17a4ccf42952b188722de1091c101beJason Monk        } catch (Exception e) {
90584b2b2bc17a4ccf42952b188722de1091c101beJason Monk            Log.w(TAG, "Error calling NoMan", e);
91584b2b2bc17a4ccf42952b188722de1091c101beJason Monk            return false;
92584b2b2bc17a4ccf42952b188722de1091c101beJason Monk        }
93584b2b2bc17a4ccf42952b188722de1091c101beJason Monk    }
94584b2b2bc17a4ccf42952b188722de1091c101beJason Monk
95ed5c50a9cb5b67c8eed9661221f8825b69dd4da8Julia Reynolds    public boolean setBypassZenMode(String pkg, int uid, boolean bypassZen) {
96584b2b2bc17a4ccf42952b188722de1091c101beJason Monk        try {
97ed5c50a9cb5b67c8eed9661221f8825b69dd4da8Julia Reynolds            sINM.setPriority(pkg, uid,
986f526fcaf3dc83a5988a522bfa2b542390ece234Julia Reynolds                    bypassZen ? Notification.PRIORITY_MAX : Notification.PRIORITY_DEFAULT);
99584b2b2bc17a4ccf42952b188722de1091c101beJason Monk            return true;
100584b2b2bc17a4ccf42952b188722de1091c101beJason Monk        } catch (Exception e) {
101584b2b2bc17a4ccf42952b188722de1091c101beJason Monk            Log.w(TAG, "Error calling NoMan", e);
102584b2b2bc17a4ccf42952b188722de1091c101beJason Monk            return false;
103584b2b2bc17a4ccf42952b188722de1091c101beJason Monk        }
104584b2b2bc17a4ccf42952b188722de1091c101beJason Monk    }
105584b2b2bc17a4ccf42952b188722de1091c101beJason Monk
10660e90ac07cd165bcc004040356f29e0dc7d78973Julia Reynolds    public int getVisibilityOverride(String pkg, int uid) {
107584b2b2bc17a4ccf42952b188722de1091c101beJason Monk        try {
10860e90ac07cd165bcc004040356f29e0dc7d78973Julia Reynolds            return sINM.getVisibilityOverride(pkg, uid);
109584b2b2bc17a4ccf42952b188722de1091c101beJason Monk        } catch (Exception e) {
110584b2b2bc17a4ccf42952b188722de1091c101beJason Monk            Log.w(TAG, "Error calling NoMan", e);
11160e90ac07cd165bcc004040356f29e0dc7d78973Julia Reynolds            return NotificationListenerService.Ranking.VISIBILITY_NO_OVERRIDE;
112584b2b2bc17a4ccf42952b188722de1091c101beJason Monk        }
113584b2b2bc17a4ccf42952b188722de1091c101beJason Monk    }
114584b2b2bc17a4ccf42952b188722de1091c101beJason Monk
11560e90ac07cd165bcc004040356f29e0dc7d78973Julia Reynolds    public boolean setVisibilityOverride(String pkg, int uid, int override) {
116584b2b2bc17a4ccf42952b188722de1091c101beJason Monk        try {
11760e90ac07cd165bcc004040356f29e0dc7d78973Julia Reynolds            sINM.setVisibilityOverride(pkg, uid, override);
118584b2b2bc17a4ccf42952b188722de1091c101beJason Monk            return true;
119584b2b2bc17a4ccf42952b188722de1091c101beJason Monk        } catch (Exception e) {
120584b2b2bc17a4ccf42952b188722de1091c101beJason Monk            Log.w(TAG, "Error calling NoMan", e);
121584b2b2bc17a4ccf42952b188722de1091c101beJason Monk            return false;
122584b2b2bc17a4ccf42952b188722de1091c101beJason Monk        }
123584b2b2bc17a4ccf42952b188722de1091c101beJason Monk    }
124584b2b2bc17a4ccf42952b188722de1091c101beJason Monk
125ed5c50a9cb5b67c8eed9661221f8825b69dd4da8Julia Reynolds    public boolean setImportance(String pkg, int uid, int importance) {
1269dbb20f63856083017d58869457f6a6779a53c14Julia Reynolds        try {
127ed5c50a9cb5b67c8eed9661221f8825b69dd4da8Julia Reynolds            sINM.setImportance(pkg, uid, importance);
1289dbb20f63856083017d58869457f6a6779a53c14Julia Reynolds            return true;
1299dbb20f63856083017d58869457f6a6779a53c14Julia Reynolds        } catch (Exception e) {
1309dbb20f63856083017d58869457f6a6779a53c14Julia Reynolds            Log.w(TAG, "Error calling NoMan", e);
1319dbb20f63856083017d58869457f6a6779a53c14Julia Reynolds            return false;
1329dbb20f63856083017d58869457f6a6779a53c14Julia Reynolds        }
1339dbb20f63856083017d58869457f6a6779a53c14Julia Reynolds    }
1349dbb20f63856083017d58869457f6a6779a53c14Julia Reynolds
135ed5c50a9cb5b67c8eed9661221f8825b69dd4da8Julia Reynolds    public int getImportance(String pkg, int uid) {
1369dbb20f63856083017d58869457f6a6779a53c14Julia Reynolds        try {
137ed5c50a9cb5b67c8eed9661221f8825b69dd4da8Julia Reynolds            return sINM.getImportance(pkg, uid);
1389dbb20f63856083017d58869457f6a6779a53c14Julia Reynolds        } catch (Exception e) {
1399dbb20f63856083017d58869457f6a6779a53c14Julia Reynolds            Log.w(TAG, "Error calling NoMan", e);
140df01cde11c272b8e979044769641c8e17d67bf67Julia Reynolds            return NotificationListenerService.Ranking.IMPORTANCE_UNSPECIFIED;
1419dbb20f63856083017d58869457f6a6779a53c14Julia Reynolds        }
1429dbb20f63856083017d58869457f6a6779a53c14Julia Reynolds    }
1439dbb20f63856083017d58869457f6a6779a53c14Julia Reynolds
144584b2b2bc17a4ccf42952b188722de1091c101beJason Monk    static class Row {
145584b2b2bc17a4ccf42952b188722de1091c101beJason Monk        public String section;
146584b2b2bc17a4ccf42952b188722de1091c101beJason Monk    }
147584b2b2bc17a4ccf42952b188722de1091c101beJason Monk
148584b2b2bc17a4ccf42952b188722de1091c101beJason Monk    public static class AppRow extends Row {
149584b2b2bc17a4ccf42952b188722de1091c101beJason Monk        public String pkg;
150584b2b2bc17a4ccf42952b188722de1091c101beJason Monk        public int uid;
151584b2b2bc17a4ccf42952b188722de1091c101beJason Monk        public Drawable icon;
152584b2b2bc17a4ccf42952b188722de1091c101beJason Monk        public CharSequence label;
153584b2b2bc17a4ccf42952b188722de1091c101beJason Monk        public Intent settingsIntent;
154584b2b2bc17a4ccf42952b188722de1091c101beJason Monk        public boolean banned;
1556f526fcaf3dc83a5988a522bfa2b542390ece234Julia Reynolds        public boolean first;  // first app in section
156acf763e996d368bab4e7c424c3934b733c41d3d5Dan Sandler        public boolean cantBlock;
157acf763e996d368bab4e7c424c3934b733c41d3d5Dan Sandler        public boolean cantSilence;
15892ea89c3569233d2bbcb9ce0923bee5dc6e12a3bJulia Reynolds        public int appImportance;
15992ea89c3569233d2bbcb9ce0923bee5dc6e12a3bJulia Reynolds        public boolean appBypassDnd;
16060e90ac07cd165bcc004040356f29e0dc7d78973Julia Reynolds        public int appVisOverride;
1613e912e7ea537ae34234ccbe6fef9b2519a4da51bJulia Reynolds        public boolean lockScreenSecure;
162584b2b2bc17a4ccf42952b188722de1091c101beJason Monk    }
163584b2b2bc17a4ccf42952b188722de1091c101beJason Monk}
164