Skip to content

Commit 4ad6fef

Browse files
committed
- Adjust SDK implementation
- added partner dependencies, upgraded dependencies versions - updated readme.md
1 parent 54c90c7 commit 4ad6fef

File tree

3 files changed

+191
-12
lines changed

3 files changed

+191
-12
lines changed

README.md

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,15 @@ Adjust integration for [analytics-android](https://github.com/segmentio/analytic
99
## Getting Started
1010

1111
## Adding the dependency
12-
To install the Segment-Amplitude integration, simply add this line to your gradle file:
12+
To install the Segment-Adjust integration, simply add this line to your gradle file:
13+
14+
## Support
15+
16+
Please use Github issues, Pull Requests, or feel free to reach out to our [support team](https://segment.com/help/).
17+
18+
## Integrating with Segment
19+
20+
Interested in integrating your service with us? Check out our [Partners page](https://segment.com/partners/) for more details.
1321

1422

1523
## License

lib/build.gradle.kts

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -42,17 +42,17 @@ android {
4242
dependencies {
4343
coreLibraryDesugaring("com.android.tools:desugar_jdk_libs:1.1.5")
4444

45-
implementation("com.segment.analytics.kotlin:android:1.5.0")
45+
implementation("com.segment.analytics.kotlin:android:1.6.2")
4646
implementation("androidx.multidex:multidex:2.0.1")
4747
implementation("androidx.core:core-ktx:1.7.0")
4848

49-
implementation("androidx.lifecycle:lifecycle-process:2.4.1")
50-
implementation("androidx.lifecycle:lifecycle-common-java8:2.4.1")
49+
implementation("androidx.lifecycle:lifecycle-process:2.5.1")
50+
implementation("androidx.lifecycle:lifecycle-common-java8:2.5.1")
5151
}
5252

5353
// Partner Dependencies
5454
dependencies {
55-
// TODO add your partner deps here
55+
api("com.adjust.sdk:adjust-android:4.33.0")
5656
}
5757

5858
// Test Dependencies
@@ -61,9 +61,9 @@ dependencies {
6161
testImplementation("org.jetbrains.kotlinx:kotlinx-coroutines-test:1.6.0")
6262
testImplementation("io.mockk:mockk:1.12.4")
6363

64-
// Add Roboelectric dependencies.
64+
// Add Robolectric dependencies.
6565
testImplementation("org.robolectric:robolectric:4.7.3")
66-
testImplementation("androidx.test:core:1.4.0")
66+
testImplementation("androidx.test:core:1.5.0")
6767

6868
// Add JUnit4 legacy dependencies.
6969
testRuntimeOnly("org.junit.vintage:junit-vintage-engine:5.8.2")
@@ -75,10 +75,10 @@ dependencies {
7575
testImplementation("org.skyscreamer:jsonassert:1.5.0")
7676
}
7777

78-
// Android Test Deps
78+
// Android Test Dependencies
7979
dependencies {
80-
androidTestImplementation("androidx.test.ext:junit:1.1.3")
81-
androidTestImplementation("androidx.test.espresso:espresso-core:3.4.0")
80+
androidTestImplementation("androidx.test.ext:junit:1.1.4")
81+
androidTestImplementation("androidx.test.espresso:espresso-core:3.5.0")
8282
}
8383

8484
tasks.withType<Test> {
Lines changed: 173 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,175 @@
11
package 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

Comments
 (0)