Skip to content

Commit 30e3a68

Browse files
Updated code for deep links should have context:referrer like Swift sdk
1 parent c2ac4ea commit 30e3a68

File tree

9 files changed

+106
-22
lines changed

9 files changed

+106
-22
lines changed

android/src/main/java/com/segment/analytics/kotlin/android/utilities/DeepLinkUtils.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ class DeepLinkUtils(val analytics: Analytics) {
1515
return
1616
}
1717

18+
analytics.updateReferrer(intent.data.toString())
1819
val properties = extractLinkProperties(referrer, intent.data)
1920
analytics.track("Deep Link Opened", properties)
2021
}

android/src/test/java/com/segment/analytics/kotlin/android/StorageTests.kt

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,8 @@ class StorageTests {
5555
UserInfo(
5656
anonymousId = "oldAnonId",
5757
userId = "oldUserId",
58-
traits = buildJsonObject { put("behaviour", "bad") }
58+
traits = buildJsonObject { put("behaviour", "bad") },
59+
referrer = "oldReferrer",
5960
))
6061

6162
store.provide(
@@ -85,7 +86,8 @@ class StorageTests {
8586
return UserInfo(
8687
anonymousId = "newAnonId",
8788
userId = "newUserId",
88-
traits = emptyJsonObject
89+
traits = emptyJsonObject,
90+
referrer = "newReferrer"
8991
)
9092
}
9193
}

core/src/main/java/com/segment/analytics/kotlin/core/Analytics.kt

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -580,7 +580,7 @@ open class Analytics protected constructor(
580580
*/
581581
fun reset() {
582582
val newAnonymousId = UUID.randomUUID().toString()
583-
userInfo = UserInfo(newAnonymousId, null, null)
583+
userInfo = UserInfo(newAnonymousId, null, null, null)
584584

585585
analyticsScope.launch(analyticsDispatcher) {
586586
store.dispatch(UserInfo.ResetAction(newAnonymousId), UserInfo::class)
@@ -740,6 +740,16 @@ open class Analytics protected constructor(
740740
catch (ignored: Exception) {}
741741
}
742742
}
743+
744+
fun updateReferrer(referrerUrl: String?) {
745+
userInfo.referrer = referrerUrl
746+
analyticsScope.launch {
747+
store.dispatch(
748+
UserInfo.SetReferrerAction(referrerUrl),
749+
UserInfo::class
750+
)
751+
}
752+
}
743753
}
744754

745755

core/src/main/java/com/segment/analytics/kotlin/core/State.kt

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import kotlinx.serialization.json.buildJsonObject
77
import kotlinx.serialization.json.put
88
import sovran.kotlin.Action
99
import sovran.kotlin.State
10-
import java.util.*
10+
import java.util.UUID
1111

1212
/**
1313
* Stores state related to the analytics system
@@ -143,11 +143,13 @@ data class System(
143143
* - anonymousId (String)
144144
* - userId (String)
145145
* - traits (Map)
146+
* - referrer (String)
146147
*/
147148
data class UserInfo(
148149
var anonymousId: String,
149150
var userId: String?,
150-
var traits: JsonObject?
151+
var traits: JsonObject?,
152+
var referrer: String?,
151153
) : State {
152154

153155
companion object {
@@ -160,25 +162,33 @@ data class UserInfo(
160162
val anonymousId: String =
161163
storage.read(Storage.Constants.AnonymousId) ?: UUID.randomUUID().toString()
162164

163-
return UserInfo(anonymousId, userId, traits)
165+
return UserInfo(anonymousId, userId, traits, null)
164166
}
165167
}
166168

167169
class ResetAction(var anonymousId: String = UUID.randomUUID().toString()) : Action<UserInfo> {
168170
override fun reduce(state: UserInfo): UserInfo {
169-
return UserInfo(anonymousId, null, null)
171+
return UserInfo(anonymousId, null, null, null)
170172
}
171173
}
172174

173175
class SetUserIdAction(var userId: String) : Action<UserInfo> {
174176
override fun reduce(state: UserInfo): UserInfo {
175-
return UserInfo(state.anonymousId, userId, state.traits)
177+
return state.copy(
178+
userId = userId
179+
)
176180
}
177181
}
178182

179183
class SetAnonymousIdAction(var anonymousId: String) : Action<UserInfo> {
180184
override fun reduce(state: UserInfo): UserInfo {
181-
return UserInfo(anonymousId, state.userId, state.traits)
185+
return state.copy(anonymousId = anonymousId)
186+
}
187+
}
188+
189+
class SetReferrerAction(var referrer: String?) : Action<UserInfo> {
190+
override fun reduce(state: UserInfo): UserInfo {
191+
return state.copy(referrer = referrer)
182192
}
183193
}
184194

@@ -190,7 +200,10 @@ data class UserInfo(
190200

191201
class SetUserIdAndTraitsAction(var userId: String, var traits: JsonObject) : Action<UserInfo> {
192202
override fun reduce(state: UserInfo): UserInfo {
193-
return UserInfo(state.anonymousId, userId, traits)
203+
return state.copy(
204+
userId = userId,
205+
traits = traits
206+
)
194207
}
195208
}
196209
}

core/src/main/java/com/segment/analytics/kotlin/core/platform/plugins/ContextPlugin.kt

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import com.segment.analytics.kotlin.core.utilities.putAll
88
import kotlinx.serialization.json.JsonObject
99
import kotlinx.serialization.json.buildJsonObject
1010
import kotlinx.serialization.json.put
11-
import java.util.*
11+
import java.util.UUID
1212

1313
/**
1414
* Analytics plugin used to populate events with basic context data.
@@ -27,6 +27,8 @@ class ContextPlugin : Plugin {
2727
const val LIBRARY_NAME_KEY = "name"
2828
const val LIBRARY_VERSION_KEY = "version"
2929
const val INSTANCE_ID_KEY = "instanceId"
30+
const val REFERRER_KEY = "referrer"
31+
const val URL_KEY = "url"
3032
}
3133

3234
override fun setup(analytics: Analytics) {
@@ -45,6 +47,13 @@ class ContextPlugin : Plugin {
4547
// putLibrary
4648
put(LIBRARY_KEY, library)
4749
put(INSTANCE_ID_KEY, instanceId)
50+
51+
// add additional context data
52+
analytics.userInfo.referrer?.let { referrer ->
53+
put(REFERRER_KEY, buildJsonObject {
54+
put(URL_KEY, referrer)
55+
})
56+
}
4857
}
4958
event.context = newContext
5059
}

core/src/test/kotlin/com/segment/analytics/kotlin/core/AnalyticsTests.kt

Lines changed: 29 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -472,8 +472,8 @@ class AnalyticsTests {
472472
UserInfo(
473473
userId = "oldUserId",
474474
traits = buildJsonObject { put("behaviour", "bad") },
475-
anonymousId = "qwerty-qwerty-123"
476-
), curUserInfo
475+
anonymousId = "qwerty-qwerty-123",
476+
referrer = null), curUserInfo
477477
)
478478

479479
analytics.identify("newUserId", buildJsonObject { put("behaviour", "good") })
@@ -483,7 +483,8 @@ class AnalyticsTests {
483483
UserInfo(
484484
userId = "newUserId",
485485
traits = buildJsonObject { put("behaviour", "good") },
486-
anonymousId = "qwerty-qwerty-123"
486+
anonymousId = "qwerty-qwerty-123",
487+
referrer = null
487488
), newUserInfo
488489
)
489490
}
@@ -501,7 +502,8 @@ class AnalyticsTests {
501502
UserInfo(
502503
userId = "oldUserId",
503504
traits = buildJsonObject { put("behaviour", "bad") },
504-
anonymousId = "qwerty-qwerty-123"
505+
anonymousId = "qwerty-qwerty-123",
506+
referrer = null
505507
), curUserInfo
506508
)
507509

@@ -512,7 +514,8 @@ class AnalyticsTests {
512514
UserInfo(
513515
userId = "oldUserId",
514516
traits = buildJsonObject { put("behaviour", "good") },
515-
anonymousId = "qwerty-qwerty-123"
517+
anonymousId = "qwerty-qwerty-123",
518+
referrer = null
516519
), newUserInfo
517520
)
518521
}
@@ -782,7 +785,8 @@ class AnalyticsTests {
782785
UserInfo(
783786
userId = "newId",
784787
traits = emptyJsonObject,
785-
anonymousId = "qwerty-qwerty-123"
788+
anonymousId = "qwerty-qwerty-123",
789+
referrer = null
786790
), newUserInfo
787791
)
788792
}
@@ -890,6 +894,25 @@ class AnalyticsTests {
890894
}
891895
}
892896

897+
@Nested
898+
inner class Referrer {
899+
@Test
900+
fun `updateReferrer non-null update`() = runTest {
901+
analytics.updateReferrer("https://example.com")
902+
val newUserInfo = analytics.store.currentState(UserInfo::class)
903+
assertEquals(analytics.userInfo.referrer, "https://example.com")
904+
assertEquals(newUserInfo?.referrer, "https://example.com")
905+
}
906+
907+
@Test
908+
fun `updateReferrer null update`() = runTest {
909+
analytics.updateReferrer(null)
910+
val newUserInfo = analytics.store.currentState(UserInfo::class)
911+
assertEquals(analytics.userInfo.referrer, null)
912+
assertEquals(newUserInfo?.referrer, null)
913+
}
914+
}
915+
893916
@Test
894917
fun `settings fetches current Analytics Settings`() = runTest {
895918
val settings = Settings(

core/src/test/kotlin/com/segment/analytics/kotlin/core/StateTest.kt

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,4 +99,25 @@ internal class StateTest {
9999
assertEquals(traits, (analytics.store.currentState(UserInfo::class))?.traits)
100100
}
101101
}
102+
103+
@Test
104+
fun setReferrerAction() = runTest {
105+
analytics.store.dispatch(UserInfo.SetReferrerAction("oldReferrer"), UserInfo::class)
106+
assertEquals("oldReferrer", (analytics.store.currentState(UserInfo::class))?.referrer)
107+
108+
analytics.store.dispatch(UserInfo.SetReferrerAction("newReferrer"), UserInfo::class)
109+
assertEquals("newReferrer", (analytics.store.currentState(UserInfo::class))?.referrer)
110+
}
111+
112+
113+
@Test
114+
fun `setReferrerAction state change`() = runTest {
115+
val traits = buildJsonObject { put("behaviour", "bad") }
116+
analytics.store.dispatch(UserInfo.SetReferrerAction("newReferrer"), UserInfo::class)
117+
analytics.store.dispatch(UserInfo.SetUserIdAction("oldUserId"), UserInfo::class)
118+
analytics.store.dispatch(UserInfo.SetAnonymousIdAction("anonymous"), UserInfo::class)
119+
analytics.store.dispatch(UserInfo.SetTraitsAction(traits), UserInfo::class)
120+
121+
assertEquals("newReferrer", (analytics.store.currentState(UserInfo::class))?.referrer)
122+
}
102123
}

core/src/test/kotlin/com/segment/analytics/kotlin/core/utilities/InMemoryStorageTest.kt

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,8 @@ internal class InMemoryStorageTest {
6161
return UserInfo(
6262
anonymousId = "newAnonId",
6363
userId = "newUserId",
64-
traits = emptyJsonObject
64+
traits = emptyJsonObject,
65+
referrer = "newReferrer"
6566
)
6667
}
6768
}
@@ -294,7 +295,8 @@ internal class InMemoryStorageTest {
294295
return UserInfo(
295296
anonymousId = "newAnonId",
296297
userId = "newUserId",
297-
traits = emptyJsonObject
298+
traits = emptyJsonObject,
299+
referrer = "newReferrer"
298300
)
299301
}
300302
}

core/src/test/kotlin/com/segment/analytics/kotlin/core/utilities/StorageImplTest.kt

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,8 @@ internal class StorageImplTest {
4848
UserInfo(
4949
anonymousId = "oldAnonId",
5050
userId = "oldUserId",
51-
traits = buildJsonObject { put("behaviour", "bad") }
51+
traits = buildJsonObject { put("behaviour", "bad") },
52+
referrer = "oldReferrer"
5253
))
5354

5455
store.provide(
@@ -86,7 +87,8 @@ internal class StorageImplTest {
8687
return UserInfo(
8788
anonymousId = "newAnonId",
8889
userId = "newUserId",
89-
traits = emptyJsonObject
90+
traits = emptyJsonObject,
91+
referrer = "newReferrer"
9092
)
9193
}
9294
}
@@ -341,7 +343,8 @@ internal class StorageImplTest {
341343
return UserInfo(
342344
anonymousId = "newAnonId",
343345
userId = "newUserId",
344-
traits = emptyJsonObject
346+
traits = emptyJsonObject,
347+
referrer = "newReferrer"
345348
)
346349
}
347350
}

0 commit comments

Comments
 (0)