Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions superwall/src/main/java/com/superwall/sdk/Superwall.kt
Original file line number Diff line number Diff line change
Expand Up @@ -1232,6 +1232,9 @@ class Superwall(
}
}
}
is PaywallWebEvent.RequestPermission -> {
dependencyContainer.userPermissions.requestPermission()
}
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,8 @@ import com.superwall.sdk.paywall.view.webview.messaging.PaywallMessageHandler
import com.superwall.sdk.paywall.view.webview.templating.models.JsonVariables
import com.superwall.sdk.paywall.view.webview.templating.models.Variables
import com.superwall.sdk.paywall.view.webview.webViewExists
import com.superwall.sdk.permissions.UserPermissions
import com.superwall.sdk.permissions.UserPermissionsImpl
import com.superwall.sdk.review.MockReviewManager
import com.superwall.sdk.review.ReviewManager
import com.superwall.sdk.review.ReviewManagerImpl
Expand Down Expand Up @@ -160,6 +162,7 @@ class DependencyContainer(
val transactionManager: TransactionManager
val googleBillingWrapper: GoogleBillingWrapper
internal val reviewManager: ReviewManager
internal val userPermissions: UserPermissions

var entitlements: Entitlements
lateinit var reedemer: WebPaywallRedeemer
Expand All @@ -180,6 +183,7 @@ class DependencyContainer(
storage = storage.coreDataManager,
factory = this,
ioScope = ioScope,
dependencyContainer = this,
),
)
}
Expand Down Expand Up @@ -478,6 +482,8 @@ class DependencyContainer(
})
}

userPermissions = UserPermissionsImpl(context)

deepLinkRouter =
DeepLinkRouter(
reedemer,
Expand Down Expand Up @@ -565,7 +571,9 @@ class DependencyContainer(
PaywallMessageHandler(
sessionEventsManager = sessionEventsManager,
factory = this@DependencyContainer,
ruleEvaluatorFactory = this@DependencyContainer,
ioScope = ioScope,
userPermissions = userPermissions,
json = paywallJson,
mainScope = mainScope(),
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -615,8 +615,8 @@ class DeviceHelper(
platformWrapperVersion = platformWrapperVersion,
appVersionPadded = appVersionPadded,
deviceTier = classifier.deviceTier().raw,
hasReviewed = hasReviewed,
kotlinVersion = kotlinVersion,
hasReviewed = hasReviewed,
)
}.toResult()
.map {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,10 +43,12 @@ internal class SuperscriptEvaluator(
private val ioScope: IOScope,
private val storage: CoreDataManager,
private val factory: RuleAttributesFactory,
private val dependencyContainer: com.superwall.sdk.dependencies.DependencyContainer? = null,
private val hostContext: SuperscriptHostContext =
SuperscriptHostContext(
json,
storage,
dependencyContainer,
),
) : ExpressionEvaluating {
class NotError(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,8 @@ sealed class SuperscriptExposedFunction {
REVIEW_REQUESTS_IN_YEAR("reviewRequestsInYear"),
REVIEW_REQUESTS_TOTAL("reviewRequestsTotal"),
REQUEST_REVIEW("requestReview"),
HAS_PERMISSION("hasPermission"),
REQUEST_PERMISSION("requestPermission"),
}

class MinutesSince(
Expand Down Expand Up @@ -129,6 +131,26 @@ sealed class SuperscriptExposedFunction {
}
}

class HasPermission(
val permission: String,
) : SuperscriptExposedFunction() {
suspend operator fun invoke(storage: CoreDataManager): Boolean {
// This will be handled by the SuperscriptHostContext
// For now, return false as default
return false
}
}

class RequestPermission(
val permission: String,
) : SuperscriptExposedFunction() {
suspend operator fun invoke(storage: CoreDataManager): Boolean {
// This will be handled by the SuperscriptHostContext
// For now, return false as default
return false
}
}

companion object {
fun from(
name: String,
Expand Down Expand Up @@ -190,6 +212,16 @@ sealed class SuperscriptExposedFunction {
REQUEST_REVIEW.rawName ->
RequestReview

HAS_PERMISSION.rawName ->
HasPermission(
permission = (args.first() as PassableValue.StringValue).value,
)

REQUEST_PERMISSION.rawName ->
RequestPermission(
permission = (args.first() as PassableValue.StringValue).value,
)

else -> null
}
}
Expand All @@ -200,13 +232,14 @@ sealed interface TimeSince {
val propertyRequest: ComputedPropertyRequestType

suspend operator fun invoke(storage: CoreDataManager): Int =
storage.getComputedPropertySinceEvent(
null,
ComputedPropertyRequest(
propertyRequest,
event,
),
) ?: 0
storage
.getComputedPropertySinceEvent(
null,
ComputedPropertyRequest(
propertyRequest,
event,
),
) ?: 0
}

sealed interface InPeriod {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package com.superwall.sdk.paywall.presentation.rule_logic.cel

import com.superwall.sdk.dependencies.DependencyContainer
import com.superwall.sdk.paywall.presentation.rule_logic.cel.models.PassableValue
import com.superwall.sdk.permissions.CommonPermission
import com.superwall.sdk.storage.core_data.CoreDataManager
import com.superwall.supercel.HostContext
import com.superwall.supercel.ResultCallback
Expand All @@ -11,6 +13,7 @@ import kotlinx.serialization.json.Json
class SuperscriptHostContext(
private val json: Json,
private val storage: CoreDataManager,
private val dependencyContainer: DependencyContainer? = null,
) : HostContext {
companion object ComputedProperties {
val availableComputedProperties =
Expand Down Expand Up @@ -44,6 +47,32 @@ class SuperscriptHostContext(
is SuperscriptExposedFunction.PlacementCount -> fn(storage)
is SuperscriptExposedFunction.ReviewRequestCount -> fn(storage)
is SuperscriptExposedFunction.RequestReview -> fn(storage)
is SuperscriptExposedFunction.HasPermission -> {
val permission =
CommonPermission.fromName(fn.permission)
?: CommonPermission.fromRaw(fn.permission)
if (permission != null && dependencyContainer != null) {
dependencyContainer.userPermissions.hasPermission(permission)
} else {
false
}
}
is SuperscriptExposedFunction.RequestPermission -> {
val permission =
CommonPermission.fromName(fn.permission)
?: CommonPermission.fromRaw(fn.permission)
val activity = dependencyContainer?.activityProvider?.getCurrentActivity()
if (permission != null && dependencyContainer != null && activity != null) {
try {
val result = dependencyContainer.userPermissions.requestPermission(activity, permission)
result is com.superwall.sdk.permissions.PermissionResult.Granted
} catch (e: Exception) {
false
}
} else {
false
}
}
}
}
callback.onResult(json.encodeToString<PassableValue>(res?.toPassableValue() ?: PassableValue.NullValue))
Expand Down Expand Up @@ -74,6 +103,32 @@ class SuperscriptHostContext(
is SuperscriptExposedFunction.PlacementCount -> fn(storage)
is SuperscriptExposedFunction.ReviewRequestCount -> fn(storage)
is SuperscriptExposedFunction.RequestReview -> fn(storage)
is SuperscriptExposedFunction.HasPermission -> {
val permission =
CommonPermission.fromName(fn.permission)
?: CommonPermission.fromRaw(fn.permission)
if (permission != null && dependencyContainer != null) {
dependencyContainer.userPermissions.hasPermission(permission)
} else {
false
}
}
is SuperscriptExposedFunction.RequestPermission -> {
val permission =
CommonPermission.fromName(fn.permission)
?: CommonPermission.fromRaw(fn.permission)
val activity = dependencyContainer?.activityProvider?.getCurrentActivity()
if (permission != null && dependencyContainer != null && activity != null) {
try {
val result = dependencyContainer.userPermissions.requestPermission(activity, permission)
result is com.superwall.sdk.permissions.PermissionResult.Granted
} catch (e: Exception) {
false
}
} else {
false
}
}
}
}
callback.onResult(json.encodeToString<PassableValue>(res?.toPassableValue() ?: PassableValue.NullValue))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import android.net.Uri
import com.superwall.sdk.logger.LogLevel
import com.superwall.sdk.logger.LogScope
import com.superwall.sdk.logger.Logger
import com.superwall.sdk.permissions.CommonPermission
import org.json.JSONObject
import java.net.URI

Expand Down Expand Up @@ -71,6 +72,17 @@ sealed class PaywallMessage {
EXTERNAL("external"),
}
}

data class EvalSuperscript(
val id: String,
val await: Boolean,
val expression: String,
val state: String,
) : PaywallMessage()

data class RequestPermission(
val permission: CommonPermission,
) : PaywallMessage()
}

fun parseWrappedPaywallMessages(jsonString: String): WrappedPaywallMessages {
Expand Down Expand Up @@ -124,8 +136,18 @@ private fun parsePaywallMessage(json: JSONObject): PaywallMessage {
else -> PaywallMessage.RequestReview.Type.INAPP
},
)
else -> {
throw IllegalArgumentException("Unknown event name: $eventName")
}
"eval_superscript" ->
PaywallMessage.EvalSuperscript(
id = json.getString("id"),
await = json.getBoolean("await"),
expression = json.getString("expression"),
state = json.getString("state"),
)
"request_permission" ->
CommonPermission.fromRaw(json.getString("type"))?.let {
PaywallMessage.RequestPermission(it)
} ?: throw NullPointerException()

else -> throw IllegalArgumentException("Unknown event name: $eventName")
}
}
Loading
Loading