diff --git a/CHANGELOG b/CHANGELOG index 2168d9958..92fcbe49e 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,8 @@ +Version 6.0.1 (2024-02-14) +-------------------------- +Fix wrong screen entity info assigned for screen end event and in case events are tracked right before screen view (#673) +Add percent progress to event (#662) + Version 6.0.0 (2024-02-01) -------------------------- Enable lifecycle autotracking by default (#651) diff --git a/VERSION b/VERSION index 09b254e90..5fe607230 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -6.0.0 +6.0.1 diff --git a/build.gradle b/build.gradle index dd70a6fc6..c9c25e84b 100644 --- a/build.gradle +++ b/build.gradle @@ -22,7 +22,7 @@ plugins { subprojects { group = 'com.snowplowanalytics' - version = '6.0.0' + version = '6.0.1' repositories { google() maven { diff --git a/gradle.properties b/gradle.properties index c75895ae7..88c8c9605 100644 --- a/gradle.properties +++ b/gradle.properties @@ -31,7 +31,7 @@ systemProp.org.gradle.internal.http.socketTimeout=120000 SONATYPE_STAGING_PROFILE=comsnowplowanalytics GROUP=com.snowplowanalytics POM_ARTIFACT_ID=snowplow-android-tracker -VERSION_NAME=6.0.0 +VERSION_NAME=6.0.1 POM_NAME=snowplow-android-tracker POM_PACKAGING=aar diff --git a/snowplow-demo-kotlin/src/main/java/com/snowplowanalytics/snowplowdemokotlin/media/VideoViewController.kt b/snowplow-demo-kotlin/src/main/java/com/snowplowanalytics/snowplowdemokotlin/media/VideoViewController.kt index 4a5f64f13..6e43cf295 100644 --- a/snowplow-demo-kotlin/src/main/java/com/snowplowanalytics/snowplowdemokotlin/media/VideoViewController.kt +++ b/snowplow-demo-kotlin/src/main/java/com/snowplowanalytics/snowplowdemokotlin/media/VideoViewController.kt @@ -26,6 +26,7 @@ import android.view.View import android.widget.MediaController import com.snowplowanalytics.snowplow.Snowplow import com.snowplowanalytics.snowplow.event.Event +import com.snowplowanalytics.snowplow.media.configuration.MediaTrackingConfiguration import com.snowplowanalytics.snowplow.media.controller.MediaTracking import com.snowplowanalytics.snowplow.media.entity.MediaPlayerEntity import com.snowplowanalytics.snowplow.media.event.* @@ -130,9 +131,14 @@ class VideoViewController(activity: Activity, uri: Uri) { reset() loaded = true - mediaTracking = Snowplow.defaultTracker?.media?.startMediaTracking( + val configuration = MediaTrackingConfiguration( id = UUID.randomUUID().toString(), - player = player + player = player, + boundaries = listOf(10, 25, 50, 75), + ) + + mediaTracking = Snowplow.defaultTracker?.media?.startMediaTracking( + configuration ) updateThread = UpdateThread() diff --git a/snowplow-tracker/src/androidTest/java/com/snowplowanalytics/snowplow/internal/tracker/TrackerTest.kt b/snowplow-tracker/src/androidTest/java/com/snowplowanalytics/snowplow/internal/tracker/TrackerTest.kt index 53a3dbfe5..786f79e67 100755 --- a/snowplow-tracker/src/androidTest/java/com/snowplowanalytics/snowplow/internal/tracker/TrackerTest.kt +++ b/snowplow-tracker/src/androidTest/java/com/snowplowanalytics/snowplow/internal/tracker/TrackerTest.kt @@ -383,17 +383,14 @@ class TrackerTest { } Companion.tracker = Tracker(emitter, namespace, "myAppId", context = context, builder = trackerBuilder) val screenState = Companion.tracker!!.getScreenState() - Assert.assertNotNull(screenState) - var screenStateMapWrapper: Map = screenState!!.getCurrentScreen(true).map - var screenStateMap = screenStateMapWrapper[Parameters.DATA] as Map? - Assert.assertEquals("Unknown", screenStateMap!![Parameters.SCREEN_NAME]) + Assert.assertNull(screenState) // Send screenView var screenView = ScreenView("screen1") val screenId = screenView.dataPayload["id"] as String? val eventId1 = Companion.tracker!!.track(screenView) - screenStateMapWrapper = Companion.tracker!!.getScreenState()!!.getCurrentScreen(true).map - screenStateMap = screenStateMapWrapper[Parameters.DATA] as Map? + val screenStateMapWrapper = Companion.tracker!!.getScreenState()!!.getCurrentScreen(true).map + val screenStateMap = screenStateMapWrapper[Parameters.DATA] as Map<*, *>? Assert.assertEquals("screen1", screenStateMap!![Parameters.SCREEN_NAME]) Assert.assertEquals(screenId, screenStateMap[Parameters.SCREEN_ID]) diff --git a/snowplow-tracker/src/androidTest/java/com/snowplowanalytics/snowplow/media/TestMediaController.kt b/snowplow-tracker/src/androidTest/java/com/snowplowanalytics/snowplow/media/TestMediaController.kt index a5210e0f3..944904b77 100644 --- a/snowplow-tracker/src/androidTest/java/com/snowplowanalytics/snowplow/media/TestMediaController.kt +++ b/snowplow-tracker/src/androidTest/java/com/snowplowanalytics/snowplow/media/TestMediaController.kt @@ -16,6 +16,7 @@ package com.snowplowanalytics.snowplow.media import android.content.Context import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.platform.app.InstrumentationRegistry +import com.snowplowanalytics.core.emitter.Executor import com.snowplowanalytics.core.media.MediaSchemata.eventSchema import com.snowplowanalytics.core.media.MediaSchemata.playerSchema import com.snowplowanalytics.core.media.MediaSchemata.sessionSchema @@ -73,6 +74,7 @@ class TestMediaController { tracker = null removeAllTrackers() trackedEvents.clear() + Executor.shutdown() } // --- MEDIA PLAYER EVENT TESTS @@ -523,6 +525,29 @@ class TestMediaController { assertEquals(3, trackedEvents.filter { it.schema == eventSchema("percent_progress") }.size) } + @Test + fun progressEventShouldHavePercentValue() { + val configuration = MediaTrackingConfiguration( + id = "media1", + player = MediaPlayerEntity(duration = 100.0), + boundaries = listOf(50), + ) + val media = tracker?.media?.startMediaTracking(configuration = configuration) + + media?.track(MediaPlayEvent()) + for (i in 1 until 60) { + media?.update(player = MediaPlayerEntity(currentTime = i.toDouble())) + } + + Thread.sleep(100) + + assertEquals(2, trackedEvents.size) + + val progressEvents = trackedEvents.filter { it.schema == eventSchema("percent_progress") } + assertEquals(1, progressEvents.size) + assertEquals(50, progressEvents[0].payload["percentProgress"]) + } + @Test fun doesntSendProgressEventsIfPaused() { val configuration = MediaTrackingConfiguration( diff --git a/snowplow-tracker/src/androidTest/java/com/snowplowanalytics/snowplow/screen/ScreenViewAutotrackingTest.kt b/snowplow-tracker/src/androidTest/java/com/snowplowanalytics/snowplow/screen/ScreenViewAutotrackingTest.kt index a0fd293e2..2666cbf50 100644 --- a/snowplow-tracker/src/androidTest/java/com/snowplowanalytics/snowplow/screen/ScreenViewAutotrackingTest.kt +++ b/snowplow-tracker/src/androidTest/java/com/snowplowanalytics/snowplow/screen/ScreenViewAutotrackingTest.kt @@ -16,17 +16,16 @@ import android.content.Context import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.platform.app.InstrumentationRegistry import com.snowplowanalytics.core.constants.TrackerConstants +import com.snowplowanalytics.core.emitter.Executor import com.snowplowanalytics.core.utils.NotificationCenter import com.snowplowanalytics.snowplow.Snowplow import com.snowplowanalytics.snowplow.Snowplow.removeAllTrackers import com.snowplowanalytics.snowplow.configuration.Configuration import com.snowplowanalytics.snowplow.configuration.NetworkConfiguration -import com.snowplowanalytics.snowplow.configuration.PluginConfiguration import com.snowplowanalytics.snowplow.controller.TrackerController import com.snowplowanalytics.snowplow.event.ScreenView -import com.snowplowanalytics.snowplow.event.Structured import com.snowplowanalytics.snowplow.network.HttpMethod -import com.snowplowanalytics.snowplow.payload.SelfDescribingJson +import com.snowplowanalytics.snowplow.util.EventSink import org.junit.After import org.junit.Assert import org.junit.Test @@ -39,21 +38,14 @@ class ScreenViewAutotrackingTest { @After fun tearDown() { removeAllTrackers() + Executor.shutdown() } // --- TESTS @Test fun doesntTrackTheSameScreenViewMultipleTimes() { - var numberOfScreenViews = 0 - - val countPlugin = PluginConfiguration("test") - countPlugin.afterTrack { - if (it.schema == TrackerConstants.SCHEMA_SCREEN_VIEW) { - numberOfScreenViews += 1 - } - } - - createTracker(listOf(countPlugin)) + val eventSink = EventSink() + createTracker(listOf(eventSink)) Thread.sleep(200) NotificationCenter.postNotification("SnowplowScreenView", mapOf( @@ -69,8 +61,9 @@ class ScreenViewAutotrackingTest { NotificationCenter.postNotification("SnowplowScreenView", mapOf( "event" to ScreenView(name = "Screen2").activityClassName("Screen2") )) - Thread.sleep(200) + Thread.sleep(500) + val numberOfScreenViews = eventSink.trackedEvents.filter { it.schema == TrackerConstants.SCHEMA_SCREEN_VIEW }.size Assert.assertEquals(2, numberOfScreenViews) } diff --git a/snowplow-tracker/src/androidTest/java/com/snowplowanalytics/snowplow/screenviews/ScreenStateMachineTest.kt b/snowplow-tracker/src/androidTest/java/com/snowplowanalytics/snowplow/screenviews/ScreenStateMachineTest.kt new file mode 100644 index 000000000..fc6cd880d --- /dev/null +++ b/snowplow-tracker/src/androidTest/java/com/snowplowanalytics/snowplow/screenviews/ScreenStateMachineTest.kt @@ -0,0 +1,102 @@ +/* + * Copyright (c) 2015-present Snowplow Analytics Ltd. All rights reserved. + * + * This program is licensed to you under the Apache License Version 2.0, + * and you may not use this file except in compliance with the Apache License Version 2.0. + * You may obtain a copy of the Apache License Version 2.0 at http://www.apache.org/licenses/LICENSE-2.0. + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the Apache License Version 2.0 is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the Apache License Version 2.0 for the specific language governing permissions and limitations there under. + */ +package com.snowplowanalytics.snowplow.tracker + +import android.content.Context +import androidx.test.ext.junit.runners.AndroidJUnit4 +import androidx.test.platform.app.InstrumentationRegistry +import com.snowplowanalytics.core.constants.TrackerConstants +import com.snowplowanalytics.core.emitter.Executor +import com.snowplowanalytics.snowplow.Snowplow +import com.snowplowanalytics.snowplow.Snowplow.removeAllTrackers +import com.snowplowanalytics.snowplow.configuration.Configuration +import com.snowplowanalytics.snowplow.configuration.NetworkConfiguration +import com.snowplowanalytics.snowplow.controller.TrackerController +import com.snowplowanalytics.snowplow.event.* +import com.snowplowanalytics.snowplow.network.HttpMethod +import com.snowplowanalytics.snowplow.util.EventSink +import org.junit.After +import org.junit.Assert +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import java.util.* + +@RunWith(AndroidJUnit4::class) +class ScreenStateMachineTest { + + @Before + fun setUp() { + } + + @After + fun tearDown() { + removeAllTrackers() + Executor.shutdown() + } + + // --- TESTS + + @Test + fun tracksEventsWithTheCorrectScreenEntityInfo() { + val eventSink = EventSink() + val tracker = createTracker(listOf(eventSink)) + + tracker.track(Timing(category = "c1", variable = "v1", timing = 1)) + tracker.track(ScreenView(name = "Screen 1")) + tracker.track(Timing(category = "c2", variable = "v2", timing = 2)) + tracker.track(ScreenView(name = "Screen 2")) + tracker.track(Timing(category = "c3", variable = "v3", timing = 3)) + tracker.track(ScreenView(name = "Screen 3")) + tracker.track(Timing(category = "c4", variable = "v4", timing = 4)) + + Thread.sleep(200) + + val events = eventSink.trackedEvents + + val timingEvents = events.filter { it.schema == TrackerConstants.SCHEMA_USER_TIMINGS } + .sortedBy { it.payload["timing"] as Int } + Assert.assertEquals(4, timingEvents.size) + + val screen0 = getScreenEntityData(timingEvents[0]) + Assert.assertNull(screen0) + + val screen1 = getScreenEntityData(timingEvents[1]) + Assert.assertEquals("Screen 1", screen1?.get("name")) + + val screen2 = getScreenEntityData(timingEvents[2]) + Assert.assertEquals("Screen 2", screen2?.get("name")) + + val screen3 = getScreenEntityData(timingEvents[3]) + Assert.assertEquals("Screen 3", screen3?.get("name")) + } + + // --- PRIVATE + private val context: Context + get() = InstrumentationRegistry.getInstrumentation().targetContext + + private fun getScreenEntityData(event: InspectableEvent): Map<*, *>? { + val entity = event.entities.find { it.map["schema"] == TrackerConstants.SCHEMA_SCREEN } + return entity?.map?.get("data") as? Map<*, *> + } + + private fun createTracker(configurations: List): TrackerController { + val networkConfig = NetworkConfiguration(MockNetworkConnection(HttpMethod.POST, 200)) + return Snowplow.createTracker( + context, + namespace = "ns" + Math.random().toString(), + network = networkConfig, + configurations = configurations.toTypedArray() + ) + } +} diff --git a/snowplow-tracker/src/androidTest/java/com/snowplowanalytics/snowplow/screenviews/ScreenSummaryStateMachineTest.kt b/snowplow-tracker/src/androidTest/java/com/snowplowanalytics/snowplow/screenviews/ScreenSummaryStateMachineTest.kt index 93d3a8a33..a0f36d322 100644 --- a/snowplow-tracker/src/androidTest/java/com/snowplowanalytics/snowplow/screenviews/ScreenSummaryStateMachineTest.kt +++ b/snowplow-tracker/src/androidTest/java/com/snowplowanalytics/snowplow/screenviews/ScreenSummaryStateMachineTest.kt @@ -16,16 +16,15 @@ import android.content.Context import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.platform.app.InstrumentationRegistry import com.snowplowanalytics.core.constants.TrackerConstants +import com.snowplowanalytics.core.emitter.Executor import com.snowplowanalytics.core.screenviews.ScreenSummaryState import com.snowplowanalytics.snowplow.Snowplow import com.snowplowanalytics.snowplow.Snowplow.removeAllTrackers import com.snowplowanalytics.snowplow.configuration.Configuration import com.snowplowanalytics.snowplow.configuration.NetworkConfiguration -import com.snowplowanalytics.snowplow.configuration.PluginConfiguration import com.snowplowanalytics.snowplow.controller.TrackerController import com.snowplowanalytics.snowplow.event.* import com.snowplowanalytics.snowplow.network.HttpMethod -import com.snowplowanalytics.snowplow.payload.SelfDescribingJson import com.snowplowanalytics.snowplow.util.EventSink import com.snowplowanalytics.snowplow.util.TimeTraveler import org.junit.After @@ -50,6 +49,7 @@ class ScreenSummaryStateMachineTest { @After fun tearDown() { removeAllTrackers() + Executor.shutdown() } // --- TESTS @@ -94,9 +94,14 @@ class ScreenSummaryStateMachineTest { val events = eventSink.trackedEvents Assert.assertEquals(3, events.size) - val screenSummary = getScreenSummary(events.find { it.schema == TrackerConstants.SCHEMA_SCREEN_END }) + val screenEnd = events.find { it.schema == TrackerConstants.SCHEMA_SCREEN_END } + val screenSummary = getScreenSummary(screenEnd) Assert.assertEquals(10.0, screenSummary?.get("foreground_sec")) Assert.assertEquals(0.0, screenSummary?.get("background_sec")) + + // should have the screen name of the first screen view + val screenEndScreen = screenEnd?.entities?.find { it.map["schema"] == TrackerConstants.SCHEMA_SCREEN } + Assert.assertEquals("Screen 1", (screenEndScreen?.map?.get("data") as? Map<*, *>)?.get("name")) } @Test diff --git a/snowplow-tracker/src/androidTest/java/com/snowplowanalytics/snowplow/tracker/FocalMeterConfigurationTest.kt b/snowplow-tracker/src/androidTest/java/com/snowplowanalytics/snowplow/tracker/FocalMeterConfigurationTest.kt index 57f471dd2..1fa1dc1b2 100644 --- a/snowplow-tracker/src/androidTest/java/com/snowplowanalytics/snowplow/tracker/FocalMeterConfigurationTest.kt +++ b/snowplow-tracker/src/androidTest/java/com/snowplowanalytics/snowplow/tracker/FocalMeterConfigurationTest.kt @@ -16,6 +16,7 @@ package com.snowplowanalytics.snowplow.tracker import android.content.Context import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.platform.app.InstrumentationRegistry +import com.snowplowanalytics.core.emitter.Executor import com.snowplowanalytics.snowplow.Snowplow import com.snowplowanalytics.snowplow.Snowplow.removeAllTrackers import com.snowplowanalytics.snowplow.configuration.* @@ -36,6 +37,7 @@ class FocalMeterConfigurationTest { @After fun tearDown() { removeAllTrackers() + Executor.shutdown() } // --- TESTS diff --git a/snowplow-tracker/src/androidTest/java/com/snowplowanalytics/snowplow/tracker/PluginsTest.kt b/snowplow-tracker/src/androidTest/java/com/snowplowanalytics/snowplow/tracker/PluginsTest.kt index 6c173512c..6862666ad 100644 --- a/snowplow-tracker/src/androidTest/java/com/snowplowanalytics/snowplow/tracker/PluginsTest.kt +++ b/snowplow-tracker/src/androidTest/java/com/snowplowanalytics/snowplow/tracker/PluginsTest.kt @@ -15,6 +15,7 @@ package com.snowplowanalytics.snowplow.tracker import android.content.Context import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.platform.app.InstrumentationRegistry +import com.snowplowanalytics.core.emitter.Executor import com.snowplowanalytics.snowplow.Snowplow import com.snowplowanalytics.snowplow.Snowplow.removeAllTrackers import com.snowplowanalytics.snowplow.configuration.Configuration @@ -38,6 +39,7 @@ class PluginsTest { @After fun tearDown() { removeAllTrackers() + Executor.shutdown() } // --- TESTS diff --git a/snowplow-tracker/src/main/java/com/snowplowanalytics/core/media/controller/MediaTrackingImpl.kt b/snowplow-tracker/src/main/java/com/snowplowanalytics/core/media/controller/MediaTrackingImpl.kt index 2d7bf0063..fb9847407 100644 --- a/snowplow-tracker/src/main/java/com/snowplowanalytics/core/media/controller/MediaTrackingImpl.kt +++ b/snowplow-tracker/src/main/java/com/snowplowanalytics/core/media/controller/MediaTrackingImpl.kt @@ -101,7 +101,7 @@ class MediaTrackingImpl ( // track events event?.let { addEntitiesAndTrack(it) } if (shouldSendPercentProgressEvent()) { - addEntitiesAndTrack(MediaPercentProgressEvent()) + addEntitiesAndTrack(MediaPercentProgressEvent(this.player.percentProgress)) } // update state for events after this one diff --git a/snowplow-tracker/src/main/java/com/snowplowanalytics/core/media/event/MediaPercentProgressEvent.kt b/snowplow-tracker/src/main/java/com/snowplowanalytics/core/media/event/MediaPercentProgressEvent.kt index df1f3dbfe..9289d656a 100644 --- a/snowplow-tracker/src/main/java/com/snowplowanalytics/core/media/event/MediaPercentProgressEvent.kt +++ b/snowplow-tracker/src/main/java/com/snowplowanalytics/core/media/event/MediaPercentProgressEvent.kt @@ -19,10 +19,12 @@ import com.snowplowanalytics.snowplow.event.AbstractSelfDescribing /** * Media player event fired when a percentage boundary set in the `boundaries` list in `MediaTrackingConfiguration` is reached. */ -class MediaPercentProgressEvent : AbstractSelfDescribing() { +class MediaPercentProgressEvent(val percentProgress: Int?) : AbstractSelfDescribing() { override val schema: String get() = MediaSchemata.eventSchema("percent_progress") override val dataPayload: Map - get() = emptyMap() + get() = mapOf( + "percentProgress" to percentProgress, + ) } diff --git a/snowplow-tracker/src/main/java/com/snowplowanalytics/core/screenviews/ScreenState.kt b/snowplow-tracker/src/main/java/com/snowplowanalytics/core/screenviews/ScreenState.kt index 50cec9ddd..c64981b51 100644 --- a/snowplow-tracker/src/main/java/com/snowplowanalytics/core/screenviews/ScreenState.kt +++ b/snowplow-tracker/src/main/java/com/snowplowanalytics/core/screenviews/ScreenState.kt @@ -21,63 +21,25 @@ import com.snowplowanalytics.snowplow.payload.SelfDescribingJson import com.snowplowanalytics.snowplow.payload.TrackerPayload @RestrictTo(RestrictTo.Scope.LIBRARY) -class ScreenState : State { - private var name: String - private var type: String? = null - private var id: String - var previousName: String? = null - private set - var previousId: String? = null - private set - var previousType: String? = null - private set - private var transitionType: String? = null - private var fragmentClassName: String? = null - private var fragmentTag: String? = null - var activityClassName: String? = null - var activityTag: String? = null +class ScreenState( + val name: String = "Unknown", + val type: String? = null, + val id: String = uUIDString(), + val transitionType: String? = null, + val fragmentClassName: String? = null, + val fragmentTag: String? = null, + val activityClassName: String? = null, + val activityTag: String? = null, + val previousScreenState: ScreenState? = null +) : State { - init { - id = uUIDString() - name = "Unknown" - } - - @Synchronized - fun updateScreenState(id: String?, name: String, type: String?, transitionType: String?) { - populatePreviousFields() - this.name = name - this.type = type - this.transitionType = transitionType - if (id != null) { - this.id = id - } else { - this.id = uUIDString() - } - } + val previousName: String? + get() { return previousScreenState?.name } + val previousId: String? + get() { return previousScreenState?.id } + val previousType: String? + get() { return previousScreenState?.type } - @Synchronized - fun updateScreenState( - id: String, - name: String, - type: String?, - transitionType: String?, - fragmentClassName: String?, - fragmentTag: String?, - activityClassName: String?, - activityTag: String? - ) { - this.updateScreenState(id, name, type, transitionType) - this.fragmentClassName = fragmentClassName - this.fragmentTag = fragmentTag - this.activityClassName = activityClassName - this.activityTag = activityTag - } - - private fun populatePreviousFields() { - previousName = name - previousType = type - previousId = id - } fun getCurrentScreen(debug: Boolean): SelfDescribingJson { // this creates a screen context from screen state diff --git a/snowplow-tracker/src/main/java/com/snowplowanalytics/core/screenviews/ScreenStateMachine.kt b/snowplow-tracker/src/main/java/com/snowplowanalytics/core/screenviews/ScreenStateMachine.kt index ad8bb6ee1..2b05bf8bc 100644 --- a/snowplow-tracker/src/main/java/com/snowplowanalytics/core/screenviews/ScreenStateMachine.kt +++ b/snowplow-tracker/src/main/java/com/snowplowanalytics/core/screenviews/ScreenStateMachine.kt @@ -54,27 +54,19 @@ class ScreenStateMachine : StateMachineInterface { get() = emptyList() override fun transition(event: Event, state: State?): State? { - val screenView = event as? ScreenView - val screenState: ScreenState? = if (state != null) { - // - Screen (SV) Screen - state as? ScreenState - } else { - // - Init (SV) Screen - ScreenState() - } - screenView?.let { - screenState?.updateScreenState( - it.id, - it.name, - it.type, - it.transitionType, - it.fragmentClassName, - it.fragmentTag, - it.activityClassName, - it.activityTag + return (event as? ScreenView)?.let { screenView -> + ScreenState( + id = screenView.id, + name = screenView.name, + type = screenView.type, + transitionType = screenView.transitionType, + fragmentClassName = screenView.fragmentClassName, + fragmentTag = screenView.fragmentTag, + activityClassName = screenView.activityClassName, + activityTag = screenView.activityTag, + previousScreenState = state as? ScreenState ) } - return screenState } override fun entities(event: InspectableEvent, state: State?): List? { diff --git a/snowplow-tracker/src/main/java/com/snowplowanalytics/core/tracker/Tracker.kt b/snowplow-tracker/src/main/java/com/snowplowanalytics/core/tracker/Tracker.kt index 4a32ea29c..961a0ebb8 100755 --- a/snowplow-tracker/src/main/java/com/snowplowanalytics/core/tracker/Tracker.kt +++ b/snowplow-tracker/src/main/java/com/snowplowanalytics/core/tracker/Tracker.kt @@ -71,12 +71,7 @@ class Tracker( fun getScreenState(): ScreenState? { val state = stateManager.trackerState.getState(ScreenStateMachine.ID) - ?: // Legacy initialization - return ScreenState() - - return if (state is ScreenState) { - state - } else null + return state as? ScreenState } private var trackerVersion = BuildConfig.TRACKER_LABEL @@ -333,8 +328,9 @@ class Tracker( override fun apply(data: Map) { if (screenViewAutotracking) { val event = data["event"] as? ScreenView? - event?.let { event -> - getScreenState()?.let { state -> + if (event != null) { + val state = getScreenState() + if (state != null) { // don't track if screen view is for the same activity as the last one if ( event.activityClassName?.isEmpty() != false || @@ -343,7 +339,9 @@ class Tracker( ) { track(event) } - } ?: track(event) + } else { + track(event) + } } } }