Merge "Allow apps to know what users think of their notifications." into nyc-dev
diff --git a/api/current.txt b/api/current.txt
index b9f932b..1d891a6 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -5225,6 +5225,7 @@
 
   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 @@
     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 b404bb0..1ab5837 100644
--- a/api/system-current.txt
+++ b/api/system-current.txt
@@ -5357,6 +5357,7 @@
 
   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 @@
     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 9f8b8a8..49b8ffe 100644
--- a/api/test-current.txt
+++ b/api/test-current.txt
@@ -5225,6 +5225,7 @@
 
   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 @@
     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 40e58af..0d35cf0 100644
--- a/core/java/android/app/INotificationManager.aidl
+++ b/core/java/android/app/INotificationManager.aidl
@@ -46,6 +46,7 @@
 
     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 @@
     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 a83225d..1f17024 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.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 @@
         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 d2bcf13..36ddbcf 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 @@
          * 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 @@
         }
 
         @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 1a7e355..17bb907 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 @@
     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 aa36e29..6554bf9 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.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 @@
     }
 
     /**
+     * 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 3a30230..46de201 100644
--- a/tests/StatusBar/src/com/android/statusbartest/NotificationTestList.java
+++ b/tests/StatusBar/src/com/android/statusbartest/NotificationTestList.java
@@ -37,6 +37,7 @@
 
 // private NM API
 import android.app.INotificationManager;
+import android.widget.Toast;
 
 public class NotificationTestList extends TestActivity
 {
@@ -233,6 +234,30 @@
                 }
             },
 
+            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()
             {