diff options
| author | 2014-02-12 22:21:42 +0000 | |
|---|---|---|
| committer | 2014-02-12 22:21:42 +0000 | |
| commit | 5788f2ba9b634ecc35a861d53b086bee1384d0b0 (patch) | |
| tree | 94bfc4c90c5c3798517ad6042a85fce86b94c74e | |
| parent | efe6e05ca849ab479240fcf508b4d7af189a2c11 (diff) | |
| parent | ae5708db9d02433027f4574f912def6558805642 (diff) | |
am ae5708db: am c4aee98a: Improve error handling in listener services.
* commit 'ae5708db9d02433027f4574f912def6558805642':
Improve error handling in listener services.
| -rw-r--r-- | core/java/android/service/notification/NotificationListenerService.java | 11 | ||||
| -rw-r--r-- | services/core/java/com/android/server/notification/NotificationManagerService.java | 9 |
2 files changed, 20 insertions, 0 deletions
diff --git a/core/java/android/service/notification/NotificationListenerService.java b/core/java/android/service/notification/NotificationListenerService.java index 2e0e59bc91c9..cf862b872aa3 100644 --- a/core/java/android/service/notification/NotificationListenerService.java +++ b/core/java/android/service/notification/NotificationListenerService.java @@ -112,6 +112,7 @@ public abstract class NotificationListenerService extends Service { * {@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 @@ public abstract class NotificationListenerService extends Service { * {@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 @@ public abstract class NotificationListenerService extends Service { * @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 @@ public abstract class NotificationListenerService extends Service { 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 6ee89891a84b..2ba6c711bce3 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 @@ public class NotificationManagerService extends SystemService { // -- 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 class NotificationManagerService extends SystemService { public void registerListener(final INotificationListener listener, final ComponentName component, final int userid) { checkCallerIsSystem(); + checkNullListener(listener); registerListenerImpl(listener, component, userid); } @@ -1477,6 +1485,7 @@ public class NotificationManagerService extends SystemService { */ @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); |