6.0.0-rc.3
Warning
v6 is currently in a release-candidate phase — use 6.0.0-rc.3, not 6.0.0. 6.0.0-rc.3 is the official build to integrate against for early integration and testing while v6 stabilizes. Use it to validate your migration and report any issues; the stable 6.0.0 will be announced once the RC cycle completes.
implementation("io.purchasely:core:6.0.0-rc.3")
implementation("io.purchasely:google-play:6.0.0-rc.3")
// implementation("io.purchasely:player:6.0.0-rc.3") // optionalPurchasely Android SDK 6.0.0-rc.3
The third release candidate of the v6 major version. It builds on 6.0.0-rc.2 with bug fixes, API refinements, and a toolchain bump. The full set of v6 breaking changes is documented in the migration guide; the sections below cover only what changed since rc.2.
⚠️ Breaking Changes (since rc.2)
interceptAction<T>/removeActionInterceptor<T>are now members ofPurchasely, not top-level extension functions. If an earlier6.0.0-rcbuild had you add an explicit import for the reified Kotlin overloads, delete it — the member call now resolves from thePurchaselyimport you already have. No call-site change is needed.- import io.purchasely.ext.interceptAction // remove - import io.purchasely.ext.removeActionInterceptor // remove Purchasely.interceptAction<PLYPresentationAction.Purchase> { info, purchase -> … } // unchanged
Purchasely.displaySubscriptionCancellationInstruction(activity, themeId)removed. This helper dialog is dropped as part of aligning the Android public surface with iOS. Route users to the store's native manage-subscription screen instead (e.g. Google Play's Manage subscriptions).
✨ Highlights & Fixes
- Observer-mode auto-sync on interceptor
SUCCESS— in Observer mode, the SDK now callssynchronize()automatically after a paywall Purchase or Restore action that your interceptor handled and reported asSUCCESS, matching iOS. Previously the transaction was never reported unless you calledsynchronize()yourself, corrupting analytics and subscription state. Remove any manualsynchronize()you added inside the interceptor — it would now double-sync. (MOB-260) open_presentationno longer drops your dismiss callback — when a paywall action navigates to another presentation that has no callback of its own, the originalonDismissed/ close callback is now preserved instead of being overwritten by a no-op, so a latercloseAllScreens()correctly reaches your handler. The secondary screen also reaches a terminalDismissedstate so observers no longer block indefinitely.- Bottom safe area is opt-in again and no longer doubled — the navigation-bar safe area is now driven per component by
safe_area_bottom(symmetric withsafe_area_top). A previously unconditional inset stacked with the per-component one, doubling the CTA-to-bottom gap — large on 3-button-navigation devices, small on gesture-navigation ones. Layouts that need bottom spacing must setsafe_area_bottomon their bottom container, as they already do forsafe_area_top. - Kotlin interceptor without coroutines — a new
Class-based overload lets Kotlin callers register an interceptor without asuspendlambda, returning the outcome via aresult(…)callback:Purchasely.interceptAction(PLYPresentationAction.Purchase::class.java) { info, action, result -> … }. The reified coroutine form and the Java overload are unchanged. - Translations — corrected the Indonesian locale (
id→in, the JVM's legacy code) and added the missing web-checkout strings across languages.
📦 Publishing & Artifacts
- Fat-AAR now declares its external dependencies — the published
:corePOM and Gradle module metadata now correctly listkotlinx-serialization-jsonandandroidx.core:core-ktx, which were previously stripped along with the internal modules merged into the AAR. Consumers no longer risk missing these transitive dependencies. - Javadoc jar populated again — the published
-javadoc.jarwas effectively empty in rc.2; it now ships the full Dokka output, so IDE documentation resolves against the artifact.
🛠 Build Requirements
- compileSdk
36(Android 16) — up from 35.targetSdkstays 35, so there is no runtime behavior change. - Kotlin
2.3.21toolchain — up from 2.2.x, picked up via AGP 9's built-in Kotlin. The published modules still pinlanguageVersionto 2.0, so consuming apps only need Kotlin 2.0+ — no consumer change required. - Bundled bumps: kotlinx-coroutines
1.11.0, kotlinx-serialization1.11.0, Dokka2.2.0, Gradle wrapper9.6.1. - Unchanged from rc.2: Java target 11, minimum Gradle 9.3.0.