From 23d28cecf820d19154944994cb2bbebac8845ba4 Mon Sep 17 00:00:00 2001 From: Shibin George Date: Sat, 7 May 2016 16:16:50 +0530 Subject: [PATCH] Synchronize access of mSubscriptions Introduction of setConfigAsync to set Zen mode config asynchronously leads to synchronization issues like ArrayIndexOutOfBoundsException while accessing mSubscriptions. Change-Id: I6f72d894605498e0a4b48eb58af19851be53b9dc --- .../notification/ZenModeConditions.java | 23 +++++++++++-------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/services/core/java/com/android/server/notification/ZenModeConditions.java b/services/core/java/com/android/server/notification/ZenModeConditions.java index c2e434979c01e..22b685597c0c6 100644 --- a/services/core/java/com/android/server/notification/ZenModeConditions.java +++ b/services/core/java/com/android/server/notification/ZenModeConditions.java @@ -76,14 +76,17 @@ public class ZenModeConditions implements ConditionProviders.Callback { evaluateRule(automaticRule, current, processSubscriptions); updateSnoozing(automaticRule); } - final int N = mSubscriptions.size(); - for (int i = N - 1; i >= 0; i--) { - final Uri id = mSubscriptions.keyAt(i); - final ComponentName component = mSubscriptions.valueAt(i); - if (processSubscriptions) { - if (!current.contains(id)) { - mConditionProviders.unsubscribeIfNecessary(component, id); - mSubscriptions.removeAt(i); + + synchronized (mSubscriptions) { + final int N = mSubscriptions.size(); + for (int i = N - 1; i >= 0; i--) { + final Uri id = mSubscriptions.keyAt(i); + final ComponentName component = mSubscriptions.valueAt(i); + if (processSubscriptions) { + if (!current.contains(id)) { + mConditionProviders.unsubscribeIfNecessary(component, id); + mSubscriptions.removeAt(i); + } } } } @@ -152,7 +155,9 @@ public class ZenModeConditions implements ConditionProviders.Callback { } if (processSubscriptions) { if (mConditionProviders.subscribeIfNecessary(rule.component, rule.conditionId)) { - mSubscriptions.put(rule.conditionId, rule.component); + synchronized (mSubscriptions) { + mSubscriptions.put(rule.conditionId, rule.component); + } } else { if (DEBUG) Log.d(TAG, "zmc failed to subscribe"); }