# Changelog

Release notes for the Superwall Android SDK

2.7.15 [#2715]

Enhancements [#enhancements]

* Improves preloading logic to reduce number of preloaded paywalls for certain campaign types
* Improve display of periodic price in some cases

Fixes [#fixes]

* Fix dropping delegate events when an error occurs
* Fix overenthusiastic delivery of `subscriptionStatus_didChange` events on minor changes

2.7.14 [#2714]

Fixes [#fixes-1]

* Fixes test mode products not being loaded properly in PW
* Improve exponential backoff retry for Play Service unavailable
* Fix Custom Info date serialization issues

2.7.13 [#2713]

Fixes [#fixes-2]

* Fix `device.appVersionPadded` and `device.sdkVersionPadded` emitting non-ASCII digits on devices whose default locale uses a non-Latin numbering system (e.g. `ar-EG`, `fa-IR`, `bn-BD`), which caused audience-rule version comparisons to misbucket affected users.
* Ensures timeout applies to HttpUrlConnection for enrichment and subscription API's
* Remove unnecessary sync access causing ANR lock in React Native

2.7.12 [#2712]

Enhancements [#enhancements-1]

* Add customer info to paywall info and tracked events
* Add stripe/paddle intro offer eligibility

Fixes [#fixes-3]

* Fix dismiss animation for bottom sheets and modals on newer Samsung devices

2.7.11 [#2711]

Enhancements [#enhancements-2]

* Improved startup performance and reduced blockage of caller threads
* Add `PaywallOptions.preloadDeviceOverrides` - this allows you to override `shouldPreload` for different device tiers, i.e. disable it for low-end devices. For more details, see KDoc.

Fixes [#fixes-4]

* Reduce CookieManager ANR potential
* Fix concurrency issues with double onFinished calls being invoked

2.7.10 [#2710]

Potentially impactful changes [#potentially-impactful-changes]

* Billing errors on register are now wrapped in `SubscriptionStatusTimeout` errors
* This is used to clarify that the status is timing out due to billing errors. If you are depending on the `NoPaywallView` to distinguish between these, ensure you are checking for the proper status.

Enhancements [#enhancements-3]

* Adds onboarding analytics
* Adds prioritized preloading support
* Improved error handling

Fixes [#fixes-5]

* Prevents paywalls from dismissing on return from deep link
* Fixes deadlock in `SerialTaskManager`
* Fix issues with bottom sheet on certain Samsung devices

2.7.9 [#279]

Fixes [#fixes-6]

* Fix review dialog closing paywall

2.7.8 [#278]

Fixes [#fixes-7]

* Fix serialization issue with R8 and dates
* Fix scope cancellation for test mode

2.7.7 [#277]

Enhancements [#enhancements-4]

* Adds support for local resource loading in paywalls via `Superwall.instance.localResources`

Fixes [#fixes-8]

* Fix issues with stripe period types failing to deserialize

2.7.6 [#276]

Fixes [#fixes-9]

* Fix concurrency issue with early paywall displays and product loading
* Improve edge case handling in billing
* Improve paywall timeout cases and failAt stamping
* Fix issue with param templating in re-presentation
* Fix race issue with test mode

2.7.5 [#275]

Enhancements [#enhancements-5]

* Add appstack integration attribute identifier

Fixes [#fixes-10]

* Ensure test mode does not interfere with expo
* Ensure isActive is properly returned and not calculated via expiration date
* Fix potential memory leak when webview crashes
* Ensure O(n) cleanup doesn't run multiple times

2.7.4 [#274]

Enhancements [#enhancements-6]

* Adds support for "Test Mode", which allows you to simulate in-app purchases without involving Google Play. Test Mode can be enabled through the Superwall dashboard by marking specific users as test store users, or activates automatically when a an application ID mismatch is detected or behavior is set to `ALWAYS`. When active, a configuration modal lets you select starting entitlements and override free trial availability. Purchases are simulated with a UI that lets users complete, abandon, or fail transactions, with all purchase events firing normally for end-to-end paywall testing.
* Improved logging in web entitlement and entitlement redeeming for easier debugging
* Adds active entitlements to subscription status change event
* Ensures purchases are always queried with connected clients and retried in background
* Adds `expirationDate`, `subscriptionGroupId` and `offerId` to `StoreTransactionType`

Fixes [#fixes-11]

* Improve rounding to match editor's pricing consistently

2.7.3 [#273]

Enhancements [#enhancements-7]

* Adds state and params to `PaywallInfo` for `PaywallClose` events

2.7.2 [#272]

Fixes [#fixes-12]

* Fixes issue with `enableExperimentalDeviceVariables` option causing subscription status sync to fail

2.7.1 [#271]

Enhancements [#enhancements-8]

* Adds improved constructors for `SuperwallOptions`,`PaywallOptions` and `PaywallPresentationHandler`, allowing a DSL like usage,i.e. ` PaywallPresentationHandler { onPresent { ... } }`
* Adds haptic feedback action support

Fixes [#fixes-13]

* Ensures poster is always visible on video preview
* Fix bug with loading not dismissing post purchase if user remains in paywall
* Fix warning about old edge-to-edge API usages
* Fix shimmerview theme warnings and memory leak

2.7.0 [#270]

Enhancements [#enhancements-9]

* Enables paywall post-purchase action execution instead of dismissing
* Enables triggering custom callback requests from paywall
* Adds a new method to PaywallPresentationHandler called onCustomCallback that allows user to handle custom callback requests
* Adds retrieving of paywall state inside paywall info
* Adds support for new one time purchases with purchase options and offers
* Update Superscript to version 1.0.13, find more in the [Superscript changelog](https://github.com/superwall/superscript/releases/tag/1.0.13)

Deprecations [#deprecations]

* Deprecated `paywallWebviewLoad_timeout` - this event was causing confusion due to its naming, leading to it being deprecated

Fixes [#fixes-14]

* Fixes late initialization authorization issue for Stripe checkouts
* Improves how Shimmer duration is measured
* Fixes wrong redemption type being displayed due to integration attributes

2.6.8 [#268]

Enhancements [#enhancements-10]

* Adds microphone permission

Fixes [#fixes-15]

* Fixes error when redeeming external purchases

2.6.7 [#267]

Enhancements [#enhancements-11]

* Adds permission granting and callbacks to/from paywalls
* Adds `PaywallPreloadStart` and `PaywallPreloadComplete` events

Fixes [#fixes-16]

* Fix handling of deep links when paywall is detached
* Enables permission granting from paywall and callbacks
* Fix crash when handling drawer style paywalls with 100% height

2.6.6 [#266]

Enhancements [#enhancements-12]

* Add dynamic notification support and scheduling enabling deeper personalization of notifications
* Provides a `CustomerInfo` class API, allowing you to observe the customer's purchases and subscription lifecycle via `Superwall.instance.customerInfo` flow
* Provides a new delegate method to observe customer info changes - `fun customerInfoDidChange(from: CustomerInfo, to: CustomerInfo)`
* Provides a `CustomerInfoDidChange` event to track customer info changes
* Overrides `Collection<Entitlement>.plus`and `.toSet` methods to ensure our merging methods are used.
* Provides a `userAttributesDidChange(newAttributes: Map<String, Any>)` method in Superwall Delegate to track external (i.e. paywall) attribute changesg
* Allows triggering a `transaction_abandon` offer on a `paywall_decline` offer and vice-versa, whereas previously it would trigger a presentation error.
* Add a `Superwall.teardown` method and `Superwall.instance.refreshConfiguration()` for development with hot-reload based frameworks

⚠️ Warning ⚠️ [#️-warning-️]

If you are using a Purchase Controller and web2app or app2web purchases, you will have to update your purchase controller
to listen to `Superwall.instance.customerInfo` which will provide you with the relevant web entitlements and call
`setSubscriptionStatus` accordingly.

2.6.5 [#265]

Dependencies [#dependencies]

* Reverts `androidx.lifecycle:lifecycle-runtime-ktx` to 2.8.4 to ensure old Compose BOM compatiblity

Enhancements [#enhancements-13]

* Improves error messaging in play store errors

Fixes [#fixes-17]

* Fixes edge case bug with wrong entitlement being matched in cases where product ID's match and base plans differentiate by suffix only
* Fixes issue with composable paywall state updates not firing in onAttach

2.6.4 [#264]

Enhancements [#enhancements-14]

* Improves error and timeout handling
* Hardens paywall recreation in case of render process crash

2.6.3 [#263]

Enhancements [#enhancements-15]

* Adds `productIdentifier` to RedemptionResult's `PaywallInfo` object

Fixes [#fixes-18]

* Fixes nested scrolling issue in Modal webviews
* Removes node removal for `com.google.android.gms.permission.AD_ID` from Manifest
* Ensures remote entitlements in the background refresh without feature flags

2.6.2 [#262]

Enhancements [#enhancements-16]

* Adds `Superwall.instance.consume(purchaseToken)` method to help easily consume in-app purchases

Fixes [#fixes-19]

* Fixes issue with deeplink params not being handled properly in some cases
* Fixes issue with Drawer and Modal displays on Android 14 Samsung devices
* Fixes selection issue with some OTP, ensures after consuming the Status is synced

2.6.1 [#261]

Enhancements [#enhancements-17]

* Enables Stripe and Paddle checkout via in-app payment sheets
* Improves product handling and redemption for Stripe and Paddle

Fixes [#fixes-20]

* Fixes issue with Google's Play Billing library auto-reconnection

2.6.0 ⚠️ [Deprecated] [#260-️-deprecated]

Notes [#notes]

* This version is deprecated due to discovery of an issue in Play Billing library which could cause runtime issues
* Please use version 2.6.1

2.5.8 [#258]

Fixes [#fixes-21]

* Fix lifetime purchase entitlements not being discovered in some cases on purchase
* Fix potential ANR issues where some animations would end up looping over on main thread
* Fix webview client not behaving properly when using a resetted paywall

2.6.0-alpha [#260-alpha]

* Add app2web support, allowing users to purchase Stripe or Paddle products without leaving your app
* Add `PaymentSheet` purchase type enabling quick bottom sheet purchases
* Add support for Android app links purchase redeeming

2.5.7 [#257]

Fixes [#fixes-22]

* Fix `demandScore` and `demandTier` getting removed from some events
* Fixes paywall navigation resetting after backgrounding
* Removes webview flags which can cause off-screen render issues

2.5.6 [#256]

Enhancements [#enhancements-18]

* Add support for rerouting back button if enabled in paywall settings
  * Handled by `SuperwallOptions.PaywallOptions.onBackPressed`, which enables you to consume the back press or let the SDK consume it
* Add support for redeeming web entitlements with Paddle

Fixes [#fixes-23]

* Fix binary .so file regression to ensure 16kb page size compatibility
* Fix potential issue with paywall not dismissing due to paywall\_decline concurrency issue

2.5.5 [#255]

Enhancements [#enhancements-19]

* Expose `signature` on `StoreTransaction`

Fixes [#fixes-24]

* ⚠️ Important - in the recent versions we have added usage of Google AppSetId and AdID to enable automatic attribution with Google's ad networks.
* Due to issues with Google's detection of the usage, they have been removed temporarily and will be added back once the issue is resolved.
* As an alternative, you can set those attribution identifiers using `AttributionProvider.GOOGLE_APP_SET | AttributionProvider.GOOGLE_ADS`

2.5.4 [#254]

Enhancements [#enhancements-20]

* `PaywallComposable` now reapplies theme on system change and `PaywallView` now exposes an `onThemeChanged()` method
* `DeepLink` event now exposes query params

2.5.3 [#253]

Enhancements [#enhancements-21]

* Adds ability to specify a custom height and corner radius for the drawer presentation style.
* Adds ability to display a `Popup` presentation style
* Adds ability to request reviews from paywall actions, including:
  * Value `device.reviewRequestCount` that returns total request counts
  * Method `device.reviewRequestsInHour|Day|Week|Year|reviewRequestsSinceInstall` computed methods for granular targeting
* Adds `Superwall.instance.setIntegrationAttributes` method enabling you to set integration identifiers for the users from different platforms (Adjust, Mixpanel, Meta, etc.)
* Adds `Superwall.instance.showAlert` method enabling you to easily show an alert over the current paywall
* Adds `PaywallOptions.timeoutAfter` to easily control timeout of paywalls when not using fallback loading
* Adds `Superwall.instance.setIntegrationAttributes` and `Superwall.instance.integrationAttributes` to set integration identifiers (i.e. Mixpanel, Appsflyer, etc)
* Adds user attributes to `TransactionComplete` and `PaywallOpen` events
* Adds device ID to device attributes

Fixes [#fixes-25]

* Fixes memory leak issues in `PaywallBuilder` would keep the paywall view alive in some cases
* Fixes issue where some events would be missing properties

2.5.1 [#251]

Enhancements [#enhancements-22]

* Improves subscribed user experience in cases with slow configuration

2.5.0 [#250]

Enhancements [#enhancements-23]

* Updates Google Play billing library to v8. Unfortunately, Google has broken backwards compatibility with previous versions, so if you're using the standalone library too ensure it is compatible with v8.
* Adds kotlin version to device variables

Fixes [#fixes-26]

* Reduces noisy logging when product is missing an offer
* Ensures that getting experimental properties works for consumable products

2.4.1 [#241]

Fixes [#fixes-27]

* Google Play Billing integration with newer libraries (such as RC 9.\*)
* Reduces noisy logging when product is missing an offer
* Ensures that getting experimental properties works for consumable products

2.4.0 [#240]

Enhancements [#enhancements-24]

* Increases superscript version to 1.0.2 with improved type and null safety

2.3.3 [#233]

Fixes [#fixes-28]

* Ensure properties are always properly serialized

2.3.2 [#232]

Enhancements [#enhancements-25]

* Adds new properties to count placement occurrences in specific time: `placementsInHours`, `placementsInDay`, `placementsInWeek`, `placementsInMonth`, `placementsSinceInstall`

Fixes [#fixes-29]

* Fixes an issue where a redemption could succeed but throw an error
* Fixes an issue with receipt manager when there is no purchases and experimental properties are enabled

2.3.1 [#231]

Fixes [#fixes-30]

* Fixes an issue where entitlements would not be reset on time
* Ensures `redeem` is only done on initial config not on config refresh

Enhancements [#enhancements-26]

* Adds `overrideProductsByName` property to allow globally overriding products on paywalls. This property accepts a map of product names to product identifiers (strings). Local overrides provided via `PaywallOverrides` take precedence over global overrides.
* Adds `ProductOverride` sealed class to provide flexible product override handling with support for both product IDs and `StoreProduct` objects.

2.3.0 [#230]

Enhancements [#enhancements-27]

* Deprecated `Superwall.instance.handleDeepLink` in favor of static `Superwall.handleDeepLink` to ensure links received before `configure` completion are handled properly
* Adds `externalAcountId`, provided to Google Play billing upon purchase as a SHA256 of the userId or the userId itself if `passIdentifiersToPlayStore` option is provided.
* Adds a `SuperwallOption` named `enableExperimentalDeviceVariables`. When set to true, this enables additional device-level variables: `latestSubscriptionPeriodType`, `latestSubscriptionState`, and `latestSubscriptionWillAutoRenew`. These properties provide information about the most recent Google Play subscription on the device and can be used in audience filters. Note that due to their experimental nature, they are subject to change in future updates.
* Update `com.android.billingclient` to version 7.1.1 to align with Google's latest requirements

Fixes [#fixes-31]

* Fixes issues with paywall destruction when activity performs a hot reload (i.e. during update)
* Fixes issue where the feature block would be triggered on non-gated paywalls when the app is minimised

2.2.3 [#223]

Fixes [#fixes-32]

* Fix potential issue with device enrichment and attributes synchronisation causing a lock

2.2.2 [#222]

Enhancements [#enhancements-28]

* Adds `demandScore` and `demandTier` to device attributes using an off-device advanced machine learning model. A user is assigned these based on a variety of factors to determine whether they're more or less likely to convert and can be used within audience filters.
* Adds `deviceTier` to the device attributes using an on-device scoring system to place the device in a tier based on it's capabilities. This can be used in audience filters to display different paywalls based on the user's device capabilities. The value can be one of the following values `ultraLow`, `low`, `mid`, `high`, `ultra_high`, `unknown`. NOTE: This property is still experimental

Fix [#fix]

* Fixes potential issue in `web2app` with subscription being overriden by the polling due to extra API calls

2.2.0 [#220]

Enhancements [#enhancements-29]

* Updates binaries to work on 16kb page sizes

2.1.2 [#212]

Fixes [#fixes-33]

* Fix issue with deep link referrer throwing a DeadObjectException

2.1.1 [#211]

Enhancements [#enhancements-30]

* Add optimisticLoading paywall option that hides the shimmer when HTML is loaded
* Prevent stopping the paywall handler listening with onDismiss when reason is None
* Improve PaywallBuilder API for non-kotlin and non-coroutine users
* Expose `deviceAttributes()` function to retrieve session device attributes

2.1.0 [#210]

Enhancements [#enhancements-31]

* Updates kotlin version to 2.0.21
* Updates `compileSDK` to 35
* Adds web checkout and redemption support
* Adds SuperwallDelegate methods `willRedeemLink` and `didRedeemLink`

Fixes [#fixes-34]

* Removes lock while reading cache that could cause ANR on the main thread
* Fixes issue where experiment and variant ID would be missing due to concurrency issues

2.1.0-beta.1 [#210-beta1]

Enhancements [#enhancements-32]

* Updates kotlin version to 2.0.21
* Updates `compileSDK` to 35
* Adds web checkout and redemption support
* Adds SuperwallDelegate methods `willRedeemLink` and `didRedeemLink`

2.0.8 [#208]

Fixes [#fixes-35]

* Fixes the serialization issue with Kotlin 2.0

2.0.7 [#207]

Enhancements [#enhancements-33]

* Improves how errors are handled when loading, improving the UX and reloading in real failure cases
* Added `device.subscriptionStatus` to the device object

Fixes [#fixes-36]

* Fixes an issue where users of kotlin 2.0 would experience a `NoAudienceMatch` when evaluating rules

2.0.6 [#206]

Fixes [#fixes-37]

* Fix potential crash while setting render priority

2.0.5 [#205]

Fixes [#fixes-38]

* Fix issue with `original_transaction_id` missing when using a `PurchaseController`

2.0.4 [#204]

Enhancements [#enhancements-34]

* Provide overloads for Java interop
* Provide utility functions for Java interop with `PurchaseController`

2.0.3 [#203]

Enhancements [#enhancements-35]

* Renames `SuperwallPlacement` back to `SuperwallEvent`

2.0.2 [#202]

Fixes [#fixes-39]

* Fixes issue with `NoAudienceMatch` appearing on some devices and issues with certain campaign rules

2.0.1 [#201]

Enhancements [#enhancements-36]

* Changes back to `handleSuperwallEvent` naming with a deprecation notice and a typealias for previous methods

Fixes [#fixes-40]

* Removes extra failure logging when displaying alerts
* Finds nearest activity instead of relying just on Context in `PaywallComposable`
* Improves cleanup in `PaywallComposable`

2.0.0 [#200]

Our 2.0.0 release brings some major and minor changes to both our API's and core features. For more information, please look at our [migration docs](https://superwall.com/docs/migrating-to-v2-android)

Enhancements [#enhancements-37]

* Adds `PaywallBuilder` class as an alternative to existing `getPaywallView` method. This provides a cleaner API and an ability to change purchase loading bar and shimmer view.
* Ensure safety of static webview calls that are known to fail randomly due to Webview's internal issues
* Adds `purchase` method to `Superwall` you can use to purchase products without having to resort on paywalls. To purchase a product you can pass it in one of the following objects:
  * Google Play's `ProductDetails`
  * Superwall's `StoreProduct` object
  * Or a string containing the product identifier, i.e. `Superwall.instance.purchase("product_id:base_plan:offer")`
* Adds `restorePurchases` method to `Superwall` you can use to handle restoring purchases
* Adds `getProducts` method to `Superwall` you can use to retrieve a list of `ProductDetails` given the product ID, i.e. i.e. `Superwall.instance.purchase("product_id:base_plan:offer")`
* Adds support for observing purchases done outside of Superwall paywalls. You can now observe purchases done outside of Superwall paywalls by setting the `shouldObservePurchases` option to true and either:
  * Manually by calling `Superwall.instance.observe(PurchasingObserverState)` or utility methods `Superwall.instance.observePurchaseStart/observePurchaseError/observePurchaseResult`
  * Automatically by replacing `launchBillingFlow` with `launchBillingFlowWithSuperwall`. This will automatically observe purchases done outside of Superwall paywalls.
* Adds consumer proguard rules to enable consumer minification
* `Superwall.instance` now provides blocking or callback based version of multiple calls, suffixed with `*Sync`
* Improves preloading performance and reduces impact on the main thread
* Reduces minSDK to 22

Breaking Changes [#breaking-changes]

* `SuperwallPaywallActivity` and `PaywallView` have been moved into `com.superwall.sdk.paywall.view` package from `com.superwall.sdk.paywall.vc` package.
* Removes `PaywallComposable` and Jetpack Compose support from the main SDK artifact in favor of `Superwall-Compose` module for Jetpack Compose support:
  * You can find it at `com.superwall.sdk:superwall-compose:2.0.0-alpha`
  * Usage remains the same as before, but now you need to include the `superwall-compose` module in your project.
* Removed methods previously marked as Deprecated
* `SubscriptionStatus.Active` now takes in a set of `Entitlements`, while `Inactive` and `Active` have been turned into objects.
* `Superwall.instance.register` now uses `placement` instead of `event` as the argument name
* `preloadPaywalls` now uses `placementNames` instead of `eventNames` as the argument name
* `PaywallPresentationHandler.onDismiss` now has two arguments, `PaywallInfo` and `PaywallResult`
* `PaywallComposable` now uses `placement` argument instead of `event`
* `TriggerResult.NoRuleMatch` and `TriggerResult.EventNotFound` have been renamed to `TriggerResult.NoAudienceMatch` and `TriggerResult.PlacementNotFound`
* `PresentationResult.NoRuleMatch` and `PresentationResult.EventNotFound` have been renamed to `PresentationResult.NoAudienceMatch` and `PresentationResult.PlacementNotFound`
* `SuperwallEvent` has been renamed to `SuperwallPlacement`, belonging properties with `eventName` have been renamed to `placementName`
* `SuperwallEventInfo` has been renamed to `SuperwallPlacementInfo`
* `ComputedPropertyRequest.eventName` has been renamed to `ComputedPropertyRequest.placementName`
* `Superwall.instance.events` has been renamed to `Superwall.instance.placements`
* `LogScope.events` has been renamed to `LogScope.placements`
* `PaywallPresentationRequestStatusReason.EventNotFound` has been renamed to `PaywallPresentationRequestStatusReason.PlacementNotFound`
* `PaywallSkippedReason.EventNotFound` has been renamed to `PaywallSkippedReason.PlacementNotFound`
* `SuperwallDelegate.handleSuperwallEvent` method has been renamed to `SuperwallDelegate.handleSuperwallPlacement`
* Removed `PurchaseResult.Restored`

2.0.0-beta.5 [#200-beta5]

Breaking changes [#breaking-changes-1]

* `Superwall.instance.register` now uses `placement` instead of `event` as the argument name
* `preloadPaywalls` now uses `placementNames` instead of `eventNames` as the argument name
* Superwall's `PaywallPresentationHandler.onDismiss` now has two arguments, `PaywallInfo` and `PaywallResult`
* `PaywallComposable` now uses `placement` argument instead of `event`
* Remove `PurchaseResult.Restored`

2.0.0-beta.4 [#200-beta4]

Breaking changes [#breaking-changes-2]

* `SuperwallEvents.entitlementStatusDidChange` has been renamed to `SuperwallEvents.subscriptionStatusDidChange`
* `SuperwallDelegate.entitlementStatusDidChange` has been renamed to `SuperwallEvents.entitlementStatusDidChange`
* `TriggerResult.NoRuleMatch` and `TriggerResult.EventNotFound` have been renamed to `TriggerResult.NoAudienceMatch` and `TriggerResult.PlacementNotFound`
* `PresentationResult.NoRuleMatch` and `PresentationResult.EventNotFound` have been renamed to `PresentationResult.NoAudienceMatch` and `PresentationResult.PlacementNotFound`

2.0.0-beta.3 [#200-beta3]

Breaking changes [#breaking-changes-3]

* `SuperwallEvent` has been renamed to `SuperwallPlacement`, belonging properties with `eventName` have been renamed to `placementName`
* `SuperwallEventInfo` has been renamed to `SuperwallPlacementInfo`
* `ComputedPropertyRequest.eventName` has been renamed to `ComputedPropertyRequest.placementName`
* `Superwall.instance.events` has been renamed to `Superwall.instance.placements`
* `LogScope.events` has been renamed to `LogScope.placements`
* `PaywallPresentationRequestStatusReason.EventNotFound` has been renamed to `PaywallPresentationRequestStatusReason.PlacementNotFound`
* `PaywallSkippedReason.EventNotFound` has been renamed to `PaywallSkippedReason.PlacementNotFound`
* `SuperwallDelegate.handleSuperwallEvent` method has been renamed to `SuperwallDelegate.handleSuperwallPlacement`

2.0.0-beta.2 [#200-beta2]

Breaking Changes [#breaking-changes-4]

* API Changes:
  * Migration of `setEntitlementStatus` to `setSubscriptionStatus`
  * Exposing `Superwall.instance.entitlementsStatus`
  * Migration of `SuperwallDelegate.entitlementStatusDidChange` to `SuperwallDelegate.subscriptionStatusDidChange`

2.0.0-beta.1 [#200-beta1]

Enhancements [#enhancements-38]

* Add `PaywallBuilder` class as an alternative to existing `getPaywallView` method. This provides a cleaner API and an ability to change purchase loading bar and shimmer view.
* Add callback versions of new 2.0 methods
* Ensure safety of static webview calls that are known to fail randomly due to Webview's internal issues

2.0.0-Alpha.1 [#200-alpha1]

Breaking Changes [#breaking-changes-5]

* `SuperwallPaywallActivity` and `PaywallView` have been moved into `com.superwall.sdk.paywall.view` package from `com.superwall.sdk.paywall.vc` package.
* Removes `PaywallComposable` and Jetpack Compose support from the main SDK artifact in favor of `Superwall-Compose` module for Jetpack Compose support:
  * You can find it at `com.superwall.sdk:superwall-compose:2.0.0-alpha`
  * Usage remains the same as before, but now you need to include the `superwall-compose` module in your project.
* Removed methods previously marked as Deprecated
* Removes `SubscriptionStatus`, together with belonging update methods and `subscriptionStatusDidChange` callback.
* These are replaced with `EntitlementStatus` and `entitlementStatusDidChange` callback. You can find more details on this migration in our docs.

Enhancements [#enhancements-39]

* Adds `purchase` method to `Superwall` you can use to purchase products without having to resort on paywalls. To purchase a product you can pass it in one of the following objects:
  * Google Play's `ProductDetails`
  * Superwall's `StoreProduct` object
  * Or a string containing the product identifier, i.e. `Superwall.instance.purchase("product_id:base_plan:offer")`

* Adds `restorePurchases` method to `Superwall` you can use to handle restoring purchases

* Adds `getProducts` method to `Superwall` you can use to retrieve a list of `ProductDetails` given the product ID, i.e. i.e. `Superwall.instance.purchase("product_id:base_plan:offer")`

* Adds support for observing purchases done outside of Superwall paywalls. You can now observe purchases done outside of Superwall paywalls by setting the `shouldObservePurchases` option to true and either:
  * Manually by calling `Superwall.instance.observe(PurchasingObserverState)` or utility methods `Superwall.instance.observePurchaseStart/observePurchaseError/observePurchaseResult`
  * Automatically by replacing `launchBillingFlow` with `launchBillingFlowWithSuperwall`. This will automatically observe purchases done outside of Superwall paywalls.

* Adds consumer proguard rules to enable consumer minification

* Reduces minSDK to 22

* Adds `purchaseToken` to purchase events

* `Superwall.instance` now provides blocking or callback based version of multiple calls, suffixed with `*Sync`

* Improves preloading performance and reduces impact on the main thread

1.5.5 [#155]

Fixes [#fixes-41]

* Fixes potential distribution issues for variant selection in edge cases
* Fixes potential memory leaks of paywall calling activity

1.5.4 [#154]

Fixes [#fixes-42]

* Fixes issue when a paywall would dismiss with `ForNextPaywall` but next paywall could not be shown due to triggers or limits. Now it resolves into the proper dismiss status.

1.5.3 [#153]

Enhancements [#enhancements-40]

* Add `purchaseToken` to TransactionComplete

1.5.2 [#152]

Fixes [#fixes-43]

* Fix chromium crashes caused by race conditions in webview's implementation

1.5.1 [#151]

Enhancements [#enhancements-41]

* Updates superscript dependencies to reduce minSDK version

Fixes [#fixes-44]

* Adds consumer proguard rules to avoid minifying JNA classes during minification

1.5.0 [#150]

Enhancements [#enhancements-42]

* Adds `shimmerView_start` and `shimmerView_complete` events to track the loading of the shimmer animation.
* Makes `hasFreeTrial` match iOS SDK behavior by returning `true` for both free trials and non-free introductory offers
* Adds `Superwall.instance.events` - A SharedFlow instance emitting all Superwall events as `SuperwallEventInfo`. This can be used as an alternative to a delegate for listening to events.
* Adds a new shimmer animation
* Adds support for SuperScript expression evaluator

Fixes [#fixes-45]

* Fixes concurrency issues with subscriptions triggered in Cordova apps

1.5.0-beta.2 [#150-beta2]

Enhancements [#enhancements-43]

* Adds `shimmerView_start` and `shimmerView_complete` events to track the loading of the shimmer animation.
* Makes `hasFreeTrial` match iOS SDK behavior by returning `true` for both free trials and non-free introductory offers

1.5.0-beta.1 [#150-beta1]

Enhancements [#enhancements-44]

* Adds `Superwall.instance.events` - A SharedFlow instance emitting all Superwall events as `SuperwallEventInfo`. This can be used as an alternative to a delegate for listening to events.
* Adds a new shimmer animation
* Adds support for SuperScript expression evaluator

1.4.1 [#141]

Enhancements [#enhancements-45]

* Adds `appVersionPadded` attribute

Fixes [#fixes-46]

* Fixes issue where `PaywallPresentationHandler.onError` would be skipped in case of `BillingError`s

1.4.0 [#140]

Enhancements [#enhancements-46]

* Improves paywall loading and preloading performance
* Reduces impact of preloading on render performance
* Updates methods to return `kotlin.Result` instead of relying on throwing exceptions
* This introduces some minor breaking changes:
  * `configure` completion block now provides a `Result<Unit>` that can be used to check for success or failure
  * `handleDeepLink` now returns a `Result<Boolean>`
  * `getAssignments` now returns a `Result<List<ConfirmedAssignments>>`
  * `confirmAllAssignments` now returns a `Result<List<ConfirmedAssignments>>`
  * `getPresentationResult` now returns a `Result<PresentationResult>`
  * `getPaywallComponents` now returns a `Result<PaywallComponents>`
* Removes Gson dependency
* Adds `isScrollEnabled` flag to enable remote control of Paywall scrollability
* Adds `PaywallResourceLoadFail` event to enable tracking of failed resources in Paywall
* Improves bottom navigation bar color handling

Fixes [#fixes-47]

* Fixes issue where paywalls without fallback would fail to load and missing resource would cause a failure event
* Fixes issue with `trialPeriodDays` rounding to the higher value instead of lower, i.e. where `P4W2D` would return 28 days instead of 30, it now returns 30.
* Fixes issue with system navigation bar not respecting paywall color
* Fixes issues with cursor allocation in Room transaction
* Improves handling of chromium render process crash

1.4.0-beta.3 [#140-beta3]

* Fixes issue where paywalls without fallback would fail to load and missing resource would cause a failure event

1.4.0-beta.2 [#140-beta2]

Enhancements [#enhancements-47]

* Removes Gson dependency
* Adds `isScrollEnabled` flag to enable remote controll of Paywall scrollability

Fixes [#fixes-48]

* Fixes issue with `trialPeriodDays` rounding to the higher value instead of lower, i.e. where `P4W2D` would return 28 days instead of 30, it now returns 30.
* Fixes issue with system navigation bar not respecting paywall color
* Reduces impact of preloading on render performance
* Fixes issues with cursor allocation in Room transaction

1.4.0-beta.1 [#140-beta1]

* Updates methods to return `kotlin.Result` instead of relying on throwing exceptions
* This introduces some minor breaking changes:
  * `configure` completion block now provides a `Result<Unit>` that can be used to check for success or failure
  * `handleDeepLink` now returns a `Result<Boolean>`
  * `getAssignments` now returns a `Result<List<ConfirmedAssignments>>`
  * `confirmAllAssignments` now returns a `Result<List<ConfirmedAssignments>>`
  * `getPresentationResult` now returns a `Result<PresentationResult>`
  * `getPaywallComponents` now returns a `Result<PaywallComponents>`

1.3.1 [#131]

Fixes [#fixes-49]

* Fixes issue when destroying activities during sleep would cause a background crash
* Fixes issue when using Superwall with some SDK's would cause a crash (i.e. Smartlook SDK)

1.3.0 [#130]

Enhancements [#enhancements-48]

* The existing `getPaywall` method has been deprecated and renamed to `getPaywallOrThrow`. The new `getPaywall` method now returns a `kotlin.Result<PaywallView>` instead of throwing an exception.
* Adds a new option to `SuperwallOptions` - `passIdentifiersToPlayStore` which allows you to pass the user's identifiers (from `Superwall.instance.identify(userId: String, ...)`) to the Play Store when making a purchase. Note: When passing in identifiers to use with the play store, please make sure to follow their \[guidelines]\([https://developer.android.com/reference/com/android/billingclient/api/BillingFlowParams.Builder#setObfuscatedAccountId(java.lang.String)](https://developer.android.com/reference/com/android/billingclient/api/BillingFlowParams.Builder#setObfuscatedAccountId\(java.lang.String\)).
* Adds `Superwall.instance.confirmAllAssignments()`, which confirms assignments for all placements and returns an array of all confirmed experiment assignments. Note that the assignments may be different when a placement is registered due to changes in user, placement, or device parameters used in audience filters.

Fixes [#fixes-50]

* Fixes issues with Paywall sometimes not displaying when returning from background
* Fixes issue with SDK crashing when WebView is not available
* Fixes issue with `SuperwallPaywallActivity` NPE
* Update visibility of internal `getPaywall` methods to `internal` to prevent misuse

1.2.9 [#129]

Fixes [#fixes-51]

* Fixes issues with `MODAL` presentation style and scrolling containers
* Fixes issues with `FULLSCREEN` presentation style rendering behind navigation

1.2.8 [#128]

Fixes [#fixes-52]

* Fixes issues with Paywall presentation styles not being properly passed

1.2.7 [#127]

Enhancements [#enhancements-49]

* Exposes current configuration status via `Superwall.instance.configurationStatus`

Fixes [#fixes-53]

* Fixes issues with Paywall previews not loading

1.2.6 [#126]

Fixes [#fixes-54]

* Fixes issue where the paywall would not show in some cases when using `minutes_since`
* Fixes issue with wrong URL being logged when a paywall fails to load

1.2.5 [#125]

Enhancements [#enhancements-50]

* Adds a `Modifier` to `PaywallComposable` to allow for more control
* Adds a `PaywallView.setup(...)` method to allow for easy setup when using `PaywallView` directly
* Adds support for `MODAL` presentation style

Fixes [#fixes-55]

* Fixes issue with displaying `PaywallComposable`
* Resolves issue where users would get `UninitializedPropertyAccessException` when calling `Superwall.instance`

1.2.4 [#124]

Enhancements [#enhancements-51]

* For users who are not able to upgrade their AGP or Gradle versions, we have added a new artifact `superwall-android-agp-7` which keeps compatibility.

Enhancements [#enhancements-52]

* Fixes issue with decoding custom placements from paywalls.

1.2.3 [#123]

Enhancements [#enhancements-53]

* Expose `placementName`, `paywallInfo` and `params` on a `custom_placement` event

1.2.2 [#122]

Enhancements [#enhancements-54]

* Adds support for multiple paywall URLs, in case one CDN provider fails.
* `ActivityEncapsulatable` now uses a WeakReference instead of a reference
* SW-2900: Adds Superwall.instance.localeIdentifier as a convenience variable that you can use to dynamically update the locale used for evaluating rules and getting localized paywalls.
* SW-2919: Adds a `custom_placement` event that you can attach to any element in the paywall with a dictionary of parameters. When the element is tapped, the event will be tracked. The name of the placement can be used to trigger a paywall and its params used in audience filters.
* Adds support for bottom sheet presentation style (DRAWER), no animation style and default animation.
* Adds `build_id` and `cache_key` to `PaywallInfo`.
* SW-2917: Tracks a `config_attributes` event after calling `Superwall.configure`, which contains info about the configuration of the SDK. This gets tracked whenever you set the delegate.
* Adds in device attributes tracking after setting the interface style override.
* To comply with new Google Play Billing requirements we now avoid setting empty `offerToken` for one-time purchases

1.2.1 [#121]

Enhancements [#enhancements-55]

* Adds the ability for the SDK to refresh the Superwall configuration every session start, subject to a feature flag.
* Tracks a `config_refresh` Superwall event when the configuration is refreshed.
* SW-2890: Adds `capabilities` to device attributes. This is a comma-separated list of capabilities the SDK has that you can target in audience filters. This release adds the `paywall_event_receiver` capability. This indicates that the paywall can receive transaction from the SDK.
* SW-2902: Adds `abandoned_product_id` to a `transaction_abandon` event to use in audience filters. You can use this to show a paywall if a user abandons the transaction for a specific product.

1.2.0 [#120]

Enhancements [#enhancements-56]

* Adds DSL methods for configuring the SDK. You can now use a configuration block:
  ```kotlin
  fun Application.configureSuperwall(
        apiKey: String,
        configure: SuperwallBuilder.() -> Unit,
  )
  ```

This allows you to configure the SDK in a more idiomatic way:

```kotlin
   configureSuperwall(CONSTANT_API_KEY){
      options {
        logging {
          level = LogLevel.debug
        }
        paywalls {
          shouldPreload = false
        }
      }
  }
```

Deprecations [#deprecations-1]

This release includes multiple deprecations that will be removed in upcoming versions.
Most are internal and will not affect the public API, those that will are marked as such and a simple migration
path is provided. The notable ones in the public API are as follows:

* Deprecated `DebugViewControllerActivity` in favor of `DebugViewActivity`

* Deprecated `PaywallViewController` in favor of `PaywallView`
  * Deprecated belonging methods:
    * `viewWillAppear` in favor of `beforeViewCreated`
    * `viewDidAppear` in favor of `onViewCreated`
    * `viewWillDisappear` in favor of `beforeOnDestroy`
    * `viewDidDisappear` in favor of `destroyed`
    * `presentAlert` in favor of `showAlert`

* Deprecated `PaywallViewControllerDelegate` in favor of `PaywallViewCallback`
  * Deprecated belonging methods:
    * `didFinish` in favor of `onFinished`

* Deprecated `PaywallViewControllerEventDelegate` in favor of `PaywallViewEventCallback`
  * Users might also note deprecation of `PaywallWebEvent.OpenedUrlInSafari` in favor of `PaywallWebEvent.OpenedUrlInChrome`
    * `didFinish` in favor of `onFinished`

* In `Superwall`, the following methods were deprecated:
  * `Superwall.paywallViewController` in favor of `Superwall.paywallView`
  * `Superwall.eventDidOccur` argument `paywallViewController` in favor of `paywallView`
  * `Superwall.dismiss` in favor of \`Superwall.presentPaywallView
  * `Superwall.presentPaywallViewController` in favor of `Superwall.presentPaywallView`

* Deprecated `Paywallmanager.getPaywallViewController` in favor of `PaywallManager.getPaywallView`

* Deprecated `DebugManager.viewController` in favor of `DebugManager.view`

* Deprecated `DebugViewController` in favor of `DebugView`

* Deprecated `LogScope.debugViewController` in favor of `LogScope.debugView`

* Deprecated `PaywallPresentationRequestStatus.NoPaywallViewController` in favor of `NoPaywallView`

1.1.9 [#119]

Deprecations [#deprecations-2]

* Deprecated configuration method `Superwall.configure(applicationContext: Context, ...)` in favor of `Superwall.configure(applicationContext: Application, ...)` to enforce type safety. The rest of the method signature remains the same.

Fixes [#fixes-56]

* SW-2878: and it's related leaks. The `PaywallViewController` was not being properly detached when activity was stopped, causing memory leaks.
* SW-2872: Fixes issue where `deviceAttributes` event and fetching would not await for IP geo to complete.
* Fixes issues on tablet devices where the paywall would close after rotation/configuration change.

1.1.8 [#118]

Enhancements [#enhancements-57]

* SW-2859: Adds error message to `paywallWebviewLoad_fail`.
* SW-2866: Logs error when trying to purchase a product that has failed to load.
* SW-2869: Add `Reset` event to track when `Superwall.instance.reset` is called.
* SW-2867: Prevents Geo api from being called when app is in the background
* SW-2431: Improves coroutine scope usages & threading limits
* Toolchain and dependency updates

Fixes [#fixes-57]

* SW-2863: Fixed a `NullPointerException` some users on Android 12 & 13 would experience when calling `configure`.

1.1.7 [#117]

Enhancements [#enhancements-58]

* SW-2805: Exposes a `presentation` property on the `PaywallInfo` object. This contains information about the presentation of the paywall.
* SW-2855: Adds `restore_start`, `restore_complete`, and `restore_fail` events.

Fixes [#fixes-58]

* SW-2854: Fixed issue where abandoning the transaction by pressing back would prevent the user from restarting the transaction.

1.1.6 [#116]

Enhancements [#enhancements-59]

* SW-2833: Adds support for dark mode paywall background color.
* Adds ability to target devices based on their IP address location. Use `device.ipRegion`,
  `device.ipRegionCode`, `device.ipCountry`, `device.ipCity`, `device.ipContinent`, or `device.ipTimezone`.
* Adds `event_name` to the event params for use with audience filters.

Fixes [#fixes-59]

* Fixes issue with products whose labels weren't primary/secondary/tertiary.

1.1.5 [#115]

Fixes [#fixes-60]

* Fixes thread safety crash when multiple threads attempted to initialize the `JavaScriptSandbox`
  internally.

1.1.3 [#113]

Enhancements [#enhancements-60]

* Tracks an `identity_alias` event whenever identify is called to alias Superwall's anonymous ID with a
  developer provided id.
* Adds `setInterfaceStyle(interfaceStyle:)` which can be used to override the system interface style.
* Adds `device.interfaceStyleMode` to the device template, which can be `automatic` or `manual` if
  overriding the interface style.

Fixes [#fixes-61]

* Uses `JavascriptSandbox` when available for filter expression evaluation on a background thread
  instead of running code on the main thread in a webview.
* Fixes crash where the loading spinner inside the `PaywallViewController` was being updated outside
  the main thread.

1.1.2 [#112]

Enhancements [#enhancements-61]

* Updates build.gradle configuration which means we can now upload the SDK to maven central. You no
  longer need to specify our custom repo in your build.gradle to get our SDK and therefore installation
  should be easier.

Fixes [#fixes-62]

* Fixes `ConcurrentModificationException` crash that sometimes happened when identifying a user.
* Fixes crash on purchasing a free trial when using `getPaywall`.

1.1.1 [#111]

Fixes [#fixes-63]

* Fixes an issue loading products with offers.

1.1.0 [#110]

Enhancements [#enhancements-62]

* SW-2768: Adds `device.regionCode` and `device.preferredRegionCode`, which returns the `regionCode`
  of the locale. For example, if a locale is `en_GB`, the `regionCode` will be `GB`. You can use this
  in the filters of your campaign.
* Adds support for unlimited products in a paywall.
* SW-2785: Adds internal feature flag to disable verbose events like `paywallResponseLoad_start`.

Fixes [#fixes-64]

* SW-2732: User attributes weren't being sent on app open until identify was called. Now they are
  sent every time there's a new session.
* SW-2733: Fixes issue where the spinner would still show on a paywall if a user had previously
  purchased on it.
* SW-2744: Fixes issue where using the back button to dismiss a paywall presented via `getPaywall`
  would call `didFinish` in the `PaywallViewControllerDelegate` with the incorrect values.
* Fixes issue where an invalid paywall background color would prevent the paywall from opening. If
  this happens, it will now default to white.
* SW-2748: Exposes `viewWillAppear`, `viewDidAppear`, `viewWillDisappear` and `viewDidDisappear`
  methods of `PaywallViewController` which you must call when using `getPaywall`.
* Stops `Superwall.configure` from being called multiple times.
* `getPresentationResult` now confirms assignments for holdouts.
* Gracefully handles unknown local notification types if new ones are added in the future.
* SW-2761: Fixes issue where "other" responses in paywall surveys weren't showing in the dashboard.

1.0.2 [#102]

Fixes [#fixes-65]

* Prevents a paywall from opening in a separate activity inside a task manager when using `taskAffinity`
  within your app.

1.0.1 [#101]

Fixes [#fixes-66]

* Fixes serialization of `feature_gating` in `SuperwallEvents`.
* Changes the product loading so that if preloading is enabled, it makes one API request to get all
  products available in paywalls. This results in fewer API requests. Also, it adds retry logic on failure.
  If billing isn't available on device, the `onError` handler will be called.

1.0.0 [#100]

Breaking Changes [#breaking-changes-6]

* Changes the import path for the `LogScope`, and `LogLevel`.

Fixes [#fixes-67]

* Fixes rare thread-safety crash when sending events back to Superwall's servers.
* Calls the `onError` presentation handler block when there's no activity to present a paywall on.
* Fixes issue where the wrong product may be presented to purchase if a free trial had already been
  used and you were letting Superwall handle purchases.
* Fixes `IllegalStateException` on Samsung devices when letting Superwall handle purchases.
* Keeps the text zoom of paywalls to 100% rather than respecting the accessibility settings text zoom,
  which caused unexpected UI issues.
* Fixes rare `UninitializedPropertyAccessException` crash caused by a threading issue.
* Fixes crash when the user has disabled the Android System WebView.

1.0.0-alpha.45 [#100-alpha45]

Fixes [#fixes-68]

* Fixes issue where the `paywallProductsLoad_fail` event wasn't correctly being logged. This is a
  "soft fail", meaning that even though it gets logged, your paywall will still show. The error message
  with the event has been updated to include all product subscription IDs that are failing to be retrieved.

1.0.0-alpha.44 [#100-alpha44]

Fixes [#fixes-69]

* Fixes rare issue where paywall preloading was preventing paywalls from showing.

1.0.0-alpha.43 [#100-alpha43]

Enhancements [#enhancements-63]

* Adds `handleLog` to the `SuperwallDelegate`.

1.0.0-alpha.42 [#100-alpha42]

Fixes [#fixes-70]

* Makes sure client apps use our proguard file.

1.0.0-alpha.41 [#100-alpha41]

Fixes [#fixes-71]

* Removes need for `SCHEDULED_EXACT_ALARM` permission in manifest.

1.0.0-alpha.40 [#100-alpha40]

Fixes [#fixes-72]

* Fixes issue presenting paywalls to users who had their device language set to Russian, Polish or
  Czech.

1.0.0-alpha.39 [#100-alpha39]

Fixes [#fixes-73]

* Adds missing `presentationSourceType` to `PaywallInfo`.
* Fixes issue where the status bar color was always dark regardless of paywall color.
* Adds `TypeToken` to proguard rules to prevent r8 from 'optimizing' our code and causing a crash.

1.0.0-alpha.38 [#100-alpha38]

Enhancements [#enhancements-64]

* SW-2682: Adds `Superwall.instance.latestPaywallInfo`, which you can use to get the `PaywallInfo` of
  the most recently presented view controller.
* SW-2683: Adds `Superwall.instance.isLoggedIn`, which you can use to check if the user is logged in.

Fixes [#fixes-74]

* Removes use of `USE_EXACT_ALARM` permission that was getting apps rejected.
* Fixes issue with scheduling notifications. The paywall wasn't waiting to schedule notifications
  before dismissal so the permissions wasn't always showing.

1.0.0-alpha.37 [#100-alpha37]

Enhancements [#enhancements-65]

* SW-2684: Adds error logging if the `currentActivity` is `null` when trying to present a paywall.

Fixes [#fixes-75]

* Fixes bug where paywalls might not present on first app install.
* Fixes bug where all `paywallResponseLoad_` events were being counted as `paywallResponseLoad_start`.
* Adds ProGuard rule to prevent `DefaultLifecycleObserver` from being removed.

1.0.0-alpha.36 [#100-alpha36]

Enhancements [#enhancements-66]

* Adds `X-Subscription-Status` header to all requests.
* Caches the last `subscriptionStatus`.
* Adds `subscriptionStatus_didChange` event that is fired whenever the subscription status changes.
* Calls the delegate method `subscriptionStatusDidChange` whenever the subscription status changes.
* SW-2676: Adds a completion block to the `configure` method.

Fixes [#fixes-76]

* Fixes issue where the main thread was blocked when accessing some properties internally.
* SW-2679: Fixes issue where the `subscription_start` event was being fired even if a non-recurring product was
  purchased.

1.0.0-alpha.35 [#100-alpha35]

Fixes [#fixes-77]

* Fixes issue where `transaction_complete` events were being rejected by the server.

1.0.0-alpha.34 [#100-alpha34]

Breaking Changes [#breaking-changes-7]

* Changes `Superwall.instance.getUserAttributes()` to `Superwall.instance.userAttributes`.
* `SuperwallOptions.logging.logLevel` is now non-optional. Set it to `LogLevel.none` to prevent
  logs from being printed to the console.

Enhancements [#enhancements-67]

* SW-2663: Adds `preloadAllPaywalls()` and `preloadPaywalls(eventNames:)` to be able to manually
  preload paywalls.
* SW-2665: Adds `Superwall.instance.userId` so you can access the current user's id.
* SW-2668: Adds `preferredLocale` and `preferredLanguageLocale` to the device attributes for use in rules.
* Adds `Superwall.instance.logLevel` as a convenience variable to set and get the log level.

Fixes [#fixes-78]

* SW-2664: Fixes race condition between resetting and presenting paywalls.

1.0.0-alpha.33 [#100-alpha33]

Fixes [#fixes-79]

* Fixes issue where a user would be asked to enable notifications even if there weren't any attached
  to the paywall.

1.0.0-alpha.32 [#100-alpha32]

Enhancements [#enhancements-68]

* SW-2214: Adds ability to use free trial notifications with a paywall.
* Adds `cancelAllScheduledNotifications()` to cancel any scheduled free trial notifications.
* SW-2640: Adds `computedPropertyRequests` to `PaywallInfo`.
* SW-2641: Makes `closeReason` in `PaywallInfo` non-optional.

Fixes [#fixes-80]

* Fixes issue where thrown exceptions weren't always being caught.

1.0.0-alpha.31 [#100-alpha31]

Enhancements [#enhancements-69]

* SW-2638: Adds `Restored` to `PurchaseResult`.
* SW-2644: Adds `RestoreType` to `SuperwallEvent.TransactionRestore`.
* SW-2643: Makes `storePayment` non-optional for a `StoreTransaction`.
* SW-2642: Adds `productIdentifier` to `StorePayment`.

Fixes [#fixes-81]

* SW-2635: Fixes crash that sometimes occurred if an app was trying to get Superwall's paywall
  configuration in the background.

1.0.0-alpha.30 [#100-alpha30]

Enhancements [#enhancements-70]

* SW-2154: The SDK now includes a paywall debugger, meaning you can scan the QR code of any paywall in the
  editor to preview it on device. You can change its localization, view product attributes, and view
  the paywall with or without a trial.

Fixes [#fixes-82]

* More bug fixes relating to the loading of products.

1.0.0-alpha.29 [#100-alpha29]

Fixes [#fixes-83]

* SW-2631: Fixes issue where paywalls weren't showing if the products within them had a base plan or
  offer ID set.

1.0.0-alpha.28 [#100-alpha28]

Fixes [#fixes-84]

* SW-2615: Fixes crash on Android versions \< 8 when accessing the Android 8+ only class Period.
* SW-2616: Fixes crash where the `PaywallViewController` was sometimes being added to a new parent view before
  being removed from it's existing parent view.

1.0.0-alpha.27 [#100-alpha27]

Breaking Changes [#breaking-changes-8]

* \#SW-2218: Changes the `PurchaseController` purchase function to `purchase(activity:productDetails:basePlanId:offerId:)`.
  This adds support for purchasing offers and base plans.

Enhancements [#enhancements-71]

* \#SW-2600: Backport device attributes
* Adds support for localized paywalls.
* Paywalls are only preloaded if their associated rules can match.
* Adds status bar to full screen paywalls.

Fixes [#fixes-85]

* Fixes issue where holdouts were still matching even if the limit set for their corresponding rules were exceeded.
* \#SW-2584: Fixes issue where prices with non-terminating decimals were causing products to fail to load.

1.0.0-alpha.26 [#100-alpha26]

Fixes [#fixes-86]

* Additional fixes to make Google billing more robust.
* Fixes an issue that causes `transaction_complete` events to fail.

1.0.0-alpha.25 [#100-alpha25]

Fixes [#fixes-87]

* Fixes [Google Billing Crash on Samsung devices](https://community.revenuecat.com/sdks-51/how-to-fix-crash-too-many-bind-requests-999-for-service-intent-inappbillingservice-3317).

1.0.0-alpha.24 [#100-alpha24]

Fixes [#fixes-88]

* Fixes an issue that could cause "n/a" to be displayed on a paywall in place of the proper subscription period string.

1.0.0-alpha.23 [#100-alpha23]

Fixes [#fixes-89]

* Fixes an issue where calling `identify` right after `configure` would hang b/c network requests need to access the user id to add to headers.
* Fixes a potential crash when loading data from disk

1.0.0-alpha.22 [#100-alpha22]

Fixes [#fixes-90]

* Fixes threading issue

1.0.0-alpha.21 [#100-alpha21]

Fixes [#fixes-91]

* Changes Activity to AppCompatActivity

1.0.0-alpha.20 [#100-alpha20]

Enhancements [#enhancements-72]

Fixes [#fixes-92]

* Fixes `app_open` race condition
* Prevents calling purchase twice
* Disables interactivity during purchase

1.0.0-alpha.19 [#100-alpha19]

Fixes [#fixes-93]

* Fixes `app_launch` event not triggering

1.0.0-alpha.18 [#100-alpha18]

Enhancements [#enhancements-73]

* Adds the ability to provide an `ActivityProvider` when configuring the SDK. This is an interface
  containing the function `getCurrentActivity()`, which Superwall will use to present paywalls from.
  You would typically conform an `ActivityLifecycleTracker` to this interface.

Fixes [#fixes-94]

* Fixes a crash when storing a `List` to user attributes and if that List or a Map had a null value.

1.0.0-alpha.17 [#100-alpha17]

Enhancements [#enhancements-74]

* Adds automatic purchase controller
* Improves memory handling for webviews
* Hides the loading indicator on a paywall if transactionBackgroundView is set to NONE

1.0.0-alpha.14 [#100-alpha14]

Enhancements [#enhancements-75]

* Adds `trigger_session_id` to Superwall Events.
* Resets the scroll position of the paywall on close.

Fixes [#fixes-95]

* Fixes issue where an invalid currency code on a device would crash the app when trying to retrieve products.

1.0.0-alpha.13 [#100-alpha13]

Fixes [#fixes-96]

* Fixes concurrency issues when setting and retrieving values like the appUserId and seed.

1.0.0-alpha.11 [#100-alpha11]

Fixes [#fixes-97]

* Can now use both non-recurring products and subscription products in paywalls.
* Fixes a crash issue that was caused by a lazy variable being accessed before it was initialized.