From 8bf90a7667939496efb01456361f8146f2074682 Mon Sep 17 00:00:00 2001 From: Fabre Lambeau Date: Tue, 3 Mar 2026 13:23:42 +0000 Subject: [PATCH 1/7] [web/app] App sends trackers when iframe is shown --- web/app/src/Player.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/web/app/src/Player.ts b/web/app/src/Player.ts index 92358cd..2941187 100644 --- a/web/app/src/Player.ts +++ b/web/app/src/Player.ts @@ -164,6 +164,11 @@ export default class Player { return } simidIframe.style.display = show ? 'block' : 'none' + + if (show) { + this.smartlibSession?.sendTracker('impression', adId) + this.smartlibSession?.sendTracker('creativeView', adId) + } } private resizeSimid(adId: string, dimensions: DOMRect): boolean { From 708894121001930c3c83d180a273f18b4a7a92e4 Mon Sep 17 00:00:00 2001 From: Fabre Lambeau Date: Tue, 3 Mar 2026 13:25:21 +0000 Subject: [PATCH 2/7] [android/app] App sends trackers when iframe is shown --- .../src/main/java/tv/broadpeak/simid/app/PlayerActivity.kt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/android/app/src/main/java/tv/broadpeak/simid/app/PlayerActivity.kt b/android/app/src/main/java/tv/broadpeak/simid/app/PlayerActivity.kt index b347ad6..97f376d 100644 --- a/android/app/src/main/java/tv/broadpeak/simid/app/PlayerActivity.kt +++ b/android/app/src/main/java/tv/broadpeak/simid/app/PlayerActivity.kt @@ -262,6 +262,10 @@ class PlayerActivity : AppCompatActivity() { webView.visibility = if (show) View.VISIBLE else View.GONE } } + if (show) { + session?.sendTracker('impression', adId) + session?.sendTracker('creativeView', adId) + } } private fun resizeSimid(adId: String, dimensions: Rect): Boolean { From c72702b518cd93ebf88fb14ebbe51cd6a98ef1c7 Mon Sep 17 00:00:00 2001 From: Fabre Lambeau Date: Tue, 3 Mar 2026 13:35:45 +0000 Subject: [PATCH 3/7] Apply suggestion from @Copilot Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .../src/main/java/tv/broadpeak/simid/app/PlayerActivity.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/android/app/src/main/java/tv/broadpeak/simid/app/PlayerActivity.kt b/android/app/src/main/java/tv/broadpeak/simid/app/PlayerActivity.kt index 97f376d..bd729dc 100644 --- a/android/app/src/main/java/tv/broadpeak/simid/app/PlayerActivity.kt +++ b/android/app/src/main/java/tv/broadpeak/simid/app/PlayerActivity.kt @@ -263,8 +263,8 @@ class PlayerActivity : AppCompatActivity() { } } if (show) { - session?.sendTracker('impression', adId) - session?.sendTracker('creativeView', adId) + session?.sendTracker("impression", adId) + session?.sendTracker("creativeView", adId) } } From 9603e1a9ef68608f1c8c29d1f1ea927eeca649d9 Mon Sep 17 00:00:00 2001 From: Fabre Lambeau Date: Tue, 3 Mar 2026 13:38:41 +0000 Subject: [PATCH 4/7] [android/app] show trackers only if a webview exists --- .../main/java/tv/broadpeak/simid/app/PlayerActivity.kt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/android/app/src/main/java/tv/broadpeak/simid/app/PlayerActivity.kt b/android/app/src/main/java/tv/broadpeak/simid/app/PlayerActivity.kt index bd729dc..22a49f2 100644 --- a/android/app/src/main/java/tv/broadpeak/simid/app/PlayerActivity.kt +++ b/android/app/src/main/java/tv/broadpeak/simid/app/PlayerActivity.kt @@ -260,12 +260,12 @@ class PlayerActivity : AppCompatActivity() { webView?.let { runOnUiThread { webView.visibility = if (show) View.VISIBLE else View.GONE + if (show) { + session?.sendTracker("impression", adId) + session?.sendTracker("creativeView", adId) + } } } - if (show) { - session?.sendTracker("impression", adId) - session?.sendTracker("creativeView", adId) - } } private fun resizeSimid(adId: String, dimensions: Rect): Boolean { From 0abb9bfa67a8d524b1bd83a45c49780e1a7bf701 Mon Sep 17 00:00:00 2001 From: Bertrand Berthelot Date: Wed, 11 Mar 2026 16:33:23 +0100 Subject: [PATCH 5/7] Refactor demo apps (#18) --- android/app/proguard-rules.pro | 5 +- .../tv/broadpeak/simid/app/MainActivity.kt | 23 ++- .../tv/broadpeak/simid/app/PlayerActivity.kt | 24 ++- .../app/src/main/res/layout/activity_main.xml | 31 ++-- .../src/main/res/layout/activity_player.xml | 10 +- android/controller/consumer-rules.pro | 7 + android/controller/proguard-rules.pro | 4 +- android/gradle/libs.versions.toml | 2 +- web/app/public/index.html | 137 +++++++++++------- web/app/src/App.ts | 31 +++- web/app/src/Player.ts | 35 +++-- web/app/src/SimidController.ts | 2 +- 12 files changed, 228 insertions(+), 83 deletions(-) diff --git a/android/app/proguard-rules.pro b/android/app/proguard-rules.pro index 481bb43..b72a5fb 100644 --- a/android/app/proguard-rules.pro +++ b/android/app/proguard-rules.pro @@ -18,4 +18,7 @@ # If you keep the line number information, uncomment this to # hide the original source file name. -#-renamesourcefileattribute SourceFile \ No newline at end of file +#-renamesourcefileattribute SourceFile + +-dontwarn com.google.android.gms.tasks.OnFailureListener +-dontwarn com.google.android.gms.tasks.OnSuccessListener diff --git a/android/app/src/main/java/tv/broadpeak/simid/app/MainActivity.kt b/android/app/src/main/java/tv/broadpeak/simid/app/MainActivity.kt index 734548e..9863f9f 100644 --- a/android/app/src/main/java/tv/broadpeak/simid/app/MainActivity.kt +++ b/android/app/src/main/java/tv/broadpeak/simid/app/MainActivity.kt @@ -6,7 +6,13 @@ import android.view.View import androidx.activity.ComponentActivity import androidx.tv.material3.ExperimentalTvMaterial3Api -const val DEFAULT_STREAM_URL = "https://d2lwku66j7s1id.cloudfront.net/9bf31c7ff062936a7f941ad65712fad3/out/v1/6e0f649095ca4131b16bd0f877048629/index.mpd?nl-config=demo-samples-live" +const val DEFAULT_STREAM_URL = "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps.mpd" + +const val DEFAULT_CREATIVE_URL = "https://interactiveadvertisingbureau.github.io/SIMID/examples/creatives/banner_nonlinear.html" +const val DEFAULT_CREATIVE_AD_PARAMS = "{\"bannerText\":\"Click here to draw!\",\"webUrl\":\"https://quickdraw.withgoogle.com/\"}" +const val DEFAULT_CREATIVE_DURATION = 10 + +const val DEFAULT_STREAM_BPKIO_URL = "https://dcv5s0ei7csoc.cloudfront.net/2ab56412b1163ee103b9ed7065a20563/AVOD/Meridian_1920x1080_30fps_SDR/conditioned/stream.mpd?midfreq=40&coll=cooldrink&adid=crea&max_ads=1&nldur=20&vdur=600&vod=true" class MainActivity : ComponentActivity() { @@ -15,13 +21,26 @@ class MainActivity : ComponentActivity() { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) - findViewById(R.id.buttonLoad).setOnClickListener { + findViewById(R.id.buttonLoadDefault).setOnClickListener { startActivity( Intent( this, PlayerActivity::class.java ) .putExtra("url", DEFAULT_STREAM_URL) + .putExtra("creativeUrl", DEFAULT_CREATIVE_URL) + .putExtra("creativeAdParams", DEFAULT_CREATIVE_AD_PARAMS) + .putExtra("creativeDuration", DEFAULT_CREATIVE_DURATION) + ) + } + + findViewById(R.id.buttonLoadBpkio).setOnClickListener { + startActivity( + Intent( + this, + PlayerActivity::class.java + ) + .putExtra("url", DEFAULT_STREAM_BPKIO_URL) ) } } diff --git a/android/app/src/main/java/tv/broadpeak/simid/app/PlayerActivity.kt b/android/app/src/main/java/tv/broadpeak/simid/app/PlayerActivity.kt index b347ad6..702b7de 100644 --- a/android/app/src/main/java/tv/broadpeak/simid/app/PlayerActivity.kt +++ b/android/app/src/main/java/tv/broadpeak/simid/app/PlayerActivity.kt @@ -23,6 +23,7 @@ import androidx.media3.exoplayer.source.MediaSource import androidx.media3.ui.PlayerView import androidx.core.net.toUri import androidx.media3.common.util.UnstableApi +import androidx.media3.ui.PlayerNotificationManager import tv.broadpeak.simid.controller.MediaState import tv.broadpeak.smartlib.SmartLib import tv.broadpeak.smartlib.ad.AdBreakData @@ -88,6 +89,15 @@ class PlayerActivity : AppCompatActivity() { initSmartLib(inputUrl) loadStream(inputUrl) + + val creativeUrl = b.getString("creativeUrl") + if (creativeUrl == null) { + findViewById(R.id.buttonStartCreative).visibility = View.GONE + } else { + findViewById(R.id.buttonStartCreative).setOnClickListener { + startCreative() + } + } } override fun onDestroy() { @@ -102,7 +112,7 @@ class PlayerActivity : AppCompatActivity() { private fun loadStream(url: String) { val result = session!!.getURL(url) - val streamUrl = if (result != null) result.url else url + val streamUrl = if (result != null && !result.isError) result.url else url player?.let { sPlayer -> @@ -124,6 +134,14 @@ class PlayerActivity : AppCompatActivity() { } } + private fun startCreative() { + val b = intent.extras + val creativeUrl = b?.getString("creativeUrl") ?: return + val creativeAdParams = b.getString("creativeAdParams") ?: "" + val creativeDuration = b.getInt("creativeDuration") + loadSimid("input-creative", creativeUrl, creativeAdParams, creativeDuration.toFloat(), true) + } + private fun initSmartLib(url: String) { val domain = URL(url).host @@ -195,7 +213,7 @@ class PlayerActivity : AppCompatActivity() { } } - private fun loadSimid(adId: String, creativeUri: String, adParameters: String, duration: Float) { + private fun loadSimid(adId: String, creativeUri: String, adParameters: String, duration: Float, autoStart: Boolean = false) { if (playerContainer == null) { return @@ -221,7 +239,7 @@ class PlayerActivity : AppCompatActivity() { controller.simidControllerApi(bpkSimidController!!) Log.d(TAG, "Load SIMID controller v${controller.getVersion()} and creative from $creativeUri") - controller.load(false) + controller.load(autoStart) simidControllers[adId] = controller } diff --git a/android/app/src/main/res/layout/activity_main.xml b/android/app/src/main/res/layout/activity_main.xml index 23e1f3f..127343b 100644 --- a/android/app/src/main/res/layout/activity_main.xml +++ b/android/app/src/main/res/layout/activity_main.xml @@ -8,14 +8,27 @@ android:layout_height="match_parent" tools:context=".MainActivity"> - - - - + +
+ +
+
+ + + +
- -
- +
+ + + + + + +
+
+
+
+
+ +
+ +
+ +
+