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