Skip to content

Commit 6e2f123

Browse files
feat: Implement Jetpack compose
1 parent 28fec59 commit 6e2f123

3 files changed

Lines changed: 115 additions & 10 deletions

File tree

build.gradle

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,13 @@ android {
4848
jvmArgs += ['--add-opens', 'java.base/java.lang.reflect=ALL-UNNAMED']
4949
}
5050
}
51+
buildFeatures {
52+
compose true
53+
}
54+
55+
composeOptions {
56+
kotlinCompilerExtensionVersion = "1.5.2" // or match the app’s version
57+
}
5158
}
5259

5360
repositories {
@@ -59,9 +66,13 @@ dependencies {
5966
implementation 'androidx.annotation:annotation:1.5.0'
6067
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4'
6168
api 'com.rokt:roktsdk:4.10.0'
69+
implementation 'androidx.compose.runtime:runtime-android:1.8.3'
6270

6371
testImplementation files('libs/java-json.jar')
6472
testImplementation 'com.squareup.assertj:assertj-android:1.2.0'
6573
testImplementation ("io.mockk:mockk:1.13.4")
6674
testImplementation 'org.jetbrains.kotlinx:kotlinx-coroutines-test:1.6.4'
75+
implementation 'androidx.compose.ui:ui:1.0.0'
76+
implementation 'androidx.compose.material:material:1.0.0'
77+
implementation 'androidx.compose.ui:ui-tooling:1.0.0'
6778
}

src/main/kotlin/com/mparticle/kits/RoktKit.kt

Lines changed: 56 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import android.content.pm.PackageInfo
66
import android.content.pm.PackageManager
77
import android.graphics.Typeface
88
import android.os.Build
9+
import androidx.compose.runtime.Composable
910
import com.mparticle.BuildConfig
1011
import com.mparticle.MParticle
1112
import com.mparticle.MParticle.IdentityType
@@ -23,15 +24,20 @@ import com.mparticle.rokt.RoktConfig
2324
import com.mparticle.rokt.RoktEmbeddedView
2425
import com.rokt.roktsdk.CacheConfig
2526
import com.rokt.roktsdk.Rokt
27+
import com.rokt.roktsdk.Rokt.RoktCallback
2628
import com.rokt.roktsdk.Rokt.SdkFrameworkType.Android
2729
import com.rokt.roktsdk.Rokt.SdkFrameworkType.Cordova
2830
import com.rokt.roktsdk.Rokt.SdkFrameworkType.Flutter
2931
import com.rokt.roktsdk.Rokt.SdkFrameworkType.ReactNative
3032
import com.rokt.roktsdk.RoktEvent
3133
import com.rokt.roktsdk.RoktWidgetDimensionCallBack
3234
import com.rokt.roktsdk.Widget
35+
import kotlinx.coroutines.CompletableDeferred
36+
import kotlinx.coroutines.CoroutineScope
37+
import kotlinx.coroutines.Dispatchers
3338
import kotlinx.coroutines.flow.Flow
3439
import kotlinx.coroutines.flow.map
40+
import kotlinx.coroutines.launch
3541
import java.lang.ref.WeakReference
3642
import java.math.BigDecimal
3743

@@ -49,10 +55,13 @@ class RoktKit : KitIntegration(), CommerceListener, IdentityListener, RoktListen
4955

5056
override fun getInstance(): RoktKit = this
5157

58+
private var deferredAttributes: CompletableDeferred<Map<String, String>>? = null
59+
5260
public override fun onKitCreate(
5361
settings: Map<String, String>,
5462
ctx: Context
5563
): List<ReportingMessage> {
64+
register(this)
5665
applicationContext = ctx.applicationContext
5766
val roktTagId = settings[ROKT_ACCOUNT_ID]
5867
if (KitUtils.isEmpty(roktTagId)) {
@@ -189,6 +198,23 @@ class RoktKit : KitIntegration(), CommerceListener, IdentityListener, RoktListen
189198
}?.toMap()
190199

191200
this.mpRoktEventCallback = mpRoktEventCallback
201+
val finalAttributes = prepareFinalAttributes(filterUser, attributes)
202+
val roktConfig = mpRoktConfig?.let { mapToRoktConfig(it) }
203+
Rokt.execute(
204+
viewName,
205+
finalAttributes,
206+
this,
207+
// Pass placeholders and fontTypefaces only if they are not empty or null
208+
placeholders.takeIf { it?.isNotEmpty() == true },
209+
fontTypefaces.takeIf { it?.isNotEmpty() == true },
210+
roktConfig
211+
)
212+
}
213+
214+
private fun prepareFinalAttributes(
215+
filterUser: FilteredMParticleUser?,
216+
attributes: Map<String, String>?
217+
): Map<String, String> {
192218
val finalAttributes = mutableMapOf<String, String>()
193219
filterUser?.userAttributes?.let { userAttrs ->
194220
for ((key, value) in userAttrs) {
@@ -208,16 +234,9 @@ class RoktKit : KitIntegration(), CommerceListener, IdentityListener, RoktListen
208234
finalAttributes.put(SANDBOX_MODE_ROKT, value)
209235
}
210236
verifyHashedEmail(finalAttributes)
211-
val roktConfig = mpRoktConfig?.let { mapToRoktConfig(it) }
212-
Rokt.execute(
213-
viewName,
214-
finalAttributes,
215-
this,
216-
// Pass placeholders and fontTypefaces only if they are not empty or null
217-
placeholders.takeIf { it?.isNotEmpty() == true },
218-
fontTypefaces.takeIf { it?.isNotEmpty() == true },
219-
roktConfig
220-
)
237+
238+
239+
return finalAttributes
221240
}
222241

223242
override fun events(identifier: String): Flow<com.mparticle.RoktEvent> {
@@ -277,6 +296,26 @@ class RoktKit : KitIntegration(), CommerceListener, IdentityListener, RoktListen
277296
Rokt.close()
278297
}
279298

299+
override fun callRoktComposable(attributes: MutableMap<String, String>, user: FilteredMParticleUser?) {
300+
val finalAttributes = prepareFinalAttributes(user, attributes)
301+
deferredAttributes?.complete(finalAttributes)
302+
}
303+
304+
fun ComposableTest(
305+
attributes: Map<String, String>,
306+
mpRoktEventCallback: MpRoktEventCallback?,
307+
onResult: (Map<String, String>, RoktCallback) -> Unit
308+
) {
309+
val instance = MParticle.getInstance()
310+
deferredAttributes = CompletableDeferred()
311+
instance?.Internal()?.kitManager?.callExecuteForComposable(attributes)
312+
this.mpRoktEventCallback = mpRoktEventCallback
313+
CoroutineScope(Dispatchers.Default).launch {
314+
val resultAttributes = deferredAttributes!!.await()
315+
onResult(resultAttributes, this@RoktKit)
316+
}
317+
}
318+
280319
private fun mapToRoktConfig(config: RoktConfig): com.rokt.roktsdk.RoktConfig {
281320
val colorMode = when (config.colorMode) {
282321
RoktConfig.ColorMode.LIGHT -> com.rokt.roktsdk.RoktConfig.ColorMode.LIGHT
@@ -371,6 +410,13 @@ class RoktKit : KitIntegration(), CommerceListener, IdentityListener, RoktListen
371410
}
372411

373412
companion object {
413+
private var instance: RoktKit? = null
414+
415+
fun register(kit: RoktKit) {
416+
instance = kit
417+
}
418+
419+
fun get(): RoktKit? = instance
374420
const val NAME = "Rokt"
375421
const val ROKT_ACCOUNT_ID = "accountId"
376422
const val MPID = "mpid"
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package com.mparticle.kits
2+
3+
import android.graphics.Typeface
4+
import androidx.annotation.NonNull
5+
import androidx.annotation.Nullable
6+
import androidx.compose.foundation.layout.padding
7+
import androidx.compose.foundation.layout.wrapContentHeight
8+
import androidx.compose.foundation.layout.wrapContentWidth
9+
import androidx.compose.material.MaterialTheme.typography
10+
import androidx.compose.material.Text
11+
import androidx.compose.runtime.Composable
12+
import androidx.compose.runtime.LaunchedEffect
13+
import androidx.compose.runtime.mutableStateOf
14+
import androidx.compose.runtime.remember
15+
import androidx.compose.ui.Modifier
16+
import androidx.compose.ui.graphics.Color
17+
import androidx.compose.ui.unit.dp
18+
import com.mparticle.MpRoktEventCallback
19+
import com.mparticle.rokt.RoktConfig
20+
import com.mparticle.rokt.RoktEmbeddedView
21+
import com.rokt.roktsdk.Rokt
22+
import java.lang.ref.WeakReference
23+
24+
@Composable
25+
fun RoktLayout(
26+
sdkTriggered: Boolean,
27+
viewName: String,
28+
modifier: Modifier,
29+
attributes: Map<String, String>,
30+
location: String,
31+
mpRoktEventCallback: MpRoktEventCallback?
32+
) {
33+
val instance = RoktKit.get()
34+
35+
data class RoktResult(val attributes: Map<String, String>, val callback: Rokt.RoktCallback)
36+
37+
val resultMapState = remember { mutableStateOf<RoktResult?>(null) }
38+
val trigger = remember { mutableStateOf(0) }
39+
LaunchedEffect(trigger.value) {
40+
instance?.ComposableTest(attributes, mpRoktEventCallback, { resultMap, callback ->
41+
resultMapState.value = RoktResult(resultMap, callback)
42+
})
43+
}
44+
45+
resultMapState.value?.let { resultMap ->
46+
com.rokt.roktsdk.RoktLayout(sdkTriggered, viewName, modifier, resultMap.attributes, location)
47+
}
48+
}

0 commit comments

Comments
 (0)