Skip to content

Commit 4c958e2

Browse files
authored
LIBMOBILE-338 add update type param to update (#26)
* add enum UpdateType * update usage * update sample destination usages * fix logic issue * update test case * update README.md
1 parent be31bbb commit 4c958e2

File tree

9 files changed

+44
-20
lines changed

9 files changed

+44
-20
lines changed

README.md

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -336,8 +336,9 @@ class AmplitudePlugin: DestinationPlugin() {
336336
### Advanced concepts
337337
- [`setup(Analytics)`](https://github.com/segmentio/analytics-kotlin/blob/main/analytics-kotlin/src/main/java/com/segment/analytics/platform/Plugin.kt#L20-L24)
338338
Use this function to setup your plugin. This will be implicitly called once the plugin is registered
339-
- [`update(Settings)`](https://github.com/segmentio/analytics-kotlin/blob/main/analytics-kotlin/src/main/java/com/segment/analytics/platform/Plugin.kt#L31-L33)
340-
Use this function to react to any settings updates. This will be implicitly called when settings are updated.
339+
- [`update(Settings, UpdateType)`](https://github.com/segmentio/analytics-kotlin/blob/main/analytics-kotlin/src/main/java/com/segment/analytics/platform/Plugin.kt#L31-L33)
340+
Use this function to react to any settings updates. This will be implicitly called when settings are updated. The `UpdateType` is used to indicate whether the settings change
341+
is for initialization or refreshment, and you can use it to decide whether to update your plugins accordingly.
341342
You can force a settings update by calling `analytics.checkSettings()`
342343
- AndroidLifecycle hooks
343344
Plugins can also hook into [`AndroidLifecycle`]() functions by implementing an interface. These functions will get called implicitly as the lifecycle events are processed.

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.segment.analytics.kotlin.core
22

33
import com.segment.analytics.kotlin.core.platform.DestinationPlugin
4+
import com.segment.analytics.kotlin.core.platform.Plugin
45
import com.segment.analytics.kotlin.core.platform.plugins.LogType
56
import com.segment.analytics.kotlin.core.platform.plugins.log
67
import kotlinx.coroutines.launch
@@ -107,7 +108,7 @@ class SegmentDestination(
107108
}
108109
}
109110

110-
override fun update(settings: Settings) {
111+
override fun update(settings: Settings, type: Plugin.UpdateType) {
111112
settings.integrations[key]?.jsonObject?.let {
112113
apiKey = it["apiKey"]?.jsonPrimitive?.content ?: apiKey
113114
apiHost = it["apiHost"]?.jsonPrimitive?.content ?: apiHost

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

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.segment.analytics.kotlin.core
22

33
import com.segment.analytics.kotlin.core.platform.DestinationPlugin
4+
import com.segment.analytics.kotlin.core.platform.Plugin
45
import com.segment.analytics.kotlin.core.platform.plugins.LogType
56
import com.segment.analytics.kotlin.core.platform.plugins.log
67
import kotlinx.coroutines.launch
@@ -33,14 +34,14 @@ data class Settings(
3334
}
3435
}
3536

36-
internal fun Analytics.update(settings: Settings) {
37+
internal fun Analytics.update(settings: Settings, type: Plugin.UpdateType) {
3738
timeline.applyClosure { plugin ->
3839
if (plugin is DestinationPlugin) {
3940
plugin.enabled = settings.isDestinationEnabled(plugin.key)
4041
}
4142
// tell all top level plugins to update.
4243
// For destination plugins they auto-handle propagation to sub-plugins
43-
plugin.update(settings)
44+
plugin.update(settings, type)
4445
}
4546
}
4647

@@ -67,8 +68,15 @@ fun Analytics.checkSettings() {
6768
}
6869
settingsObj?.let {
6970
log("Dispatching update settings on ${Thread.currentThread().name}")
71+
72+
// check current system state to determine whether it's initial or refresh
73+
val systemState = store.currentState(System::class)
74+
val hasSettings = systemState?.settings?.integrations != null &&
75+
systemState.settings?.plan != null
76+
val updateType = if (hasSettings) Plugin.UpdateType.Refresh else Plugin.UpdateType.Initial
77+
7078
store.dispatch(System.UpdateSettingsAction(settingsObj), System::class)
71-
update(settingsObj)
79+
update(settingsObj, updateType)
7280
}
7381

7482
// we're good to go back to a running state.

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

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,11 @@ interface Plugin {
1919
Utility // Executed only when called manually, such as Logging.
2020
}
2121

22+
enum class UpdateType {
23+
Initial,
24+
Refresh
25+
}
26+
2227
val type: Type
2328
var analytics: Analytics // ideally will be auto-assigned by setup(), and can be declared as lateinit
2429

@@ -33,7 +38,7 @@ interface Plugin {
3338
return event
3439
}
3540

36-
fun update(settings: Settings) {
41+
fun update(settings: Settings, type: UpdateType) {
3742
// empty body default
3843
}
3944
}
@@ -83,10 +88,10 @@ abstract class DestinationPlugin : EventPlugin {
8388
timeline.remove(plugin)
8489
}
8590

86-
override fun update(settings: Settings) {
91+
override fun update(settings: Settings, type: Plugin.UpdateType) {
8792
// Apply settings update to its own plugins
8893
timeline.applyClosure {
89-
it.update(settings)
94+
it.update(settings, type)
9095
}
9196
}
9297

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ internal class Timeline {
6262
plugins[plugin.type]?.add(plugin)
6363
analytics.store.currentState(System::class)?.settings?.let {
6464
// if we have settings then update plugin with it
65-
plugin.update(it)
65+
plugin.update(it, Plugin.UpdateType.Initial)
6666
}
6767
}
6868

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.segment.analytics.kotlin.core
22

3+
import com.segment.analytics.kotlin.core.platform.Plugin
34
import com.segment.analytics.kotlin.core.utils.StubPlugin
45
import io.mockk.*
56
import kotlinx.coroutines.runBlocking
@@ -87,7 +88,8 @@ class SettingsTests {
8788
},
8889
plan = emptyJsonObject,
8990
edgeFunction = emptyJsonObject
90-
)
91+
),
92+
Plugin.UpdateType.Initial
9193
)
9294
}
9395
}

samples/kotlin-android-app-destinations/src/main/java/com/segment/analytics/destinations/plugins/AmplitudeSession.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ class AmplitudeSession : Plugin {
2020
private var timer: TimerTask? = null
2121
private val fireTime: Long = 300000
2222

23-
override fun update(settings: Settings) {
23+
override fun update(settings: Settings, type:Plugin.UpdateType) {
2424
active = settings.isDestinationEnabled(key)
2525
}
2626

samples/kotlin-android-app-destinations/src/main/java/com/segment/analytics/destinations/plugins/FirebaseDestination.kt

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,9 @@ import com.google.firebase.analytics.FirebaseAnalytics
88
import com.google.firebase.analytics.FirebaseAnalytics.Event
99
import com.google.firebase.analytics.FirebaseAnalytics.Param
1010
import com.segment.analytics.kotlin.android.plugins.AndroidLifecycle
11-
import com.segment.analytics.kotlin.core.Analytics
12-
import com.segment.analytics.kotlin.core.BaseEvent
13-
import com.segment.analytics.kotlin.core.IdentifyEvent
14-
import com.segment.analytics.kotlin.core.Properties
15-
import com.segment.analytics.kotlin.core.ScreenEvent
16-
import com.segment.analytics.kotlin.core.TrackEvent
11+
import com.segment.analytics.kotlin.core.*
1712
import com.segment.analytics.kotlin.core.platform.DestinationPlugin
13+
import com.segment.analytics.kotlin.core.platform.Plugin
1814
import com.segment.analytics.kotlin.core.platform.plugins.log
1915
import com.segment.analytics.kotlin.core.utilities.getDouble
2016
import com.segment.analytics.kotlin.core.utilities.getMapSet
@@ -77,6 +73,13 @@ class FirebaseDestination(
7773
firebaseAnalytics = FirebaseAnalytics.getInstance(context)
7874
}
7975

76+
override fun update(settings: Settings, type: Plugin.UpdateType) {
77+
// if we've already set up this singleton SDK, can't do it again, so skip.
78+
if (type != Plugin.UpdateType.Initial) return
79+
80+
super.update(settings, type)
81+
}
82+
8083
override fun identify(payload: IdentifyEvent): BaseEvent? {
8184
var returnPayload = super.identify(payload)
8285

samples/kotlin-android-app-destinations/src/main/java/com/segment/analytics/destinations/plugins/MixpanelDestination.kt

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import com.segment.analytics.kotlin.core.platform.DestinationPlugin
99
import com.segment.analytics.kotlin.core.platform.plugins.LogType
1010
import com.segment.analytics.kotlin.android.plugins.AndroidLifecycle
1111
import com.segment.analytics.kotlin.android.utilities.toJSONObject
12+
import com.segment.analytics.kotlin.core.platform.Plugin
1213
import com.segment.analytics.kotlin.core.platform.plugins.log
1314
import com.segment.analytics.kotlin.core.utilities.*
1415
import kotlinx.serialization.json.*
@@ -163,8 +164,11 @@ class MixpanelDestination(
163164
return payload
164165
}
165166

166-
override fun update(settings: Settings) {
167-
super.update(settings)
167+
override fun update(settings: Settings, type:Plugin.UpdateType) {
168+
// if we've already set up this singleton SDK, can't do it again, so skip.
169+
if (type != Plugin.UpdateType.Initial) return
170+
171+
super.update(settings, type)
168172
val mixpanelSettings = settings.integrations[key]
169173
mixpanelSettings?.jsonObject?.let {
170174
analytics.log("mixpanel.received settings=$it", type = LogType.INFO)

0 commit comments

Comments
 (0)