Skip to content
Merged
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
6 changes: 3 additions & 3 deletions destination-filters-kotlin/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -31,9 +31,9 @@ android {
}

dependencies {
implementation 'com.segment.analytics.kotlin:analytics-kotlin-live:1.0.1'
implementation 'com.segment.analytics.kotlin:substrata:1.0.0'
implementation 'com.segment.analytics.kotlin:android:1.16.3'
implementation 'com.segment.analytics.kotlin:analytics-kotlin-live:1.2.0'
implementation 'com.segment.analytics.kotlin:substrata:1.1.1'
implementation 'com.segment.analytics.kotlin:android:1.20.0'
implementation 'androidx.core:core-ktx:1.7.0'
testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.ext:junit:1.1.3'
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import com.segment.analytics.kotlin.core.utilities.toBaseEvent
import com.segment.analytics.substrata.kotlin.JSObject
import com.segment.analytics.substrata.kotlin.JSScope
import com.segment.analytics.substrata.kotlin.JsonElementConverter
import kotlinx.serialization.json.JsonElement
import kotlinx.serialization.json.JsonObject
import kotlinx.serialization.json.contentOrNull
import kotlinx.serialization.json.encodeToJsonElement
Expand Down Expand Up @@ -39,13 +40,24 @@ class DestinationFilters : Plugin {
override val type: Plugin.Type = Plugin.Type.Utility
var engine: JSScope? = null

private var cachedRules: JsonElement? = null
private val metricsPlugin = MetricsPlugin()

// Call this function when app is destroyed, to prevent memory leaks
fun release() {
engine?.release()
engine = null
cachedRules = null
metricsPlugin.setOfActiveDestinations.clear()
}

override fun setup(analytics: Analytics) {
super.setup(analytics)
analytics.add(metricsPlugin)
}

override fun update(settings: Settings, type: Plugin.UpdateType) {
var engineRecreated = false
if (engine == null) {
engine = JSScope {
it.printStackTrace()
Expand All @@ -54,26 +66,33 @@ class DestinationFilters : Plugin {
evaluate(tsubScript)
evaluate(tsubEvaluate)
}
engineRecreated = true
}

removeExistingFilters()
var cacheInvalidated = false
if (cachedRules != settings.middlewareSettings["routingRules"]) {
cachedRules = settings.middlewareSettings["routingRules"]
cacheInvalidated = true
}

// If the engine has NOT been recreated and the cache/rules have not been invalidated then we can exit early.
if (!engineRecreated && !cacheInvalidated) return

val setOfActiveDestinations = mutableSetOf<String>()
settings.middlewareSettings["routingRules"]?.safeJsonArray?.let { rules ->
metricsPlugin.setOfActiveDestinations.clear()
removeExistingFilters()
cachedRules?.safeJsonArray?.let { rules ->
for (it in rules) {
val rule = it.jsonObject
val destination: String =
rule["destinationName"]?.jsonPrimitive?.contentOrNull ?: ""
if (destination.isNotBlank()) {
val added = createFilter(destination, rule)
if (added) {
setOfActiveDestinations.add(destination)
metricsPlugin.setOfActiveDestinations.add(destination)
}
}
}
}

analytics.add(MetricsPlugin(setOfActiveDestinations))
}

private fun removeExistingFilters() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,33 +4,30 @@ import com.segment.analytics.kotlin.core.Analytics
import com.segment.analytics.kotlin.core.BaseEvent
import com.segment.analytics.kotlin.core.platform.Plugin
import com.segment.analytics.kotlin.core.utilities.putInContextUnderKey
import kotlinx.serialization.json.JsonArray
import kotlinx.serialization.json.add
import kotlinx.serialization.json.buildJsonArray
import kotlinx.serialization.json.buildJsonObject
import kotlinx.serialization.json.put
import kotlinx.serialization.json.putJsonArray
import java.util.concurrent.CopyOnWriteArraySet

class MetricsPlugin(setOfActiveDestinations: Set<String>): Plugin {
class MetricsPlugin: Plugin {

private val activeDestinations: JsonArray

init {
activeDestinations = buildJsonArray {
for (dest in setOfActiveDestinations) {
add(dest)
}
}
}
val setOfActiveDestinations = CopyOnWriteArraySet<String>()

override val type: Plugin.Type = Plugin.Type.Enrichment
override lateinit var analytics: Analytics

override fun execute(event: BaseEvent): BaseEvent? {
event.putInContextUnderKey(
"plugins",
"destination-filters",
buildJsonObject {
put("version", DestinationFilters.version)
put("active", activeDestinations)
putJsonArray("active") {
for (dest in setOfActiveDestinations) {
add(dest)
}
}
}
)
return super.execute(event)
Expand Down
Binary file modified gradle/wrapper/gradle-wrapper.jar
Binary file not shown.
7 changes: 4 additions & 3 deletions gradle/wrapper/gradle-wrapper.properties
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
#Wed Aug 17 10:50:02 PDT 2022
distributionBase=GRADLE_USER_HOME
distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-bin.zip
distributionPath=wrapper/dists
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-bin.zip
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
Loading