From 3356eef4ac81a6249444e58621897a1d5e6eee55 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Yusuf=20To=CC=88r?= Date: Tue, 24 Oct 2023 13:49:44 +0800 Subject: [PATCH] Fixed serialisation of computed property requests MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Added Android test 18 - an occurrence limit of once per minute. - Added Android test 19 – a daysSince test that only matches when one day has passed since the last `once_a_minute` event. --- .../superwall/superapp/test/UITestActivity.kt | 2 ++ .../superwall/superapp/test/UITestHandler.kt | 23 ++++++++++++ superwall/build.gradle.kts | 2 +- .../main/java/com/superwall/sdk/Superwall.kt | 2 +- .../models/config/ComputedPropertyRequest.kt | 36 ++++++++++++++----- .../superwall/sdk/models/paywall/Paywall.kt | 8 ++--- .../sdk/models/triggers/TriggerRule.kt | 2 +- .../sdk/storage/core_data/CoreDataManager.kt | 2 -- 8 files changed, 59 insertions(+), 18 deletions(-) diff --git a/app/src/main/java/com/superwall/superapp/test/UITestActivity.kt b/app/src/main/java/com/superwall/superapp/test/UITestActivity.kt index 351aefb6..cbf8bf3e 100644 --- a/app/src/main/java/com/superwall/superapp/test/UITestActivity.kt +++ b/app/src/main/java/com/superwall/superapp/test/UITestActivity.kt @@ -129,6 +129,8 @@ fun UITestTable() { UITestHandler.test82Info to { CoroutineScope(Dispatchers.IO).launch { UITestHandler.test82() } }, UITestHandler.testAndroid4Info to { CoroutineScope(Dispatchers.IO).launch { UITestHandler.testAndroid4() } }, UITestHandler.testAndroid9Info to { CoroutineScope(Dispatchers.IO).launch { UITestHandler.testAndroid9() } }, + UITestHandler.testAndroid18Info to { CoroutineScope(Dispatchers.IO).launch { UITestHandler.testAndroid18() } }, + UITestHandler.testAndroid19Info to { CoroutineScope(Dispatchers.IO).launch { UITestHandler.testAndroid19() } }, ) LazyColumn { diff --git a/app/src/main/java/com/superwall/superapp/test/UITestHandler.kt b/app/src/main/java/com/superwall/superapp/test/UITestHandler.kt index be3bdd69..d20340ff 100644 --- a/app/src/main/java/com/superwall/superapp/test/UITestHandler.kt +++ b/app/src/main/java/com/superwall/superapp/test/UITestHandler.kt @@ -1351,5 +1351,28 @@ class UITestHandler { suspend fun testAndroid9() { Superwall.instance.register(event = "one_time_occurrence") } + + var testAndroid18Info = UITestInfo( + 18, + "Tap launch button. It should display the paywall. Tap again and it should NOT " + + "display again within a minute, printing a NoRuleMatch in the console. After a " + + "minute, tap again, and it should show. You will need to delete and reinstall " + + "the app to test this again.", + testCaseType = TestCaseType.Android + ) + suspend fun testAndroid18() { + Superwall.instance.register(event = "once_a_minute") + } + + var testAndroid19Info = UITestInfo( + 19, + "Tap launch button. The paywall should not display until one day or longer has " + + "passed since the last once_a_minute event. You'll get a NoRuleMatch in the " + + "console.", + testCaseType = TestCaseType.Android + ) + suspend fun testAndroid19() { + Superwall.instance.register(event = "one_day_since_last_event") + } } } \ No newline at end of file diff --git a/superwall/build.gradle.kts b/superwall/build.gradle.kts index 2e167a38..94e6c7f3 100644 --- a/superwall/build.gradle.kts +++ b/superwall/build.gradle.kts @@ -20,7 +20,7 @@ plugins { } -version = "1.0.0-alpha08" +version = "1.0.0-alpha09" android { compileSdk = 33 diff --git a/superwall/src/main/java/com/superwall/sdk/Superwall.kt b/superwall/src/main/java/com/superwall/sdk/Superwall.kt index 87690cb0..6304fc1f 100644 --- a/superwall/src/main/java/com/superwall/sdk/Superwall.kt +++ b/superwall/src/main/java/com/superwall/sdk/Superwall.kt @@ -31,7 +31,7 @@ import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.filterNotNull import java.util.* -public class Superwall( +class Superwall( context: Context, apiKey: String, purchaseController: PurchaseController?, diff --git a/superwall/src/main/java/com/superwall/sdk/models/config/ComputedPropertyRequest.kt b/superwall/src/main/java/com/superwall/sdk/models/config/ComputedPropertyRequest.kt index d9cf39bc..75b53c65 100644 --- a/superwall/src/main/java/com/superwall/sdk/models/config/ComputedPropertyRequest.kt +++ b/superwall/src/main/java/com/superwall/sdk/models/config/ComputedPropertyRequest.kt @@ -1,4 +1,9 @@ +import com.superwall.sdk.config.models.SurveyShowCondition +import com.superwall.sdk.config.models.SurveyShowConditionSerializer +import kotlinx.serialization.KSerializer +import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable +import kotlinx.serialization.Serializer import java.util.Calendar import java.util.Date @@ -13,11 +18,21 @@ data class ComputedPropertyRequest( /** * The type of device property to compute. */ + @Serializable(with = ComputedPropertyRequestTypeSerializer::class) enum class ComputedPropertyRequestType(val rawValue: String) { + @SerialName("MINUTES_SINCE") MINUTES_SINCE("MINUTES_SINCE"), + + @SerialName("HOUSE_SINCE") HOURS_SINCE("HOURS_SINCE"), + + @SerialName("DAYS_SINCE") DAYS_SINCE("DAYS_SINCE"), + + @SerialName("MONTHS_SINCE") MONTHS_SINCE("MONTHS_SINCE"), + + @SerialName("YEARS_SINCE") YEARS_SINCE("YEARS_SINCE"); val prefix: String @@ -47,18 +62,21 @@ data class ComputedPropertyRequest( YEARS_SINCE -> components[Calendar.YEAR] } } + } - fun dateComponent(date: Date): Int { - val calendar = Calendar.getInstance() - calendar.time = date - return calendar.get(calendarComponent) + @Serializer(forClass = ComputedPropertyRequestType::class) + object ComputedPropertyRequestTypeSerializer : KSerializer { + override fun serialize( + encoder: kotlinx.serialization.encoding.Encoder, + value: ComputedPropertyRequestType + ) { + encoder.encodeString(value.rawValue) } - companion object { - fun fromRawValue(value: String): ComputedPropertyRequestType? { - return values().find { it.rawValue == value } - ?: throw IllegalArgumentException("Unsupported computed property type.") - } + override fun deserialize(decoder: kotlinx.serialization.encoding.Decoder): ComputedPropertyRequestType { + val rawValue = decoder.decodeString() + return ComputedPropertyRequestType.values().find { it.rawValue == rawValue } + ?: throw IllegalArgumentException("Unsupported computed property type.") } } } \ No newline at end of file diff --git a/superwall/src/main/java/com/superwall/sdk/models/paywall/Paywall.kt b/superwall/src/main/java/com/superwall/sdk/models/paywall/Paywall.kt index 143ef7d5..5a2ba13c 100644 --- a/superwall/src/main/java/com/superwall/sdk/models/paywall/Paywall.kt +++ b/superwall/src/main/java/com/superwall/sdk/models/paywall/Paywall.kt @@ -38,7 +38,7 @@ data class Paywall( ), @SerialName("presentation_style_v2") - private val presensentationStyle: String, + private val presentationStyle: String, private val presentationCondition: String, @@ -64,7 +64,7 @@ data class Paywall( var featureGating: FeatureGatingBehavior = FeatureGatingBehavior.NonGated, - @SerialName("computedProperties") + @SerialName("computed_properties") var computedPropertyRequests: List = emptyList(), /** @@ -87,7 +87,7 @@ data class Paywall( init { productIds = products.map { it.id } presentation = Presentation( - style = PaywallPresentationStyle.valueOf(presensentationStyle.uppercase()), + style = PaywallPresentationStyle.valueOf(presentationStyle.uppercase()), condition = PresentationCondition.valueOf(presentationCondition.uppercase()) ) } @@ -166,7 +166,7 @@ data class Paywall( PaywallPresentationStyle.MODAL, PresentationCondition.CHECK_USER_SUBSCRIPTION ), - presensentationStyle = "MODAL", + presentationStyle = "MODAL", presentationCondition = "CHECK_USER_SUBSCRIPTION", backgroundColorHex = "000000", products = arrayListOf(), diff --git a/superwall/src/main/java/com/superwall/sdk/models/triggers/TriggerRule.kt b/superwall/src/main/java/com/superwall/sdk/models/triggers/TriggerRule.kt index 6d213de6..7f424ed1 100644 --- a/superwall/src/main/java/com/superwall/sdk/models/triggers/TriggerRule.kt +++ b/superwall/src/main/java/com/superwall/sdk/models/triggers/TriggerRule.kt @@ -55,7 +55,7 @@ data class TriggerRule( val expression: String? = null, val expressionJs: String? = null, val occurrence: TriggerRuleOccurrence? = null, - @SerialName("computedProperties") + @SerialName("computed_properties") val computedPropertyRequests: List = emptyList() ) { diff --git a/superwall/src/main/java/com/superwall/sdk/storage/core_data/CoreDataManager.kt b/superwall/src/main/java/com/superwall/sdk/storage/core_data/CoreDataManager.kt index c6464d74..59f518c5 100644 --- a/superwall/src/main/java/com/superwall/sdk/storage/core_data/CoreDataManager.kt +++ b/superwall/src/main/java/com/superwall/sdk/storage/core_data/CoreDataManager.kt @@ -139,8 +139,6 @@ class CoreDataManager( } return request.type.dateComponent(componentsMap) - - } catch (error: Exception) { Logger.debug( logLevel = LogLevel.error,