Skip to content

refactor: migrate Rokt contracts and facade ownership to rokt-kit#700

Open
denischilik wants to merge 20 commits into
workstation/6.0-Releasefrom
feat/migrate-rokt-types-1
Open

refactor: migrate Rokt contracts and facade ownership to rokt-kit#700
denischilik wants to merge 20 commits into
workstation/6.0-Releasefrom
feat/migrate-rokt-types-1

Conversation

@denischilik
Copy link
Copy Markdown

Background

This change completes the Rokt ownership migration to the rokt-kit module so Rokt-specific contracts no longer leak through android-core and android-kit-base.
It also removes fragile reflection in the Rokt enablement check to improve runtime reliability.

What Has Changed

  • Moved Rokt facade and related Rokt view/callback contracts into kits/rokt/rokt
  • Replaced mParticle wrapper contracts with native com.rokt.roktsdk types across the Rokt kit flow
  • Removed RoktKitApi bridging from core kit manager contracts
  • Updated Rokt request and bridge flow to resolve and execute through kit-owned components only
  • Reworked isEnabled resolution to use a callback provider instead of reflection and updated unit tests accordingly

Screenshots/Video

N/A

Checklist

  • I have performed a self-review of my own code.
  • I have made corresponding changes to the documentation.
  • I have added tests that prove my fix is effective or that my feature works.
  • I have tested this locally.

Additional Notes

This PR is intentionally scoped to internal ownership/type migration for Rokt integration and related reliability fixes.

Stop instantiating and storing Rokt inside android-core MParticle, and create it from rokt-kit extensions instead to start decoupling Rokt object ownership from the core SDK.
Relocate the Rokt facade class and its unit tests from android-core to the rokt kit so Rokt-specific API ownership continues shifting out of core while preserving current behavior and test coverage.
Use a single helper in the Rokt facade to resolve the kit API for all operations, making the upcoming decoupling from the legacy roktKitApi chain incremental and safer.
Remove the mParticle RoktEvent wrapper and return native Rokt SDK events directly to simplify the event pipeline and reduce duplicate mapping logic.
Remove the mParticle unload reason wrapper and pass Rokt SDK unload reasons through directly to simplify callback handling and eliminate redundant mapping.
Replace MpRoktEventCallback with the native RoktCallback across the rokt kit and tests to remove callback wrappers and simplify callback delegation.
Replace the local PlacementOptions wrapper with the native Rokt SDK PlacementOptions across the rokt kit and remove the now-redundant conversion layer.
Replace mParticle RoktConfig and CacheConfig wrappers with native Rokt SDK config types and remove the now-unnecessary config conversion layer and tests.
Relocate Rokt, RoktEmbeddedView, RoktLayoutDimensionCallBack, and RoktTest into com.mparticle.kits to keep kit-owned types co-located and simplify package boundaries.
Avoid runtime method lookup for isEnabled by injecting an explicit enablement callback and wiring it to core callbacks with a safe opt-out fallback, preserving behavior under obfuscation.
@denischilik denischilik requested a review from a team as a code owner May 13, 2026 17:00
@cursor
Copy link
Copy Markdown

cursor Bot commented May 13, 2026

PR Summary

Medium Risk
Moderate risk because it changes public API surface and rewires how the Rokt kit is discovered/invoked (including callback/config/event types), which could break existing integrations or edge cases around enablement and kit activation.

Overview
Rokt ownership is migrated into the kits/rokt/rokt module. The android-core MParticle.Rokt() accessor and core-level Rokt facade/contracts (MpRoktEventCallback, RoktEvent, com.mparticle.rokt.*) are removed, and Rokt kit calls now use native com.rokt.roktsdk callback/config/event/placement types.

The core/kit-base bridge API is deleted and invocation is rerouted. RoktKitApi and KitManager.getRoktKitApi() are removed (plus associated tests), replaced by kit-owned resolution (RoktKitBridge) that looks up the Rokt kit instance via KitManager.isKitActive()/getKitInstance() and uses a shared RoktKitRequestHelper for attribute prep/email confirmation.

Enablement plumbing is made explicit. KitManager/KitFrameworkWrapper/KitManagerImpl add isEnabled() (delegating to CoreCallbacks), and tests/publish tooling are updated accordingly (including task-name capitalization fix and additional kit test dependencies).

Reviewed by Cursor Bugbot for commit df42198. Bugbot is set up for automated code reviews on this repo. Configure here.

Comment thread kits/rokt/rokt/src/main/kotlin/com/mparticle/kits/MParticleRoktExtensions.kt Outdated
Add isEnabled to KitManager and use it from the Rokt facade so enablement is resolved through a stable kit-layer API without reflection or config manager coupling.
Clean up stale imports in KitManagerImplTest so android-kit-base ktlint test source checks pass in CI.
Copy link
Copy Markdown

@cursor cursor Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, have a team admin enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 73c65a8. Configure here.

@@ -0,0 +1,25 @@
package com.mparticle.rokt
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

File package doesn't match directory structure

High Severity

MParticleRoktExtensions.kt declares package com.mparticle.rokt but is physically located in the com/mparticle/kits/ directory. There is no com/mparticle/rokt/ directory under the Kotlin source root in this module. This mismatch between the declared package and the file's directory path will likely cause build failures or the file being invisible to the compiler, since Android/Gradle projects conventionally require the source file path to match the package declaration.

Fix in Cursor Fix in Web

Reviewed by Cursor Bugbot for commit 73c65a8. Configure here.

Replace replaceFirstChar in buildSrc for older Kotlin compatibility and address rokt ktlint violations by suppressing Java-style accessor naming and wrapping long warning messages.
@sonarqubecloud
Copy link
Copy Markdown

*
* @param wrapperSdkVersion the version of the mParticle SDK
*/
void setWrapperSdkVersion(@NonNull WrapperSdkVersion wrapperSdkVersion);
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If this is used by just Rokt SDK, do we need to keep it?

* Java-friendly accessors for the legacy Rokt API object.
*/
object MParticleRokt {
@Suppress("FunctionName")
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is probably confusing. Can we keep the function name start with small letters?

*/
object MParticleRokt {
@Suppress("FunctionName")
@JvmStatic
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do we need JvmStatic here? Only consumer is Kotlin, isn't it?

object MParticleRokt {
@Suppress("FunctionName")
@JvmStatic
fun Rokt(mParticle: MParticle?): Rokt? = mParticle?.let { createRokt(it) }
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why do we need this nullable?


class Rokt internal constructor(private val mKitManager: KitManager) {
@JvmOverloads
fun selectPlacements(
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Since this is a public api, it would be nice to have some javadoc documentation.

null
}

fun prepareAttributesAsync(attributes: Map<String, String>) {
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We don't want this to be public.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants