Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: Add basic customer center events #2075

Merged
merged 11 commits into from
Jan 29, 2025
Merged
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package com.revenuecat.purchases.customercenter.events

import com.revenuecat.purchases.ExperimentalPreviewRevenueCatPurchasesAPI
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable

/**
* Display mode for the Customer Center. Meant for RevenueCatUI use.
*/
@Serializable
@ExperimentalPreviewRevenueCatPurchasesAPI
enum class CustomerCenterDisplayMode {

@SerialName("full_screen")
FULL_SCREEN,
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
package com.revenuecat.purchases.customercenter.events

import androidx.annotation.VisibleForTesting
import com.revenuecat.purchases.ExperimentalPreviewRevenueCatPurchasesAPI
import com.revenuecat.purchases.utils.serializers.DateSerializer
import com.revenuecat.purchases.utils.serializers.UUIDSerializer
import dev.drewhamilton.poko.Poko
import kotlinx.serialization.Serializable
import kotlinx.serialization.json.Json
import java.util.Date
import java.util.UUID

/**
* Type representing a customer center event and associated data. Meant for RevenueCatUI use.
*/
@ExperimentalPreviewRevenueCatPurchasesAPI
@Poko
@Serializable
class CustomerCenterEvent(
val creationData: CreationData,
val eventData: Data,
) {

companion object {
@VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)
internal val json = Json.Default
}

@ExperimentalPreviewRevenueCatPurchasesAPI
@Poko
@Serializable
class CreationData(
@Serializable(with = UUIDSerializer::class)
val id: UUID,

Check warning on line 34 in purchases/src/main/kotlin/com/revenuecat/purchases/customercenter/events/CustomerCenterEvent.kt

View check run for this annotation

Codecov / codecov/patch

purchases/src/main/kotlin/com/revenuecat/purchases/customercenter/events/CustomerCenterEvent.kt#L34

Added line #L34 was not covered by tests
@Serializable(with = DateSerializer::class)
val date: Date,

Check warning on line 36 in purchases/src/main/kotlin/com/revenuecat/purchases/customercenter/events/CustomerCenterEvent.kt

View check run for this annotation

Codecov / codecov/patch

purchases/src/main/kotlin/com/revenuecat/purchases/customercenter/events/CustomerCenterEvent.kt#L36

Added line #L36 was not covered by tests
)

@ExperimentalPreviewRevenueCatPurchasesAPI
@Poko
@Serializable
@SuppressWarnings("LongParameterList")
class Data(
val type: CustomerCenterEventType,
@Serializable(with = DateSerializer::class)
val timestamp: Date,

Check warning on line 46 in purchases/src/main/kotlin/com/revenuecat/purchases/customercenter/events/CustomerCenterEvent.kt

View check run for this annotation

Codecov / codecov/patch

purchases/src/main/kotlin/com/revenuecat/purchases/customercenter/events/CustomerCenterEvent.kt#L46

Added line #L46 was not covered by tests
val darkMode: Boolean,
val locale: String,
val isSandbox: Boolean,
val version: Int = 1,
val revisionId: Int = 1,
val displayMode: CustomerCenterDisplayMode = CustomerCenterDisplayMode.FULL_SCREEN,
)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package com.revenuecat.purchases.customercenter.events

import com.revenuecat.purchases.ExperimentalPreviewRevenueCatPurchasesAPI
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable

/**
* Types of events that can be tracked in the Customer Center. Meant for RevenueCatUI use.
*/
@Serializable
@ExperimentalPreviewRevenueCatPurchasesAPI
enum class CustomerCenterEventType {
/**
* The customer center was shown to the user.
*/
@SerialName("customer_center_impression")
IMPRESSION,

/**
* The customer center was closed by the user.
*/
@SerialName("customer_center_survey_option_chosen")
SURVEY_OPTION_CHOSEN,
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
package com.revenuecat.purchases.customercenter.events

import kotlinx.serialization.decodeFromString
import kotlinx.serialization.encodeToString
import kotlinx.serialization.json.Json
import org.assertj.core.api.Assertions.assertThat
import androidx.test.ext.junit.runners.AndroidJUnit4
import com.revenuecat.purchases.ExperimentalPreviewRevenueCatPurchasesAPI
import org.json.JSONObject
import org.junit.Test
import org.junit.runner.RunWith
import java.util.Date
import java.util.UUID

@OptIn(ExperimentalPreviewRevenueCatPurchasesAPI::class)
@RunWith(AndroidJUnit4::class)
public class CustomerCenterEventSerializationTests {

val event = CustomerCenterEvent(
creationData = CustomerCenterEvent.CreationData(
id = UUID.fromString("298207f4-87af-4b57-a581-eb27bcc6e009"),
date = Date(1699270688884)
),
eventData = CustomerCenterEvent.Data(
type = CustomerCenterEventType.IMPRESSION,
timestamp = Date(1699270688884),
darkMode = true,
locale = "en_US",
isSandbox = true,
version = 1,
revisionId = 1,
)
)

@Test
fun `can encode customer center event correctly`() {
val eventString: String = CustomerCenterEvent.json.encodeToString(event)
val expectedJson = "{\"creationData\":{\"id\":\"298207f4-87af-4b57-a581-eb27bcc6e009\",\"date\":1699270688884},\"eventData\":{\"type\":\"customer_center_impression\",\"timestamp\":1699270688884,\"darkMode\":true,\"locale\":\"en_US\",\"isSandbox\":true}}"

assertThat(eventString).isEqualTo(expectedJson)
}

@Test
fun `can encode and decode event correctly`() {
val eventString = CustomerCenterEvent.json.encodeToString(event)
print(eventString)
val decodedEvent = CustomerCenterEvent.json.decodeFromString<CustomerCenterEvent>(eventString)
assertThat(decodedEvent).isEqualTo(event)
}
}