Skip to content

Commit 7be234e

Browse files
authored
Refactor to support JVM (#13)
* move around modules, and add core-kotlin module * move context around, fix storage for jvm * add kotlin JVM sample app * rename module * rename packages * fix core tests * fix android tests * fix example app * fix example apps * code cleanup * fix some docs and rename test to tests * add documentation * clarify main.kt * move around some code * rename modules * fix conflicts after rebase from master and fix wildcard imports * fix tests
1 parent 77fedfe commit 7be234e

File tree

90 files changed

+1184
-1440
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

90 files changed

+1184
-1440
lines changed

analytics-kotlin/src/test/java/com/segment/analytics/main/utils/Mocks.kt

-92
This file was deleted.

analytics-kotlin/src/test/java/com/segment/analytics/main/utils/Utils.kt

-33
This file was deleted.
File renamed without changes.

analytics-kotlin/build.gradle renamed to android/build.gradle

+2-1
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,8 @@ android {
4545

4646
dependencies {
4747
// MAIN DEPS
48-
api project(":sovran-kotlin")
48+
api project(':core')
49+
api 'com.github.segmentio:sovran-kotlin:0.1.0'
4950
api "org.jetbrains.kotlinx:kotlinx-serialization-json:1.0.1"
5051
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.9'
5152
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.9'
File renamed without changes.
File renamed without changes.

analytics-kotlin/src/main/java/com/segment/analytics/AndroidAnalytics.kt renamed to android/src/main/java/com/segment/analytics/kotlin/android/AndroidAnalytics.kt

+13-9
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,14 @@
1-
package com.segment.analytics
1+
package com.segment.analytics.kotlin.android
22

33
import android.content.Context
44
import android.util.Log
5-
import com.segment.analytics.platform.plugins.LogType
6-
import com.segment.analytics.platform.plugins.Logger
7-
import com.segment.analytics.platform.plugins.android.AndroidContextPlugin
8-
import com.segment.analytics.platform.plugins.android.AndroidLifecyclePlugin
5+
import com.segment.analytics.kotlin.android.plugins.AndroidContextPlugin
6+
import com.segment.analytics.kotlin.android.plugins.AndroidLifecyclePlugin
7+
import com.segment.analytics.kotlin.core.Analytics
8+
import com.segment.analytics.kotlin.core.BaseEvent
9+
import com.segment.analytics.kotlin.core.Configuration
10+
import com.segment.analytics.kotlin.core.platform.plugins.LogType
11+
import com.segment.analytics.kotlin.core.platform.plugins.Logger
912
import kotlinx.coroutines.CoroutineDispatcher
1013
import kotlinx.coroutines.CoroutineScope
1114
import kotlinx.coroutines.Dispatchers
@@ -31,7 +34,8 @@ public fun Analytics(
3134
analyticsScope = coroutineScope,
3235
analyticsDispatcher = analyticsDispatcher,
3336
ioDispatcher = ioDispatcher,
34-
application = context
37+
application = context,
38+
storageProvider = AndroidStorageProvider
3539
)
3640
return Analytics(conf).apply {
3741
startup()
@@ -53,7 +57,8 @@ public fun Analytics(
5357
require(writeKey.isNotBlank()) { "writeKey cannot be blank " }
5458
val conf = Configuration(
5559
writeKey = writeKey,
56-
application = context
60+
application = context,
61+
storageProvider = AndroidStorageProvider
5762
)
5863
configs.invoke(conf)
5964
return Analytics(conf).apply {
@@ -62,7 +67,7 @@ public fun Analytics(
6267
}
6368

6469
// Logger instance that uses the android `Log` class
65-
object AndroidLogger: Logger("AndroidLogger") {
70+
object AndroidLogger : Logger("AndroidLogger") {
6671
override fun log(type: LogType, message: String, event: BaseEvent?) {
6772
when (type) {
6873
LogType.ERROR -> {
@@ -84,6 +89,5 @@ object AndroidLogger: Logger("AndroidLogger") {
8489
private fun Analytics.startup() {
8590
add(AndroidLogger)
8691
add(AndroidContextPlugin())
87-
8892
add(AndroidLifecyclePlugin())
8993
}

analytics-kotlin/src/main/java/com/segment/analytics/Storage.kt renamed to android/src/main/java/com/segment/analytics/kotlin/android/Storage.kt

+12-74
Original file line numberDiff line numberDiff line change
@@ -1,73 +1,20 @@
1-
package com.segment.analytics
1+
package com.segment.analytics.kotlin.android
22

33
import android.content.Context
44
import android.content.SharedPreferences
5-
import com.segment.analytics.Storage.Companion.MAX_PAYLOAD_SIZE
6-
import com.segment.analytics.utilities.EventsFileManager
5+
import com.segment.analytics.kotlin.android.utilities.AndroidKVS
6+
import com.segment.analytics.kotlin.core.Analytics
7+
import com.segment.analytics.kotlin.core.Storage
8+
import com.segment.analytics.kotlin.core.Storage.Companion.MAX_PAYLOAD_SIZE
9+
import com.segment.analytics.kotlin.core.StorageProvider
10+
import com.segment.analytics.kotlin.core.System
11+
import com.segment.analytics.kotlin.core.UserInfo
12+
import com.segment.analytics.kotlin.core.utilities.EventsFileManager
713
import kotlinx.coroutines.CoroutineDispatcher
8-
import kotlinx.serialization.json.Json
9-
import kotlinx.serialization.json.JsonObject
1014
import sovran.kotlin.Store
1115
import sovran.kotlin.Subscriber
1216
import java.io.File
1317

14-
interface Storage {
15-
companion object {
16-
/** Our servers only accept payloads < 32KB. */
17-
const val MAX_PAYLOAD_SIZE = 32000 // 32KB.
18-
19-
/**
20-
* Our servers only accept batches < 500KB. This limit is 475KB to account for extra data that
21-
* is not present in payloads themselves, but is added later, such as `sentAt`, `integrations` and other json tokens.
22-
*/
23-
const val MAX_BATCH_SIZE = 475000 // 475KB.
24-
}
25-
26-
enum class Constants(val rawVal: String) {
27-
UserId("segment.userId"),
28-
Traits("segment.traits"),
29-
AnonymousId("segment.anonymousId"),
30-
Settings("segment.settings"),
31-
Events("segment.events"),
32-
AppVersion("segment.app.version"),
33-
AppBuild("segment.app.build")
34-
}
35-
36-
fun subscribeToStore()
37-
fun write(key: Constants, value: String)
38-
fun read(key: Constants): String?
39-
fun remove(key: Constants): Boolean
40-
fun removeFile(filePath: String): Boolean
41-
42-
fun userInfoUpdate(userInfo: UserInfo) {
43-
write(Constants.AnonymousId, userInfo.anonymousId)
44-
userInfo.userId?.let { write(Constants.UserId, it) }
45-
userInfo.traits?.let {
46-
write(
47-
Constants.Traits,
48-
Json.encodeToString(JsonObject.serializer(), it)
49-
)
50-
}
51-
}
52-
53-
fun systemUpdate(system: System) {
54-
system.settings?.let {
55-
write(
56-
Constants.Settings,
57-
Json.encodeToString(Settings.serializer(), it)
58-
)
59-
}
60-
}
61-
}
62-
63-
fun parseFilePaths(filePathStr: String?): List<String> {
64-
return if (filePathStr.isNullOrEmpty()) {
65-
emptyList()
66-
} else {
67-
filePathStr.split(",").map { it.trim() }
68-
}
69-
}
70-
7118
// Android specific
7219
class AndroidStorage(
7320
internal val analytics: Analytics,
@@ -80,7 +27,8 @@ class AndroidStorage(
8027
private val sharedPreferences: SharedPreferences =
8128
context.getSharedPreferences("analytics-android-$writeKey", Context.MODE_PRIVATE)
8229
private val storageDirectory: File = context.getDir("segment-disk-queue", Context.MODE_PRIVATE)
83-
internal val eventsFile = EventsFileManager(storageDirectory, writeKey, sharedPreferences)
30+
internal val eventsFile =
31+
EventsFileManager(storageDirectory, writeKey, AndroidKVS(sharedPreferences))
8432

8533
override fun subscribeToStore() {
8634
store.subscribe(
@@ -147,17 +95,7 @@ class AndroidStorage(
14795
}
14896
}
14997

150-
interface StorageProvider {
151-
fun getStorage(
152-
analytics: Analytics,
153-
store: Store,
154-
writeKey: String,
155-
ioDispatcher: CoroutineDispatcher,
156-
application: Any
157-
): Storage
158-
}
159-
160-
object ConcreteStorageProvider: StorageProvider {
98+
object AndroidStorageProvider : StorageProvider {
16199
override fun getStorage(
162100
analytics: Analytics,
163101
store: Store,
+17-23
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,29 @@
1-
package com.segment.analytics.platform.plugins.android
1+
package com.segment.analytics.kotlin.android.plugins
22

33
import android.Manifest.permission
44
import android.annotation.SuppressLint
55
import android.content.Context
66
import android.content.pm.PackageManager
77
import android.net.ConnectivityManager
8-
import android.net.NetworkCapabilities.*
8+
import android.net.NetworkCapabilities.TRANSPORT_BLUETOOTH
9+
import android.net.NetworkCapabilities.TRANSPORT_CELLULAR
10+
import android.net.NetworkCapabilities.TRANSPORT_WIFI
911
import android.os.Build
1012
import android.provider.Settings.Secure
1113
import android.telephony.TelephonyManager
12-
import com.segment.analytics.*
13-
import com.segment.analytics.platform.EventPlugin
14-
import com.segment.analytics.platform.Plugin
15-
import com.segment.analytics.utilities.putAll
16-
import com.segment.analytics.utilities.putUndefinedIfNull
17-
import kotlinx.serialization.json.*
18-
import java.util.*
14+
import com.segment.analytics.kotlin.core.Analytics
15+
import com.segment.analytics.kotlin.core.BaseEvent
16+
import com.segment.analytics.kotlin.core.Storage
17+
import com.segment.analytics.kotlin.core.emptyJsonObject
18+
import com.segment.analytics.kotlin.core.platform.Plugin
19+
import com.segment.analytics.kotlin.core.utilities.putAll
20+
import com.segment.analytics.kotlin.core.utilities.putUndefinedIfNull
21+
import kotlinx.serialization.json.JsonObject
22+
import kotlinx.serialization.json.buildJsonObject
23+
import kotlinx.serialization.json.put
24+
import java.util.Locale
25+
import java.util.TimeZone
26+
import java.util.UUID
1927
import java.lang.System as JavaSystem
2028

2129
// Plugin that applies context related changes. Auto-added to system on build
@@ -30,7 +38,6 @@ class AndroidContextPlugin : Plugin {
3038
private lateinit var app: JsonObject
3139
private lateinit var os: JsonObject
3240
private lateinit var device: JsonObject
33-
private lateinit var library: JsonObject
3441
private lateinit var screen: JsonObject
3542

3643
companion object {
@@ -53,11 +60,6 @@ class AndroidContextPlugin : Plugin {
5360
const val DEVICE_NAME_KEY = "name"
5461
const val DEVICE_TYPE_KEY = "type"
5562

56-
// Library
57-
const val LIBRARY_KEY = "library"
58-
const val LIBRARY_NAME_KEY = "name"
59-
const val LIBRARY_VERSION_KEY = "version"
60-
6163
// Network
6264
const val NETWORK_KEY = "network"
6365
const val NETWORK_BLUETOOTH_KEY = "bluetooth"
@@ -89,11 +91,6 @@ class AndroidContextPlugin : Plugin {
8991
put(OS_VERSION_KEY, Build.VERSION.RELEASE)
9092
}
9193

92-
library = buildJsonObject {
93-
put(LIBRARY_NAME_KEY, "analytics-kotlin")
94-
put(LIBRARY_VERSION_KEY, BuildConfig.SEGMENT_VERSION_NAME)
95-
}
96-
9794
screen = buildJsonObject {
9895
val displayMetrics = context.resources.displayMetrics
9996

@@ -188,9 +185,6 @@ class AndroidContextPlugin : Plugin {
188185
// putApp
189186
put(APP_KEY, app)
190187

191-
// putLibrary
192-
put(LIBRARY_KEY, library)
193-
194188
// putDevice
195189
put(DEVICE_KEY, device)
196190

0 commit comments

Comments
 (0)