Merge "Don't add windows from exiting app tokens twice." into klp-modular-dev
diff --git a/core/java/android/service/notification/NotificationListenerService.java b/core/java/android/service/notification/NotificationListenerService.java
index 2e0e59b..cf862b8 100644
--- a/core/java/android/service/notification/NotificationListenerService.java
+++ b/core/java/android/service/notification/NotificationListenerService.java
@@ -112,6 +112,7 @@
      *     {@link android.app.NotificationManager#notify(String, int, android.app.Notification)}.
      */
     public final void cancelNotification(String pkg, String tag, int id) {
+        if (!isBound()) return;
         try {
             getNotificationInterface().cancelNotificationFromListener(mWrapper, pkg, tag, id);
         } catch (android.os.RemoteException ex) {
@@ -131,6 +132,7 @@
      * {@see #cancelNotification(String, String, int)}
      */
     public final void cancelAllNotifications() {
+        if (!isBound()) return;
         try {
             getNotificationInterface().cancelAllNotificationsFromListener(mWrapper);
         } catch (android.os.RemoteException ex) {
@@ -145,6 +147,7 @@
      * @return An array of active notifications.
      */
     public StatusBarNotification[] getActiveNotifications() {
+        if (!isBound()) return null;
         try {
             return getNotificationInterface().getActiveNotificationsFromListener(mWrapper);
         } catch (android.os.RemoteException ex) {
@@ -161,6 +164,14 @@
         return mWrapper;
     }
 
+    private boolean isBound() {
+        if (mWrapper == null) {
+            Log.w(TAG, "Notification listener service not yet bound.");
+            return false;
+        }
+        return true;
+    }
+
     private class INotificationListenerWrapper extends INotificationListener.Stub {
         @Override
         public void onNotificationPosted(StatusBarNotification sbn) {
diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java
index 6ee8989..2ba6c71 100644
--- a/services/core/java/com/android/server/notification/NotificationManagerService.java
+++ b/services/core/java/com/android/server/notification/NotificationManagerService.java
@@ -725,7 +725,14 @@
 
     // -- APIs to support listeners clicking/clearing notifications --
 
+    private void checkNullListener(INotificationListener listener) {
+        if (listener == null) {
+            throw new IllegalArgumentException("Listener must not be null");
+        }
+    }
+
     private NotificationListenerInfo checkListenerToken(INotificationListener listener) {
+        checkNullListener(listener);
         final IBinder token = listener.asBinder();
         final int N = mListeners.size();
         for (int i=0; i<N; i++) {
@@ -1469,6 +1476,7 @@
         public void registerListener(final INotificationListener listener,
                 final ComponentName component, final int userid) {
             checkCallerIsSystem();
+            checkNullListener(listener);
             registerListenerImpl(listener, component, userid);
         }
 
@@ -1477,6 +1485,7 @@
          */
         @Override
         public void unregisterListener(INotificationListener listener, int userid) {
+            checkNullListener(listener);
             // no need to check permissions; if your listener binder is in the list,
             // that's proof that you had permission to add it in the first place
             unregisterListenerImpl(listener, userid);