From 119fb7f4f8379fd289d78e881d0d0720a8ca83f3 Mon Sep 17 00:00:00 2001 From: Amine Karimi Date: Mon, 17 Apr 2023 00:16:30 +0000 Subject: [PATCH 1/2] update segment implementation - was based on com.segment.analytics.android:analytics, changed to com.segment.analytics.kotlin:android - delete PropertiesHelper.kt --- addon/analytiks-segment/build.gradle | 2 +- .../com/analytiks/segment/PropertiesHelper.kt | 14 ----- .../segment/SegmentAnalyticsClient.kt | 58 ++++++++++--------- 3 files changed, 32 insertions(+), 42 deletions(-) delete mode 100644 addon/analytiks-segment/src/main/java/com/analytiks/segment/PropertiesHelper.kt diff --git a/addon/analytiks-segment/build.gradle b/addon/analytiks-segment/build.gradle index 3b81c4a..af0b213 100644 --- a/addon/analytiks-segment/build.gradle +++ b/addon/analytiks-segment/build.gradle @@ -33,6 +33,6 @@ android { dependencies { implementation 'androidx.core:core-ktx:1.7.0' - implementation 'com.segment.analytics.android:analytics:4.11.0' + implementation 'com.segment.analytics.kotlin:android:1.10.3' implementation project(':analytiks-core') } \ No newline at end of file diff --git a/addon/analytiks-segment/src/main/java/com/analytiks/segment/PropertiesHelper.kt b/addon/analytiks-segment/src/main/java/com/analytiks/segment/PropertiesHelper.kt deleted file mode 100644 index bd14b5a..0000000 --- a/addon/analytiks-segment/src/main/java/com/analytiks/segment/PropertiesHelper.kt +++ /dev/null @@ -1,14 +0,0 @@ -package com.analytiks.segment - -import com.analytiks.core.model.Param -import com.segment.analytics.Properties - -object PropertiesHelper { - fun formatParamsToProperties(vararg properties: Param) : Properties { - return Properties().apply { - properties.forEach { param -> - putValue(param.propertyName, param.propertyValue) - } - } - } -} \ No newline at end of file diff --git a/addon/analytiks-segment/src/main/java/com/analytiks/segment/SegmentAnalyticsClient.kt b/addon/analytiks-segment/src/main/java/com/analytiks/segment/SegmentAnalyticsClient.kt index 6de8675..f2c8db6 100644 --- a/addon/analytiks-segment/src/main/java/com/analytiks/segment/SegmentAnalyticsClient.kt +++ b/addon/analytiks-segment/src/main/java/com/analytiks/segment/SegmentAnalyticsClient.kt @@ -1,42 +1,39 @@ package com.analytiks.segment import android.content.Context +import com.analytiks.core.AnalyticsDataTransmitterExtension import com.analytiks.core.CoreAddon import com.analytiks.core.EventsExtension import com.analytiks.core.UserProfileExtension import com.analytiks.core.model.Param import com.analytiks.core.model.UserProperty -import com.analytiks.segment.PropertiesHelper.formatParamsToProperties -import com.segment.analytics.Analytics -import com.segment.analytics.Traits -import java.util.concurrent.TimeUnit +import com.segment.analytics.kotlin.android.Analytics +import com.segment.analytics.kotlin.core.Analytics +import kotlinx.serialization.json.buildJsonObject +import kotlinx.serialization.json.put class SegmentAnalyticsClient( private val token: String, - private val recordScreen: Boolean = true, private val collectDeviceId: Boolean = true, - private val flushIntervalInSeconds: Long? = null, + private val trackApplicationLifecycleEvents: Boolean = false, + private val useLifecycleObserver: Boolean = false, + private val flushIntervalInSeconds: Int? = null, + private val flushAt: Int? = null, private val tag: String? = null -) : CoreAddon, EventsExtension, UserProfileExtension { +) : CoreAddon, EventsExtension, UserProfileExtension, AnalyticsDataTransmitterExtension { lateinit var segmentAnalytics: Analytics override fun initialize(context: Context) { - segmentAnalytics = Analytics.Builder(context, token).apply { - trackApplicationLifecycleEvents() + segmentAnalytics = Analytics(this.token, context) { + this.trackApplicationLifecycleEvents = + this@SegmentAnalyticsClient.trackApplicationLifecycleEvents - if (flushIntervalInSeconds != null) this.flushInterval( - flushIntervalInSeconds, - TimeUnit.SECONDS - ) + this.useLifecycleObserver = this@SegmentAnalyticsClient.useLifecycleObserver + this.collectDeviceId = this@SegmentAnalyticsClient.collectDeviceId - if (recordScreen) this.recordScreenViews() - if (collectDeviceId) this.collectDeviceId(true) - tag?.let { this.tag(it) } - }.build().also { - Analytics.setSingletonInstance(it) + this@SegmentAnalyticsClient.flushIntervalInSeconds?.let { this.flushInterval = it } + this@SegmentAnalyticsClient.flushAt?.let { this.flushAt = it } } - - segmentAnalytics = Analytics.with(context) } override fun reset() { @@ -48,8 +45,11 @@ class SegmentAnalyticsClient( } override fun logEvent(name: String, vararg properties: Param) { - val formattedParams = formatParamsToProperties(*properties) - segmentAnalytics.track(name, formattedParams) + segmentAnalytics.track(name, buildJsonObject { + properties.forEach { + put(it.propertyName, it.propertyValue) + } + }) } override fun identify(userId: String) { @@ -57,12 +57,16 @@ class SegmentAnalyticsClient( } override fun setUserProperty(property: UserProperty) { - segmentAnalytics.identify( - Traits().apply { - putValue(property.propertyName, property.propertyValue) - } - ) + if (segmentAnalytics.userId() == null) return + + segmentAnalytics.identify(userId = segmentAnalytics.userId()!!, buildJsonObject { + put(property.propertyName, property.propertyValue.toString()) + }) } override fun setUserPropertyOnce(property: UserProperty) = Unit + + override fun pushAll() { + segmentAnalytics.flush() + } } \ No newline at end of file From d54afc6d7659914fa91f3f23fa43785bd8067803 Mon Sep 17 00:00:00 2001 From: Amine Karimi Date: Mon, 17 Apr 2023 00:16:54 +0000 Subject: [PATCH 2/2] add segment addon to the sample app --- app/build.gradle | 1 + app/src/main/java/com/logitanalyticsapp/MainActivity.kt | 6 ++++++ 2 files changed, 7 insertions(+) diff --git a/app/build.gradle b/app/build.gradle index ce82f57..5654a96 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -47,6 +47,7 @@ dependencies { implementation project(':analytiks') implementation project(path: ':analytiks-core') implementation project(path: ':addon:analytiks-mixpanel') + implementation project(path: ':addon:analytiks-segment') implementation project(path: ':addon:analytiks-timber') testImplementation 'junit:junit:4.13.2' diff --git a/app/src/main/java/com/logitanalyticsapp/MainActivity.kt b/app/src/main/java/com/logitanalyticsapp/MainActivity.kt index 47b5de5..d785011 100644 --- a/app/src/main/java/com/logitanalyticsapp/MainActivity.kt +++ b/app/src/main/java/com/logitanalyticsapp/MainActivity.kt @@ -7,6 +7,7 @@ import com.analytiks.addon.mixpanel.MixpanelAnalyticsClient import com.analytiks.addon.timber.TimberLocalClient import com.analytiks.core.CoreAddon import com.analytiks.core.model.Param +import com.analytiks.segment.SegmentAnalyticsClient import com.logitanalyticsapp.databinding.ActivityMainBinding class MainActivity : AppCompatActivity() { @@ -25,6 +26,11 @@ class MainActivity : AppCompatActivity() { TimberLocalClient(), MixpanelAnalyticsClient( token = "YOUR_TOKEN" + ), + SegmentAnalyticsClient( + token = "YOUR_TOKEN", + flushIntervalInSeconds = 5, + trackApplicationLifecycleEvents = true, ) )