diff --git a/app/build.gradle b/app/build.gradle index 43300dc8..d7dcef2c 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -60,6 +60,7 @@ dependencies { implementation "com.theoplayer.theoplayer-sdk-android:core:$sdkVersion" implementation "com.theoplayer.theoplayer-sdk-android:integration-ads-ima:$sdkVersion" + implementation "com.theoplayer.theoplayer-sdk-android:integration-ads-dai:$sdkVersion" implementation libs.theoplayer.android.ui implementation project(":connectors:analytics:conviva") diff --git a/app/src/main/java/com/theoplayer/android/connector/Sources.kt b/app/src/main/java/com/theoplayer/android/connector/Sources.kt index 7993f543..4e8c78eb 100644 --- a/app/src/main/java/com/theoplayer/android/connector/Sources.kt +++ b/app/src/main/java/com/theoplayer/android/connector/Sources.kt @@ -2,17 +2,20 @@ package com.theoplayer.android.connector import androidx.compose.runtime.saveable.Saver import androidx.compose.runtime.saveable.SaverScope +import com.theoplayer.android.api.source.GoogleDaiTypedSource import com.theoplayer.android.api.source.SourceDescription import com.theoplayer.android.api.source.SourceType import com.theoplayer.android.api.source.TypedSource import com.theoplayer.android.api.source.addescription.GoogleImaAdDescription import com.theoplayer.android.api.source.metadata.MetadataDescription +import com.theoplayer.android.api.source.ssai.dai.GoogleDaiVodConfiguration import com.theoplayer.android.api.theolive.TheoLiveSource import com.theoplayer.android.connector.uplynk.UplynkAssetType import com.theoplayer.android.connector.uplynk.UplynkPingConfiguration import com.theoplayer.android.connector.uplynk.UplynkSsaiDescription import com.theoplayer.android.connector.yospace.YospaceSsaiDescription import com.theoplayer.android.connector.yospace.YospaceStreamType +import java.util.Collections data class Source( val name: String, @@ -41,6 +44,24 @@ val sources: List by lazy { "program" to "BigBuckBunny with Google IMA ads" ) ), + Source( + name = "BigBuckBunny with Google DAI ads", + sourceDescription = SourceDescription.Builder( + GoogleDaiTypedSource.Builder( + GoogleDaiVodConfiguration.Builder( + "null", + "2474148", + "bbb-clear" + ).apply { + adTagParameters(Collections.singletonMap("npa", "1")) + streamActivityMonitorID("test-stream-activity-monitor-id") + }.build() + ) + .type(SourceType.DASH) + .build() + ) + .build() + ), Source( name = "THEOlive demo", sourceDescription = SourceDescription.Builder(TheoLiveSource(src = "9lwkudxeyjwwm132pukwwhhtk")) diff --git a/connectors/analytics/conviva/build.gradle b/connectors/analytics/conviva/build.gradle index 5a325853..48cb0173 100644 --- a/connectors/analytics/conviva/build.gradle +++ b/connectors/analytics/conviva/build.gradle @@ -45,6 +45,7 @@ android { dependencies { compileOnly "com.theoplayer.theoplayer-sdk-android:core:$sdkVersion" compileOnly "com.theoplayer.theoplayer-sdk-android:integration-ads-ima:$sdkVersion" + compileOnly "com.theoplayer.theoplayer-sdk-android:integration-ads-theoads:$sdkVersion" compileOnly libs.conviva implementation libs.androidx.lifecycle.process diff --git a/connectors/analytics/conviva/src/main/java/com/theoplayer/android/connector/analytics/conviva/ConvivaHandler.kt b/connectors/analytics/conviva/src/main/java/com/theoplayer/android/connector/analytics/conviva/ConvivaHandler.kt index 69c54d65..2be5cfa1 100644 --- a/connectors/analytics/conviva/src/main/java/com/theoplayer/android/connector/analytics/conviva/ConvivaHandler.kt +++ b/connectors/analytics/conviva/src/main/java/com/theoplayer/android/connector/analytics/conviva/ConvivaHandler.kt @@ -28,6 +28,7 @@ import com.theoplayer.android.connector.analytics.conviva.utils.calculateEncodin import com.theoplayer.android.connector.analytics.conviva.utils.calculateStreamType import com.theoplayer.android.connector.analytics.conviva.utils.collectPlaybackConfigMetadata import com.theoplayer.android.connector.analytics.conviva.utils.collectPlayerInfo +import com.theoplayer.android.connector.analytics.conviva.utils.collectAdDescriptionMetadata private const val TAG = "ConvivaHandler" @@ -488,6 +489,7 @@ class ConvivaHandler( put(ConvivaSdkConstants.ASSET_NAME, contentAssetName) put(ConvivaSdkConstants.PLAYER_NAME, playerName) putAll(collectPlaybackConfigMetadata(player)) + putAll(collectAdDescriptionMetadata(player)) // Do not override the `isLive` value if already set by the consumer, as the value // is read-only for a given session. diff --git a/connectors/analytics/conviva/src/main/java/com/theoplayer/android/connector/analytics/conviva/utils/Utils.kt b/connectors/analytics/conviva/src/main/java/com/theoplayer/android/connector/analytics/conviva/utils/Utils.kt index a9cd97cb..d3a1e080 100644 --- a/connectors/analytics/conviva/src/main/java/com/theoplayer/android/connector/analytics/conviva/utils/Utils.kt +++ b/connectors/analytics/conviva/src/main/java/com/theoplayer/android/connector/analytics/conviva/utils/Utils.kt @@ -8,10 +8,12 @@ import com.theoplayer.android.api.ads.Ad import com.theoplayer.android.api.ads.AdBreak import com.theoplayer.android.api.ads.LinearAd import com.theoplayer.android.api.ads.ima.GoogleImaAd +import com.theoplayer.android.api.ads.theoads.TheoAdDescription import com.theoplayer.android.api.event.ads.AdIntegrationKind import com.theoplayer.android.api.player.Player import com.theoplayer.android.api.source.SourceType import com.theoplayer.android.api.source.TypedSource +import com.theoplayer.android.api.source.ssai.GoogleDaiConfiguration import com.theoplayer.android.api.timerange.TimeRanges import com.theoplayer.android.connector.analytics.conviva.ConvivaConfiguration import com.theoplayer.android.connector.analytics.conviva.ConvivaMetadata @@ -119,6 +121,24 @@ fun collectPlaybackConfigMetadata(player: Player): ConvivaMetadata = buildMap { } } +fun collectAdDescriptionMetadata(player: Player): Map { + return mutableMapOf().apply { + player.source?.let { src -> + // Extract streamActivityMonitorId from either THEOads or Google DAI configuration + val streamActivityMonitorId = try { + src.ads.firstNotNullOfOrNull { (it as? TheoAdDescription)?.streamActivityMonitorId } + } catch (_: NoClassDefFoundError) { + // THEOads is not integrated, ignore missing class. + null + } ?: (src.sources.firstOrNull()?.ssai as? GoogleDaiConfiguration)?.streamActivityMonitorID + + streamActivityMonitorId?.let { + put("streamActivityMonitorId", it) + } + } + } +} + private fun validStringOrNA(str: String?): String { return if (str.isNullOrEmpty()) "NA" else str }