summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author John Spurlock <jspurlock@google.com> 2014-02-12 22:21:42 +0000
committer Android Git Automerger <android-git-automerger@android.com> 2014-02-12 22:21:42 +0000
commit5788f2ba9b634ecc35a861d53b086bee1384d0b0 (patch)
tree94bfc4c90c5c3798517ad6042a85fce86b94c74e
parentefe6e05ca849ab479240fcf508b4d7af189a2c11 (diff)
parentae5708db9d02433027f4574f912def6558805642 (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.java11
-rw-r--r--services/core/java/com/android/server/notification/NotificationManagerService.java9
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);