Repository navigation
Bump Android SDK to 2.8.7 - #16
Closed
github-actions[bot] wants to merge 1 commit into
Closed
github-actions[bot] wants to merge 1 commit into
github-actions[bot] wants to merge 1 commit into
Conversation
Author
|
The integration agent failed (run). This PR only contains the version bump — check the release notes above for public API changes by hand before merging. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Bumps the Android SDK from
2.7.23to2.8.7. The package version is unchanged; the note is under[Unreleased].Opened automatically by
native-sdk-bump.ymlafter superwall/Superwall-Android 2.8.7 was released. An agent then checks the release notes below for public API changes and pushes any integration work onto this PR.Android release notes (2.7.23 → 2.8.7)
2.8.7
Fixes
2.8.6
Enhancements
PaywallOptions.presentationHost. Set it toPresentationHost.IN_WINDOWto show paywalls as an overlay in the presenting activity's own window instead of launchingSuperwallPaywallActivity. Fullscreen, Drawer, Modal, Popup and Push styles, back handling, surveys, trial reminder notifications, permission requests and web checkout all work in this mode. It is meant for hosts that stop running while another activity covers them, such as Unity games, where a purchase controller written in the game's code could otherwise never answer. The default staysPresentationHost.ACTIVITY.2.8.5
Enhancements
Superwall.instance.presentCustomerCenter(), dismiss it withSuperwall.instance.dismissCustomerCenter(), and configure it withSuperwallOptions.customerCenter.CustomerCenterDelegateand thecustomerCenter_open,customerCenter_close,customerCenter_action,customerCenter_surveyResponseandcustomerCenter_refundRequestevents.Fixes
AutomaticPurchaseControllernow acknowledges any unacknowledged purchase whenever it syncs the subscription status, including on launch, and retries acknowledgements that fail.register()never calling its handler, and every later placement stalling behind it, when a Google Play product query at launch was dropped. A request that found the billing client disconnected between being queued and running was discarded without a callback, leaving its products loading forever. Such requests are now re-queued until the client reconnects, a product query that Google Play never answers times out after 15 seconds, a disconnect with queued requests reconnects, and a secondstartConnectionis no longer issued while one is in flight.paywalls.timeoutAfterpassed, is now dismissed as declined with thewebViewFailedToLoadclose reason, matching iOS. The register handler getsonDismissand then the feature block for a non-gated placement, oronErrorfor a gated one. Previously the paywall stayed on screen, and withtimeoutAfterset the handler receivedonPresentfollowed by a bareonErrorwhile the paywall was still showing. A paywall that fails to load off-screen, for example during preload, reloads the next time it is presented.2.8.4
Fixes
presentation_idchanging mid-presentation whengetPaywall()is called for a paywall that is already on screen. The id now rotates when a cached paywall is presented again, so every event between onepaywall_openand the next carries the same id.freeTrial_startmessage for every started trial, even when it has no trial reminders configured.2.8.3
Fixes
didRedeemLink, tracksfreeTrial_startonce per code, and schedules the active paywall's trial reminders from the checkout timestamp. Notification permission waits no longer block access or drop a late grant; ambiguous or already-elapsed reminders are skipped.paywall_opennow waits for an in-flighttemplate_variablessend, so the runtime does not treat a late template payload as a fresh load and drop laterpage_views."null", so a filter checking whether a field is null never matched.2.8.2
Enhancements
app_launch,session_start) no longer occupy the presentation queue ahead ofregister()calls while waiting for entitlements.Fixes
paywall_resourceLoad_failevents now report the failing resource's URL.SuperwallDelegate.handleLogimplementation that throws no longer propagates the exception into whatever SDK code produced the log.Potentially Breaking Changes
SuperwallDelegate.handleLogis now always called on a background thread. It could previously be called on any thread, including main, so implementations that touch UI directly must now dispatch to the main thread themselves.2.8.1
Fixes
paywall_open,paywall_page_view,paywall_close, etc.) now include apresentation_id, a unique identifier minted for each paywall presentation. Adds the previously-missingclose_reason,cache_key, andbuild_idfields to these events, matching the data already sent by the iOS SDK.2.8.0
Enhancements
PurchaseController, bypassing Google Play Billing entirely — checkproduct.isCustomProductto fulfill them via your own payment flow, and grant their entitlements withSuperwall.instance.setSubscriptionStatus(...)on success. Requires configuring the SDK with aPurchaseController.PurchaseController.purchase(activity, product: StoreProduct, basePlanId, offerId)method that handles both Google Play and custom store products. For Play products, the underlyingProductDetailsare available viaproduct.rawStoreProduct.transaction_start/transaction_complete,subscriptionStart/freeTrialStart) with an SDK-generated transaction identifier exposed asStoreProduct.customTransactionId, and free-trial eligibility for custom products is derived from the customer's entitlement history.ApiStoreProduct, a product backed by Superwall API data, used for custom store products.Breaking Changes
System back presses are now forwarded into the paywall as a
back_button_inputmessage instead of dismissing it directly: multi-page flows navigate back one page, and paywalls with nowhere to go back (root page, single page) close themselves through the standard manual-close path (Declined/ManualClose) — so single-page paywalls dismiss the same as before, from the app's perspective. Whenreroute_back_buttonis enabled in Paywall settings, thePaywallOptions.onBackPressedapp callback keeps first refusal before the press is forwarded. Paywalls built on runtimes that predateback_button_inputwill ignore the press; this means that previously existing Multi-page paywalls, if republished, will now navigate back inside the paywall once republished.Removes the deprecated
SuperwallBillingFlowParams.Builder.setSkuDetails(SkuDetails). Billing Library 9 removesSkuDetailsentirely, so this method can no longer exist. UsesetProductDetailsParamsList(...)withProductDetailsinstead.Removes the unused internal
com.superwall.sdk.billing.SWProduct, which wrapped the now-removedSkuDetails.Internal purchase-history queries now resolve current purchases via
QueryPurchasesParams— Billing Library 9 removes the purchase-history APIs (queryPurchaseHistoryAsync,QueryPurchaseHistoryParams).Impact: if your app still calls the removed Billing Library APIs (
SkuDetails,SkuDetailsParams,querySkuDetailsAsync,queryPurchaseHistoryAsync,BillingClient.SkuType, or the no-argenablePendingPurchases()), it will no longer compile once it picks up Billing 9 through this SDK. Migrate those call sites to theProductDetailsAPIs before upgrading; the migration guide has a mapping of every removed API to its replacement.Please test your billing and purchasing flows before shipping this upgrade. Because the Billing Library is resolved to a single version across your app, upgrading Superwall also upgrades Billing for everything else that depends on it. If you use Google Play Billing directly, or another subscription provider such as RevenueCat, Adapty or Purchasely, make sure that provider's SDK supports Billing 9 and run through purchase, restore and subscription-status flows end to end.
If you use other subscription management libraries (RC, Purchasely, Adapty) and they do not support Play Billing 9: you can pin the Billing Client version to 8 in the following way.
Add this to your app module's
build.gradle.kts, outside theandroid { }block:configurations.all { resolutionStrategy.force("com.android.billingclient:billing:8.3.0") }Or in Groovy (
build.gradle):You can confirm which version you end up with via
./gradlew :app:dependencies --configuration releaseRuntimeClasspath— look forcom.android.billingclient:billing:9.1.0 -> 8.3.0. Billing 8 still satisfies Google's August 31, 2026 requirement, so this is a safe interim state, and no Superwall functionality is lost: the SDK works on both 8.x and 9.x.Note that a
-dontwarn com.android.billingclient.api.QueryPurchaseHistoryParamsProGuard rule is not a fix. It silences the R8 error and lets the build through, but then throws at runtime.Google Play Billing Library 9 requires Android 6.0 (API 23), so the SDK's
minSdkis now 23 (previously 21). If your app'sminSdkis below 23, you'll need to raise it to pick up this release — devices on Android 5.x will no longer receive app updates that include this SDK version.Deprecations
PurchaseController.purchase(activity, productDetails, basePlanId, offerId)in favor of theStoreProduct-based method above. Existing implementations keep working unchanged — the new method's default implementation routes Google Play purchases to the deprecated one — but purchasing custom store products requires implementing the new method.