Skip to content

chore: merge workstation/6.0-Release into main#737

Merged
denischilik merged 62 commits into
mainfrom
chore/merge-6.0-release-into-main
Jul 21, 2026
Merged

chore: merge workstation/6.0-Release into main#737
denischilik merged 62 commits into
mainfrom
chore/merge-6.0-release-into-main

Conversation

@denischilik

@denischilik denischilik commented Jul 21, 2026

Copy link
Copy Markdown
Contributor

Summary

Brings the 6.0 release line (workstation/6.0-Release) into main. The resulting tree is set to match workstation/6.0-Release exactly, while retaining main as 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 main as an ancestor of workstation/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-Release is empty, and origin/main is an ancestor of the merge commit.

What this adopts from 6.0

Follow-up (separate PR)

Test plan

placement-bottomsheet-redacted placement-embedded-redacted placement-overlay-redacted

denischilik and others added 30 commits March 6, 2026 10:45
* 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>
denischilik and others added 24 commits April 13, 2026 13:17
…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.
@denischilik
denischilik requested a review from a team as a code owner July 21, 2026 15:59
@cursor

cursor Bot commented Jul 21, 2026

Copy link
Copy Markdown

PR Summary

High Risk
Major-version merge with widespread breaking public API removals, Rokt relocation, and automated Maven Central publishing—high impact for integrators and release correctness.

Overview
Merges the 6.0 release tree into main, aligning main with the monorepo layout and release model used on workstation/6.0-Release (version 6.0.0-rc.1 in VERSION).

Repository & kits: Removes git submodules (.gitmodules deleted) and vendors integration kits under kits/<vendor>/…, driven by kits/matrix.json. CI adds build-kits.yml to matrix-test kits and example apps against core published to Maven Local (-Pmparticle.kit.mparticleFromMavenLocalOnly=true). Isolated kits (e.g. urbanairship-20, ga-23, ga4-23) are exercised via explicit Gradle -p paths instead of old *-kit submodule dirs.

CI & release: Replaces the old release.yml semantic-release flow with release-draft.yml (bump VERSION, changelog PR) and release-publish.yml (publish core + kits—and rokt-sdk-plus—to Maven Central on VERSION changes). PR/daily workflows drop submodule checkout, pin actions/checkout, split instrumented tests into reusable instrumented-tests.yml (core, sharded kit-base, testutils, orchestrator), and wire build-kits into PR gates.

SDK 6.0 breaking changes (core): Drops deprecated APIs (UserAttributeListener, UserAliasHandler, inverted androidIdDisabled, isProviderActive / isAutoTrackingEnabled, MPEvent info helpers, legacy consent builder names). Rokt is removed from android-core (MParticle.Rokt(), RoktKitApi, wrapper types); apps use com.mparticle.kits / native Rokt SDK types per MIGRATING.md. Kit-base tests and kit listener contracts shift toward ModifyIdentityListener / typed user-attribute callbacks without getAllUserAttributes-style kit APIs.

Build/publish: Core and kit-base use mparticle.android.library.publish instead of shared scripts/maven.gradle; networking tweaks ignore per-endpoint domain mappings when customBaseURL is set.

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

@denischilik
denischilik merged commit e6b127b into main Jul 21, 2026
41 of 42 checks passed
@denischilik
denischilik deleted the chore/merge-6.0-release-into-main branch July 21, 2026 17:44
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.

6 participants