@@ -23,15 +23,20 @@ import com.mparticle.rokt.RoktConfig
2323import com.mparticle.rokt.RoktEmbeddedView
2424import com.rokt.roktsdk.CacheConfig
2525import com.rokt.roktsdk.Rokt
26+ import com.rokt.roktsdk.Rokt.RoktCallback
2627import com.rokt.roktsdk.Rokt.SdkFrameworkType.Android
2728import com.rokt.roktsdk.Rokt.SdkFrameworkType.Cordova
2829import com.rokt.roktsdk.Rokt.SdkFrameworkType.Flutter
2930import com.rokt.roktsdk.Rokt.SdkFrameworkType.ReactNative
3031import com.rokt.roktsdk.RoktEvent
3132import com.rokt.roktsdk.RoktWidgetDimensionCallBack
3233import com.rokt.roktsdk.Widget
34+ import kotlinx.coroutines.CompletableDeferred
35+ import kotlinx.coroutines.CoroutineScope
36+ import kotlinx.coroutines.Dispatchers
3337import kotlinx.coroutines.flow.Flow
3438import kotlinx.coroutines.flow.map
39+ import kotlinx.coroutines.launch
3540import java.lang.ref.WeakReference
3641import java.math.BigDecimal
3742
@@ -56,7 +61,10 @@ class RoktKit :
5661
5762 override fun getInstance (): RoktKit = this
5863
64+ private var deferredAttributes: CompletableDeferred <Map <String , String >>? = null
65+
5966 public override fun onKitCreate (settings : Map <String , String >, ctx : Context ): List <ReportingMessage > {
67+ register(this )
6068 applicationContext = ctx.applicationContext
6169 val roktTagId = settings[ROKT_ACCOUNT_ID ]
6270 if (KitUtils .isEmpty(roktTagId)) {
@@ -186,6 +194,23 @@ class RoktKit :
186194 }?.toMap()
187195
188196 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 > {
189214 val finalAttributes = mutableMapOf<String , String >()
190215 filterUser?.userAttributes?.let { userAttrs ->
191216 for ((key, value) in userAttrs) {
@@ -203,16 +228,7 @@ class RoktKit :
203228 finalAttributes.put(ROKT_ATTRIBUTE_SANDBOX_MODE , value)
204229 }
205230 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
216232 }
217233
218234 override fun events (identifier : String ): Flow <com.mparticle.RoktEvent > = Rokt .events(identifier).map { event ->
@@ -274,6 +290,26 @@ class RoktKit :
274290 Rokt .close()
275291 }
276292
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+
277313 private fun mapToRoktConfig (config : RoktConfig ): com.rokt.roktsdk.RoktConfig {
278314 val colorMode = when (config.colorMode) {
279315 RoktConfig .ColorMode .LIGHT -> com.rokt.roktsdk.RoktConfig .ColorMode .LIGHT
@@ -367,6 +403,14 @@ class RoktKit :
367403 }
368404
369405 companion object {
406+ @Volatile
407+ var instance: RoktKit ? = null
408+ private set
409+
410+ fun register (kit : RoktKit ) {
411+ instance = kit
412+ }
413+
370414 const val NAME = " Rokt"
371415 const val ROKT_ACCOUNT_ID = " accountId"
372416 const val MPID = " mpid"
0 commit comments