diff options
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 |