summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--api/current.txt1
-rw-r--r--core/java/android/app/INotificationManager.aidl2
-rw-r--r--core/java/android/service/notification/NotificationListenerService.java15
-rw-r--r--services/java/com/android/server/NotificationManagerService.java24
4 files changed, 42 insertions, 0 deletions
diff --git a/api/current.txt b/api/current.txt
index 331d2e3..dba8be7 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -21230,6 +21230,7 @@ package android.service.notification {
ctor public NotificationListenerService();
method public final void clearAllNotifications();
method public final void clearNotification(java.lang.String, java.lang.String, int);
+ method public android.service.notification.StatusBarNotification[] getActiveNotifications();
method public android.os.IBinder onBind(android.content.Intent);
method public abstract void onNotificationPosted(android.service.notification.StatusBarNotification);
method public abstract void onNotificationRemoved(android.service.notification.StatusBarNotification);
diff --git a/core/java/android/app/INotificationManager.aidl b/core/java/android/app/INotificationManager.aidl
index 92ec3ad..6cfb56e 100644
--- a/core/java/android/app/INotificationManager.aidl
+++ b/core/java/android/app/INotificationManager.aidl
@@ -46,4 +46,6 @@ interface INotificationManager
void clearNotificationFromListener(in INotificationListener token, String pkg, String tag, int id);
void clearAllNotificationsFromListener(in INotificationListener token);
+
+ StatusBarNotification[] getActiveNotificationsFromListener(in INotificationListener token);
} \ No newline at end of file
diff --git a/core/java/android/service/notification/NotificationListenerService.java b/core/java/android/service/notification/NotificationListenerService.java
index 8b72ca9..6a5864c 100644
--- a/core/java/android/service/notification/NotificationListenerService.java
+++ b/core/java/android/service/notification/NotificationListenerService.java
@@ -124,6 +124,21 @@ public abstract class NotificationListenerService extends Service {
}
}
+ /**
+ * Request the list of outstanding notifications (that is, those that are visible to the
+ * current user). Useful when starting up and you don't know what's already been posted.
+ *
+ * @return An array of active notifications.
+ */
+ public StatusBarNotification[] getActiveNotifications() {
+ try {
+ return getNotificationInterface().getActiveNotificationsFromListener(mWrapper);
+ } catch (android.os.RemoteException ex) {
+ Log.v(TAG, "Unable to contact notification manager", ex);
+ }
+ return null;
+ }
+
@Override
public IBinder onBind(Intent intent) {
if (mWrapper == null) {
diff --git a/services/java/com/android/server/NotificationManagerService.java b/services/java/com/android/server/NotificationManagerService.java
index f0257ff..6cac227 100644
--- a/services/java/com/android/server/NotificationManagerService.java
+++ b/services/java/com/android/server/NotificationManagerService.java
@@ -816,6 +816,30 @@ public class NotificationManagerService extends INotificationManager.Stub
}
}
+ /**
+ * Allow an INotificationListener to request the list of outstanding notifications seen by
+ * the current user. Useful when starting up, after which point the listener callbacks should
+ * be used.
+ *
+ * @param token The binder for the listener, to check that the caller is allowed
+ */
+ public StatusBarNotification[] getActiveNotificationsFromListener(INotificationListener token) {
+ NotificationListenerInfo info = checkListenerToken(token);
+
+ StatusBarNotification[] result = new StatusBarNotification[0];
+ ArrayList<StatusBarNotification> list = new ArrayList<StatusBarNotification>();
+ synchronized (mNotificationList) {
+ final int N = mNotificationList.size();
+ for (int i=0; i<N; i++) {
+ StatusBarNotification sbn = mNotificationList.get(i).sbn;
+ if (info.enabledAndUserMatches(sbn)) {
+ list.add(sbn);
+ }
+ }
+ }
+ return list.toArray(result);
+ }
+
// -- end of listener APIs --
public static final class NotificationRecord