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

Commit 1941fc71 authored by Chris Wren's avatar Chris Wren
Browse files

Extend NotificationListenerService to support system use cases.

Bug: 14846846
Change-Id: Ic308b2f78c86393304d446c57fd677294e01717c
parent 3242f51c
Loading
Loading
Loading
Loading
+41 −3
Original line number Diff line number Diff line
@@ -16,9 +16,11 @@

package android.service.notification;

import android.annotation.PrivateApi;
import android.annotation.SdkConstant;
import android.app.INotificationManager;
import android.app.Service;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.os.IBinder;
@@ -26,9 +28,6 @@ import android.os.RemoteException;
import android.os.ServiceManager;
import android.util.Log;

import java.util.Comparator;
import java.util.HashMap;

/**
 * A service that receives calls from the system when new notifications are posted or removed.
 * <p>To extend this class, you must declare the service in your manifest file with
@@ -53,6 +52,9 @@ public abstract class NotificationListenerService extends Service {

    private INotificationManager mNoMan;

    /** Only valid after a successful call to (@link registerAsService}. */
    private int mCurrentUser;

    /**
     * The {@link Intent} that must be declared as handled by the service.
     */
@@ -267,6 +269,42 @@ public abstract class NotificationListenerService extends Service {
        return true;
    }

    /**
     * Directly register this service with the Notification Manager.
     *
     * <p>Only system services may use this call. It will fail for non-system callers.
     * Apps should ask the user to add their listener in Settings.
     *
     * @param componentName the component that will consume the notification information
     * @param currentUser the user to use as the stream filter
     * @hide
     */
    @PrivateApi
    public void registerAsSystemService(ComponentName componentName, int currentUser)
            throws RemoteException {
        if (mWrapper == null) {
            mWrapper = new INotificationListenerWrapper();
        }
        INotificationManager noMan = getNotificationInterface();
        noMan.registerListener(mWrapper, componentName, currentUser);
        mCurrentUser = currentUser;
    }

    /**
     * Directly unregister this service from the Notification Manager.
     *
     * <P>This method will fail for listeners that were not registered
     * with (@link registerAsService).
     * @hide
     */
    @PrivateApi
    public void unregisterAsSystemService() throws RemoteException {
        if (mWrapper != null) {
            INotificationManager noMan = getNotificationInterface();
            noMan.unregisterListener(mWrapper, mCurrentUser);
        }
    }

    private class INotificationListenerWrapper extends INotificationListener.Stub {
        @Override
        public void onNotificationPosted(StatusBarNotification sbn,