diff options
Diffstat (limited to 'services')
| -rw-r--r-- | services/java/com/android/server/status/StatusBarService.java | 33 |
1 files changed, 19 insertions, 14 deletions
diff --git a/services/java/com/android/server/status/StatusBarService.java b/services/java/com/android/server/status/StatusBarService.java index 34921d6..9ccd38b 100644 --- a/services/java/com/android/server/status/StatusBarService.java +++ b/services/java/com/android/server/status/StatusBarService.java @@ -552,15 +552,17 @@ public class StatusBarService extends IStatusBar.Stub doRevealAnimation(); return; } + boolean expand = false; + boolean doExpand = false; + boolean doDisable = false; + int disableWhat = 0; + synchronized (mQueue) { boolean wasExpanded = mExpanded; // for each one in the queue, find all of the ones with the same key // and collapse that down into a final op and/or call to setVisibility, etc - boolean expand = wasExpanded; - boolean doExpand = false; - boolean doDisable = false; - int disableWhat = 0; + expand = wasExpanded; int N = mQueue.size(); while (N > 0) { PendingOp op = mQueue.get(0); @@ -634,18 +636,21 @@ public class StatusBarService extends IStatusBar.Stub if (mQueue.size() != 0) { throw new RuntimeException("Assertion failed: mQueue.size=" + mQueue.size()); } - if (doExpand) { - // this is last so that we capture all of the pending changes before doing it - if (expand) { - animateExpand(); - } else { - animateCollapse(); - } - } - if (doDisable) { - performDisableActions(disableWhat); + } + // This must be done outside the synchronized block above to prevent a deadlock where + // we call into the NotificationManagerService and it is in turn attempting to post a + // message to our queue. + if (doExpand) { + // this is last so that we capture all of the pending changes before doing it + if (expand) { + animateExpand(); + } else { + animateCollapse(); } } + if (doDisable) { + performDisableActions(disableWhat); + } } } |
