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
This commit is contained in:
Shibin George
2016-05-07 16:16:50 +05:30
parent 9f2a1979a7
commit 23d28cecf8

View File

@@ -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");
}