Skip to content

Commit 07feb1d

Browse files
Support Map<String, Any> for properties and traits. (#168)
* Support Map<String, Any> for properties and traits. Co-authored-by: Wenxi Zeng <[email protected]>
1 parent f7fa676 commit 07feb1d

File tree

12 files changed

+535
-99
lines changed

12 files changed

+535
-99
lines changed

android/build.gradle

+17-18
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,14 @@ plugins {
66
}
77

88
android {
9-
compileSdkVersion 31
10-
buildToolsVersion "31.0.0"
9+
compileSdkVersion 33
1110

1211
defaultConfig {
1312
// Required when setting minSdkVersion to 20 or lower
1413
multiDexEnabled true
1514

1615
minSdkVersion 16
17-
targetSdkVersion 31
16+
targetSdkVersion 33
1817
versionCode VERSION_CODE.toInteger()
1918
versionName VERSION_NAME
2019

@@ -49,32 +48,32 @@ android {
4948
dependencies {
5049
// MAIN DEPS
5150
api project(':core')
52-
api 'com.segment:sovran-kotlin:1.2.1'
53-
api "org.jetbrains.kotlinx:kotlinx-serialization-json:1.2.2"
54-
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4'
55-
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4'
56-
implementation 'androidx.lifecycle:lifecycle-process:2.4.0'
57-
implementation 'androidx.lifecycle:lifecycle-common-java8:2.4.0'
51+
api 'com.segment:sovran-kotlin:1.2.2'
52+
api "org.jetbrains.kotlinx:kotlinx-serialization-json:1.5.1"
53+
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.1'
54+
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.1'
55+
implementation 'androidx.lifecycle:lifecycle-process:2.6.1'
56+
implementation 'androidx.lifecycle:lifecycle-common-java8:2.6.1'
5857

5958

6059
// TESTING
61-
testImplementation 'org.junit.jupiter:junit-jupiter:5.7.2'
62-
testImplementation 'io.mockk:mockk:1.10.6'
63-
testImplementation 'org.jetbrains.kotlinx:kotlinx-coroutines-test:1.6.0'
64-
androidTestImplementation 'androidx.test.ext:junit:1.1.3'
65-
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
60+
testImplementation 'org.junit.jupiter:junit-jupiter:5.8.2'
61+
testImplementation 'io.mockk:mockk:1.12.2'
62+
testImplementation 'org.jetbrains.kotlinx:kotlinx-coroutines-test:1.7.1'
63+
androidTestImplementation 'androidx.test.ext:junit:1.1.5'
64+
androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'
6665

6766
// Add JUnit5 dependencies.
68-
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.7.2'
69-
testImplementation 'org.junit.jupiter:junit-jupiter-params:5.7.2'
67+
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.2'
68+
testImplementation 'org.junit.jupiter:junit-jupiter-params:5.8.2'
7069

7170
// Add JUnit4 legacy dependencies.
7271
testImplementation 'junit:junit:4.13.2'
73-
testRuntimeOnly 'org.junit.vintage:junit-vintage-engine:5.7.2'
72+
testRuntimeOnly 'org.junit.vintage:junit-vintage-engine:5.8.2'
7473

7574
// Add Roboelectric dependencies.
7675
testImplementation 'org.robolectric:robolectric:4.7.3'
77-
testImplementation 'androidx.test:core:1.4.0'
76+
testImplementation 'androidx.test:core:1.5.0'
7877
}
7978

8079
apply from: rootProject.file('gradle/artifacts-android.gradle')

android/src/main/java/com/segment/analytics/kotlin/android/plugins/AndroidLifecyclePlugin.kt

+4-6
Original file line numberDiff line numberDiff line change
@@ -295,14 +295,12 @@ class AndroidLifecyclePlugin() : Application.ActivityLifecycleCallbacks, Default
295295
// NO-OP
296296
}
297297

298-
override fun getCurrentState(): State {
299-
return State.DESTROYED
300-
}
298+
override val currentState: State
299+
get() = State.DESTROYED
301300
}
302301

303-
override fun getLifecycle(): Lifecycle {
304-
return stubLifecycle
305-
}
302+
override val lifecycle: Lifecycle
303+
get() = stubLifecycle
306304
}
307305
}
308306
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
sdk=31

build.gradle

+4-4
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,20 @@
11
// Top-level build file where you can add configuration options common to all sub-projects/modules.
22
buildscript {
3-
ext.kotlin_version = "1.6.0"
3+
ext.kotlin_version = "1.8.0"
44
ext.writeKey = "hAh3QxoRCsQsnyabTLMpWbpxoIN4O2mU"
55
repositories {
66
google()
77
}
88
dependencies {
9-
classpath 'com.android.tools.build:gradle:7.0.4'
9+
classpath 'com.android.tools.build:gradle:7.4.2'
1010
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
1111
classpath "org.jetbrains.kotlin:kotlin-serialization:$kotlin_version"
1212

1313
// needed for android unit tests
14-
classpath("de.mannodermaus.gradle.plugins:android-junit5:1.7.1.1")
14+
classpath("de.mannodermaus.gradle.plugins:android-junit5:1.9.3.0")
1515
// NOTE: Do not place your application dependencies here; they belong
1616
// in the individual module build.gradle files
17-
classpath 'com.google.gms:google-services:4.3.10'
17+
classpath 'com.google.gms:google-services:4.3.15'
1818
}
1919
}
2020

core/build.gradle

+3-3
Original file line numberDiff line numberDiff line change
@@ -24,13 +24,13 @@ test {
2424
dependencies {
2525
// MAIN DEPS
2626
api 'com.segment:sovran-kotlin:1.2.2'
27-
api "org.jetbrains.kotlinx:kotlinx-serialization-json:1.4.1"
28-
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4'
27+
api "org.jetbrains.kotlinx:kotlinx-serialization-json:1.5.1"
28+
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.1'
2929

3030
// TESTING
3131
repositories { mavenCentral() }
3232
testImplementation 'io.mockk:mockk:1.10.6'
33-
testImplementation 'org.jetbrains.kotlinx:kotlinx-coroutines-test:1.6.4'
33+
testImplementation 'org.jetbrains.kotlinx:kotlinx-coroutines-test:1.7.1'
3434

3535
testImplementation platform("org.junit:junit-bom:5.7.2")
3636
testImplementation "org.junit.jupiter:junit-jupiter"

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

+22-23
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,13 @@ import com.segment.analytics.kotlin.core.platform.plugins.SegmentDestination
99
import com.segment.analytics.kotlin.core.platform.plugins.StartupQueue
1010
import com.segment.analytics.kotlin.core.platform.plugins.UserInfoPlugin
1111
import com.segment.analytics.kotlin.core.platform.plugins.logger.*
12+
import com.segment.analytics.kotlin.core.utilities.JsonAnySerializer
1213
import kotlinx.coroutines.*
13-
import kotlinx.serialization.DeserializationStrategy
14-
import kotlinx.serialization.SerializationStrategy
14+
import kotlinx.serialization.*
1515
import kotlinx.serialization.json.Json
1616
import kotlinx.serialization.json.Json.Default.decodeFromJsonElement
1717
import kotlinx.serialization.json.JsonObject
1818
import kotlinx.serialization.json.jsonObject
19-
import kotlinx.serialization.serializer
2019
import sovran.kotlin.Store
2120
import sovran.kotlin.Subscriber
2221
import java.util.*
@@ -99,11 +98,11 @@ open class Analytics protected constructor(
9998
)
10099
}
101100
override val analyticsScope = CoroutineScope(SupervisorJob() + exceptionHandler)
102-
override val analyticsDispatcher : CloseableCoroutineDispatcher =
101+
override val analyticsDispatcher: CloseableCoroutineDispatcher =
103102
Executors.newCachedThreadPool().asCoroutineDispatcher()
104-
override val networkIODispatcher : CloseableCoroutineDispatcher =
103+
override val networkIODispatcher: CloseableCoroutineDispatcher =
105104
Executors.newSingleThreadExecutor().asCoroutineDispatcher()
106-
override val fileIODispatcher : CloseableCoroutineDispatcher =
105+
override val fileIODispatcher: CloseableCoroutineDispatcher =
107106
Executors.newFixedThreadPool(2).asCoroutineDispatcher()
108107
})
109108

@@ -161,7 +160,7 @@ open class Analytics protected constructor(
161160
* @param serializationStrategy strategy to serialize [properties]
162161
* @see <a href="https://segment.com/docs/spec/track/">Track Documentation</a>
163162
*/
164-
fun <T : Any> track(
163+
fun <T> track(
165164
name: String,
166165
properties: T,
167166
serializationStrategy: SerializationStrategy<T>,
@@ -178,11 +177,11 @@ open class Analytics protected constructor(
178177
* @param properties to describe the action. Needs to be [serializable](https://github.com/Kotlin/kotlinx.serialization/blob/master/docs/serializers.md)
179178
* @see <a href="https://segment.com/docs/spec/track/">Track Documentation</a>
180179
*/
181-
inline fun <reified T : Any> track(
180+
inline fun <reified T> track(
182181
name: String,
183182
properties: T,
184183
) {
185-
track(name, properties, Json.serializersModule.serializer())
184+
track(name, properties, JsonAnySerializer.serializersModule.serializer())
186185
}
187186

188187
/**
@@ -227,7 +226,7 @@ open class Analytics protected constructor(
227226
* @param serializationStrategy strategy to serialize [traits]
228227
* @see <a href="https://segment.com/docs/spec/identify/">Identify Documentation</a>
229228
*/
230-
fun <T : Any> identify(
229+
fun <T> identify(
231230
userId: String,
232231
traits: T,
233232
serializationStrategy: SerializationStrategy<T>,
@@ -250,10 +249,10 @@ open class Analytics protected constructor(
250249
* @param traits [Traits] about the user. Needs to be [serializable](https://github.com/Kotlin/kotlinx.serialization/blob/master/docs/serializers.md)
251250
* @see <a href="https://segment.com/docs/spec/identify/">Identify Documentation</a>
252251
*/
253-
inline fun <reified T : Any> identify(
252+
inline fun <reified T> identify(
254253
traits: T,
255254
) {
256-
identify(traits, Json.serializersModule.serializer())
255+
identify(traits, JsonAnySerializer.serializersModule.serializer())
257256
}
258257

259258
/**
@@ -298,7 +297,7 @@ open class Analytics protected constructor(
298297
* @param serializationStrategy strategy to serialize [traits]
299298
* @see <a href="https://segment.com/docs/spec/identify/">Identify Documentation</a>
300299
*/
301-
fun <T : Any> identify(
300+
fun <T> identify(
302301
traits: T,
303302
serializationStrategy: SerializationStrategy<T>,
304303
) {
@@ -321,11 +320,11 @@ open class Analytics protected constructor(
321320
* @param traits [Traits] about the user. Needs to be [serializable](https://github.com/Kotlin/kotlinx.serialization/blob/master/docs/serializers.md)
322321
* @see <a href="https://segment.com/docs/spec/identify/">Identify Documentation</a>
323322
*/
324-
inline fun <reified T : Any> identify(
323+
inline fun <reified T> identify(
325324
userId: String,
326325
traits: T,
327326
) {
328-
identify(userId, traits, Json.serializersModule.serializer())
327+
identify(userId, traits, JsonAnySerializer.serializersModule.serializer())
329328
}
330329

331330
/**
@@ -359,7 +358,7 @@ open class Analytics protected constructor(
359358
* @param serializationStrategy strategy to serialize [properties]
360359
* @see <a href="https://segment.com/docs/spec/screen/">Screen Documentation</a>
361360
*/
362-
fun <T : Any> screen(
361+
fun <T> screen(
363362
title: String,
364363
properties: T,
365364
serializationStrategy: SerializationStrategy<T>,
@@ -382,12 +381,12 @@ open class Analytics protected constructor(
382381
* @param properties [Properties] to add extra information to this call. Needs to be [serializable](https://github.com/Kotlin/kotlinx.serialization/blob/master/docs/serializers.md)
383382
* @see <a href="https://segment.com/docs/spec/screen/">Screen Documentation</a>
384383
*/
385-
inline fun <reified T : Any> screen(
384+
inline fun <reified T> screen(
386385
title: String,
387386
properties: T,
388387
category: String = "",
389388
) {
390-
screen(title, properties, Json.serializersModule.serializer(), category)
389+
screen(title, properties, JsonAnySerializer.serializersModule.serializer(), category)
391390
}
392391

393392
/**
@@ -419,7 +418,7 @@ open class Analytics protected constructor(
419418
* @param serializationStrategy strategy to serialize [traits]
420419
* @see <a href="https://segment.com/docs/spec/group/">Group Documentation</a>
421420
*/
422-
fun <T : Any> group(
421+
fun <T> group(
423422
groupId: String,
424423
traits: T,
425424
serializationStrategy: SerializationStrategy<T>,
@@ -438,11 +437,11 @@ open class Analytics protected constructor(
438437
* @param traits [Traits] about the group. Needs to be [serializable](https://github.com/Kotlin/kotlinx.serialization/blob/master/docs/serializers.md)
439438
* @see <a href="https://segment.com/docs/spec/group/">Group Documentation</a>
440439
*/
441-
inline fun <reified T : Any> group(
440+
inline fun <reified T> group(
442441
groupId: String,
443442
traits: T,
444443
) {
445-
group(groupId, traits, Json.serializersModule.serializer())
444+
group(groupId, traits, JsonAnySerializer.serializersModule.serializer())
446445
}
447446

448447
/**
@@ -613,7 +612,7 @@ open class Analytics protected constructor(
613612
/**
614613
* Retrieve the traits registered by a previous `identify` call in a blocking way.
615614
*/
616-
inline fun <reified T : Any> traits(deserializationStrategy: DeserializationStrategy<T> = Json.serializersModule.serializer()): T? {
615+
inline fun <reified T> traits(deserializationStrategy: DeserializationStrategy<T> = Json.serializersModule.serializer()): T? {
617616
return traits()?.let {
618617
decodeFromJsonElement(deserializationStrategy, it)
619618
}
@@ -626,7 +625,7 @@ open class Analytics protected constructor(
626625
"This function no longer serves a purpose and internally calls `traits(deserializationStrategy: DeserializationStrategy<T>)`.",
627626
ReplaceWith("traits(deserializationStrategy: DeserializationStrategy<T>)")
628627
)
629-
inline fun <reified T : Any> traitsAsync(deserializationStrategy: DeserializationStrategy<T> = Json.serializersModule.serializer()): T? {
628+
inline fun <reified T> traitsAsync(deserializationStrategy: DeserializationStrategy<T> = Json.serializersModule.serializer()): T? {
630629
return traits(deserializationStrategy)
631630
}
632631

0 commit comments

Comments
 (0)