chore: merge workstation/6.0-Release into main#737
Conversation
* feat: migrate appsflyer-kit from submodule to regular directory * feat: relocate appsflyer-kit to kits/appsflyer/appsflyer-6 and update settings-kits.gradle * Add kit lint/ktlint to PR workflow; ignore appsflyer-6 in Trunk Made-with: Cursor * Fix Trunk ignore: use glob patterns for appsflyer-6 and gradlew Made-with: Cursor * feat: remove .gitignore
* feat: migrate appboy-kit from submodule to regular directory * feat: relocate appboy-kit to kits/braze/braze-38 and update settings-kits.gradle Made-with: Cursor * fix: add braze-38 to settings-kits.gradle (alphabetical order) Made-with: Cursor
* feat: migrate googleanalyticsfirebase-kit from submodule to regular directory * feat: relocate googleanalyticsfirebase-kit to kits/ga/ga-23 and update settings-kits.gradle Made-with: Cursor * fix agent typo * add bracket
* feat: migrate googleanalyticsfirebasega4-kit from submodule to regular directory * feat: relocate googleanalyticsfirebasega4-kit to kits/ga4/ga4-23 and update settings-kits.gradle * fix typo
* feat: migrate rokt-kit from submodule to regular directory * feat: relocate rokt-kit to kits/rokt/rokt * feat: add rokt to settings-kits.gradle, remove accidental kit adds Made-with: Cursor
* feat: migrate kochava-kit from submodule to regular directory * feat: relocate kochava-kit to kits/kochava/kochava-5 and update settings-kits.gradle Made-with: Cursor * fix typo
* feat: migrate adjust-kit from submodule to regular directory * feat: relocate adjust-kit to kits/adjust/adjust-5 * feat: add adjust-5 to settings-kits.gradle Made-with: Cursor
* feat: migrate localytics-kit from submodule to regular directory * feat: relocate localytics-kit to kits/localytics/localytics-6 Made-with: Cursor * feat: update settings-kits.gradle for localytics-6 path Made-with: Cursor
* feat: split instrumented tests in CI for parallel execution - Split instrumented tests into 4 parallel jobs: core, kit-base, testutils, orchestrator - Reduced timeout from 30 to 20 min per job - Each job runs only its module for faster feedback - Add kit directories for isolated testing (adjust, googleanalyticsfirebase, kochava, localytics, rokt) - Replace 2 shard jobs with matrix strategy (shards 0-3) - Each shard runs ~25% of tests in parallel - Timeout 12 min per shard, fail-fast: false - extract common part in instrumented-tests.yml * chore: remove rokt-kit submodule (migrated to monorepo) Rokt kit is now in kits/rokt/rokt, no longer a submodule. Made-with: Cursor * fix: add explicit permissions to instrumented-tests workflow for Checkov CKV2_GHA_1 Made-with: Cursor * fix: remove actions: write permission from instrumented-tests workflow Made-with: Cursor
* feat: migrate leanplum-kit from submodule to regular directory feat: relocate leanplum-kit to kits/leanplum/leanplum-7 and update settings-kits.gradle fix: replace exposed Google API key with placeholder in leanplum example Made-with: Cursor * chore: update .mobsf to suppress MobSF false positives - Add ignore-paths for src/test, example apps - Add webview_javascript_interface ignore (intentional JS bridge for WebView SDK) Made-with: Cursor * fix security issues
* feat: migrate clevertap-kit from submodule to regular directory * feat: relocate clevertap-kit to kits/clevertap/clevertap-7 Made-with: Cursor * feat: update settings-kits.gradle for clevertap-7 kit path Made-with: Cursor
feat: migrate apptentive-kit from submodule to regular directory feat: relocate apptentive-kit to kits/apptentive/apptentive-6 feat: add apptentive-6 to settings-kits.gradle
* feat: migrate apptimize-kit from submodule to regular directory * feat: relocate apptimize-kit to kits/apptimize/apptimize-3 * feat: add apptimize-3 to settings-kits.gradle Made-with: Cursor
* feat: migrate adobemedia-kit from submodule to regular directory * feat: relocate adobemedia-kit to kits/adobemedia/adobemedia-5 Made-with: Cursor * feat: add adobemedia-5 to settings-kits.gradle Made-with: Cursor
* feat: migrate adobe-kit from submodule to regular directory * feat: relocate adobe-kit to kits/adobe/adobe-5 Made-with: Cursor * feat: add adobe-5 to settings-kits.gradle Made-with: Cursor
* feat: migrate iterable-kit from submodule to regular directory * feat: relocate iterable-kit to kits/iterable/iterable-3 Made-with: Cursor * feat: add iterable-3 to settings-kits.gradle Made-with: Cursor
* feat: migrate comscore-kit from submodule to regular directory * feat: relocate comscore-kit to kits/comscore/comscore-6 Made-with: Cursor * feat: add comscore-6 to settings-kits.gradle Made-with: Cursor
* feat: migrate radar-kit from submodule to regular directory * feat: relocate radar-kit to kits/radar/radar-3 Made-with: Cursor * feat: update settings-kits.gradle for radar-3 Made-with: Cursor
* feat: migrate singular-kit from submodule to regular directory * feat: relocate singular-kit to kits/singular/singular-12 Made-with: Cursor * feat: add singular-12 to settings-kits.gradle Made-with: Cursor
* feat: migrate optimizely-kit from submodule to regular directory * feat: relocate optimizely-kit to kits/optimizely/optimizely-3 Made-with: Cursor * feat: update settings-kits.gradle for optimizely-3 Made-with: Cursor
* feat: migrate branch-kit from submodule to regular directory * feat: relocate branch-kit to kits/branch/branch-5 * feat: add branch-5 to settings-kits.gradle Made-with: Cursor * fix: remove old branch-kit path from settings-kits.gradle Made-with: Cursor * fix: resolve MobSF/mobsfscan security findings - Remove sensitive value from CustomDataParser log (android_kotlin_logging) - Add SampleApplication to ignore-paths and manifest rules to .mobsf (assetlinks, task hijacking for Branch sample app) Made-with: Cursor * Add nosemgrep to SampleApplication gradlew to fix Semgrep CI Made-with: Cursor
* feat: migrate urbanairship-kit from submodule to regular directory * feat: relocate urbanairship-kit to kits/urbanairship/urbanairship-20 Made-with: Cursor * feat: add urbanairship-20 to settings-kits.gradle (commented, Kotlin 2.2.x standalone) Made-with: Cursor * fix: update CI and ONBOARDING for urbanairship standalone path (kits/urbanairship/urbanairship-20) Made-with: Cursor * Add nosemgrep to urbanairship PushSample gradlew to fix Semgrep CI Made-with: Cursor * Fix MobSF findings: remove sensitive logging, use SecureRandom in tests Made-with: Cursor
* feat: migrate onetrust-kit from submodule to regular directory * feat: relocate onetrust-kit to kits/onetrust/onetrust-5 Made-with: Cursor * feat: add onetrust-5 to settings-kits.gradle Made-with: Cursor * fix: use version 202411 from OneTrust SDK dependency (com.onetrust.cmp:native-sdk:202411.2.0.0) Made-with: Cursor * fix: OneTrust kit uses path without version (kits/onetrust/onetrust) Made-with: Cursor * Add nosemgrep to onetrust gradlew to fix Semgrep CI Made-with: Cursor * disable AVD cache because of the issues in CI
chore: remove submodules, migrate to monorepo - Remove .gitmodules and 12 kit submodules (apteligent, button, example, flurry, foresee, pilgrim, responsys, revealmobile, skyhook, taplytics, tune, wootric) - Update settings-kits.gradle to remove deleted kit references - Remove submodule steps from CI (pull-request.yml, release.yml, daily.yml) - Update ONBOARDING.md: kits are in monorepo, no submodule init needed - Update CONTRIBUTING.md: urbanairship path - Update urbanairship paths in release.yml and daily.yml Made-with: Cursor
* chore: Migrate to Rokt release process * Fix trunk issues * Fixes for versions * Separate versions for coroutines * Change jvm version and fix lower case issue * Update KitPlugin.groovy * Pin actions versions up lint timeout --------- Signed-off-by: James Newman <james.newman@rokt.com>
* fix: resolve trunk issues for adjust kit Made-with: Cursor * fix: resolve trunk issues for adobe kit Made-with: Cursor * fix: resolve trunk issues for adobemedia kit Made-with: Cursor * fix: resolve trunk issues for apptentive kit Made-with: Cursor * fix: resolve trunk issues for appsflyer kit Made-with: Cursor * fix: resolve trunk issues for apptimize kit Made-with: Cursor * fix: resolve trunk issues for branch kit Made-with: Cursor * fix: resolve trunk issues for braze kit Made-with: Cursor * fix: resolve trunk issues for clevertap kit Made-with: Cursor * fix: resolve trunk issues for comscore kit Made-with: Cursor * fix: resolve trunk issues for iterable kit Made-with: Cursor * fix: resolve trunk issues for ga kit Made-with: Cursor * fix: resolve trunk issues for ga4 kit Made-with: Cursor * fix: resolve trunk issues for kochava kit Made-with: Cursor * fix: resolve trunk issues for leanplum kit Made-with: Cursor * fix: resolve trunk issues for localytics kit Made-with: Cursor * fix: resolve trunk issues for onetrust kit Made-with: Cursor * fix: resolve trunk issues for optimizely kit Made-with: Cursor * fix: resolve trunk issues for radar kit Made-with: Cursor * fix: resolve trunk issues for rokt kit Made-with: Cursor * fix: resolve trunk issues for singular kit Made-with: Cursor
feat: Removing deprecations Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat: copy Braze 39 kit from braze-38 * feat: update Braze 39 SDK to 39.0.0
feat: add Braze SDK 41 kit (braze-41) - Add kits/braze/braze-41 with Braze android-sdk-ui:41.0.0 - Unique SonarQube project key and namespace (appboy41) - Maven artifact: com.mparticle:braze-41 - Include in settings-kits.gradle Made-with: Cursor
feat: add Braze SDK 40 kit (braze-40) - Add kits/braze/braze-40 with Braze android-sdk-ui:40.0.0 - Unique SonarQube project key and namespace (appboy40) - Maven artifact: com.mparticle:braze-40 - Include in settings-kits.gradle Made-with: Cursor Signed-off-by: denischilik <denis.chilik@rokt.com>
…istener cleanup (#693) * Add activeKits() helper and unit test Introduce activeKits() to return non-disabled kit integrations from the providers map. Add KitManagerImplTest.testActiveKitsExcludesDisabled to verify disabled kits are omitted. Made-with: Cursor * Refactor KitManagerImpl user-attribute and identity forwarding Use activeKits() for user attribute and identity paths; inline former setUserAttribute helpers to avoid duplicate isDisabled checks. Flatten syncUserIdentities with early returns and drop redundant null check on identities map. Made-with: Cursor * UserAttributeListener: expose kit identity; use activeKits in onUserAttributesReceived Declare getConfiguration() and getName() on UserAttributeListener so callers can access kit metadata consistently. Route onUserAttributesReceived through activeKits() and align variable naming with other active-kit paths. Made-with: Cursor * Remove FilteredMParticleUser from UserAttributeListener callbacks Drop the user parameter from KitIntegration.UserAttributeListener methods; update KitManagerImpl forwarding, instrumented/unit tests, and kit implementations (Adobe, AppsFlyer, Apptentive, Braze, CleverTap, etc.). Made-with: Cursor * Refactor UserAttributeListener forwarding in KitManagerImpl Add getConfiguration() and getName() to UserAttributeListener so callers can use the listener type without casting. Introduce userAttributeListeners() and iterate with variable name listener; keep activeKits() package-visible for tests. Made-with: Cursor * test(appsflyer): align onConsentStateUpdated calls with UserAttributeListener API Remove third argument and unused FilteredMParticleUser mock setup from unit tests. Made-with: Cursor * Fix DataplanBlockingUserTests onRemoveUserAttribute lambda arity UserAttributeListenerTestKit exposes (String?) -> Unit; a two-parameter lambda failed Kotlin type inference in compileDebugAndroidTestKotlin. Made-with: Cursor * Fix Braze kit tests for two-arg onConsentStateUpdated KitIntegration.UserAttributeListener now passes only old and new ConsentState. Drop the removed FilteredMParticleUser argument and unused mock from AppboyKitTests across braze-38 through braze-41. Made-with: Cursor * Fix GA and GA4 kit tests for two-arg onConsentStateUpdated Align GoogleAnalyticsFirebaseKitTest and GoogleAnalyticsFirebaseGA4KitTest with KitIntegration: drop the removed FilteredMParticleUser argument and unused mock from consent tests. Made-with: Cursor
* ci: generate CHANGELOG on release draft Run ROKT/rokt-workflows generate-changelog after mavenLocal smoke; use default tag-prefix so semver matches VERSION and GitHub release tags. Made-with: Cursor * ci: pin generate-changelog action to commit SHA Semgrep blocks mutable @main and unpinned third-party actions; use ROKT/rokt-workflows@c5c93e9. Made-with: Cursor
* refactor: use activeKits in getRoktKitApi Use activeKits() in getRoktKitApi to centralize filtering of disabled kits and remove duplicated disabled checks. Made-with: Cursor * refactor: use activeKits in setWrapperSdkVersion Use activeKits() in setWrapperSdkVersion to centralize disabled-kit filtering and remove duplicate disabled checks. Made-with: Cursor * refactor: use activeKits in kit event forwarding Apply activeKits() in setLocation, logNetworkPerformance, and logCommerceEvent to centralize disabled-kit filtering and remove duplicated disabled checks. Made-with: Cursor * refactor: use activeKits for push and lifecycle forwarding Apply activeKits() in push callbacks, breadcrumb/error forwarding, and selected activity/session listeners to centralize disabled-kit filtering and remove repeated checks. Made-with: Cursor * refactor: use activeKits for identity and referrer callbacks Apply activeKits() in installReferrerUpdated and identity/consent callback forwarding methods to centralize disabled-kit filtering and remove duplicated checks. Made-with: Cursor * address sonar cube comments
* feat: move Rokt object creation into rokt kit 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. * feat: move Rokt facade and tests into rokt kit 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. * refactor: route Rokt facade calls through resolveRoktKit 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. * refactor: move Rokt request preprocessing into rokt kit helper * refactor: route RoktKit attribute preparation through kit helper * refactor: remove roktKitApi from core kit manager contract * refactor: remove remaining roktKitApi bridge and tests * refactor: move rokt contract types into rokt kit module * refactor: move RoktEvent type into rokt kit module * refactor: move MpRoktEventCallback into rokt kit module * refactor: use native RoktEvent in rokt kit Remove the mParticle RoktEvent wrapper and return native Rokt SDK events directly to simplify the event pipeline and reduce duplicate mapping logic. * refactor: use native unload reasons in rokt callback Remove the mParticle unload reason wrapper and pass Rokt SDK unload reasons through directly to simplify callback handling and eliminate redundant mapping. * refactor: use native rokt callback types Replace MpRoktEventCallback with the native RoktCallback across the rokt kit and tests to remove callback wrappers and simplify callback delegation. * refactor: use native placement options type Replace the local PlacementOptions wrapper with the native Rokt SDK PlacementOptions across the rokt kit and remove the now-redundant conversion layer. * refactor: use native rokt config types Replace mParticle RoktConfig and CacheConfig wrappers with native Rokt SDK config types and remove the now-unnecessary config conversion layer and tests. * refactor: move rokt facade and embedded view types to kits package Relocate Rokt, RoktEmbeddedView, RoktLayoutDimensionCallBack, and RoktTest into com.mparticle.kits to keep kit-owned types co-located and simplify package boundaries. * refactor: replace rokt isEnabled reflection with callback provider 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. * refactor: route Rokt enabled check through kit manager contract 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. * chore: remove unused imports in KitManagerImpl tests Clean up stale imports in KitManagerImplTest so android-kit-base ktlint test source checks pass in CI. * fix: resolve rokt and buildSrc lint and ci compatibility issues Replace replaceFirstChar in buildSrc for older Kotlin compatibility and address rokt ktlint violations by suppressing Java-style accessor naming and wrapping long warning messages. * refactor: tighten Rokt accessor API and restore legacy docs Keep only the no-arg public Rokt accessor with explicit start precondition, restore original public method documentation text, and make prepareAttributesAsync internal per review feedback. * refactor: align MParticleRokt package with kit module path Update MParticleRokt package to com.mparticle.kits so declaration matches the file location and resolves package/path review feedback. * refactor: cache MParticleRokt accessor instance Keep a synchronized singleton Rokt instance in MParticleRokt to avoid repeated allocations while preserving the explicit start precondition.
…#704) * feat: migrate Rokt kit to Rokt SDK 5.x and remove MpRoktEventCallback Bumps com.rokt:roktsdk 4.14.0 → 5.1.0 and adopts the 5.x event-driven API: - Rokt.execute(...) → Rokt.selectPlacements(...) - RoktEvent.id renamed to identifier; SDK-side CartItemInstantPurchase.placementId renamed to identifier - com.rokt.roktsdk.RoktLayout switched to onEvent: (RoktEvent) -> Unit - Drops removed Rokt.RoktCallback / Rokt.RoktInitCallback / Rokt.UnloadReasons and RoktWidgetDimensionCallBack.onMarginChanged Removes the legacy callback surface from the mParticle public API, since 5.x customers consume Rokt.events(identifier): Flow<RoktEvent> instead: - Delete MpRoktEventCallback and UnloadReasons - Drop callbacks param from com.mparticle.Rokt.selectPlacements - Drop mpRoktEventCallback from RoktKitApi, RoktKitApiImpl, KitIntegration.RoktListener, and RoktKit.selectPlacements - Rename RoktKit.runComposableWithCallback to prepareComposableAttributes; RoktLayout composable no longer takes a callback parameter BREAKING CHANGE: MpRoktEventCallback and UnloadReasons are removed and the callbacks parameter has been dropped from Rokt.selectPlacements and the mParticle RoktLayout composable. Use Rokt.events(identifier) to observe placement events as a Flow. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * refactor: align mParticle Rokt API naming with Rokt SDK 5.x Renames public API symbols to match Rokt 5.x's vocabulary: - com.mparticle.RoktEvent.*.placementId → identifier on all event classes (OfferEngagement, PositiveEngagement, FirstPositiveEngagement, PlacementInteractive, PlacementReady, PlacementClosed, PlacementCompleted, PlacementFailure, OpenUrl, CartItemInstantPurchase) - Rokt.purchaseFinalized(placementId, ..., status) → (identifier, ..., success); propagated through RoktKitApi, RoktKitApiImpl, KitIntegration.RoktListener, and RoktKit Rename-only — no behavior change. BREAKING CHANGE: RoktEvent.placementId is renamed to identifier and Rokt.purchaseFinalized parameters renamed from (placementId, status) to (identifier, success). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * refactor: drop dead onMarginChanged from RoktLayoutDimensionCallBack Rokt SDK 5.x removed onMarginChanged from RoktWidgetDimensionCallBack; the kit already dropped its override, but mParticle's mirror interface still forced customers to implement an onMarginChanged that never fires. onHeightChanged remains the only method on RoktLayoutDimensionCallBack and is still the way to observe Widget height changes — 5.x exposes no event-based equivalent. BREAKING CHANGE: RoktLayoutDimensionCallBack.onMarginChanged is removed. Customers implementing this interface should drop the override. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* feat: add customBaseURL CNAME support to NetworkOptions Adds NetworkOptions.Builder.setCustomBaseURL(String) which routes all mParticle endpoint traffic (config, events, identity, alias, audience) through a single HTTPS CNAME host. When set, customBaseURL takes priority over individual domain mappings and rewrites paths to match CDN routing: /config/v4/, /nativeevents/v2/, /identity/v1/, /nativeevents/v1/identity/, /nativeevents/v1/<key>/audience. Also adds R8 keep rules for MParticle$Internal and ConfigManager.getNetworkOptions() so kits can read customBaseURL after minification. The Rokt kit reads NetworkOptions.customBaseURL and forwards it to the Rokt SDK: mparticle-integrations/mparticle-android-integration-rokt#143 Mirrors iOS work from mparticle-apple-sdk#760. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * feat: pass mParticle CNAME through to Rokt SDK When the integrating app sets a custom CNAME on MParticleOptions via NetworkOptions.customBaseURL, forward it to the Rokt SDK so Rokt traffic routes through the same first-party domain. No-op when customBaseURL is unset, empty, or MParticle is uninitialized. Mirrors the iOS Rokt kit behavior added in mparticle-apple-sdk#760. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * fix: persist customBaseURL across NetworkOptions JSON round-trip NetworkOptions.toJson() and withNetworkOptions(String) did not include customBaseURL, so any value was silently dropped when UploadSettings serialized NetworkOptions to the upload database. Events and alias uploads read back NetworkOptions without customBaseURL and routed to the default mParticle endpoints instead of the partner CNAME. Also: - Extract the customBaseURL/DomainMapping host-resolution branch out of getUrl() into a private resolveHost() helper plus a small ResolvedHost value type, lowering getUrl()'s cyclomatic complexity. - Switch java.net.URL / java.net.MalformedURLException to imports. - Add two androidTest cases covering the round-trip. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * Bump Rokt dependency version * fix: only warn on domain-mapping conflict when mapping is non-default NetworkOptionsManager.validateAndResolve auto-populates a default DomainMapping for every endpoint, so the previous check fired the "customBaseURL is set; domain mapping for X is ignored" warning on every getUrl() call for every endpoint — even when the integrator never configured a custom mapping. Compare against the default URL so the warning only fires for genuinely user-configured mappings that conflict with customBaseURL. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* ci(release): support alpha beta and release candidate versions Add qualified release version handling to the draft workflow so alpha, beta, and release candidate versions can be prepared from the selected branch. Publish workflow releases now run from workstation branches and mark qualified versions as GitHub pre-releases instead of latest stable releases. Document the new release flow and record the workflow capability in the changelog. * fix: support older Kotlin in publish helper * ci: use SDK Gradle wrapper for cross-platform tests * ci: patch cross-platform Gradle settings * ci: update cross-platform javadoc patch * ci: align cross-platform Android plugin version * ci: relax cross-platform JVM target validation * ci: patch cross-platform SDK API usage * ci: normalize cross-platform user attribute lists * ci: remove cross-platform compatibility workarounds * ci: use release-prep branch for draft releases
* build(rokt): update Rokt kit dependency stack Align the Rokt kit build with the upcoming Rokt SDK alpha by updating Kotlin, Compose, and coroutine dependencies. Pin the Maven artifact id so the kit continues publishing as android-rokt-kit. #agentic * build(rokt): use Rokt SDK 6.0.0 release candidate Point the Rokt kit at the Maven Central release candidate so the kit can compile and test without relying on unpublished alpha artifacts. #agentic * build(rokt): guard publish metadata for standalone builds Only configure the Rokt kit Maven publish metadata when the mparticleMavenPublish extension is available. This keeps standalone kit builds working while preserving the monorepo publish artifact id. #agentic
* chore: prepare release 6.0.0-rc.1 * build(rokt): update Rokt SDK to 6.0.1-rc.1 --------- Co-authored-by: thomson-t <125323226+thomson-t@users.noreply.github.com> Co-authored-by: Thomson Thomas <thomson.thomas@rokt.com>
Add Kotlin MParticle.rokt access so partners can call Rokt kit APIs from the active mParticle instance again. Forward native Rokt SDK Compose events through the kit RoktLayout wrapper and document the Kotlin and Java entry points.
docs: add v6 Rokt migration notes Document v6 Rokt migration details so integrators can update imports and type usage after moving Rokt APIs into rokt-kit.
* feat(kits): add adjust sample apps and CI example builds Introduce Kotlin/Java sample apps for adjust-5 and wire a CI-only settings file so example modules stay isolated from kit settings and settings-kits.gradle. * ci: pin build-kits workflow actions to commit SHAs Fix semgrep blocking findings for mutable GitHub Actions tag references. * fix(kits): align Gradle project paths with android- kit names Use explicit android- prefixed includes and projectDir mappings so kit examples, dependencies, and CI matrix tasks resolve the same modules. * revert: restore settings-kits.gradle rename pattern Keep kit registration unchanged and rely on the existing android- rename so example modules and CI matrix paths continue to resolve correctly. * chore(kits): remove Adjust Java sample app Keep only the Kotlin example and drop Java example wiring from CI matrix and kit example settings.
* feat(kits): add Kotlin sample apps for all integrated kits Replicate the Adjust example-app pattern across every kit in settings-kits.gradle, wire them in settings-kit-examples.gradle and kits/matrix.json, and add a generator script. Skip CI example builds for kits that need custom Maven repos or AGP 8.6+. * fix(kits): enable vendor Maven repos in sample app builds Add kit-specific repositories and multidex to example apps that need vendor Maven resolution, and drop skip_example_builds for those kits.
* feat: pin kit SDK dependencies to current supported ranges * refactor(adobemedia): rename kit to adobemedia-3 and lock to Adobe SDK BOM Adobe's Experience Platform SDK is at major 3.x, so the kit directory now follows the wrapped-SDK-major convention (adobemedia-5 -> adobemedia-3). Replace the mixed per-artifact pins with the Adobe sdk-bom. The legacy sdk-core (deprecated 2024-06-30) and mobileservices (unsupported on Android) artifacts are dropped; modern `core` now arrives via the BOM. The BOM range [3.0.0,4.0.0) auto-tracks the latest 3.x minor/patch, the Gradle equivalent of iOS SPM .upToNextMajor(from: "3.0.0"). Updated matrix.json, settings-kits.gradle, settings-kit-examples.gradle, the example module project ref, and the README install line. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * refactor(adobe): rename adobe-5 to adobe (no SDK, S2S only) and drop adobemedia BOM comments The adobe kit is a server-to-server integration with no Adobe SDK dependency (no com.adobe.* imports), so the wrapped-SDK-major suffix does not apply — renamed adobe-5 -> adobe, matching the no-number convention used by onetrust and rokt. Updated matrix.json, settings-kits.gradle, settings-kit-examples.gradle, and the example module project ref. The published artifact version (android-adobe-kit:5+) is unchanged, consistent with other no-number kits. Also removed the explanatory comments from the adobemedia-3 BOM block. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
The kit directory suffix N encodes the wrapped vendor SDK's intended major version, but braze/braze-38 pinned com.braze:android-sdk-ui:[37.0.0,38.0.0) (major 37). Bumped to [38.0.0,39.0.0) to match the braze-38 directory; siblings braze-39/40/41 already align and there is no braze-37 directory. The GA kit (ga-23/ga4-23) major-23 alignment is deferred to a separate PR that also bumps the repo Kotlin toolchain, because firebase-analytics 23.x ships Kotlin 2.1/2.2 metadata that the current Kotlin 2.0.20 compiler cannot read. Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
* feat: Upgrade Kotlin to 2.1.20 across core SDK and kits * fix: construct kit test config JSON explicitly for Kotlin 2.1 overload resolution
…731) * fix: align GA kits with directory major 23 and bump Kotlin to read 23.x metadata The ga-23 and ga4-23 directories encode wrapped firebase-analytics major 23, but both pinned firebase-analytics:[22.1.0,23.0.0) (major 22). Bumped the firebase-analytics and lockstep play-services-measurement-api ranges to [23.0.0,24.0.0). firebase-analytics 23.x ships Kotlin 2.1/2.2 metadata (23.0.0 -> 2.1.0, 23.2.0 -> 2.2.0), which the kits' Kotlin 2.0.20 compiler cannot read, so the range bump alone fails compileReleaseKotlin. Bumped these two kits' ext.kotlin_version to 2.2.20, matching the existing per-kit override pattern already used by urbanairship-20 (2.2.20) and rokt (2.1.20). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * ci: build ga-23/ga4-23 as isolated kits (Kotlin 2.2.x) firebase-analytics 23.x ships Kotlin 2.1/2.2 metadata that the repo's root Kotlin Gradle plugin (2.0.20) cannot read, so the GA kits cannot compile in the aggregate settings-kits.gradle build. Per-kit ext.kotlin_version has no effect there because the aggregate compiler is fixed by the root buildscript. Follow the established urbanairship-20 isolated-kit pattern so the GA kits are built standalone with their own Kotlin 2.2.20: - Remove ga-23/ga4-23 from kits/matrix.json (no aggregate build-kits jobs). - Comment them out of settings-kits.gradle and remove their example modules from settings-kit-examples.gradle. - Add isolated compatibility (pull-request.yml) and lint/ktlint/test (daily.yml) steps that run `-p kits/ga/ga-23` / `-p kits/ga4/ga4-23`. - Document both kits under "Currently isolated" in ONBOARDING.md. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> --------- Signed-off-by: Nickolas Dimitrakas <nickolas.dimitrakas@rokt.com> Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
…729) The braze-38/39/40/41 example apps set applicationId to "com.mparticle.com.mparticle.kits.braze.example" (duplicated prefix) while the manifest package and the MPReceiver FCM intent-filter category are "com.mparticle.kits.braze.example". Since the effective package equals the applicationId, the push category no longer matched, so push registration and receipt in the sample apps could fail. Align the applicationId with the package and category across all four tracks. Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
* chore: Update submodules * chore: 5.78.3 (release) ## [5.78.3](v5.78.2...v5.78.3) (2026-03-11) ### Updates & Maintenance * bump actions/upload-artifact from 6 to 7 ([#649](#649)) ([0a188b1](0a188b1)) * Update submodules ([cbb17d7](cbb17d7)) * chore: Update submodules * chore: 5.78.4 (release) ## [5.78.4](v5.78.3...v5.78.4) (2026-03-23) ### Updates & Maintenance * Update submodules ([08dab75](08dab75)) * chore: Update submodules * chore: 5.78.5 (release) ## [5.78.5](v5.78.4...v5.78.5) (2026-03-25) ### Updates & Maintenance * Update submodules ([86d8d97](86d8d97)) * fix: increase MPLatch timeout from 5s to 30s (#695) * fix: increase MPLatch timeout from 5s to 30s The 5-second timeout is too short for WebView JS bridge tests running on newer GitHub Actions runner images (ubuntu24/20260309.50+). The MParticleJSInterfaceITest tests consistently fail because JS execution in the emulator WebView doesn't complete within 5 seconds on these environments. Increasing to 30 seconds provides sufficient margin while still catching genuine hangs via the workflow-level timeout-minutes: 15. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * fix: use explicit 30s timeout in JS bridge tests only Instead of increasing the global MPLatch timeout (used by 20+ test files), use an explicit 30-second await in MParticleJSInterfaceITest only. WebView JS execution needs more time on newer CI runner images, but other tests don't need the longer timeout. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * feat: Add max persistence age override option [TRIAGE-608] (#699) * TRIAGE-608: Add max persistence age override option * TRIAGE-608: Update throttl ts on success + tests * TRIAGE-608: Make properties @VisibleForTesting * TRIAGE-608: Fix retry-on-failure throttle logic * feat: add customBaseURL CNAME support to NetworkOptions (#701) * feat: add customBaseURL CNAME support to NetworkOptions Adds NetworkOptions.Builder.setCustomBaseURL(String) which routes all mParticle endpoint traffic (config, events, identity, alias, audience) through a single HTTPS CNAME host. When set, customBaseURL takes priority over individual domain mappings and rewrites paths to match CDN routing: /config/v4/, /nativeevents/v2/, /identity/v1/, /nativeevents/v1/identity/, /nativeevents/v1/<key>/audience. Also adds R8 keep rules for MParticle$Internal and ConfigManager.getNetworkOptions() so kits can read customBaseURL after minification. The Rokt kit reads NetworkOptions.customBaseURL and forwards it to the Rokt SDK: mparticle-integrations/mparticle-android-integration-rokt#143 Mirrors iOS work from mparticle-apple-sdk#760. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * fix: persist customBaseURL across NetworkOptions JSON round-trip NetworkOptions.toJson() and withNetworkOptions(String) did not include customBaseURL, so any value was silently dropped when UploadSettings serialized NetworkOptions to the upload database. Events and alias uploads read back NetworkOptions without customBaseURL and routed to the default mParticle endpoints instead of the partner CNAME. Also: - Extract the customBaseURL/DomainMapping host-resolution branch out of getUrl() into a private resolveHost() helper plus a small ResolvedHost value type, lowering getUrl()'s cyclomatic complexity. - Switch java.net.URL / java.net.MalformedURLException to imports. - Add two androidTest cases covering the round-trip. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * test(android-core): cover custom base URL upload storage --------- Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com> Co-authored-by: Thomson Thomas <thomson.thomas@rokt.com> * chore: Update submodules * chore: 5.79.0 (release) ## [5.79.0](v5.78.5...v5.79.0) (2026-05-14) ### Features * add customBaseURL CNAME support to NetworkOptions ([#701](#701)) ([5285149](5285149)), closes [mparticle-apple-sdk#760](mParticle/mparticle-apple-sdk#760) * Add max persistence age override option [TRIAGE-608] ([#699](#699)) ([ca88322](ca88322)) ### Bug Fixes * increase MPLatch timeout from 5s to 30s ([#695](#695)) ([20f723f](20f723f)) ### Updates & Maintenance * Update submodules ([59a4a9a](59a4a9a)) * chore: bump trunk-io/trunk-action from 1.2.4 to 1.3.1 (#705) Bumps [trunk-io/trunk-action](https://github.com/trunk-io/trunk-action) from 1.2.4 to 1.3.1. - [Release notes](https://github.com/trunk-io/trunk-action/releases) - [Commits](trunk-io/trunk-action@75699af...04ba50e) --- updated-dependencies: - dependency-name: trunk-io/trunk-action dependency-version: 1.3.1 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Handle legacy persisted domain mappings safely (#703) Co-authored-by: James Newman <james.newman@rokt.com> * fix(ci): pin isolated-kit gradle version to prevent 6.0.0-rc.1 pull (#714) The isolated urbanairship-kit lint/test steps in daily.yml and the kit-compatibility test in pull-request.yml run `./gradlew` from inside the kit dir without `-Pversion=...`. The kit's standalone build.gradle defaults `project.version = '+'`, so its `com.mparticle:android-kit-plugin` dependency resolves to the highest version on Maven Central — now `6.0.0-rc.1` (published 2026-05-22), which renamed/removed kit-base symbols and broke the kit's compile. Mirror the pattern already used in the Sonatype Release job: extract the SDK version via `./gradlew -q properties` and pass it as `-Pversion=...` to every standalone kit invocation, so it resolves the freshly-published mavenLocal artifact instead of the RC. Affected steps: - lint-checks → Run Isolated Kit Lint (urbanairship-kit) - kotlin-lint-checks → Run Isolated Kit Kotlin Lint (urbanairship-kit) - update-kits → Test Isolated Kits (urbanairship-kit) - kit-compatibility-test → Run Isolated Kit Compatibility Tests (urbanairship-kit) The companion defensive fix in mparticle-android-integration-urbanairship pins the kit's standalone `project.version` to `[5.0,6.0)`. Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * chore: Update submodules * chore: 5.79.1 (release) ## [5.79.1](v5.79.0...v5.79.1) (2026-05-27) ### Bug Fixes * **ci:** pin isolated-kit gradle version to prevent 6.0.0-rc.1 pull ([#714](#714)) ([eff10ea](eff10ea)) ### Updates & Maintenance * bump trunk-io/trunk-action from 1.2.4 to 1.3.1 ([#705](#705)) ([f4ceca7](f4ceca7)) * Update submodules ([e435979](e435979)) * ci: remove cross-platform-tests and semantic PR/branch checks (#712) These checks have been failing on nearly every recent PR. The cross-platform tests are known broken, and the semantic PR title / branch name checks are no longer enforced. Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * chore: bump actions/checkout from 6.0.2 to 6.0.3 (#720) Bumps [actions/checkout](https://github.com/actions/checkout) from 6.0.2 to 6.0.3. - [Release notes](https://github.com/actions/checkout/releases) - [Commits](actions/checkout@v6.0.2...v6.0.3) --- updated-dependencies: - dependency-name: actions/checkout dependency-version: 6.0.3 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * chore: Update submodules * chore: 5.79.2 (release) ## [5.79.2](v5.79.1...v5.79.2) (2026-06-22) ### Updates & Maintenance * bump actions/checkout from 6.0.2 to 6.0.3 ([#720](#720)) ([d904edb](d904edb)) * remove cross-platform-tests and semantic PR/branch checks ([#712](#712)) ([6cdacf2](6cdacf2)) * Update submodules ([976dd0d](976dd0d)) * feat: add device-based consent to override MPID-scoped consent (#726) Enables Inspire-style flows where consent is collected before MPID changes at checkout, so kit forwarding rules and uploads keep the correct consent state. * chore: 5.80.0 (release) ## [5.80.0](v5.79.2...v5.80.0) (2026-06-25) ### Features * add device-based consent to override MPID-scoped consent ([#726](#726)) ([e92d352](e92d352)) * chore: normalize CHANGELOG list markers after merge * ci: pin actions/checkout to commit SHA to satisfy security lint * docs: remove duplicate Unreleased changelog section --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: mparticle-automation <developers@mparticle.com> Co-authored-by: Robert Ing <ring@mparticle.com> Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com> Co-authored-by: junias-rokt <junias.ngoyi@rokt.com> Co-authored-by: James Newman <james.newman@rokt.com> Co-authored-by: Thomson Thomas <thomson.thomas@rokt.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: ankitsingh08 <ankit.tomar08@gmail.com>
feat(rokt): add Shoppable Ads support Add Rokt kit facade APIs for payment extension registration and Shoppable Ads selection so host apps can wire optional payment providers through mParticle. Forward Shoppable Ads requests through the existing identity confirmation and attribute enrichment pipeline, pass dashboard stripePublishableKey into the Rokt SDK registration config, and cover the behavior with kit and facade tests.
docs: address 6.0 merge review comments (README version, checkout pin comment)
Introduce a single Android dependency that bundles the mParticle core SDK, the mParticle Rokt kit, and the Rokt Payment Extension (Shoppable Ads), mirroring the iOS RoktSDKPlus umbrella. Partners adopting Shoppable Ads can depend on one artifact instead of wiring up core + kit + payment extension by hand. - New rokt-sdk-plus module: thin com.android.library (empty AAR) that api-aggregates android-core, android-rokt-kit, and com.rokt:payment-extension, plus a RoktSdkPlus version constant. The mParticle Rokt kit deliberately omits the payment extension; this umbrella is what adds it on top. - Published as com.rokt:rokt-sdk-plus via an isolated settings-rokt-sdk-plus.gradle so it builds/publishes in its own Gradle invocation with Rokt Maven Central credentials. - Centralize the Rokt SDK / payment extension versions in gradle.properties (roktSdkVersion, roktPaymentExtensionVersion); the Rokt kit now reads roktSdkVersion. - Extend the publish convention plugin with optional POM url/license overrides (backward-compatible) so the com.rokt artifact carries Rokt branding. - release-publish.yml: publish the Rokt kit to mavenLocal so the umbrella resolves its mParticle deps locally (avoiding Maven Central propagation races), then publish the umbrella to Central with the Rokt credentials. The umbrella version tracks the mParticle SDK line; the bundled Rokt artifacts ride their own line. Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* feat: extend Rokt kit Kotlin example for joint SDK testing * fix: use NoActionBar theme and inset-aware layout in Rokt kit example * feat: add runtime credential switching and bottom sheet button to Rokt kit example * feat: build Rokt kit example against rokt-sdk-plus umbrella Depend on the single com.rokt:rokt-sdk-plus umbrella instead of wiring android-core + android-rokt-kit by hand. Bump AGP to 8.9.1 and compileSdk to 36 (required by the payment-extension Compose deps the umbrella pulls in), and pin the mParticle chain to the umbrella version so the kit's dynamic android-kit-base version resolves from Maven Local.
PR SummaryHigh Risk Overview Repository & kits: Removes git submodules ( CI & release: Replaces the old SDK 6.0 breaking changes (core): Drops deprecated APIs ( Build/publish: Core and kit-base use Reviewed by Cursor Bugbot for commit d0592ba. Bugbot is set up for automated code reviews on this repo. Configure here. |
Summary
Brings the 6.0 release line (
workstation/6.0-Release) intomain. The resulting tree is set to matchworkstation/6.0-Releaseexactly, while retainingmainas a merge parent so this stays cleanly mergeable.Why so many changes / context
PR #734 ("merge main into workstation/6.0-Release") was a squash merge, so git never recorded
mainas an ancestor ofworkstation/6.0-Release. As a result the common merge-base is still very old and a plain merge re-surfaces the entire 6.0 divergence (kit restructure submodule→inline, workflow rework, etc.) as conflicts — even though that content is already reconciled.Rather than re-resolving ~45 phantom conflicts, the merge tree was set to exactly
workstation/6.0-Release. Verified:git diff HEAD origin/workstation/6.0-Releaseis empty, andorigin/mainis an ancestor of the merge commit.What this adopts from 6.0
kits/<name>/(oldkits/<name>-kitgit submodules and.gitmodulesremoved).release-draft.yml/release-publish.yml) replacingrelease.yml; addsbuild-kits.ymlandinstrumented-tests.yml.persistenceMaxAgeSeconds(feat: Add max persistence age override option [TRIAGE-608] #699), legacy domain mappings (Handle legacy persisted domain mappings safely #703).Follow-up (separate PR)
mainchange not present in 6.0. It lives in the pre-restructure kit and will be ported intokits/rokt/rokt/.../RoktKitRequestHelper.ktin a separate PR againstworkstation/6.0-Release.Test plan
git diffempty)