Skip to content

Commit 241b1a6

Browse files
committed
refactor: Introduce RoktKitApi interface to reduce SDK-Kit coupling
- Create RoktKitApi interface in android-core to abstract Rokt operations - Add getRoktKitApi() method to KitManager interface - Create RoktKitApiImpl wrapper in kit-base that handles user resolution - Update Rokt.kt to use the new interface-based approach - Update KitFrameworkWrapper to implement getRoktKitApi()
1 parent 88a682c commit 241b1a6

11 files changed

Lines changed: 807 additions & 1116 deletions

File tree

android-core/src/main/java/com/mparticle/internal/KitFrameworkWrapper.java

Lines changed: 4 additions & 84 deletions
Original file line numberDiff line numberDiff line change
@@ -19,16 +19,11 @@
1919
import com.mparticle.MPEvent;
2020
import com.mparticle.MParticle;
2121
import com.mparticle.MParticleOptions;
22-
import com.mparticle.MpRoktEventCallback;
23-
import com.mparticle.RoktEvent;
2422
import com.mparticle.WrapperSdkVersion;
2523
import com.mparticle.consent.ConsentState;
2624
import com.mparticle.identity.IdentityApiRequest;
2725
import com.mparticle.identity.MParticleUser;
2826
import com.mparticle.internal.listeners.InternalListenerManager;
29-
import com.mparticle.rokt.PlacementOptions;
30-
import com.mparticle.rokt.RoktConfig;
31-
import com.mparticle.rokt.RoktEmbeddedView;
3227
import com.mparticle.rokt.RoktOptions;
3328

3429
import org.json.JSONArray;
@@ -44,8 +39,6 @@
4439
import java.util.TreeMap;
4540
import java.util.concurrent.ConcurrentLinkedQueue;
4641

47-
import kotlinx.coroutines.flow.Flow;
48-
4942
public class KitFrameworkWrapper implements KitManager {
5043
private final Context mContext;
5144
final CoreCallbacks mCoreCallbacks;
@@ -670,48 +663,12 @@ public void reset() {
670663
}
671664

672665
@Override
673-
public void execute(@NonNull String viewName,
674-
@NonNull Map<String, String> attributes,
675-
@Nullable MpRoktEventCallback mpRoktEventCallback,
676-
@Nullable Map<String, WeakReference<RoktEmbeddedView>> placeHolders,
677-
@Nullable Map<String, WeakReference<Typeface>> fontTypefaces,
678-
@Nullable RoktConfig config) {
679-
if (mKitManager != null) {
680-
mKitManager.execute(viewName,
681-
attributes,
682-
mpRoktEventCallback,
683-
placeHolders,
684-
fontTypefaces,
685-
config);
686-
}
687-
}
688-
689-
@Override
690-
public void execute(@NonNull String identifier,
691-
@NonNull Map<String, String> attributes,
692-
@Nullable MpRoktEventCallback mpRoktEventCallback,
693-
@Nullable Map<String, WeakReference<RoktEmbeddedView>> embeddedViews,
694-
@Nullable Map<String, WeakReference<Typeface>> fontTypefaces,
695-
@Nullable RoktConfig config,
696-
@Nullable PlacementOptions options) {
697-
if (mKitManager != null) {
698-
mKitManager.execute(identifier,
699-
attributes,
700-
mpRoktEventCallback,
701-
embeddedViews,
702-
fontTypefaces,
703-
config,
704-
options);
705-
}
706-
}
707-
708-
@Override
709-
public Flow<RoktEvent> events(@NonNull String identifier) {
666+
@Nullable
667+
public RoktKitApi getRoktKitApi() {
710668
if (mKitManager != null) {
711-
return mKitManager.events(identifier);
712-
} else {
713-
return flowOf();
669+
return mKitManager.getRoktKitApi();
714670
}
671+
return null;
715672
}
716673

717674
@Override
@@ -721,43 +678,6 @@ public void setWrapperSdkVersion(@NonNull WrapperSdkVersion wrapperSdkVersion) {
721678
}
722679
}
723680

724-
@Override
725-
public void purchaseFinalized(@NonNull String placementId, @NonNull String catalogItemId, boolean status) {
726-
if (mKitManager != null) {
727-
mKitManager.purchaseFinalized(placementId, catalogItemId, status);
728-
}
729-
}
730-
731-
@Override
732-
public void close() {
733-
if (mKitManager != null) {
734-
mKitManager.close();
735-
}
736-
}
737-
738-
@Override
739-
public void prepareAttributesAsync(@NonNull Map<String, String> attributes) {
740-
if (mKitManager != null) {
741-
mKitManager.prepareAttributesAsync(attributes);
742-
}
743-
}
744-
745-
@Override
746-
public void setSessionId(@NonNull String sessionId) {
747-
if (mKitManager != null) {
748-
mKitManager.setSessionId(sessionId);
749-
}
750-
}
751-
752-
@Override
753-
@Nullable
754-
public String getSessionId() {
755-
if (mKitManager != null) {
756-
return mKitManager.getSessionId();
757-
}
758-
return null;
759-
}
760-
761681
static class CoreCallbacksImpl implements CoreCallbacks {
762682
KitFrameworkWrapper mKitFrameworkWrapper;
763683
ConfigManager mConfigManager;

android-core/src/main/java/com/mparticle/internal/KitManager.java

Lines changed: 5 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -16,15 +16,10 @@
1616
import com.mparticle.MPEvent;
1717
import com.mparticle.MParticle;
1818
import com.mparticle.MParticleOptions;
19-
import com.mparticle.MpRoktEventCallback;
20-
import com.mparticle.RoktEvent;
2119
import com.mparticle.WrapperSdkVersion;
2220
import com.mparticle.consent.ConsentState;
2321
import com.mparticle.identity.IdentityApiRequest;
2422
import com.mparticle.identity.MParticleUser;
25-
import com.mparticle.rokt.PlacementOptions;
26-
import com.mparticle.rokt.RoktConfig;
27-
import com.mparticle.rokt.RoktEmbeddedView;
2823
import com.mparticle.rokt.RoktOptions;
2924

3025
import org.json.JSONArray;
@@ -34,8 +29,6 @@
3429
import java.util.Map;
3530
import java.util.Set;
3631

37-
import kotlinx.coroutines.flow.Flow;
38-
3932
public interface KitManager {
4033

4134
WeakReference<Activity> getCurrentActivity();
@@ -134,49 +127,19 @@ public interface KitManager {
134127

135128
void reset();
136129

137-
void execute(@NonNull String identifier,
138-
@NonNull Map<String, String> attributes,
139-
@Nullable MpRoktEventCallback mpRoktEventCallback,
140-
@Nullable Map<String, WeakReference<RoktEmbeddedView>> embeddedViews,
141-
@Nullable Map<String, WeakReference<Typeface>> fontTypefaces,
142-
@Nullable RoktConfig config);
143-
144-
void execute(@NonNull String identifier,
145-
@NonNull Map<String, String> attributes,
146-
@Nullable MpRoktEventCallback mpRoktEventCallback,
147-
@Nullable Map<String, WeakReference<RoktEmbeddedView>> embeddedViews,
148-
@Nullable Map<String, WeakReference<Typeface>> fontTypefaces,
149-
@Nullable RoktConfig config,
150-
@Nullable PlacementOptions options);
151-
152-
Flow<RoktEvent> events(@NonNull String identifier);
153-
154-
void setWrapperSdkVersion(@NonNull WrapperSdkVersion wrapperSdkVersion);
155-
156-
void purchaseFinalized(@NonNull String placementId, @NonNull String catalogItemId, boolean status);
157-
158-
void close();
159-
160-
/**
161-
* Set the session id to use for the next execute call.
162-
*
163-
* @param sessionId The session id to be set. Must be a non-empty string.
164-
*/
165-
void setSessionId(@NonNull String sessionId);
166-
167130
/**
168-
* Get the session id to use within a non-native integration e.g. WebView.
131+
* Get the RoktKitApi implementation if available.
169132
*
170-
* @return The session id or null if no session is present.
133+
* @return RoktKitApi instance or null if Rokt Kit is not configured or active
171134
*/
172135
@Nullable
173-
String getSessionId();
136+
RoktKitApi getRoktKitApi();
174137

175-
void prepareAttributesAsync(@NonNull Map<String, String> attributes);
138+
void setWrapperSdkVersion(@NonNull WrapperSdkVersion wrapperSdkVersion);
176139

177140
enum KitStatus {
178141
NOT_CONFIGURED,
179142
STOPPED,
180143
ACTIVE
181144
}
182-
}
145+
}

android-core/src/main/kotlin/com/mparticle/Rokt.kt

Lines changed: 49 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package com.mparticle
33
import android.graphics.Typeface
44
import com.mparticle.internal.ConfigManager
55
import com.mparticle.internal.KitManager
6+
import com.mparticle.internal.Logger
67
import com.mparticle.internal.listeners.ApiClass
78
import com.mparticle.rokt.PlacementOptions
89
import com.mparticle.rokt.RoktConfig
@@ -14,6 +15,16 @@ import java.lang.ref.WeakReference
1415
@ApiClass
1516
class Rokt internal constructor(private val mConfigManager: ConfigManager, private val mKitManager: KitManager) {
1617

18+
/**
19+
* Display a Rokt placement with the specified parameters.
20+
*
21+
* @param identifier The placement identifier
22+
* @param attributes User attributes to pass to Rokt
23+
* @param callbacks Optional callback for Rokt events
24+
* @param embeddedViews Optional map of embedded view placeholders
25+
* @param fontTypefaces Optional map of font typefaces
26+
* @param config Optional Rokt configuration
27+
*/
1728
@JvmOverloads
1829
fun selectPlacements(
1930
identifier: String,
@@ -24,25 +35,46 @@ class Rokt internal constructor(private val mConfigManager: ConfigManager, priva
2435
config: RoktConfig? = null,
2536
) {
2637
if (mConfigManager.isEnabled) {
27-
mKitManager.execute(identifier, HashMap(attributes), callbacks, embeddedViews, fontTypefaces, config, buildPlacementOptions())
38+
val roktApi = mKitManager.roktKitApi
39+
if (roktApi != null) {
40+
roktApi.execute(identifier, HashMap(attributes), callbacks, embeddedViews, fontTypefaces, config, buildPlacementOptions())
41+
} else {
42+
Logger.warning("Rokt Kit is not available. Make sure the Rokt Kit is included in your app.")
43+
}
2844
}
2945
}
3046

47+
/**
48+
* Get a Flow of Rokt events for the specified identifier.
49+
*
50+
* @param identifier The placement identifier to listen for events
51+
* @return A Flow emitting RoktEvent objects
52+
*/
3153
fun events(identifier: String): Flow<RoktEvent> = if (mConfigManager.isEnabled) {
32-
mKitManager.events(identifier)
54+
mKitManager.roktKitApi?.events(identifier) ?: flowOf()
3355
} else {
3456
flowOf()
3557
}
3658

59+
/**
60+
* Notify Rokt that a purchase has been finalized.
61+
*
62+
* @param placementId The placement identifier
63+
* @param catalogItemId The catalog item identifier
64+
* @param status Whether the purchase was successful
65+
*/
3766
fun purchaseFinalized(placementId: String, catalogItemId: String, status: Boolean) {
3867
if (mConfigManager.isEnabled) {
39-
mKitManager.purchaseFinalized(placementId, catalogItemId, status)
68+
mKitManager.roktKitApi?.purchaseFinalized(placementId, catalogItemId, status)
4069
}
4170
}
4271

72+
/**
73+
* Close any active Rokt placements.
74+
*/
4375
fun close() {
4476
if (mConfigManager.isEnabled) {
45-
mKitManager.close()
77+
mKitManager.roktKitApi?.close()
4678
}
4779
}
4880

@@ -58,7 +90,7 @@ class Rokt internal constructor(private val mConfigManager: ConfigManager, priva
5890
*/
5991
fun setSessionId(sessionId: String) {
6092
if (mConfigManager.isEnabled) {
61-
mKitManager.setSessionId(sessionId)
93+
mKitManager.roktKitApi?.setSessionId(sessionId)
6294
}
6395
}
6496

@@ -68,11 +100,22 @@ class Rokt internal constructor(private val mConfigManager: ConfigManager, priva
68100
* @return The session id or null if no session is present or SDK is not initialized.
69101
*/
70102
fun getSessionId(): String? = if (mConfigManager.isEnabled) {
71-
mKitManager.getSessionId()
103+
mKitManager.roktKitApi?.getSessionId()
72104
} else {
73105
null
74106
}
75107

108+
/**
109+
* Prepare attributes asynchronously before executing a placement.
110+
*
111+
* @param attributes The attributes to prepare
112+
*/
113+
fun prepareAttributesAsync(attributes: Map<String, String>) {
114+
if (mConfigManager.isEnabled) {
115+
mKitManager.roktKitApi?.prepareAttributesAsync(attributes)
116+
}
117+
}
118+
76119
private fun buildPlacementOptions(): PlacementOptions = PlacementOptions(
77120
jointSdkSelectPlacements = System.currentTimeMillis(),
78121
)

0 commit comments

Comments
 (0)