subscriptionStatus
A StateFlow property that indicates the subscription status of the user.
If you're using a custom PurchaseController
, you must update this property whenever the user's entitlements change.
You can also observe changes via the SuperwallDelegate
method subscriptionStatusDidChange(from, to)
.
Purpose
Indicates the current subscription status of the user and can be observed for changes using Kotlin StateFlow.
Signature
val subscriptionStatus: StateFlow<SubscriptionStatus>
// For setting the status (when using custom PurchaseController)
fun setSubscriptionStatus(status: SubscriptionStatus)
// Java
public StateFlow<SubscriptionStatus> getSubscriptionStatus()
public void setSubscriptionStatus(SubscriptionStatus status)
Parameters
This property accepts a SubscriptionStatus
sealed class value:
SubscriptionStatus.Unknown
- Status is not yet determinedSubscriptionStatus.Active(Set<String>)
- User has active entitlements (set of entitlement identifiers)SubscriptionStatus.Inactive
- User has no active entitlements
Returns / State
Returns a StateFlow<SubscriptionStatus>
that emits the current subscription status. When using a PurchaseController
, you must set this property yourself using setSubscriptionStatus()
. Otherwise, Superwall manages it automatically.
Usage
Set subscription status (when using PurchaseController):
Superwall.instance.setSubscriptionStatus(
SubscriptionStatus.Active(setOf("premium", "pro_features"))
)
Superwall.instance.setSubscriptionStatus(SubscriptionStatus.Inactive)
Get current subscription status:
val status = Superwall.instance.subscriptionStatus.value
when (status) {
is SubscriptionStatus.Unknown ->
println("Subscription status unknown")
is SubscriptionStatus.Active ->
println("User has active entitlements: ${status.entitlements}")
is SubscriptionStatus.Inactive ->
println("User has no active subscription")
}
Observe changes with StateFlow:
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
lifecycleScope.launch {
Superwall.instance.subscriptionStatus.collect { status ->
updateUI(status)
}
}
}
private fun updateUI(status: SubscriptionStatus) {
when (status) {
is SubscriptionStatus.Active -> showPremiumContent()
is SubscriptionStatus.Inactive -> showFreeContent()
is SubscriptionStatus.Unknown -> showLoadingState()
}
}
}
Jetpack Compose observation:
@Composable
fun ContentScreen() {
val subscriptionStatus by Superwall.instance.subscriptionStatus
.collectAsState()
Column {
when (subscriptionStatus) {
is SubscriptionStatus.Active -> {
Text("Premium user with: ${subscriptionStatus.entitlements.joinToString()}")
}
is SubscriptionStatus.Inactive -> {
Text("Free user")
}
is SubscriptionStatus.Unknown -> {
Text("Loading...")
}
}
}
}
Java usage:
// Get current status
SubscriptionStatus status = Superwall.getInstance()
.getSubscriptionStatus().getValue();
// Observe changes
Superwall.getInstance().getSubscriptionStatus()
.observe(this, status -> {
updateUI(status);
});
// Set status (when using PurchaseController)
Superwall.getInstance().setSubscriptionStatus(
new SubscriptionStatus.Active(Set.of("premium"))
);
How is this guide?