SuperwallDelegate
An interface that handles Superwall lifecycle events and analytics.
Set the delegate using Superwall.instance.delegate = this to receive these callbacks. For Java, use setJavaDelegate() for better Java interop.
Use handleSuperwallEvent(eventInfo) to track Superwall analytics events in your own analytics platform for a complete view of user behavior.
Purpose
Provides callbacks for Superwall lifecycle events, analytics tracking, and custom paywall interactions.
Signature
interface SuperwallDelegate {
fun subscriptionStatusDidChange(
from: SubscriptionStatus,
to: SubscriptionStatus
) {}
fun customerInfoDidChange(
from: CustomerInfo,
to: CustomerInfo
) {}
fun userAttributesDidChange(newAttributes: Map<String, Any>) {}
fun handleSuperwallEvent(eventInfo: SuperwallEventInfo) {}
fun handleCustomPaywallAction(name: String) {}
fun willDismissPaywall(paywallInfo: PaywallInfo) {}
fun willPresentPaywall(paywallInfo: PaywallInfo) {}
fun didDismissPaywall(paywallInfo: PaywallInfo) {}
fun didPresentPaywall(paywallInfo: PaywallInfo) {}
fun paywallWillOpenURL(url: String) {}
fun paywallWillOpenDeepLink(url: String) {}
fun handleLog(
level: String,
scope: String,
message: String?,
info: Map<String, Any>?,
error: Throwable?
) {}
}// Java - Use SuperwallDelegateJava for better Java interop
public interface SuperwallDelegateJava {
default void subscriptionStatusDidChange(
SubscriptionStatus from,
SubscriptionStatus to
) {}
default void customerInfoDidChange(
CustomerInfo from,
CustomerInfo to
) {}
default void userAttributesDidChange(Map<String, Object> newAttributes) {}
default void handleSuperwallEvent(SuperwallEventInfo eventInfo) {}
default void handleCustomPaywallAction(String name) {}
default void willDismissPaywall(PaywallInfo paywallInfo) {}
default void willPresentPaywall(PaywallInfo paywallInfo) {}
default void didDismissPaywall(PaywallInfo paywallInfo) {}
default void didPresentPaywall(PaywallInfo paywallInfo) {}
default void paywallWillOpenURL(String url) {}
default void paywallWillOpenDeepLink(String url) {}
default void handleLog(
String level,
String scope,
String message,
Map<String, Object> info,
Throwable error
) {}
}handleLog receives level and scope as String, not as the LogLevel and LogScope enums. The SDK passes their string forms — level is one of "DEBUG", "INFO", "WARN", "ERROR", or "NONE". To compare against a case, use toString(): level == LogLevel.error.toString().
As of 2.8.2, handleLog is always called on a dedicated background thread (previously it could be called on any thread, including main). If your implementation touches UI directly, dispatch to the main thread yourself.
Parameters
All methods are optional to implement. Key methods include:
Prop
Type
Returns / State
All delegate methods return Unit. They provide information about Superwall events and state changes.
Usage
Basic delegate setup:
class MainActivity : AppCompatActivity(), SuperwallDelegate {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
Superwall.instance.delegate = this
}
}Track subscription status changes:
override fun subscriptionStatusDidChange(
from: SubscriptionStatus,
to: SubscriptionStatus
) {
println("Subscription changed from $from to $to")
updateUI(to)
}Mirror merged purchase history:
override fun customerInfoDidChange(
from: CustomerInfo,
to: CustomerInfo
) {
if (from.activeSubscriptionProductIds != to.activeSubscriptionProductIds) {
Analytics.track("customer_info_updated", mapOf(
"old_products" to from.activeSubscriptionProductIds.joinToString(),
"new_products" to to.activeSubscriptionProductIds.joinToString()
))
}
refreshEntitlementBadge(to.entitlements.filter { it.isActive }.map { it.id })
}Capture remote attribute changes:
override fun userAttributesDidChange(newAttributes: Map<String, Any>) {
// Paywall forms or surveys can set attributes directly.
// Forward them to your analytics platform or local cache.
analytics.identify(newAttributes)
}Forward analytics events:
override fun handleSuperwallEvent(eventInfo: SuperwallEventInfo) {
when (val event = eventInfo.event) {
is SuperwallEvent.PaywallOpen -> {
Analytics.track("paywall_opened", mapOf(
"paywall_id" to event.paywallInfo.id,
"placement" to event.paywallInfo.placement
))
}
is SuperwallEvent.TransactionComplete -> {
Analytics.track("subscription_purchased", mapOf(
"product_id" to event.product.id,
"paywall_id" to event.paywallInfo.id
))
}
else -> {
// Handle other events
}
}
}Handle custom paywall actions:
override fun handleCustomPaywallAction(name: String) {
when (name) {
"help" -> presentHelpScreen()
"contact" -> presentContactForm()
else -> println("Unknown custom action: $name")
}
}Handle paywall lifecycle:
override fun willPresentPaywall(paywallInfo: PaywallInfo) {
// Pause video, hide UI, etc.
pauseBackgroundTasks()
}
override fun didDismissPaywall(paywallInfo: PaywallInfo) {
// Resume video, show UI, etc.
resumeBackgroundTasks()
}Java usage:
public class MainActivity extends AppCompatActivity implements SuperwallDelegateJava {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Superwall.getInstance().setJavaDelegate(this);
}
@Override
public void subscriptionStatusDidChange(
SubscriptionStatus from,
SubscriptionStatus to
) {
System.out.println("Subscription changed from " + from + " to " + to);
updateUI(to);
}
@Override
public void customerInfoDidChange(
CustomerInfo from,
CustomerInfo to
) {
Logger.i("Superwall", "Customer info updated: " + to.getActiveSubscriptionProductIds());
syncUserPurchases(to);
}
@Override
public void userAttributesDidChange(Map<String, Object> newAttributes) {
analytics.identify(newAttributes);
}
}How is this guide?