From b0201e4358ae6b65e5ea3ec3ecb9c268b5b45035 Mon Sep 17 00:00:00 2001 From: Guillaume Bero Date: Tue, 13 Feb 2024 17:11:54 +0100 Subject: [PATCH] We observed crashes with devices running Android API 23. Initialization of FocalMeterConfiguration would crash. A thread (https://github.com/snowplow/snowplow-android-tracker/issues/601) in the issue tracker suggested to use of coreLibraryDesugaring but this might be avoided. remove usage of java.util.function.* in order to get rid of library desugaring. --- snowplow-demo-java/build.gradle | 3 --- .../snowplowtrackerdemojava/Demo.java | 5 ++++- snowplow-tracker/build.gradle | 4 ---- .../core/statemachine/PluginStateMachine.kt | 6 +++--- .../configuration/FocalMeterConfiguration.kt | 5 ++--- .../configuration/PluginConfiguration.kt | 16 +++++++--------- 6 files changed, 16 insertions(+), 23 deletions(-) diff --git a/snowplow-demo-java/build.gradle b/snowplow-demo-java/build.gradle index 139b97a7d..0881cf9ee 100644 --- a/snowplow-demo-java/build.gradle +++ b/snowplow-demo-java/build.gradle @@ -34,7 +34,6 @@ android { } compileOptions { - coreLibraryDesugaringEnabled true sourceCompatibility = JavaVersion.VERSION_1_8 targetCompatibility = JavaVersion.VERSION_1_8 } @@ -52,6 +51,4 @@ dependencies { implementation 'androidx.appcompat:appcompat:1.6.1' implementation 'com.squareup.okhttp3:okhttp:4.10.0' implementation 'com.google.code.gson:gson:2.9.0' - - coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.9' } diff --git a/snowplow-demo-java/src/main/java/com/snowplowanalytics/snowplowtrackerdemojava/Demo.java b/snowplow-demo-java/src/main/java/com/snowplowanalytics/snowplowtrackerdemojava/Demo.java index 33057cf65..ec94be7b1 100644 --- a/snowplow-demo-java/src/main/java/com/snowplowanalytics/snowplowtrackerdemojava/Demo.java +++ b/snowplow-demo-java/src/main/java/com/snowplowanalytics/snowplowtrackerdemojava/Demo.java @@ -336,7 +336,10 @@ private boolean setupWithLocalConfig() { gcConfiguration.add("ruleSetExampleTag", new GlobalContext(Collections.singletonList(new SelfDescribingJson(SCHEMA_IDENTIFY, pairs)))); PluginConfiguration plugin = new PluginConfiguration("myPlugin"); - plugin.afterTrack(null, event -> System.out.printf("Tracked event with %d entities%n", event.getEntities().size())); + plugin.afterTrack(null, (event) -> { + System.out.printf("Tracked event with %d entities%n", event.getEntities().size()); + return null; + }); Snowplow.createTracker(getApplicationContext(), namespace, diff --git a/snowplow-tracker/build.gradle b/snowplow-tracker/build.gradle index a921086de..ff84bc670 100755 --- a/snowplow-tracker/build.gradle +++ b/snowplow-tracker/build.gradle @@ -67,8 +67,6 @@ android { } compileOptions { - coreLibraryDesugaringEnabled true - sourceCompatibility = JavaVersion.VERSION_1_8 targetCompatibility = JavaVersion.VERSION_1_8 } @@ -92,8 +90,6 @@ dependencies { compileOnly "androidx.lifecycle:lifecycle-extensions:$project.archLifecycleVersion" compileOnly "com.android.installreferrer:installreferrer:2.2" - coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.9' - implementation fileTree(dir: 'libs', include: ['*.jar']) implementation 'com.squareup.okhttp3:okhttp:4.10.0' // test diff --git a/snowplow-tracker/src/main/java/com/snowplowanalytics/core/statemachine/PluginStateMachine.kt b/snowplow-tracker/src/main/java/com/snowplowanalytics/core/statemachine/PluginStateMachine.kt index 18908939a..ca0c89277 100644 --- a/snowplow-tracker/src/main/java/com/snowplowanalytics/core/statemachine/PluginStateMachine.kt +++ b/snowplow-tracker/src/main/java/com/snowplowanalytics/core/statemachine/PluginStateMachine.kt @@ -59,7 +59,7 @@ class PluginStateMachine( } override fun entities(event: InspectableEvent, state: State?): List { - return entitiesConfiguration?.closure?.apply(event) ?: emptyList() + return entitiesConfiguration?.closure?.invoke(event) ?: emptyList() } override fun payloadValues(event: InspectableEvent, state: State?): Map? { @@ -67,11 +67,11 @@ class PluginStateMachine( } override fun afterTrack(event: InspectableEvent) { - afterTrackConfiguration?.closure?.accept(event) + afterTrackConfiguration?.closure?.invoke(event) } override fun filter(event: InspectableEvent, state: State?): Boolean? { - return filterConfiguration?.closure?.apply(event) + return filterConfiguration?.closure?.invoke(event) } override fun eventsBefore(event: Event): List? { diff --git a/snowplow-tracker/src/main/java/com/snowplowanalytics/snowplow/configuration/FocalMeterConfiguration.kt b/snowplow-tracker/src/main/java/com/snowplowanalytics/snowplow/configuration/FocalMeterConfiguration.kt index 8018a9d57..f2f5b95f6 100644 --- a/snowplow-tracker/src/main/java/com/snowplowanalytics/snowplow/configuration/FocalMeterConfiguration.kt +++ b/snowplow-tracker/src/main/java/com/snowplowanalytics/snowplow/configuration/FocalMeterConfiguration.kt @@ -19,7 +19,6 @@ import com.snowplowanalytics.snowplow.entity.ClientSessionEntity import okhttp3.OkHttpClient import okhttp3.Request import java.io.IOException -import java.util.function.Function /** * This configuration tells the tracker to send requests with the user ID in session context entity @@ -31,7 +30,7 @@ import java.util.function.Function */ class FocalMeterConfiguration( val kantarEndpoint: String, - val processUserId: Function? = null, + val processUserId: ((String) -> String)? = null, ) : Configuration, PluginAfterTrackCallable, PluginIdentifiable { private val TAG = FocalMeterConfiguration::class.java.simpleName @@ -45,7 +44,7 @@ class FocalMeterConfiguration( val session = event.entities.find { it is ClientSessionEntity } as? ClientSessionEntity session?.userId?.let { newUserId -> if (shouldUpdate(newUserId)) { - val processedUserId = processUserId?.apply(newUserId) ?: newUserId + val processedUserId = processUserId?.invoke(newUserId) ?: newUserId makeRequest(processedUserId) } } diff --git a/snowplow-tracker/src/main/java/com/snowplowanalytics/snowplow/configuration/PluginConfiguration.kt b/snowplow-tracker/src/main/java/com/snowplowanalytics/snowplow/configuration/PluginConfiguration.kt index 4da0084ee..1007844ff 100644 --- a/snowplow-tracker/src/main/java/com/snowplowanalytics/snowplow/configuration/PluginConfiguration.kt +++ b/snowplow-tracker/src/main/java/com/snowplowanalytics/snowplow/configuration/PluginConfiguration.kt @@ -15,8 +15,6 @@ package com.snowplowanalytics.snowplow.configuration import com.snowplowanalytics.core.statemachine.PluginStateMachine import com.snowplowanalytics.snowplow.payload.SelfDescribingJson import com.snowplowanalytics.snowplow.tracker.InspectableEvent -import java.util.function.Consumer -import java.util.function.Function /** * Provides a block closure to be called after events are tracked. @@ -27,7 +25,7 @@ import java.util.function.Function */ class PluginAfterTrackConfiguration( val schemas: List? = null, - val closure: Consumer + val closure: (InspectableEvent) -> Unit? ) /** @@ -38,7 +36,7 @@ class PluginAfterTrackConfiguration( */ class PluginFilterConfiguration( val schemas: List? = null, - val closure: Function + val closure: (InspectableEvent) -> Boolean ) /** @@ -50,7 +48,7 @@ class PluginFilterConfiguration( */ class PluginEntitiesConfiguration( val schemas: List? = null, - val closure: Function> + val closure: (InspectableEvent) -> List ) /** @@ -121,7 +119,7 @@ interface PluginConfigurationInterface : PluginIdentifiable, PluginEntitiesCalla /** * Configuration for a custom tracker plugin. * Enables you to add closures to be called when and after events are tracked in the tracker. - * + * * @property identifier Unique identifier of the plugin within the tracker. */ class PluginConfiguration( @@ -139,7 +137,7 @@ class PluginConfiguration( */ fun entities( schemas: List? = null, - closure: Function> + closure: (InspectableEvent) -> List ) { entitiesConfiguration = PluginEntitiesConfiguration( schemas = schemas, @@ -156,7 +154,7 @@ class PluginConfiguration( */ fun afterTrack( schemas: List? = null, - closure: Consumer + closure: (InspectableEvent) -> Unit? ): PluginConfiguration { afterTrackConfiguration = PluginAfterTrackConfiguration( schemas = schemas, @@ -173,7 +171,7 @@ class PluginConfiguration( */ fun filter( schemas: List? = null, - closure: Function + closure: (InspectableEvent) -> Boolean ): PluginConfiguration { filterConfiguration = PluginFilterConfiguration( schemas = schemas,