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
53 changes: 5 additions & 48 deletions appcues/src/main/java/com/appcues/AnalyticsPublisher.kt
Original file line number Diff line number Diff line change
Expand Up @@ -6,17 +6,16 @@ import com.appcues.AnalyticType.IDENTIFY
import com.appcues.AnalyticType.SCREEN
import com.appcues.analytics.ActivityRequestBuilder
import com.appcues.analytics.TrackingData
import com.appcues.data.model.ExperienceStepFormState
import com.appcues.data.remote.appcues.request.EventRequest
import java.util.Date
import java.util.UUID
import com.appcues.util.DataSanitizer

internal class AnalyticsPublisher(
private val storage: Storage
private val storage: Storage,
private val dataSanitizer: DataSanitizer,
) {

fun publish(listener: AnalyticsListener?, data: TrackingData) {
if (listener == null) return
fun publish(listener: AnalyticsListener?, data: TrackingData) = with(dataSanitizer) {
if (listener == null) return@with

when (data.type) {
EVENT -> data.request.events?.forEach {
Expand All @@ -32,46 +31,4 @@ internal class AnalyticsPublisher(

private fun EventRequest.screenTitle(): String? =
attributes[ActivityRequestBuilder.SCREEN_TITLE_ATTRIBUTE] as? String

private fun Map<*, *>.sanitize(): MutableMap<String, Any> {
val sanitizedMap = mutableMapOf<String, Any>()

forEach {
val key = it.key
val value = it.value
if (key is String && value != null) {
sanitizedMap[key] = when (value) {
is ExperienceStepFormState -> value.toHashMap().sanitize()
// convert Date types to Double value
is Date -> value.time.toDouble()
// convert UUID to string value
is UUID -> value.toString()
is Map<*, *> -> value.sanitize()
is List<*> -> value.sanitize()
else -> value
}
}
}
return sanitizedMap
}

private fun List<*>.sanitize(): List<*> {
val sanitizedList = mutableListOf<Any>()

filterNotNull().forEach {
sanitizedList.add(
when (it) {
is ExperienceStepFormState -> it.toHashMap().sanitize()
// convert Date types to Double value
is Date -> it.time.toDouble()
// convert UUID to string value
is UUID -> it.toString()
is Map<*, *> -> it.sanitize()
is List<*> -> it.sanitize()
else -> it
}
)
}
return sanitizedList
}
}
4 changes: 3 additions & 1 deletion appcues/src/main/java/com/appcues/MainModule.kt
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ import com.appcues.ui.ExperienceRenderer
import com.appcues.ui.StateMachineDirectory
import com.appcues.ui.utils.ImageLoaderWrapper
import com.appcues.util.AppcuesViewTreeOwner
import com.appcues.util.DataSanitizer
import com.appcues.util.LinkOpener
import kotlinx.coroutines.CoroutineScope

Expand Down Expand Up @@ -51,7 +52,8 @@ internal object MainModule : AppcuesModule {
}
scoped { PushRepository(get(), get()) }
scoped { LinkOpener(get()) }
scoped { AnalyticsPublisher(storage = get()) }
scoped { DataSanitizer() }
scoped { AnalyticsPublisher(get(), get()) }

factory { StateMachine(actionProcessor = get(), lifecycleTracker = get(), onEndedExperience = it.next()) }

Expand Down
53 changes: 53 additions & 0 deletions appcues/src/main/java/com/appcues/util/DataSanitizer.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
package com.appcues.util

import com.appcues.data.model.ExperienceStepFormState
import org.jetbrains.annotations.VisibleForTesting
import java.util.Date
import java.util.UUID

internal class DataSanitizer {

fun Map<*, *>.sanitize(): Map<String, Any> {
val sanitizedMap = mutableMapOf<String, Any>()

forEach {
val key = it.key
val value = it.value
if (key is String && value != null) {
sanitizedMap[key] = when (value) {
is ExperienceStepFormState -> value.toHashMap().sanitize()
// convert Date types to Double value
is Date -> value.time.toDouble()
// convert UUID to string value
is UUID -> value.toString()
is Map<*, *> -> value.sanitize()
is List<*> -> value.sanitize()
else -> value
}
}
}

return sanitizedMap
}

@VisibleForTesting
fun List<*>.sanitize(): List<Any> {
val sanitizedList = mutableListOf<Any>()

filterNotNull().forEach { item ->
sanitizedList.add(
when (item) {
is ExperienceStepFormState -> item.toHashMap().sanitize()
// convert Date types to Double value
is Date -> item.time.toDouble()
// convert UUID to string value
is UUID -> item.toString()
is Map<*, *> -> item.sanitize()
is List<*> -> item.sanitize()
else -> item
}
)
}
return sanitizedList
}
}
Loading