@@ -23,15 +23,20 @@ import com.mparticle.rokt.RoktConfig
23
23
import com.mparticle.rokt.RoktEmbeddedView
24
24
import com.rokt.roktsdk.CacheConfig
25
25
import com.rokt.roktsdk.Rokt
26
+ import com.rokt.roktsdk.Rokt.RoktCallback
26
27
import com.rokt.roktsdk.Rokt.SdkFrameworkType.Android
27
28
import com.rokt.roktsdk.Rokt.SdkFrameworkType.Cordova
28
29
import com.rokt.roktsdk.Rokt.SdkFrameworkType.Flutter
29
30
import com.rokt.roktsdk.Rokt.SdkFrameworkType.ReactNative
30
31
import com.rokt.roktsdk.RoktEvent
31
32
import com.rokt.roktsdk.RoktWidgetDimensionCallBack
32
33
import com.rokt.roktsdk.Widget
34
+ import kotlinx.coroutines.CompletableDeferred
35
+ import kotlinx.coroutines.CoroutineScope
36
+ import kotlinx.coroutines.Dispatchers
33
37
import kotlinx.coroutines.flow.Flow
34
38
import kotlinx.coroutines.flow.map
39
+ import kotlinx.coroutines.launch
35
40
import java.lang.ref.WeakReference
36
41
import java.math.BigDecimal
37
42
@@ -56,7 +61,10 @@ class RoktKit :
56
61
57
62
override fun getInstance (): RoktKit = this
58
63
64
+ private var deferredAttributes: CompletableDeferred <Map <String , String >>? = null
65
+
59
66
public override fun onKitCreate (settings : Map <String , String >, ctx : Context ): List <ReportingMessage > {
67
+ register(this )
60
68
applicationContext = ctx.applicationContext
61
69
val roktTagId = settings[ROKT_ACCOUNT_ID ]
62
70
if (KitUtils .isEmpty(roktTagId)) {
@@ -186,6 +194,23 @@ class RoktKit :
186
194
}?.toMap()
187
195
188
196
this .mpRoktEventCallback = mpRoktEventCallback
197
+ val finalAttributes = prepareFinalAttributes(filterUser, attributes)
198
+ val roktConfig = mpRoktConfig?.let { mapToRoktConfig(it) }
199
+ Rokt .execute(
200
+ viewName,
201
+ finalAttributes,
202
+ this ,
203
+ // Pass placeholders and fontTypefaces only if they are not empty or null
204
+ placeholders.takeIf { it?.isNotEmpty() == true },
205
+ fontTypefaces.takeIf { it?.isNotEmpty() == true },
206
+ roktConfig,
207
+ )
208
+ }
209
+
210
+ private fun prepareFinalAttributes (
211
+ filterUser : FilteredMParticleUser ? ,
212
+ attributes : Map <String , String >,
213
+ ): Map <String , String > {
189
214
val finalAttributes = mutableMapOf<String , String >()
190
215
filterUser?.userAttributes?.let { userAttrs ->
191
216
for ((key, value) in userAttrs) {
@@ -203,16 +228,7 @@ class RoktKit :
203
228
finalAttributes.put(ROKT_ATTRIBUTE_SANDBOX_MODE , value)
204
229
}
205
230
verifyHashedEmail(finalAttributes)
206
- val roktConfig = mpRoktConfig?.let { mapToRoktConfig(it) }
207
- Rokt .execute(
208
- viewName,
209
- finalAttributes,
210
- this ,
211
- // Pass placeholders and fontTypefaces only if they are not empty or null
212
- placeholders.takeIf { it?.isNotEmpty() == true },
213
- fontTypefaces.takeIf { it?.isNotEmpty() == true },
214
- roktConfig,
215
- )
231
+ return finalAttributes
216
232
}
217
233
218
234
override fun events (identifier : String ): Flow <com.mparticle.RoktEvent > = Rokt .events(identifier).map { event ->
@@ -274,6 +290,26 @@ class RoktKit :
274
290
Rokt .close()
275
291
}
276
292
293
+ override fun enrichAttributes (attributes : MutableMap <String , String >, user : FilteredMParticleUser ? ) {
294
+ val finalAttributes = prepareFinalAttributes(user, attributes)
295
+ deferredAttributes?.complete(finalAttributes)
296
+ }
297
+
298
+ suspend fun runComposableWithCallback (
299
+ attributes : Map <String , String >,
300
+ mpRoktEventCallback : MpRoktEventCallback ? ,
301
+ onResult : (Map <String , String >, RoktCallback ) -> Unit ,
302
+ ) {
303
+ val instance = MParticle .getInstance()
304
+ deferredAttributes = CompletableDeferred ()
305
+ instance?.Internal ()?.kitManager?.prepareAttributesAsync(attributes)
306
+ this .mpRoktEventCallback = mpRoktEventCallback
307
+ CoroutineScope (Dispatchers .Default ).launch {
308
+ val resultAttributes = deferredAttributes!! .await()
309
+ onResult(resultAttributes, this @RoktKit)
310
+ }
311
+ }
312
+
277
313
private fun mapToRoktConfig (config : RoktConfig ): com.rokt.roktsdk.RoktConfig {
278
314
val colorMode = when (config.colorMode) {
279
315
RoktConfig .ColorMode .LIGHT -> com.rokt.roktsdk.RoktConfig .ColorMode .LIGHT
@@ -367,6 +403,14 @@ class RoktKit :
367
403
}
368
404
369
405
companion object {
406
+ @Volatile
407
+ var instance: RoktKit ? = null
408
+ private set
409
+
410
+ fun register (kit : RoktKit ) {
411
+ instance = kit
412
+ }
413
+
370
414
const val NAME = " Rokt"
371
415
const val ROKT_ACCOUNT_ID = " accountId"
372
416
const val MPID = " mpid"
0 commit comments