Skip to content

6.0.0-rc.3

Choose a tag to compare

@chouaibMo chouaibMo released this 08 Jul 17:01
· 4 commits to master since this release

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") // optional

Purchasely 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 of Purchasely, not top-level extension functions. If an earlier 6.0.0-rc build had you add an explicit import for the reified Kotlin overloads, delete it — the member call now resolves from the Purchasely import 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 calls synchronize() automatically after a paywall Purchase or Restore action that your interceptor handled and reported as SUCCESS, matching iOS. Previously the transaction was never reported unless you called synchronize() yourself, corrupting analytics and subscription state. Remove any manual synchronize() you added inside the interceptor — it would now double-sync. (MOB-260)
  • open_presentation no longer drops your dismiss callback — when a paywall action navigates to another presentation that has no callback of its own, the original onDismissed / close callback is now preserved instead of being overwritten by a no-op, so a later closeAllScreens() correctly reaches your handler. The secondary screen also reaches a terminal Dismissed state 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 with safe_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 set safe_area_bottom on their bottom container, as they already do for safe_area_top.
  • Kotlin interceptor without coroutines — a new Class-based overload lets Kotlin callers register an interceptor without a suspend lambda, returning the outcome via a result(…) 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 :core POM and Gradle module metadata now correctly list kotlinx-serialization-json and androidx.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.jar was 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. targetSdk stays 35, so there is no runtime behavior change.
  • Kotlin 2.3.21 toolchain — up from 2.2.x, picked up via AGP 9's built-in Kotlin. The published modules still pin languageVersion to 2.0, so consuming apps only need Kotlin 2.0+ — no consumer change required.
  • Bundled bumps: kotlinx-coroutines 1.11.0, kotlinx-serialization 1.11.0, Dokka 2.2.0, Gradle wrapper 9.6.1.
  • Unchanged from rc.2: Java target 11, minimum Gradle 9.3.0.