@@ -18,13 +18,15 @@ import io.flutter.plugin.common.MethodChannel
1818import io.flutter.plugin.common.MethodChannel.MethodCallHandler
1919import io.flutter.plugin.common.MethodChannel.Result
2020import io.flutter.plugin.common.PluginRegistry.NewIntentListener
21+ import java.util.concurrent.atomic.AtomicBoolean
22+ import java.util.concurrent.atomic.AtomicReference
2123
2224/* * MindboxAndroidPlugin */
2325class MindboxAndroidPlugin : FlutterPlugin , MethodCallHandler , ActivityAware , NewIntentListener {
2426 private lateinit var context: Activity
2527 private var binding: ActivityPluginBinding ? = null
26- private var deviceUuidSubscription : String? = null
27- private var tokenSubscription : String? = null
28+ private val deviceUuidSubscriptions = mutableListOf< String >()
29+ private val tokenSubscriptions = mutableListOf< String >()
2830 private lateinit var channel: MethodChannel
2931
3032 inner class InAppCallbackImpl : InAppCallback {
@@ -83,27 +85,76 @@ class MindboxAndroidPlugin : FlutterPlugin, MethodCallHandler, ActivityAware, Ne
8385 }
8486 }
8587 " getDeviceUUID" -> {
86- if (deviceUuidSubscription != null ) {
87- Mindbox .disposeDeviceUuidSubscription(deviceUuidSubscription!! )
88+ val subscriptionRef = AtomicReference <String ?>(null )
89+ val isResultSent = AtomicBoolean (false )
90+
91+ val subscriptionId = Mindbox .subscribeDeviceUuid { uuid ->
92+ if (isResultSent.compareAndSet(false , true )) {
93+ result.success(uuid)
94+
95+ val id = subscriptionRef.get()
96+ if (id != null ) {
97+ Mindbox .disposeDeviceUuidSubscription(id)
98+ deviceUuidSubscriptions.remove(id)
99+ }
100+ }
88101 }
89- deviceUuidSubscription = Mindbox .subscribeDeviceUuid { uuid ->
90- result.success(uuid)
102+
103+ subscriptionRef.set(subscriptionId)
104+ deviceUuidSubscriptions.add(subscriptionId)
105+
106+ // If callback was synchronous, unsubscribe immediately
107+ if (isResultSent.get()) {
108+ Mindbox .disposeDeviceUuidSubscription(subscriptionId)
109+ deviceUuidSubscriptions.remove(subscriptionId)
91110 }
92111 }
93112 " getToken" -> {
94- if (tokenSubscription != null ) {
95- Mindbox .disposePushTokenSubscription(tokenSubscription!! )
113+ val subscriptionRef = AtomicReference <String ?>(null )
114+ val isResultSent = AtomicBoolean (false )
115+
116+ val subscriptionId = Mindbox .subscribePushToken { token ->
117+ if (isResultSent.compareAndSet(false , true )) {
118+ result.success(token)
119+
120+ val id = subscriptionRef.get()
121+ if (id != null ) {
122+ Mindbox .disposePushTokenSubscription(id)
123+ tokenSubscriptions.remove(id)
124+ }
125+ }
96126 }
97- tokenSubscription = Mindbox .subscribePushToken { token ->
98- result.success(token)
127+
128+ subscriptionRef.set(subscriptionId)
129+ tokenSubscriptions.add(subscriptionId)
130+
131+ if (isResultSent.get()) {
132+ Mindbox .disposePushTokenSubscription(subscriptionId)
133+ tokenSubscriptions.remove(subscriptionId)
99134 }
100135 }
101136 " getTokens" -> {
102- if (tokenSubscription != null ) {
103- Mindbox .disposePushTokenSubscription(tokenSubscription!! )
137+ val subscriptionRef = AtomicReference <String ?>(null )
138+ val isResultSent = AtomicBoolean (false )
139+
140+ val subscriptionId = Mindbox .subscribePushTokens { token ->
141+ if (isResultSent.compareAndSet(false , true )) {
142+ result.success(token)
143+
144+ val id = subscriptionRef.get()
145+ if (id != null ) {
146+ Mindbox .disposePushTokenSubscription(id)
147+ tokenSubscriptions.remove(id)
148+ }
149+ }
104150 }
105- tokenSubscription = Mindbox .subscribePushTokens { token ->
106- result.success(token)
151+
152+ subscriptionRef.set(subscriptionId)
153+ tokenSubscriptions.add(subscriptionId)
154+
155+ if (isResultSent.get()) {
156+ Mindbox .disposePushTokenSubscription(subscriptionId)
157+ tokenSubscriptions.remove(subscriptionId)
107158 }
108159 }
109160 " executeAsyncOperation" -> {
0 commit comments