Skip to content

Commit 3bb9e9f

Browse files
align ad playback tracking logic with iOS implementation
1 parent e286e0d commit 3bb9e9f

File tree

1 file changed

+27
-21
lines changed

1 file changed

+27
-21
lines changed

media/src/main/java/com/mparticle/media/MediaSession.kt

Lines changed: 27 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ class MediaSession protected constructor(builder: Builder) {
9191
val mediaContentTimeSpent: Double
9292
get() { //total seconds spent playing content
9393
return currentPlaybackStartTimestamp?.let {
94-
this.storedPlaybackTime + (System.currentTimeMillis().minus(it) / 1000).toDouble()
94+
this.storedPlaybackTime + (System.currentTimeMillis() - it) / 1000.0
9595
} ?: this.storedPlaybackTime
9696
}
9797
var mediaContentCompleteLimit: Int = 100
@@ -119,7 +119,7 @@ class MediaSession protected constructor(builder: Builder) {
119119
var storedPlaybackTime: Double = 0.0 //On Pause calculate playback time and clear currentPlaybackTime
120120
private set
121121
private var sessionSummarySent = false // Ensures we only send summary event once
122-
private var pausedByAdBreak: Boolean = false // Tracks if content was paused by an ad break (for resume logic)
122+
private var playbackState: PlaybackState = PlaybackState.PAUSED_BY_USER // Tracks whether playback was playing, paused, or paused by ad break
123123

124124
private var testing = false // Enabled for test cases
125125

@@ -192,6 +192,8 @@ class MediaSession protected constructor(builder: Builder) {
192192
if (currentPlaybackStartTimestamp == null) {
193193
currentPlaybackStartTimestamp = System.currentTimeMillis()
194194
}
195+
196+
playbackState = PlaybackState.PLAYING
195197
val playEvent = MediaEvent(this, MediaEventName.PLAY, options = options)
196198
logEvent(playEvent)
197199
}
@@ -204,6 +206,8 @@ class MediaSession protected constructor(builder: Builder) {
204206
storedPlaybackTime += ((System.currentTimeMillis() - it) / 1000)
205207
currentPlaybackStartTimestamp = null;
206208
}
209+
210+
playbackState = PlaybackState.PAUSED_BY_USER
207211
val pauseEvent = MediaEvent(this, MediaEventName.PAUSE, options = options)
208212
logEvent(pauseEvent)
209213
}
@@ -576,34 +580,30 @@ class MediaSession protected constructor(builder: Builder) {
576580
}
577581

578582
private fun pauseContentTimeIfAdBreakExclusionEnabled() {
579-
if (excludeAdBreaksFromContentTime) {
580-
currentPlaybackStartTimestamp?.let {
581-
storedPlaybackTime += ((System.currentTimeMillis() - it) / 1000)
582-
currentPlaybackStartTimestamp = null
583-
pausedByAdBreak = true
584-
} ?: run {
585-
// Content was already paused, don't mark as paused by ad break
586-
pausedByAdBreak = false
587-
}
583+
if (!excludeAdBreaksFromContentTime || playbackState != PlaybackState.PLAYING) return
584+
585+
currentPlaybackStartTimestamp?.let {
586+
storedPlaybackTime += (System.currentTimeMillis() - it) / 1000.0
587+
currentPlaybackStartTimestamp = null
588+
playbackState = PlaybackState.PAUSED_BY_AD_BREAK
588589
}
589590
}
590591

591592
private fun resumeContentTimeIfAdBreakExclusionEnabled() {
592-
if (excludeAdBreaksFromContentTime) {
593-
// Only resume if content was paused by the ad break, not if it was already paused
594-
if (pausedByAdBreak && currentPlaybackStartTimestamp == null) {
595-
currentPlaybackStartTimestamp = System.currentTimeMillis()
596-
}
597-
pausedByAdBreak = false
598-
}
593+
if (!excludeAdBreaksFromContentTime || playbackState != PlaybackState.PAUSED_BY_AD_BREAK) return
594+
595+
currentPlaybackStartTimestamp = System.currentTimeMillis()
596+
playbackState = PlaybackState.PLAYING
599597
}
600598

601599
private fun logAdSummary(content: MediaAd?) {
602600
content?.let { ad ->
603601
ad.adStartTimestamp?.let { startTime ->
604-
val endTime = System.currentTimeMillis()
605-
ad.adEndTimestamp = endTime
606-
mediaTotalAdTimeSpent += ((endTime - startTime) / 1000).toDouble()
602+
val endTime = ad.adEndTimestamp ?: System.currentTimeMillis()
603+
if (ad.adEndTimestamp == null) {
604+
ad.adEndTimestamp = endTime
605+
mediaTotalAdTimeSpent += ((endTime - startTime) / 1000).toDouble()
606+
}
607607
}
608608

609609
val customAttributes: MutableMap<String, String> = mutableMapOf()
@@ -802,6 +802,12 @@ class MediaSession protected constructor(builder: Builder) {
802802

803803
}
804804

805+
private enum class PlaybackState {
806+
PLAYING,
807+
PAUSED_BY_USER,
808+
PAUSED_BY_AD_BREAK
809+
}
810+
805811
private fun String?.require(variableName: String): String {
806812
if (this == null) {
807813
Logger.error("\"$variableName\" should not be null")

0 commit comments

Comments
 (0)