am c4aee98a: Improve error handling in listener services.
* commit 'c4aee98a62f400dd9f6f964d26d739d409212775': Improve error handling in listener services.
This commit is contained in:
@@ -112,6 +112,7 @@ public abstract class NotificationListenerService extends Service {
|
|||||||
* {@link android.app.NotificationManager#notify(String, int, android.app.Notification)}.
|
* {@link android.app.NotificationManager#notify(String, int, android.app.Notification)}.
|
||||||
*/
|
*/
|
||||||
public final void cancelNotification(String pkg, String tag, int id) {
|
public final void cancelNotification(String pkg, String tag, int id) {
|
||||||
|
if (!isBound()) return;
|
||||||
try {
|
try {
|
||||||
getNotificationInterface().cancelNotificationFromListener(mWrapper, pkg, tag, id);
|
getNotificationInterface().cancelNotificationFromListener(mWrapper, pkg, tag, id);
|
||||||
} catch (android.os.RemoteException ex) {
|
} catch (android.os.RemoteException ex) {
|
||||||
@@ -131,6 +132,7 @@ public abstract class NotificationListenerService extends Service {
|
|||||||
* {@see #cancelNotification(String, String, int)}
|
* {@see #cancelNotification(String, String, int)}
|
||||||
*/
|
*/
|
||||||
public final void cancelAllNotifications() {
|
public final void cancelAllNotifications() {
|
||||||
|
if (!isBound()) return;
|
||||||
try {
|
try {
|
||||||
getNotificationInterface().cancelAllNotificationsFromListener(mWrapper);
|
getNotificationInterface().cancelAllNotificationsFromListener(mWrapper);
|
||||||
} catch (android.os.RemoteException ex) {
|
} catch (android.os.RemoteException ex) {
|
||||||
@@ -145,6 +147,7 @@ public abstract class NotificationListenerService extends Service {
|
|||||||
* @return An array of active notifications.
|
* @return An array of active notifications.
|
||||||
*/
|
*/
|
||||||
public StatusBarNotification[] getActiveNotifications() {
|
public StatusBarNotification[] getActiveNotifications() {
|
||||||
|
if (!isBound()) return null;
|
||||||
try {
|
try {
|
||||||
return getNotificationInterface().getActiveNotificationsFromListener(mWrapper);
|
return getNotificationInterface().getActiveNotificationsFromListener(mWrapper);
|
||||||
} catch (android.os.RemoteException ex) {
|
} catch (android.os.RemoteException ex) {
|
||||||
@@ -161,6 +164,14 @@ public abstract class NotificationListenerService extends Service {
|
|||||||
return mWrapper;
|
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 {
|
private class INotificationListenerWrapper extends INotificationListener.Stub {
|
||||||
@Override
|
@Override
|
||||||
public void onNotificationPosted(StatusBarNotification sbn) {
|
public void onNotificationPosted(StatusBarNotification sbn) {
|
||||||
|
|||||||
@@ -725,7 +725,14 @@ public class NotificationManagerService extends SystemService {
|
|||||||
|
|
||||||
// -- APIs to support listeners clicking/clearing notifications --
|
// -- 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) {
|
private NotificationListenerInfo checkListenerToken(INotificationListener listener) {
|
||||||
|
checkNullListener(listener);
|
||||||
final IBinder token = listener.asBinder();
|
final IBinder token = listener.asBinder();
|
||||||
final int N = mListeners.size();
|
final int N = mListeners.size();
|
||||||
for (int i=0; i<N; i++) {
|
for (int i=0; i<N; i++) {
|
||||||
@@ -1469,6 +1476,7 @@ public class NotificationManagerService extends SystemService {
|
|||||||
public void registerListener(final INotificationListener listener,
|
public void registerListener(final INotificationListener listener,
|
||||||
final ComponentName component, final int userid) {
|
final ComponentName component, final int userid) {
|
||||||
checkCallerIsSystem();
|
checkCallerIsSystem();
|
||||||
|
checkNullListener(listener);
|
||||||
registerListenerImpl(listener, component, userid);
|
registerListenerImpl(listener, component, userid);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1477,6 +1485,7 @@ public class NotificationManagerService extends SystemService {
|
|||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void unregisterListener(INotificationListener listener, int userid) {
|
public void unregisterListener(INotificationListener listener, int userid) {
|
||||||
|
checkNullListener(listener);
|
||||||
// no need to check permissions; if your listener binder is in the list,
|
// 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
|
// that's proof that you had permission to add it in the first place
|
||||||
unregisterListenerImpl(listener, userid);
|
unregisterListenerImpl(listener, userid);
|
||||||
|
|||||||
Reference in New Issue
Block a user