diff options
author | 2017-08-11 20:39:36 +0000 | |
---|---|---|
committer | 2017-08-11 20:39:36 +0000 | |
commit | 4590d3927a215dc1ba3805f46e3ea66ec9f04c31 (patch) | |
tree | 1ec648fc2eeaaa1b6b86498361880d2aa9ef9580 | |
parent | 845b750fd5141b3a101478c5641cedfe20318943 (diff) | |
parent | 4bb0eb9fb28df29a7fd1c0b8d404ff0c85eb1bff (diff) |
Merge "Merge "Each package can enqueue one toast at a time." into oc-mr1-dev am: a606d1049f" into oc-mr1-dev-plus-aosp
am: 4bb0eb9fb2
Change-Id: I9196d40986ae51f5e308a48940a7c6f8d88609c0
-rw-r--r-- | services/core/java/com/android/server/notification/NotificationManagerService.java | 56 |
1 files changed, 32 insertions, 24 deletions
diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java index ac9035766660..02895db54ed6 100644 --- a/services/core/java/com/android/server/notification/NotificationManagerService.java +++ b/services/core/java/com/android/server/notification/NotificationManagerService.java @@ -553,7 +553,7 @@ public class NotificationManagerService extends SystemService { { final int pid; final String pkg; - final ITransientNotification callback; + ITransientNotification callback; int duration; Binder token; @@ -570,6 +570,10 @@ public class NotificationManagerService extends SystemService { this.duration = duration; } + void update(ITransientNotification callback) { + this.callback = callback; + } + void dump(PrintWriter pw, String prefix, DumpFilter filter) { if (filter != null && !filter.matches(pkg)) return; pw.println(prefix + this); @@ -1603,38 +1607,28 @@ public class NotificationManagerService extends SystemService { long callingId = Binder.clearCallingIdentity(); try { ToastRecord record; - int index = indexOfToastLocked(pkg, callback); - // If it's already in the queue, we update it in place, we don't - // move it to the end of the queue. + int index; + // All packages aside from the android package can enqueue one toast at a time + if (!isSystemToast) { + index = indexOfToastPackageLocked(pkg); + } else { + index = indexOfToastLocked(pkg, callback); + } + + // If the package already has a toast, we update its toast + // in the queue, we don't move it to the end of the queue. if (index >= 0) { record = mToastQueue.get(index); record.update(duration); + record.update(callback); } else { - // Limit the number of toasts that any given package except the android - // package can enqueue. Prevents DOS attacks and deals with leaks. - if (!isSystemToast) { - int count = 0; - final int N = mToastQueue.size(); - for (int i=0; i<N; i++) { - final ToastRecord r = mToastQueue.get(i); - if (r.pkg.equals(pkg)) { - count++; - if (count >= MAX_PACKAGE_NOTIFICATIONS) { - Slog.e(TAG, "Package has already posted " + count - + " toasts. Not showing more. Package=" + pkg); - return; - } - } - } - } - Binder token = new Binder(); mWindowManagerInternal.addWindowToken(token, TYPE_TOAST, DEFAULT_DISPLAY); record = new ToastRecord(callingPid, pkg, callback, duration, token); mToastQueue.add(record); index = mToastQueue.size() - 1; - keepProcessAliveIfNeededLocked(callingPid); } + keepProcessAliveIfNeededLocked(callingPid); // If it's at index 0, it's the current toast. It doesn't matter if it's // new or just been updated. Call back and tell it to show itself. // If the callback fails, this will remove it from the list, so don't @@ -4237,7 +4231,21 @@ public class NotificationManagerService extends SystemService { int len = list.size(); for (int i=0; i<len; i++) { ToastRecord r = list.get(i); - if (r.pkg.equals(pkg) && r.callback.asBinder() == cbak) { + if (r.pkg.equals(pkg) && r.callback.asBinder().equals(cbak)) { + return i; + } + } + return -1; + } + + @GuardedBy("mToastQueue") + int indexOfToastPackageLocked(String pkg) + { + ArrayList<ToastRecord> list = mToastQueue; + int len = list.size(); + for (int i=0; i<len; i++) { + ToastRecord r = list.get(i); + if (r.pkg.equals(pkg)) { return i; } } |