diff options
-rw-r--r-- | api/current.txt | 2 | ||||
-rw-r--r-- | api/system-current.txt | 2 | ||||
-rw-r--r-- | api/test-current.txt | 2 | ||||
-rw-r--r-- | core/java/android/app/INotificationManager.aidl | 2 | ||||
-rw-r--r-- | core/java/android/app/NotificationManager.java | 22 | ||||
-rw-r--r-- | services/core/java/com/android/server/notification/NotificationManagerService.java | 16 | ||||
-rw-r--r-- | services/core/java/com/android/server/notification/RankingConfig.java | 2 | ||||
-rw-r--r-- | services/core/java/com/android/server/notification/RankingHelper.java | 19 | ||||
-rw-r--r-- | tests/StatusBar/src/com/android/statusbartest/NotificationTestList.java | 25 |
9 files changed, 91 insertions, 1 deletions
diff --git a/api/current.txt b/api/current.txt index 649d7fa79242..033f924056cd 100644 --- a/api/current.txt +++ b/api/current.txt @@ -5225,6 +5225,7 @@ package android.app { public class NotificationManager { method public android.app.AutomaticZenRule addAutomaticZenRule(android.app.AutomaticZenRule); + method public boolean areNotificationsEnabled(); method public void cancel(int); method public void cancel(java.lang.String, int); method public void cancelAll(); @@ -5232,6 +5233,7 @@ package android.app { method public android.app.AutomaticZenRule getAutomaticZenRule(java.lang.String); method public java.util.List<android.app.AutomaticZenRule> getAutomaticZenRules(); method public final int getCurrentInterruptionFilter(); + method public int getImportance(java.lang.String); method public android.app.NotificationManager.Policy getNotificationPolicy(); method public boolean isNotificationPolicyAccessGranted(); method public void notify(int, android.app.Notification); diff --git a/api/system-current.txt b/api/system-current.txt index 3c3054eaa5b6..cc74f67b0cfa 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -5357,6 +5357,7 @@ package android.app { public class NotificationManager { method public android.app.AutomaticZenRule addAutomaticZenRule(android.app.AutomaticZenRule); + method public boolean areNotificationsEnabled(); method public void cancel(int); method public void cancel(java.lang.String, int); method public void cancelAll(); @@ -5364,6 +5365,7 @@ package android.app { method public android.app.AutomaticZenRule getAutomaticZenRule(java.lang.String); method public java.util.List<android.app.AutomaticZenRule> getAutomaticZenRules(); method public final int getCurrentInterruptionFilter(); + method public int getImportance(java.lang.String); method public android.app.NotificationManager.Policy getNotificationPolicy(); method public boolean isNotificationPolicyAccessGranted(); method public void notify(int, android.app.Notification); diff --git a/api/test-current.txt b/api/test-current.txt index 8fbcff9218f1..1a2703c5f9c5 100644 --- a/api/test-current.txt +++ b/api/test-current.txt @@ -5225,6 +5225,7 @@ package android.app { public class NotificationManager { method public android.app.AutomaticZenRule addAutomaticZenRule(android.app.AutomaticZenRule); + method public boolean areNotificationsEnabled(); method public void cancel(int); method public void cancel(java.lang.String, int); method public void cancelAll(); @@ -5232,6 +5233,7 @@ package android.app { method public android.app.AutomaticZenRule getAutomaticZenRule(java.lang.String); method public java.util.List<android.app.AutomaticZenRule> getAutomaticZenRules(); method public final int getCurrentInterruptionFilter(); + method public int getImportance(java.lang.String); method public android.app.NotificationManager.Policy getNotificationPolicy(); method public boolean isNotificationPolicyAccessGranted(); method public void notify(int, android.app.Notification); diff --git a/core/java/android/app/INotificationManager.aidl b/core/java/android/app/INotificationManager.aidl index 40e58af57204..0d35cf04b4a6 100644 --- a/core/java/android/app/INotificationManager.aidl +++ b/core/java/android/app/INotificationManager.aidl @@ -46,6 +46,7 @@ interface INotificationManager void setNotificationsEnabledForPackage(String pkg, int uid, boolean enabled); boolean areNotificationsEnabledForPackage(String pkg, int uid); + boolean areNotificationsEnabled(String pkg); ParceledListSlice getTopics(String pkg, int uid); void setVisibilityOverride(String pkg, int uid, in Notification.Topic topic, int visibility); @@ -54,6 +55,7 @@ interface INotificationManager int getPriority(String pkg, int uid, in Notification.Topic topic); void setImportance(String pkg, int uid, in Notification.Topic topic, int importance); int getImportance(String pkg, int uid, in Notification.Topic topic); + int getTopicImportance(String pkg, String topicId); boolean doesAppUseTopics(String pkg, int uid); boolean hasBannedTopics(String pkg, int uid); diff --git a/core/java/android/app/NotificationManager.java b/core/java/android/app/NotificationManager.java index a83225d961b0..1f17024b1193 100644 --- a/core/java/android/app/NotificationManager.java +++ b/core/java/android/app/NotificationManager.java @@ -16,6 +16,8 @@ package android.app; +import com.android.internal.util.Preconditions; + import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SdkConstant; @@ -37,6 +39,7 @@ import android.os.StrictMode; import android.os.UserHandle; import android.provider.Settings.Global; import android.service.notification.IConditionListener; +import android.service.notification.NotificationListenerService; import android.service.notification.StatusBarNotification; import android.service.notification.ZenModeConfig; import android.util.ArraySet; @@ -503,6 +506,25 @@ public class NotificationManager return false; } + public int getImportance(String topicId) { + Preconditions.checkNotNull(topicId); + INotificationManager service = getService(); + try { + return service.getTopicImportance(mContext.getPackageName(), topicId); + } catch (RemoteException e) { + } + return NotificationListenerService.Ranking.IMPORTANCE_UNSPECIFIED; + } + + public boolean areNotificationsEnabled() { + INotificationManager service = getService(); + try { + return service.areNotificationsEnabled(mContext.getPackageName()); + } catch (RemoteException e) { + } + return false; + } + /** * Checks the ability to read/modify notification policy for the calling package. * diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java index f3e1365ab453..21330dbc5992 100644 --- a/services/core/java/com/android/server/notification/NotificationManagerService.java +++ b/services/core/java/com/android/server/notification/NotificationManagerService.java @@ -1265,8 +1265,16 @@ public class NotificationManagerService extends SystemService { * Use this when you just want to know if notifications are OK for this package. */ @Override + public boolean areNotificationsEnabled(String pkg) { + return areNotificationsEnabledForPackage(pkg, Binder.getCallingUid()); + } + + /** + * Use this when you just want to know if notifications are OK for this package. + */ + @Override public boolean areNotificationsEnabledForPackage(String pkg, int uid) { - checkCallerIsSystem(); + checkCallerIsSystemOrSameApp(pkg); return (mAppOps.checkOpNoThrow(AppOpsManager.OP_POST_NOTIFICATION, uid, pkg) == AppOpsManager.MODE_ALLOWED) && !isApplicationSuspended(pkg, uid); } @@ -1330,6 +1338,12 @@ public class NotificationManagerService extends SystemService { } @Override + public int getTopicImportance(String pkg, String topicId) { + checkCallerIsSystemOrSameApp(pkg); + return mRankingHelper.getImportance(pkg, Binder.getCallingUid(), topicId); + } + + @Override public int getImportance(String pkg, int uid, Notification.Topic topic) { checkCallerIsSystem(); return mRankingHelper.getImportance(pkg, uid, topic); diff --git a/services/core/java/com/android/server/notification/RankingConfig.java b/services/core/java/com/android/server/notification/RankingConfig.java index 1a7e3550d8e3..17bb9075b0eb 100644 --- a/services/core/java/com/android/server/notification/RankingConfig.java +++ b/services/core/java/com/android/server/notification/RankingConfig.java @@ -39,4 +39,6 @@ public interface RankingConfig { boolean doesAppUseTopics(String packageName, int uid); boolean hasBannedTopics(String packageName, int uid); + + int getImportance(String packageName, int uid, String topicId); } diff --git a/services/core/java/com/android/server/notification/RankingHelper.java b/services/core/java/com/android/server/notification/RankingHelper.java index aa36e298bb45..6554bf91cf18 100644 --- a/services/core/java/com/android/server/notification/RankingHelper.java +++ b/services/core/java/com/android/server/notification/RankingHelper.java @@ -20,6 +20,7 @@ import android.content.Context; import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; import android.os.UserHandle; +import android.service.notification.NotificationListenerService; import android.service.notification.NotificationListenerService.Ranking; import android.text.TextUtils; import android.util.ArrayMap; @@ -467,6 +468,24 @@ public class RankingHelper implements RankingConfig { } /** + * Gets the importance of a topic. Unlike {@link #getImportance(String, int, String)}, does not + * create package or topic records if they don't exist. + */ + @Override + public int getImportance(String packageName, int uid, String topicId) { + final String key = recordKey(packageName, uid); + Record r = mRecords.get(key); + if (r == null) { + return Ranking.IMPORTANCE_UNSPECIFIED; + } + Topic t = r.topics.get(topicId); + if (t == null) { + return Ranking.IMPORTANCE_UNSPECIFIED; + } + return t.importance; + } + + /** * Gets importance. If a topic is given, returns the importance of that topic. Otherwise, the * importance of the app. */ diff --git a/tests/StatusBar/src/com/android/statusbartest/NotificationTestList.java b/tests/StatusBar/src/com/android/statusbartest/NotificationTestList.java index 3a30230833ed..46de2016e4e4 100644 --- a/tests/StatusBar/src/com/android/statusbartest/NotificationTestList.java +++ b/tests/StatusBar/src/com/android/statusbartest/NotificationTestList.java @@ -37,6 +37,7 @@ import android.os.PowerManager; // private NM API import android.app.INotificationManager; +import android.widget.Toast; public class NotificationTestList extends TestActivity { @@ -233,6 +234,30 @@ public class NotificationTestList extends TestActivity } }, + new Test("Is blocked?") { + public void run() { + Toast.makeText(NotificationTestList.this, + "package enabled? " + mNM.areNotificationsEnabled(), + Toast.LENGTH_LONG).show(); + } + }, + + new Test("Topic banana importance?") { + public void run() { + Toast.makeText(NotificationTestList.this, + "bananas importance? " + mNM.getImportance("bananas"), + Toast.LENGTH_LONG).show(); + } + }, + + new Test("Topic garbage importance?") { + public void run() { + Toast.makeText(NotificationTestList.this, + "garbage importance? " + mNM.getImportance("garbage"), + Toast.LENGTH_LONG).show(); + } + }, + new Test("Whens") { public void run() { |