diff --git a/pillarbox-core-business/src/main/java/ch/srgssr/pillarbox/core/business/tracker/comscore/ComScoreTracker.kt b/pillarbox-core-business/src/main/java/ch/srgssr/pillarbox/core/business/tracker/comscore/ComScoreTracker.kt index a7801b983..9d4cf59dd 100644 --- a/pillarbox-core-business/src/main/java/ch/srgssr/pillarbox/core/business/tracker/comscore/ComScoreTracker.kt +++ b/pillarbox-core-business/src/main/java/ch/srgssr/pillarbox/core/business/tracker/comscore/ComScoreTracker.kt @@ -17,6 +17,7 @@ import ch.srgssr.pillarbox.player.tracker.MediaItemTracker import ch.srgssr.pillarbox.player.utils.DebugLogger import com.comscore.streaming.ContentMetadata import com.comscore.streaming.StreamingAnalytics +import java.lang.ref.WeakReference /** * A [MediaItemTracker] implementation for ComScore analytics. @@ -43,6 +44,7 @@ class ComScoreTracker internal constructor( */ private var isSurfaceConnected: Boolean = false private var isBuffering: Boolean = false + private lateinit var player: WeakReference init { streamingAnalytics.setMediaPlayerName(MEDIA_PLAYER_NAME) @@ -50,6 +52,7 @@ class ComScoreTracker internal constructor( } override fun start(player: ExoPlayer, data: Data) { + this.player = WeakReference(player) isSurfaceConnected = player.surfaceSize != Size.ZERO streamingAnalytics.createPlaybackSession() setMetadata(data) @@ -74,7 +77,7 @@ class ComScoreTracker internal constructor( private fun handleStart(player: ExoPlayer) { streamingAnalytics.notifyChangePlaybackRate(player.getPlaybackSpeed()) when { - player.isPlaying -> { + player.isPlaying && !player.currentTimeline.isEmpty -> { player.currentTimeline.getWindow(player.currentMediaItemIndex, window) notifyPlay(player.currentPosition, window) } @@ -95,6 +98,13 @@ class ComScoreTracker internal constructor( streamingAnalytics.notifyPlay() } + private fun notifyPlay(eventTime: AnalyticsListener.EventTime) { + if (!eventTime.timeline.isEmpty) { + eventTime.timeline.getWindow(eventTime.windowIndex, window) + notifyPlay(eventTime.eventPlaybackPositionMs, window) + } + } + private fun notifyEnd() { DebugLogger.debug(TAG, "notifyEnd") streamingAnalytics.notifyEnd() @@ -192,10 +202,8 @@ class ComScoreTracker internal constructor( } override fun onIsPlayingChanged(eventTime: AnalyticsListener.EventTime, isPlaying: Boolean) { - val position = eventTime.eventPlaybackPositionMs - eventTime.timeline.getWindow(eventTime.windowIndex, window) if (isPlaying) { - notifyPlay(position, window) + notifyPlay(eventTime) } else { if (!isBuffering) { notifyPause() @@ -206,12 +214,10 @@ class ComScoreTracker internal constructor( override fun onSurfaceSizeChanged(eventTime: AnalyticsListener.EventTime, width: Int, height: Int) { val isCurrentSurfaceConnected = Size(width, height) != Size.ZERO if (isCurrentSurfaceConnected != isSurfaceConnected) { - Log.d(TAG, "Surface connected change $isSurfaceConnected -> $isCurrentSurfaceConnected") + Log.d(TAG, "Surface connected change $isSurfaceConnected -> $isCurrentSurfaceConnected ${player.get()?.isPlaying}") isSurfaceConnected = isCurrentSurfaceConnected - if (isCurrentSurfaceConnected) { - val position = eventTime.eventPlaybackPositionMs - eventTime.timeline.getWindow(eventTime.windowIndex, window) - notifyPlay(position, window) + if (isCurrentSurfaceConnected && player.get()?.isPlaying == true) { + notifyPlay(eventTime) } else { notifyPause() }