Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 25cf8cee authored by Daniel Sandler's avatar Daniel Sandler
Browse files

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
parent 7395838d
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -21231,6 +21231,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);
+2 −0
Original line number Diff line number Diff line
@@ -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
+15 −0
Original line number Diff line number Diff line
@@ -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) {
+24 −0
Original line number Diff line number Diff line
@@ -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