Skip to content

Commit b5c93a0

Browse files
committed
refactor: Use threadsafe data structures to avoid any race conditions
1 parent b3f1d5b commit b5c93a0

2 files changed

Lines changed: 21 additions & 12 deletions

File tree

android/src/main/kotlin/com/mparticle/mparticle_flutter_sdk/MparticleFlutterSdkPlugin.kt

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package com.mparticle.mparticle_flutter_sdk
33
import android.app.Activity
44
import android.content.Context
55
import android.graphics.Typeface
6+
import android.os.Build
67
import androidx.annotation.NonNull
78

89
import io.flutter.embedding.engine.plugins.FlutterPlugin
@@ -60,7 +61,9 @@ class MparticleFlutterSdkPlugin: FlutterPlugin, MethodCallHandler, ActivityAware
6061
VIEW_TYPE,
6162
layoutFactory,
6263
)
63-
roktEventHandler = RoktEventHandler(flutterPluginBinding.binaryMessenger)
64+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
65+
roktEventHandler = RoktEventHandler(flutterPluginBinding.binaryMessenger)
66+
}
6467
}
6568

6669
override fun onMethodCall(@NonNull call: MethodCall, @NonNull result: Result) {
@@ -750,12 +753,14 @@ class MparticleFlutterSdkPlugin: FlutterPlugin, MethodCallHandler, ActivityAware
750753
}
751754

752755
MParticle.getInstance()?.let { instance ->
753-
activity?.let {
754-
roktEventHandler?.subscribeToEvents(
755-
events = instance.Rokt().events(placementId),
756-
activity = it,
757-
identifier = placementId,
758-
)
756+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
757+
activity?.let {
758+
roktEventHandler?.subscribeToEvents(
759+
events = instance.Rokt().events(placementId),
760+
activity = it,
761+
identifier = placementId,
762+
)
763+
}
759764
}
760765

761766
instance.Rokt().selectPlacements(placementId, stringAttributes, null, placeHolders.takeIf { it.isNotEmpty() }, customFonts, config)

android/src/main/kotlin/com/mparticle/mparticle_flutter_sdk/RoktEventHandler.kt

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package com.mparticle.mparticle_flutter_sdk
22

33
import android.app.Activity
4+
import android.os.Build
5+
import androidx.annotation.RequiresApi
46
import androidx.lifecycle.Lifecycle
57
import androidx.lifecycle.LifecycleOwner
68
import androidx.lifecycle.lifecycleScope
@@ -11,11 +13,13 @@ import io.flutter.plugin.common.EventChannel
1113
import kotlinx.coroutines.Job
1214
import kotlinx.coroutines.flow.Flow
1315
import kotlinx.coroutines.launch
14-
import java.util.ArrayDeque
16+
import java.util.concurrent.ConcurrentHashMap
17+
import java.util.concurrent.ConcurrentLinkedDeque
1518

19+
@RequiresApi(Build.VERSION_CODES.LOLLIPOP)
1620
class RoktEventHandler(private val messenger: BinaryMessenger) {
1721

18-
private val eventListeners = mutableMapOf<Any?, ArrayDeque<EventChannel.EventSink>>()
22+
private val eventListeners = ConcurrentHashMap<Any?, ConcurrentLinkedDeque<EventChannel.EventSink>>()
1923
private val eventSubscriptions = mutableMapOf<String, Job?>()
2024

2125
init {
@@ -75,18 +79,18 @@ class RoktEventHandler(private val messenger: BinaryMessenger) {
7579
sink: EventChannel.EventSink?,
7680
) {
7781
sink?.let {
78-
val sinks = eventListeners.getOrPut(arguments) { ArrayDeque() }
82+
val sinks = eventListeners.getOrPut(arguments ?: "") { ConcurrentLinkedDeque() }
7983
sinks.addLast(it)
8084
}
8185
}
8286

8387
override fun onCancel(arguments: Any?) {
84-
val sinks = eventListeners[arguments]
88+
val sinks = eventListeners[arguments ?: ""]
8589
if (sinks?.isNotEmpty() == true) {
8690
sinks.removeLast()
8791
}
8892
if (sinks?.isEmpty() == true) {
89-
eventListeners.remove(arguments)
93+
eventListeners.remove(arguments ?: "")
9094
}
9195
}
9296
},

0 commit comments

Comments
 (0)