diff options
author | Chris Wren <cwren@android.com> | 2015-06-18 14:33:56 -0400 |
---|---|---|
committer | Chris Wren <cwren@android.com> | 2015-06-18 14:33:56 -0400 |
commit | 24fb8940b4844e6b121e05c5019361f31d1baf3c (patch) | |
tree | 31311a9627972c7e8a3135be40eedf0b3b93d7cc | |
parent | b3c8564314a4ce05b722e33409f2c15bcdac6666 (diff) | |
download | frameworks_base-24fb8940b4844e6b121e05c5019361f31d1baf3c.zip frameworks_base-24fb8940b4844e6b121e05c5019361f31d1baf3c.tar.gz frameworks_base-24fb8940b4844e6b121e05c5019361f31d1baf3c.tar.bz2 |
drop corrupt notifications in the Listener
Bug: 21471255
Change-Id: I184507dfafa49b71b91406a1ae0131f930adbb77
-rw-r--r-- | core/java/android/service/notification/NotificationListenerService.java | 46 |
1 files changed, 36 insertions, 10 deletions
diff --git a/core/java/android/service/notification/NotificationListenerService.java b/core/java/android/service/notification/NotificationListenerService.java index 8c6cd09..0309d24 100644 --- a/core/java/android/service/notification/NotificationListenerService.java +++ b/core/java/android/service/notification/NotificationListenerService.java @@ -41,6 +41,7 @@ import android.util.ArrayMap; import android.util.ArraySet; import android.util.Log; +import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -463,15 +464,28 @@ public abstract class NotificationListenerService extends Service { ParceledListSlice<StatusBarNotification> parceledList = getNotificationInterface() .getActiveNotificationsFromListener(mWrapper, keys, trim); List<StatusBarNotification> list = parceledList.getList(); - + ArrayList<StatusBarNotification> corruptNotifications = null; int N = list.size(); for (int i = 0; i < N; i++) { - Notification notification = list.get(i).getNotification(); - Builder.rebuild(getContext(), notification); - // convert icon metadata to legacy format for older clients - createLegacyIconExtras(notification); + StatusBarNotification sbn = list.get(i); + Notification notification = sbn.getNotification(); + try { + Builder.rebuild(getContext(), notification); + // convert icon metadata to legacy format for older clients + createLegacyIconExtras(notification); + } catch (IllegalArgumentException e) { + if (corruptNotifications == null) { + corruptNotifications = new ArrayList<>(N); + } + corruptNotifications.add(sbn); + Log.w(TAG, "onNotificationPosted: can't rebuild notification from " + + sbn.getPackageName()); + } } - return list.toArray(new StatusBarNotification[N]); + if (corruptNotifications != null) { + list.removeAll(corruptNotifications); + } + return list.toArray(new StatusBarNotification[list.size()]); } catch (android.os.RemoteException ex) { Log.v(TAG, "Unable to contact notification manager", ex); } @@ -671,16 +685,28 @@ public abstract class NotificationListenerService extends Service { Log.w(TAG, "onNotificationPosted: Error receiving StatusBarNotification", e); return; } - Notification.Builder.rebuild(getContext(), sbn.getNotification()); - // convert icon metadata to legacy format for older clients - createLegacyIconExtras(sbn.getNotification()); + try { + Notification.Builder.rebuild(getContext(), sbn.getNotification()); + // convert icon metadata to legacy format for older clients + createLegacyIconExtras(sbn.getNotification()); + } catch (IllegalArgumentException e) { + // drop corrupt notification + sbn = null; + Log.w(TAG, "onNotificationPosted: can't rebuild notification from " + + sbn.getPackageName()); + } // protect subclass from concurrent modifications of (@link mNotificationKeys}. synchronized (mWrapper) { applyUpdate(update); try { - NotificationListenerService.this.onNotificationPosted(sbn, mRankingMap); + if (sbn != null) { + NotificationListenerService.this.onNotificationPosted(sbn, mRankingMap); + } else { + // still pass along the ranking map, it may contain other information + NotificationListenerService.this.onNotificationRankingUpdate(mRankingMap); + } } catch (Throwable t) { Log.w(TAG, "Error running onNotificationPosted", t); } |