Skip to content

Commit 466a74b

Browse files
authored
Fix concurrency exception for the action definitions. (#534)
1 parent 46582a4 commit 466a74b

File tree

3 files changed

+31
-17
lines changed

3 files changed

+31
-17
lines changed

AndroidSDKCore/src/main/java/com/leanplum/actions/internal/ActionManagerDefinition.kt

Lines changed: 27 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -64,37 +64,51 @@ data class Definitions(
6464
val actionDefinitions: MutableList<ActionDefinition> = mutableListOf(),
6565
var devModeActionDefinitionsFromServer: Map<String, Any?>? = null
6666
) {
67+
@Synchronized
6768
fun findDefinition(definitionName: String?): ActionDefinition? {
6869
return actionDefinitions.firstOrNull { it.name == definitionName }
6970
}
71+
72+
@Synchronized
73+
fun addDefinition(definition: ActionDefinition) {
74+
val idx = actionDefinitions.indexOfFirst { it.name == definition.name }
75+
if (idx >= 0) {
76+
actionDefinitions[idx] = definition
77+
} else {
78+
actionDefinitions.add(definition)
79+
}
80+
}
81+
82+
@Synchronized
83+
fun getActionDefinitionMaps(): Map<String, Any?> {
84+
val result: MutableMap<String, Map<String, Any?>> = mutableMapOf()
85+
actionDefinitions.forEach {
86+
result[it.name] = it.definitionMap
87+
}
88+
return result
89+
}
90+
91+
@Synchronized
92+
fun clear() {
93+
actionDefinitions.clear();
94+
}
7095
}
7196

7297
fun ActionManager.getActionDefinitionMap(actionName: String?): Map<String, Any?>? {
7398
val defMap = definitions.findDefinition(actionName)?.definitionMap
7499
return defMap
75100
}
76101

77-
fun ActionManager.getActionDefinitionMaps(): Map<String, Any?> {
78-
val result: MutableMap<String, Map<String, Any?>> = mutableMapOf()
79-
definitions.actionDefinitions.forEach {
80-
result.put(it.name, it.definitionMap)
81-
}
82-
return result
83-
}
84-
85102
fun ActionManager.defineAction(definition: ActionDefinition) {
86-
with (definitions.actionDefinitions) {
87-
firstOrNull { it.name == definition.name }?.also { remove(it) }
88-
add(definition)
89-
}
103+
definitions.addDefinition(definition)
90104
}
91105

92106
fun ActionManager.setDevModeActionDefinitionsFromServer(serverDefs: Map<String, Any?>?) {
93107
definitions.devModeActionDefinitionsFromServer = serverDefs
94108
}
95109

96110
fun ActionManager.areLocalAndServerDefinitionsEqual(): Boolean {
97-
val localDefinitions = getActionDefinitionMaps()
111+
val localDefinitions = definitions.getActionDefinitionMaps()
98112
val serverDefinitions = definitions.devModeActionDefinitionsFromServer
99113
return areActionDefinitionsEqual(localDefinitions, serverDefinitions)
100114
}

AndroidSDKCore/src/main/java/com/leanplum/internal/VarCache.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -577,7 +577,7 @@ public static void applyVariableDiffs(
577577
Map<String, Object> actionArgs = CollectionUtil.uncheckedCast(messageConfig.get(Constants
578578
.Keys.VARS));
579579
Map<String, Object> actionDefinitions =
580-
ActionManagerDefinitionKt.getActionDefinitionMaps(ActionManager.getInstance());
580+
ActionManager.getInstance().getDefinitions().getActionDefinitionMaps();
581581
Map<String, Object> defaultArgs = Util.multiIndex(actionDefinitions,
582582
newConfig.get(Constants.Params.ACTION), "values");
583583
Map<String, Object> vars = CollectionUtil.uncheckedCast(mergeHelper(defaultArgs,
@@ -666,7 +666,7 @@ private static boolean sendContentIfChanged(boolean variables, boolean actions)
666666
changed = true;
667667
}
668668
Map<String, Object> actionDefinitions =
669-
ActionManagerDefinitionKt.getActionDefinitionMaps(ActionManager.getInstance());
669+
ActionManager.getInstance().getDefinitions().getActionDefinitionMaps();
670670

671671
boolean areLocalAndServerDefinitionsEqual =
672672
ActionManagerDefinitionKt.areLocalAndServerDefinitionsEqual(ActionManager.getInstance());
@@ -901,7 +901,7 @@ public static void reset() {
901901
fileStreams.clear();
902902
valuesFromClient.clear();
903903
defaultKinds.clear();
904-
ActionManager.getInstance().getDefinitions().getActionDefinitions().clear();
904+
ActionManager.getInstance().getDefinitions().clear();
905905
diffs.clear();
906906
messageDiffs.clear();
907907
regions.clear();

AndroidSDKTests/src/test/java/com/leanplum/actions/internal/ActionManagerExecutionTest.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ class ActionManagerExecutionTest : AbstractTest() {
4141
ActionManager.getInstance().currentAction = null
4242
ActionManager.getInstance().messageDisplayController = null
4343
ActionManager.getInstance().messageDisplayListener = null
44-
ActionManager.getInstance().definitions.actionDefinitions.clear()
44+
ActionManager.getInstance().definitions.clear()
4545
ActionManager.getInstance().scheduler = ActionScheduler()
4646
LeanplumActions.setDismissOnPushOpened(true)
4747
}

0 commit comments

Comments
 (0)