diff --git a/ExoPlayerAdapter/src/exo-analytics-listener-2_11-2_13/java/com/mux/stats/sdk/muxstats/internal/ExoAnalyticsListener.kt b/ExoPlayerAdapter/src/exo-analytics-listener-2_11-2_13/java/com/mux/stats/sdk/muxstats/internal/ExoAnalyticsListener.kt index 2c5c829c..d2e26ba4 100644 --- a/ExoPlayerAdapter/src/exo-analytics-listener-2_11-2_13/java/com/mux/stats/sdk/muxstats/internal/ExoAnalyticsListener.kt +++ b/ExoPlayerAdapter/src/exo-analytics-listener-2_11-2_13/java/com/mux/stats/sdk/muxstats/internal/ExoAnalyticsListener.kt @@ -69,7 +69,7 @@ private class ExoAnalyticsListener(player: ExoPlayer, val collector: MuxStateCol eventTime: AnalyticsListener.EventTime, reason: Int ) { - collector.handlePositionDiscontinuity(reason) + collector.handlePositionDiscontinuityBefore218(reason) } @Suppress("OVERRIDE_DEPRECATION") // Not worth making a new variant over (deprecated 2.12) diff --git a/ExoPlayerAdapter/src/exo-analytics-listener-2_13-2_16/java/com/mux/stats/sdk/muxstats/internal/ExoAnalyticsListener.kt b/ExoPlayerAdapter/src/exo-analytics-listener-2_13-2_16/java/com/mux/stats/sdk/muxstats/internal/ExoAnalyticsListener.kt index 13f52031..17ef2ece 100644 --- a/ExoPlayerAdapter/src/exo-analytics-listener-2_13-2_16/java/com/mux/stats/sdk/muxstats/internal/ExoAnalyticsListener.kt +++ b/ExoPlayerAdapter/src/exo-analytics-listener-2_13-2_16/java/com/mux/stats/sdk/muxstats/internal/ExoAnalyticsListener.kt @@ -68,7 +68,7 @@ private class ExoAnalyticsListener(player: ExoPlayer, val collector: MuxStateCol eventTime: AnalyticsListener.EventTime, reason: Int ) { - collector.handlePositionDiscontinuity(reason) + collector.handlePositionDiscontinuityBefore218(reason) } @Suppress("OVERRIDE_DEPRECATION") // Not worth making a new variant over (deprecated 2.12) diff --git a/ExoPlayerAdapter/src/exo-analytics-listener-2_18-now/java/com/mux/stats/sdk/muxstats/internal/ExoAnalyticsListener.kt b/ExoPlayerAdapter/src/exo-analytics-listener-2_18-now/java/com/mux/stats/sdk/muxstats/internal/ExoAnalyticsListener.kt index e4a4d2c8..1e0dfe3d 100644 --- a/ExoPlayerAdapter/src/exo-analytics-listener-2_18-now/java/com/mux/stats/sdk/muxstats/internal/ExoAnalyticsListener.kt +++ b/ExoPlayerAdapter/src/exo-analytics-listener-2_18-now/java/com/mux/stats/sdk/muxstats/internal/ExoAnalyticsListener.kt @@ -7,6 +7,7 @@ import com.google.android.exoplayer2.source.LoadEventInfo import com.google.android.exoplayer2.source.MediaLoadData import com.google.android.exoplayer2.source.TrackGroupArray import com.google.android.exoplayer2.video.VideoSize +import com.mux.stats.sdk.muxstats.MuxPlayerState import com.mux.stats.sdk.muxstats.MuxStateCollector import java.io.IOException @@ -38,13 +39,15 @@ private class ExoAnalyticsListener(player: ExoPlayer, val collector: MuxStateCol //todo } - // TODO: Requires exo 2.12 override fun onPlayWhenReadyChanged( eventTime: EventTime, playWhenReady: Boolean, reason: Int ) { player?.let { + if (collector.muxPlayerState == MuxPlayerState.SEEKED) { + collector.seeked(false) + } collector.handleExoPlaybackState(it.playbackState, it.playWhenReady) } } diff --git a/ExoPlayerAdapter/src/exo-analytics-listener-just-2_17/java/com/mux/stats/sdk/muxstats/internal/ExoAnalyticsListener.kt b/ExoPlayerAdapter/src/exo-analytics-listener-just-2_17/java/com/mux/stats/sdk/muxstats/internal/ExoAnalyticsListener.kt index a83f80df..fb7c5f5e 100644 --- a/ExoPlayerAdapter/src/exo-analytics-listener-just-2_17/java/com/mux/stats/sdk/muxstats/internal/ExoAnalyticsListener.kt +++ b/ExoPlayerAdapter/src/exo-analytics-listener-just-2_17/java/com/mux/stats/sdk/muxstats/internal/ExoAnalyticsListener.kt @@ -67,7 +67,7 @@ private class ExoAnalyticsListener(player: ExoPlayer, val collector: MuxStateCol eventTime: AnalyticsListener.EventTime, reason: Int ) { - collector.handlePositionDiscontinuity(reason) + collector.handlePositionDiscontinuityBefore218(reason) } @Suppress("OVERRIDE_DEPRECATION") // Not worth making a new variant over (deprecated 2.12) diff --git a/ExoPlayerAdapter/src/main/java/com/mux/stats/sdk/muxstats/internal/Util.kt b/ExoPlayerAdapter/src/main/java/com/mux/stats/sdk/muxstats/internal/Util.kt index 3eb0f227..21f785a6 100644 --- a/ExoPlayerAdapter/src/main/java/com/mux/stats/sdk/muxstats/internal/Util.kt +++ b/ExoPlayerAdapter/src/main/java/com/mux/stats/sdk/muxstats/internal/Util.kt @@ -53,10 +53,32 @@ private val hlsExtensionAvailable: Boolean by lazy { internal fun isHlsExtensionAvailable() = hlsExtensionAvailable /** - * Handles an ExoPlayer position discontinuity + * Handles an ExoPlayer position discontinuity. */ -@JvmSynthetic // Hides from java +@JvmSynthetic internal fun MuxStateCollector.handlePositionDiscontinuity(reason: Int) { + // todo - other versions too + when (reason) { + Player.DISCONTINUITY_REASON_SEEK_ADJUSTMENT, Player.DISCONTINUITY_REASON_SEEK -> { + // Called when seeking starts. Player will move to READY when seeking is over + if (mediaHasVideoTrack != false) { + seeking() + } else { + seeked(false) + } + } + + else -> {} // ignored + } +} + +/** + * Handles an ExoPlayer position discontinuity. + * This should only be used for ExoPlayers before version 2.18. Due to behavior changes coinciding + * with Exo 2.18/media3 1.0 + */ +@JvmSynthetic // Hides from java +internal fun MuxStateCollector.handlePositionDiscontinuityBefore218(reason: Int) { when (reason) { Player.DISCONTINUITY_REASON_SEEK -> { // If they seek while paused, this is how we know the seek is complete @@ -98,6 +120,10 @@ internal fun MuxStateCollector.handleExoPlaybackState( } } Player.STATE_READY -> { + if (muxPlayerState == MuxPlayerState.SEEKING) { + // TODO playing() and pause() handle rebuffering, why not also seeking + seeked(false) + } if (playWhenReady) { playing() } else if (muxPlayerState != MuxPlayerState.PAUSED) { diff --git a/MuxExoPlayer/src/main/java/com/mux/stats/sdk/muxstats/AdsImaSDKListener.kt b/MuxExoPlayer/src/main/java/com/mux/stats/sdk/muxstats/AdsImaSDKListener.kt index af7afb50..cff4aadd 100644 --- a/MuxExoPlayer/src/main/java/com/mux/stats/sdk/muxstats/AdsImaSDKListener.kt +++ b/MuxExoPlayer/src/main/java/com/mux/stats/sdk/muxstats/AdsImaSDKListener.kt @@ -106,7 +106,12 @@ class AdsImaSDKListener private constructor( AdEvent.AdEventType.LOADED -> {} AdEvent.AdEventType.CONTENT_PAUSE_REQUESTED -> { // Send pause event if we are currently playing or preparing to play content - if (stateCollector.muxPlayerState.oneOf(MuxPlayerState.PLAY, MuxPlayerState.PLAYING)) { + if (stateCollector.muxPlayerState.oneOf( + MuxPlayerState.PLAY, + MuxPlayerState.PLAYING, + MuxPlayerState.REBUFFERING, + MuxPlayerState.SEEKING + )) { stateCollector.pause() } sendPlayOnStarted = false @@ -143,8 +148,12 @@ class AdsImaSDKListener private constructor( // End the ad break, and then toggle playback state to ensure that // we get a play/playing after the ads. dispatchAdPlaybackEvent(AdBreakEndEvent(null), ad) + val oldPlayWhenReady = player.playWhenReady player.playWhenReady = false stateCollector.finishedPlayingAds() + if(oldPlayWhenReady) { + stateCollector.playing() + } player.playWhenReady = true } AdEvent.AdEventType.PAUSED -> {