summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJulia Reynolds <juliacr@google.com>2016-02-09 14:54:08 -0500
committerJulia Reynolds <juliacr@google.com>2016-02-09 14:54:08 -0500
commit81afbcdbf96c687b61ed53170e1654f4f8ea5b15 (patch)
tree18d86025fe5ac36afb41ba506b94afa88a28cae4
parentb1a235f9524b71126a9768571ad0b0a7fe0b304c (diff)
Allow apps to know what users think of their notifications.
- App wide blocking - Topic importance Change-Id: I9026e5c26c5dbcab1c86c385beede891f961933f
-rw-r--r--api/current.txt2
-rw-r--r--api/system-current.txt2
-rw-r--r--api/test-current.txt2
-rw-r--r--core/java/android/app/INotificationManager.aidl2
-rw-r--r--core/java/android/app/NotificationManager.java22
-rw-r--r--services/core/java/com/android/server/notification/NotificationManagerService.java16
-rw-r--r--services/core/java/com/android/server/notification/RankingConfig.java2
-rw-r--r--services/core/java/com/android/server/notification/RankingHelper.java19
-rw-r--r--tests/StatusBar/src/com/android/statusbartest/NotificationTestList.java25
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()
{