From 68065e0a1980ab6abf8963b48b011efa017fe1c2 Mon Sep 17 00:00:00 2001 From: Joe Onorato Date: Wed, 3 Feb 2010 20:21:41 -0800 Subject: [PATCH] Fix 1667521 - system process crash after bad notification The steps to reproduce this were kind of interesting. You needed to have a notification with a bogus RemoteViews in the first position in the list, and then have another notification come in with an earlier timestampe. In that case, it would get a bad index for the new (not bogus) view that was being added. --- .../server/status/NotificationData.java | 2 +- .../server/status/NotificationViewList.java | 30 +++++++++++++--- .../server/status/StatusBarService.java | 3 +- .../statusbartest/NotificationTestList.java | 36 +++++++++++++++++++ 4 files changed, 65 insertions(+), 6 deletions(-) diff --git a/services/java/com/android/server/status/NotificationData.java b/services/java/com/android/server/status/NotificationData.java index 0a3411a147bb2..784b7812db4fd 100644 --- a/services/java/com/android/server/status/NotificationData.java +++ b/services/java/com/android/server/status/NotificationData.java @@ -19,7 +19,7 @@ public class NotificationData { public PendingIntent deleteIntent; public String toString() { - return "NotificationData(package=" + pkg + " tickerText=" + tickerText + return "NotificationData(package=" + pkg + " id=" + id + " tickerText=" + tickerText + " ongoingEvent=" + ongoingEvent + " contentIntent=" + contentIntent + " deleteIntent=" + deleteIntent + " clearable=" + clearable diff --git a/services/java/com/android/server/status/NotificationViewList.java b/services/java/com/android/server/status/NotificationViewList.java index 6229292b1c957..8f1633f40607e 100644 --- a/services/java/com/android/server/status/NotificationViewList.java +++ b/services/java/com/android/server/status/NotificationViewList.java @@ -104,10 +104,25 @@ class NotificationViewList { return null; } - // gets the index of the notification in its expanded parent view + // gets the index of the notification's view in its expanded parent view int getExpandedIndex(StatusBarNotification notification) { ArrayList list = notification.data.ongoingEvent ? mOngoing : mLatest; - return list.size() - indexForKey(list, notification.key) - 1; + final IBinder key = notification.key; + int index = 0; + // (the view order is backwards from this list order) + for (int i=list.size()-1; i>=0; i--) { + StatusBarNotification item = list.get(i); + if (item.key == key) { + return index; + } + if (item.view != null) { + index++; + } + } + Log.e(StatusBarService.TAG, "Couldn't find notification in NotificationViewList."); + Log.e(StatusBarService.TAG, "notification=" + notification); + dump(notification); + return 0; } void clearViews() { @@ -155,6 +170,13 @@ class NotificationViewList { } list.add(index, notification); + if (StatusBarService.SPEW) { + Log.d(StatusBarService.TAG, "NotificationViewList index=" + index); + dump(notification); + } + } + + void dump(StatusBarNotification notification) { if (StatusBarService.SPEW) { String s = ""; for (int i=0; i