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: LogLevel,
scope: LogScope,
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(
LogLevel level,
LogScope scope,
String message,
Map<String, Object> info,
Throwable error
) {}
}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?
Edit on GitHub