New NotificationListener API: getActiveNotifications()

This allows a listener service to catch up on the current
state of the notification panel at any time, including at
startup.

Bug: 8656860
Change-Id: I1a3d665d84576e17870929a63dda334afc696010
diff --git a/services/java/com/android/server/NotificationManagerService.java b/services/java/com/android/server/NotificationManagerService.java
index f0257ffe..6cac227 100644
--- a/services/java/com/android/server/NotificationManagerService.java
+++ b/services/java/com/android/server/NotificationManagerService.java
@@ -816,6 +816,30 @@
         }
     }
 
+    /**
+     * 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