summaryrefslogtreecommitdiffstats
path: root/services/java/com/android/server/NotificationManagerService.java
diff options
context:
space:
mode:
Diffstat (limited to 'services/java/com/android/server/NotificationManagerService.java')
-rw-r--r--services/java/com/android/server/NotificationManagerService.java46
1 files changed, 28 insertions, 18 deletions
diff --git a/services/java/com/android/server/NotificationManagerService.java b/services/java/com/android/server/NotificationManagerService.java
index 1e8a5899..b881934 100644
--- a/services/java/com/android/server/NotificationManagerService.java
+++ b/services/java/com/android/server/NotificationManagerService.java
@@ -2047,29 +2047,39 @@ public class NotificationManagerService extends INotificationManager.Stub
* Cancels a notification ONLY if it has all of the {@code mustHaveFlags}
* and none of the {@code mustNotHaveFlags}.
*/
- private void cancelNotification(String pkg, String tag, int id, int mustHaveFlags,
- int mustNotHaveFlags, boolean sendDelete, int userId) {
- EventLog.writeEvent(EventLogTags.NOTIFICATION_CANCEL, pkg, id, tag, userId,
- mustHaveFlags, mustNotHaveFlags);
+ private void cancelNotification(final String pkg, final String tag, final int id,
+ final int mustHaveFlags, final int mustNotHaveFlags, final boolean sendDelete,
+ final int userId) {
+ // In enqueueNotificationInternal notifications are added by scheduling the
+ // work on the worker handler. Hence, we also schedule the cancel on this
+ // handler to avoid a scenario where an add notification call followed by a
+ // remove notification call ends up in not removing the notification.
+ mHandler.post(new Runnable() {
+ @Override
+ public void run() {
+ EventLog.writeEvent(EventLogTags.NOTIFICATION_CANCEL, pkg, id, tag, userId,
+ mustHaveFlags, mustNotHaveFlags);
- synchronized (mNotificationList) {
- int index = indexOfNotificationLocked(pkg, tag, id, userId);
- if (index >= 0) {
- NotificationRecord r = mNotificationList.get(index);
+ synchronized (mNotificationList) {
+ int index = indexOfNotificationLocked(pkg, tag, id, userId);
+ if (index >= 0) {
+ NotificationRecord r = mNotificationList.get(index);
- if ((r.getNotification().flags & mustHaveFlags) != mustHaveFlags) {
- return;
- }
- if ((r.getNotification().flags & mustNotHaveFlags) != 0) {
- return;
- }
+ if ((r.getNotification().flags & mustHaveFlags) != mustHaveFlags) {
+ return;
+ }
+ if ((r.getNotification().flags & mustNotHaveFlags) != 0) {
+ return;
+ }
- mNotificationList.remove(index);
+ mNotificationList.remove(index);
- cancelNotificationLocked(r, sendDelete);
- updateLightsLocked();
+ cancelNotificationLocked(r, sendDelete);
+ updateLightsLocked();
+ }
+ }
}
- }
+ });
}
/**