11package com.segment.analytics.kotlin.destinations.adjust
22
3- class AdjustDestination {
4- }
3+ import android.app.Activity
4+ import android.content.Context
5+ import com.adjust.sdk.*
6+ import com.segment.analytics.kotlin.android.plugins.AndroidLifecycle
7+ import com.segment.analytics.kotlin.core.*
8+ import com.segment.analytics.kotlin.core.platform.DestinationPlugin
9+ import com.segment.analytics.kotlin.core.platform.Plugin
10+ import com.segment.analytics.kotlin.core.platform.plugins.logger.log
11+ import com.segment.analytics.kotlin.core.utilities.getDouble
12+ import com.segment.analytics.kotlin.core.utilities.getString
13+ import kotlinx.serialization.Serializable
14+ import kotlinx.serialization.json.JsonObject
15+ import kotlinx.serialization.json.buildJsonObject
16+ import kotlinx.serialization.json.put
17+
18+ /* *
19+ * Adjust is a business intelligence platform for mobile app marketers, combining attribution for
20+ * advertising sources with analytics and store statistics.
21+ *
22+ * @see <a href="https://www.adjust.com">Adjust</a>
23+ * @see <a href="https://segment.com/docs/integrations/adjust/">Adjust Integration</a>
24+ * @see <a href="https://github.com/adjust/android_sdk">Adjust Android SDK</a>
25+ */
26+ class AdjustDestination (
27+ private var adjustInstance : AdjustInstance = Adjust .getDefaultInstance()
28+ ) : DestinationPlugin(), AndroidLifecycle {
29+
30+ private var settings: AdjustSettings ? = null
31+
32+ private val REVENUE_KEY = " revenue"
33+ private val CURRENCY_KEY = " currency"
34+
35+ override val key: String = " Adjust"
36+
37+ override fun update (settings : Settings , type : Plugin .UpdateType ) {
38+ super .update(settings, type)
39+ if (settings.hasIntegrationSettings(this )) {
40+ analytics.log(" Adjust Destination is enabled" )
41+ this .settings = settings.destinationSettings(key, AdjustSettings .serializer())
42+ if (type == Plugin .UpdateType .Initial ) {
43+ this .settings?.let {
44+ val environment =
45+ if (it.setEnvironmentProduction)
46+ AdjustConfig .ENVIRONMENT_PRODUCTION
47+ else
48+ AdjustConfig .ENVIRONMENT_SANDBOX
49+ val adjustConfig = AdjustConfig (
50+ analytics.configuration.application as Context ? ,
51+ it.appToken, environment
52+ )
53+
54+ if (it.setEventBufferingEnabled) {
55+ adjustConfig.setEventBufferingEnabled(true )
56+ }
57+ if (it.trackAttributionData) {
58+ // registering a delegate callback to notify tracker attribution changes.
59+ val listener: OnAttributionChangedListener =
60+ AdjustSegmentAttributionChangedListener (analytics)
61+ adjustConfig.setOnAttributionChangedListener(listener)
62+ }
63+ adjustInstance.onCreate(adjustConfig)
64+ analytics.log(" Adjust Destination loaded" )
65+ }
66+ }
67+ }
68+
69+ }
70+
71+ override fun identify (payload : IdentifyEvent ): BaseEvent ? {
72+ setPartnerParams(payload)
73+ return super .identify(payload)
74+ }
75+
76+ override fun track (payload : TrackEvent ): BaseEvent ? {
77+ setPartnerParams(payload)
78+
79+ val token: String? = settings?.customEvents?.getString(payload.event)
80+ token ? : return null
81+
82+ val properties: Properties = payload.properties
83+ val event = AdjustEvent (token)
84+ properties.let {
85+ for ((propertyKey, propertyValue) in it) {
86+ event.addCallbackParameter(propertyKey, propertyValue.toString())
87+ }
88+ }
89+ val revenue: Double = properties.getDouble(REVENUE_KEY ) ? : 0.0
90+ val currency: String = properties.getString(CURRENCY_KEY ) ? : " "
91+ if (revenue != 0.0 && currency.isNotEmpty()) {
92+ event.setRevenue(revenue, currency)
93+ }
94+ analytics.log(" Adjust.getDefaultInstance().trackEvent($event );" )
95+ adjustInstance.trackEvent(event)
96+ return payload
97+ }
98+
99+ override fun reset () {
100+ super .reset()
101+ adjustInstance.resetSessionPartnerParameters()
102+ analytics.log(" Adjust.getDefaultInstance().resetSessionPartnerParameters()" )
103+ }
104+
105+ /* *
106+ * AndroidActivity Lifecycle Methods
107+ */
108+ override fun onActivityResumed (activity : Activity ? ) {
109+ super .onActivityResumed(activity)
110+ adjustInstance.onResume()
111+ }
112+
113+ override fun onActivityPaused (activity : Activity ? ) {
114+ super .onActivityPaused(activity)
115+ adjustInstance.onPause()
116+ }
117+
118+ /* *
119+ * adding session Partner parameters to Adjust. It will merge session partner parameters with event partner parameter.
120+ */
121+ private fun setPartnerParams (payload : BaseEvent ) {
122+ if (payload.userId.isNotEmpty()) {
123+ adjustInstance.addSessionPartnerParameter(" userId" , payload.userId)
124+ analytics.log(" Adjust.getDefaultInstance().addSessionPartnerParameter(userId, ${payload.userId} )" )
125+ }
126+ if (payload.anonymousId.isNotEmpty()) {
127+ adjustInstance.addSessionPartnerParameter(" anonymousId" , payload.anonymousId)
128+ analytics.log(" Adjust.getDefaultInstance().addSessionPartnerParameter(anonymousId, ${payload.anonymousId} )" )
129+ }
130+ }
131+
132+ /* *
133+ * A listener class to receive a callback on tracker attribution changes.
134+ * Need to add the attribution callback to config instance before starting the Adjust SDK.
135+ */
136+ internal class AdjustSegmentAttributionChangedListener (val analytics : Analytics ) :
137+ OnAttributionChangedListener {
138+ override fun onAttributionChanged (attribution : AdjustAttribution ) {
139+ val properties = buildJsonObject {
140+ put(" provider" , " Adjust" )
141+ put(" trackerToken" , attribution.trackerToken)
142+ put(" trackerName" , attribution.trackerName)
143+ put(" campaign" , buildJsonObject {
144+ put(" source" , attribution.network)
145+ put(" name" , attribution.campaign)
146+ put(" content" , attribution.clickLabel)
147+ put(" adCreative" , attribution.creative)
148+ put(" adGroup" , attribution.adgroup)
149+ })
150+ }
151+ // Analytic core event.
152+ analytics.track(
153+ " Install Attributed" ,
154+ properties
155+ )
156+ }
157+ }
158+ }
159+
160+ /* *
161+ * Adjust Settings data class.
162+ */
163+ @Serializable
164+ data class AdjustSettings (
165+ // Adjust App Token
166+ var appToken : String ,
167+ // Adjust Segment value for Send to Production Environment on Adjust
168+ var setEnvironmentProduction : Boolean = false ,
169+ // Adjust Segment value to Buffer and batch events sent to Adjust
170+ var setEventBufferingEnabled : Boolean = false ,
171+ // Adjust Segment value to track Attribution Data
172+ var trackAttributionData : Boolean = false ,
173+ // JSON Custom events
174+ val customEvents : JsonObject
175+ )
0 commit comments