From 4c809b79755177490dee8350e0fe8b69024024ef Mon Sep 17 00:00:00 2001 From: William Van Haevre Date: Wed, 1 Apr 2026 12:48:15 +0200 Subject: [PATCH 01/29] Update NativeAd implementation to changed Ad API --- ios/ads/THEOplayerRCTAdsNative.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ios/ads/THEOplayerRCTAdsNative.swift b/ios/ads/THEOplayerRCTAdsNative.swift index a27abbde9..151f2ec16 100644 --- a/ios/ads/THEOplayerRCTAdsNative.swift +++ b/ios/ads/THEOplayerRCTAdsNative.swift @@ -5,7 +5,7 @@ import THEOplayerSDK class NativeAd: THEOplayerSDK.Ad { /** A reference to the `AdBreak` of which the ad is a part of.*/ - var adBreak: AdBreak + var adBreak: AdBreak? /** An array of `CompanionAd`s associated to the ad, if available within the same Creatives element.*/ var companions: [THEOplayerSDK.CompanionAd] = [] /** Either 'linear' or 'nonlinear', depending on the concrete implementer.*/ From 58537c4d9fb2de1892411025175d9f9388b05803 Mon Sep 17 00:00:00 2001 From: William Van Haevre Date: Wed, 1 Apr 2026 13:14:42 +0200 Subject: [PATCH 02/29] Use adBreak as an optional property --- ios/ads/THEOplayerRCTAdAdapter.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ios/ads/THEOplayerRCTAdAdapter.swift b/ios/ads/THEOplayerRCTAdAdapter.swift index 51dd07f90..31bfbac45 100644 --- a/ios/ads/THEOplayerRCTAdAdapter.swift +++ b/ios/ads/THEOplayerRCTAdAdapter.swift @@ -62,8 +62,8 @@ class THEOplayerRCTAdAdapter { if let skipOffset = ad.skipOffset { adData[PROP_AD_SKIP_OFFSET] = (skipOffset == -1) ? skipOffset : skipOffset } - if processAdBreak { - adData[PROP_AD_BREAK] = THEOplayerRCTAdAdapter.fromAdBreak(adBreak: ad.adBreak) + if processAdBreak, let adBreak = ad.adBreak { + adData[PROP_AD_BREAK] = THEOplayerRCTAdAdapter.fromAdBreak(adBreak: adBreak) } #if os(iOS) From bd0e9e9ca279e7b2fb0bed53fcf0e728eca1283b Mon Sep 17 00:00:00 2001 From: rbnbtns Date: Fri, 10 Apr 2026 16:36:58 +0200 Subject: [PATCH 03/29] Bump wrapper --- android/build.gradle | 2 +- .../ads-wrapper/10.12.0/ads-wrapper-10.12.0.aar | Bin 23269 -> 0 bytes .../ads-wrapper/11.0.0/ads-wrapper-11.0.0.aar | Bin 0 -> 23318 bytes .../ads-wrapper-11.0.0.pom} | 6 +++--- .../ads-wrapper/maven-metadata-local.xml | 8 ++++---- 5 files changed, 8 insertions(+), 8 deletions(-) delete mode 100644 android/local/com/theoplayer/theoplayer-sdk-android/ads-wrapper/10.12.0/ads-wrapper-10.12.0.aar create mode 100644 android/local/com/theoplayer/theoplayer-sdk-android/ads-wrapper/11.0.0/ads-wrapper-11.0.0.aar rename android/local/com/theoplayer/theoplayer-sdk-android/ads-wrapper/{10.12.0/ads-wrapper-10.12.0.pom => 11.0.0/ads-wrapper-11.0.0.pom} (85%) diff --git a/android/build.gradle b/android/build.gradle index a61022ee2..d90d5f07e 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -125,7 +125,7 @@ repositories { // The minimum supported THEOplayer version is 10.12.0 def theoVersion = safeExtGet('THEOplayer_sdk', '[10.12.0, 11.0.0)') def theoMediaSessionVersion = safeExtGet('THEOplayer_mediasession', '[8.0.0, 11.0.0)') -def theoAdsWrapperVersion = "10.12.0" +def theoAdsWrapperVersion = "11.0.0" def coroutinesVersion = safeExtGet('coroutinesVersion', '1.10.2') def appcompatVersion = safeExtGet('appcompatVersion', '1.7.1') def corektxVersion = safeExtGet('corektxVersion', '1.16.0') diff --git a/android/local/com/theoplayer/theoplayer-sdk-android/ads-wrapper/10.12.0/ads-wrapper-10.12.0.aar b/android/local/com/theoplayer/theoplayer-sdk-android/ads-wrapper/10.12.0/ads-wrapper-10.12.0.aar deleted file mode 100644 index d0cac704a880ae529402d20b84482c2903852c4a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23269 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�eUoRvxhXGvTDJExQRwU{>p+M1fxV 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 czsmpb@6aWAS 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�S6l>!D6 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 - 10.12.0 + 11.0.0 com.theoplayer.theoplayer-sdk-android ads-wrapper - 10.12.0 + 11.0.0 aar com.theoplayer.theoplayer-sdk-android integration-ads-ima - [10.0.0,11.0.0) + [11.0.0,12.0.0) runtime diff --git a/android/local/com/theoplayer/theoplayer-sdk-android/ads-wrapper/maven-metadata-local.xml b/android/local/com/theoplayer/theoplayer-sdk-android/ads-wrapper/maven-metadata-local.xml index 63c6398ae..bd9d59cca 100644 --- a/android/local/com/theoplayer/theoplayer-sdk-android/ads-wrapper/maven-metadata-local.xml +++ b/android/local/com/theoplayer/theoplayer-sdk-android/ads-wrapper/maven-metadata-local.xml @@ -3,11 +3,11 @@ com.theoplayer.theoplayer-sdk-android ads-wrapper - 10.12.0 - 10.12.0 + 11.0.0 + 11.0.0 - 10.12.0 + 11.0.0 - 20260318164412 + 20260410095400 From 3b42ad05b4ee5e523320e7cfcdf0c7f42c3708be Mon Sep 17 00:00:00 2001 From: rbnbtns Date: Fri, 10 Apr 2026 16:39:51 +0200 Subject: [PATCH 04/29] Update android version --- android/build.gradle | 6 +++--- e2e/android/gradle.properties | 2 +- example/android/gradle.properties | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/android/build.gradle b/android/build.gradle index d90d5f07e..63c696385 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -122,9 +122,9 @@ repositories { mavenLocal() } -// The minimum supported THEOplayer version is 10.12.0 -def theoVersion = safeExtGet('THEOplayer_sdk', '[10.12.0, 11.0.0)') -def theoMediaSessionVersion = safeExtGet('THEOplayer_mediasession', '[8.0.0, 11.0.0)') +// The minimum supported THEOplayer version is 11.0.0 +def theoVersion = safeExtGet('THEOplayer_sdk', '[11.0.0, 12.0.0)') +def theoMediaSessionVersion = safeExtGet('THEOplayer_mediasession', '[11.0.0, 12.0.0)') def theoAdsWrapperVersion = "11.0.0" def coroutinesVersion = safeExtGet('coroutinesVersion', '1.10.2') def appcompatVersion = safeExtGet('appcompatVersion', '1.7.1') diff --git a/e2e/android/gradle.properties b/e2e/android/gradle.properties index 124071bbb..13c278cb1 100644 --- a/e2e/android/gradle.properties +++ b/e2e/android/gradle.properties @@ -41,7 +41,7 @@ newArchEnabled=true hermesEnabled=true # Version of the THEOplayer SDK, if not specified, the latest available version within bounds is set. -#THEOplayer_sdk=[10.10.0, 11.0.0) +#THEOplayer_sdk=[11.0.0, 12.0.0) # Override Android sdk versions #THEOplayer_compileSdkVersion = 34 diff --git a/example/android/gradle.properties b/example/android/gradle.properties index 3e7bacabb..9e25e3493 100644 --- a/example/android/gradle.properties +++ b/example/android/gradle.properties @@ -46,7 +46,7 @@ hermesEnabled=true edgeToEdgeEnabled=false # Version of the THEOplayer SDK, if not specified, the latest available version within bounds is set. -#THEOplayer_sdk=[10.12.0, 11.0.0) +#THEOplayer_sdk=[11.0.0, 12.0.0) # Override Android sdk versions #THEOplayer_compileSdkVersion = 36 From 29cb0510ddac9de6cf85003afa97cdb3d10a512d Mon Sep 17 00:00:00 2001 From: Tom Van Laerhoven Date: Mon, 13 Apr 2026 11:14:06 +0200 Subject: [PATCH 05/29] Fix Ad deprecations --- .../main/java/com/theoplayer/ads/AdAdapter.kt | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/android/src/main/java/com/theoplayer/ads/AdAdapter.kt b/android/src/main/java/com/theoplayer/ads/AdAdapter.kt index 4052a0055..e003c864c 100644 --- a/android/src/main/java/com/theoplayer/ads/AdAdapter.kt +++ b/android/src/main/java/com/theoplayer/ads/AdAdapter.kt @@ -100,7 +100,7 @@ object AdAdapter { adPayload.putDouble(PROP_AD_HEIGHT, ad.imaAd.vastMediaHeight.toDouble()) adPayload.putString(PROP_AD_CONTENT_TYPE, ad.imaAd.contentType) adPayload.putString(PROP_AD_DESCRIPTION, ad.imaAd.description) - } catch (ignore: Exception) { + } catch (_: Exception) { // googleImaAd.getImaAd() is not known yet } val universalAdIdsPayload = Arguments.createArray() @@ -142,7 +142,7 @@ object AdAdapter { return adbreakPayload } adbreakPayload.putString(PROP_ADBREAK_INTEGRATION, adbreak.integration.type) - adbreakPayload.putString(PROP_ADBREAK_ID, adbreak.idAsString) + adbreakPayload.putString(PROP_ADBREAK_ID, adbreak.id) adbreakPayload.putInt(PROP_ADBREAK_MAXDURATION,adbreak.maxDuration) adbreakPayload.putInt(PROP_ADBREAK_TIMEOFFSET, adbreak.timeOffset) adbreakPayload.putDouble(PROP_ADBREAK_MAXREMAININGDURATION, adbreak.maxRemainingDuration) @@ -288,10 +288,15 @@ object AdAdapter { return adBreak.getString(PROP_AD_CUSTOM_INTEGRATION) } + @Deprecated("Deprecated in favor of getIdAsString()") override fun getIdAsString(): String? { return if (adBreak.hasKey(PROP_ADBREAK_ID)) adBreak.getString(PROP_ADBREAK_ID) else null } + override fun getId(): String? { + return if (adBreak.hasKey(PROP_ADBREAK_ID)) adBreak.getString(PROP_ADBREAK_ID) else null + } + override fun getCustomData(): Any? { // Not supported yet return null @@ -415,16 +420,6 @@ object AdAdapter { return ad?.getString(PROP_AD_TRAFFICKING_PARAMETERS) ?: "" } - @Deprecated("Deprecated in Java") - override fun getUniversalAdIdRegistry(): String { - return "" - } - - @Deprecated("Deprecated in Java") - override fun getUniversalAdIdValue(): String { - return ad?.getString(PROP_UNIVERSAL_AD_ID_VALUE) ?: "" - } - override fun getCompanionAds(): List { return emptyList() } From 18e91d7ee95c4dd8e0e9794d6bb317243d007ec6 Mon Sep 17 00:00:00 2001 From: Tom Van Laerhoven Date: Mon, 13 Apr 2026 11:21:26 +0200 Subject: [PATCH 06/29] Fix ImaSdkSettings properties --- .../java/com/theoplayer/PlayerConfigAdapter.kt | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/android/src/main/java/com/theoplayer/PlayerConfigAdapter.kt b/android/src/main/java/com/theoplayer/PlayerConfigAdapter.kt index 11391afdd..95c1bd9dc 100644 --- a/android/src/main/java/com/theoplayer/PlayerConfigAdapter.kt +++ b/android/src/main/java/com/theoplayer/PlayerConfigAdapter.kt @@ -133,24 +133,24 @@ class PlayerConfigAdapter(private val configProps: ReadableMap?) { getMap(PROP_FEATURE_FLAGS)?.toHashMap()?.forEach { (key, value) -> convertedMap[key] = value as String } - featureFlags = convertedMap + setFeatureFlags(convertedMap) } // The maximum number of VAST redirects. if (hasKey(PROP_MAX_REDIRECTS)) { maxRedirects = getInt(PROP_MAX_REDIRECTS) } // The partner provided player type. - playerType = "THEOplayer" + setPlayerType("THEOplayer") // The partner provided player version. - playerVersion = THEOplayerGlobal.getVersion() + setPlayerVersion(THEOplayerGlobal.getVersion()) // The Publisher Provided Identification (PPID) sent with ads request. if (hasKey(PROP_PPID)) { - ppid = getString(PROP_PPID) ?: "" + setPpid(getString(PROP_PPID) ?: "") } // The session ID to identify a single user session. This should be a UUID. It // is used exclusively for frequency capping across the user session. if (hasKey(PROP_SESSION_ID)) { - sessionId = getString(PROP_PPID) ?: "" + setSessionId(getString(PROP_PPID) ?: "") } // Toggles debug mode which will output detailed log information to the console. if (hasKey(PROP_ENABLE_DEBUG_MODE)) { @@ -177,11 +177,11 @@ class PlayerConfigAdapter(private val configProps: ReadableMap?) { enablePreloading = preloadTypeString !== "none" } if (hasKey(PROP_ALLOWED_MIMETYPES)) { - mimeTypes = ArrayList().apply { + setMimeTypes(ArrayList().apply { getArray(PROP_ALLOWED_MIMETYPES)?.toArrayList()?.forEach { add(it as String) } - } + }) } } // bitrate and timeout are configured under the ima config From cf9491e096bc26164b00576a79aaeb7d6c1d6f0b Mon Sep 17 00:00:00 2001 From: Tom Van Laerhoven Date: Mon, 13 Apr 2026 11:31:40 +0200 Subject: [PATCH 07/29] Fix trivial warning --- android/src/main/java/com/theoplayer/cast/CastModule.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/android/src/main/java/com/theoplayer/cast/CastModule.kt b/android/src/main/java/com/theoplayer/cast/CastModule.kt index 81d0fe676..21f7491aa 100644 --- a/android/src/main/java/com/theoplayer/cast/CastModule.kt +++ b/android/src/main/java/com/theoplayer/cast/CastModule.kt @@ -59,7 +59,6 @@ class CastModule(context: ReactApplicationContext) : ReactContextBaseJavaModule( PlayerCastState.AVAILABLE -> "available" PlayerCastState.CONNECTED -> "connected" PlayerCastState.CONNECTING -> "connecting" - PlayerCastState.UNAVAILABLE -> "unavailable" else -> "unavailable" } } From 2b4be31d7ff915479db184ac0541322f7d77b719 Mon Sep 17 00:00:00 2001 From: Tom Van Laerhoven Date: Mon, 13 Apr 2026 11:32:01 +0200 Subject: [PATCH 08/29] Drop deprecated reactNativeHost --- .../reactnativetheoplayer/MainApplication.kt | 22 ++++++------------- 1 file changed, 7 insertions(+), 15 deletions(-) diff --git a/example/android/app/src/main/java/com/reactnativetheoplayer/MainApplication.kt b/example/android/app/src/main/java/com/reactnativetheoplayer/MainApplication.kt index 1939bf063..2e5d462e2 100644 --- a/example/android/app/src/main/java/com/reactnativetheoplayer/MainApplication.kt +++ b/example/android/app/src/main/java/com/reactnativetheoplayer/MainApplication.kt @@ -15,24 +15,16 @@ import com.facebook.soloader.SoLoader import com.theoplayer.ReactTHEOplayerPackage class MainApplication : Application(), ReactApplication { - override val reactNativeHost: ReactNativeHost = - object : DefaultReactNativeHost(this) { - override fun getPackages(): List = + override val reactHost: ReactHost by lazy { + getDefaultReactHost( + context = applicationContext, + packageList = PackageList(this).packages.apply { // Packages that cannot be autolinked yet can be added manually here, for example: add(ReactTHEOplayerPackage()) - } - - override fun getJSMainModuleName(): String = "index" - - override fun getUseDeveloperSupport(): Boolean = BuildConfig.DEBUG - - override val isNewArchEnabled: Boolean = BuildConfig.IS_NEW_ARCHITECTURE_ENABLED - override val isHermesEnabled: Boolean = BuildConfig.IS_HERMES_ENABLED - } - - override val reactHost: ReactHost - get() = getDefaultReactHost(this.applicationContext, reactNativeHost) + }, + ) + } override fun onCreate() { super.onCreate() From 542c24b0c77112cd401ad0c87565e90820079716 Mon Sep 17 00:00:00 2001 From: Tom Van Laerhoven Date: Mon, 13 Apr 2026 11:34:19 +0200 Subject: [PATCH 09/29] Upgrade dependencies --- android/build.gradle | 9 ++++++--- e2e/android/build.gradle | 4 ++-- e2e/android/gradle.properties | 4 ++-- example/android/app/build.gradle | 4 ++++ example/android/build.gradle | 4 ++-- 5 files changed, 16 insertions(+), 9 deletions(-) diff --git a/android/build.gradle b/android/build.gradle index 63c696385..0ae88fa38 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -9,7 +9,7 @@ buildscript { } dependencies { - classpath "com.android.tools.build:gradle:${safeExtGet('gradlePluginVersion', '8.12.3')}" + classpath "com.android.tools.build:gradle:${safeExtGet('gradlePluginVersion', '8.13.0')}" classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:${safeExtGet('kotlinVersion', '2.2.10')}" } } @@ -98,6 +98,7 @@ android { compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 + coreLibraryDesugaringEnabled true } packagingOptions { exclude 'META-INF/kotlin-stdlib.kotlin_module' @@ -128,9 +129,10 @@ def theoMediaSessionVersion = safeExtGet('THEOplayer_mediasession', '[11.0.0, 12 def theoAdsWrapperVersion = "11.0.0" def coroutinesVersion = safeExtGet('coroutinesVersion', '1.10.2') def appcompatVersion = safeExtGet('appcompatVersion', '1.7.1') -def corektxVersion = safeExtGet('corektxVersion', '1.16.0') -def gsonVersion = safeExtGet('gsonVersion', '2.13.1') +def corektxVersion = safeExtGet('corektxVersion', '1.17.0') +def gsonVersion = safeExtGet('gsonVersion', '2.13.2') def activityktxVersion = safeExtGet('activityktxVersion', '1.10.1') +def coreLibraryDesugaringVersion = safeExtGet('coreLibraryDesugaringVersion', '2.1.5') dependencies { def addOptiViewIntegration = { enabled, notation, additional = null -> @@ -156,6 +158,7 @@ dependencies { implementation("androidx.core:core-ktx:$corektxVersion") implementation("androidx.activity:activity-ktx:$activityktxVersion") implementation("com.google.code.gson:gson:$gsonVersion") + coreLibraryDesugaring("com.android.tools:desugar_jdk_libs:$coreLibraryDesugaringVersion") println("Using THEOplayer (${versionString(theoVersion)})") implementation("com.theoplayer.theoplayer-sdk-android:core:$theoVersion") diff --git a/e2e/android/build.gradle b/e2e/android/build.gradle index a25721b53..0181c74f9 100644 --- a/e2e/android/build.gradle +++ b/e2e/android/build.gradle @@ -12,8 +12,8 @@ buildscript { ndkVersion = "29.0.14033849" castFrameworkVersion = "22.0.0" kotlinVersion = "2.2.10" - agpVersion = "8.12.3" - rnrepoVersion = "0.2.1" + agpVersion = "8.13.0" + rnrepoVersion = "0.2.2" } repositories { google() diff --git a/e2e/android/gradle.properties b/e2e/android/gradle.properties index 13c278cb1..ad66e4ae9 100644 --- a/e2e/android/gradle.properties +++ b/e2e/android/gradle.properties @@ -44,9 +44,9 @@ hermesEnabled=true #THEOplayer_sdk=[11.0.0, 12.0.0) # Override Android sdk versions -#THEOplayer_compileSdkVersion = 34 +#THEOplayer_compileSdkVersion = 36 #THEOplayer_minSdkVersion = 21 -#THEOplayer_targetSdkVersion = 34 +#THEOplayer_targetSdkVersion = 36 # Toggle player event logging using tag 'VideoPlayer' (default: false) #THEOplayer_logPlayerEvents = true diff --git a/example/android/app/build.gradle b/example/android/app/build.gradle index cb057edd6..c453f1918 100644 --- a/example/android/app/build.gradle +++ b/example/android/app/build.gradle @@ -94,6 +94,9 @@ android { keyPassword 'android' } } + compileOptions { + coreLibraryDesugaringEnabled true + } buildTypes { debug { signingConfig signingConfigs.debug @@ -120,6 +123,7 @@ dependencies { implementation("com.facebook.react:react-android") implementation("androidx.activity:activity-ktx:1.9.3") + coreLibraryDesugaring("com.android.tools:desugar_jdk_libs:2.1.5") if (hermesEnabled.toBoolean()) { implementation("com.facebook.react:hermes-android") diff --git a/example/android/build.gradle b/example/android/build.gradle index a25721b53..0181c74f9 100644 --- a/example/android/build.gradle +++ b/example/android/build.gradle @@ -12,8 +12,8 @@ buildscript { ndkVersion = "29.0.14033849" castFrameworkVersion = "22.0.0" kotlinVersion = "2.2.10" - agpVersion = "8.12.3" - rnrepoVersion = "0.2.1" + agpVersion = "8.13.0" + rnrepoVersion = "0.2.2" } repositories { google() From 68b46b5bfa2abde42d98e0d2f3b35ea6a3700a56 Mon Sep 17 00:00:00 2001 From: Tom Van Laerhoven Date: Mon, 13 Apr 2026 11:41:38 +0200 Subject: [PATCH 10/29] Fix trivial warnings --- .../com/theoplayer/track/TrackListAdapter.kt | 27 +++++++------------ 1 file changed, 10 insertions(+), 17 deletions(-) diff --git a/android/src/main/java/com/theoplayer/track/TrackListAdapter.kt b/android/src/main/java/com/theoplayer/track/TrackListAdapter.kt index 2003722f1..1db1144db 100644 --- a/android/src/main/java/com/theoplayer/track/TrackListAdapter.kt +++ b/android/src/main/java/com/theoplayer/track/TrackListAdapter.kt @@ -43,9 +43,6 @@ private const val PROP_ENDDATE = "endDate" private const val PROP_DURATION = "duration" private const val PROP_PLANNED_DURATION = "plannedDuration" private const val PROP_END_ON_NEXT = "endOnNext" -private const val PROP_SCTE35CMD = "scte35Cmd" -private const val PROP_SCTE35OUT = "scte35Out" -private const val PROP_SCTE35IN = "scte35In" private const val PROP_CUSTOM_ATTRIBUTES = "customAttributes" object TrackListAdapter { @@ -167,13 +164,12 @@ object TrackListAdapter { audioTrackPayload.putString(PROP_LABEL, audioTrack.label) audioTrackPayload.putString(PROP_LANGUAGE, audioTrack.language) audioTrackPayload.putBoolean(PROP_ENABLED, audioTrack.isEnabled) - val qualityList = audioTrack.qualities val qualities = Arguments.createArray() try { - qualityList?.forEach { quality -> + audioTrack.qualities.forEach { quality -> qualities.pushMap(fromAudioQuality(quality)) } - } catch (ignore: NullPointerException) { + } catch (_: NullPointerException) { } audioTrackPayload.putArray(PROP_QUALITIES, qualities) val activeQuality = audioTrack.activeQuality @@ -214,18 +210,15 @@ object TrackListAdapter { videoTrackPayload.putBoolean(PROP_ENABLED, videoTrack.isEnabled) val qualities = Arguments.createArray() try { - val qualityList = videoTrack.qualities - if (qualityList != null) { - // Sort qualities according to (height, bandwidth) - val sortedQualityList = QualityListAdapter(qualityList) - sortedQualityList.sort { o: VideoQuality, t1: VideoQuality -> - if (o.height == t1.height) t1.bandwidth.compareTo(o.bandwidth) else t1.height.compareTo(o.height) - } - for (quality in sortedQualityList) { - qualities.pushMap(fromVideoQuality(quality as VideoQuality)) - } + // Sort qualities according to (height, bandwidth) + val sortedQualityList = QualityListAdapter(videoTrack.qualities) + sortedQualityList.sort { o: VideoQuality, t1: VideoQuality -> + if (o.height == t1.height) t1.bandwidth.compareTo(o.bandwidth) else t1.height.compareTo(o.height) + } + for (quality in sortedQualityList) { + qualities.pushMap(fromVideoQuality(quality as VideoQuality)) } - } catch (ignore: java.lang.NullPointerException) { + } catch (_: java.lang.NullPointerException) { } videoTrackPayload.putArray(PROP_QUALITIES, qualities) val activeQuality = videoTrack.activeQuality From e49d1b3f9c8936919e6f3c37e335db2e5d8cd1d6 Mon Sep 17 00:00:00 2001 From: Tom Van Laerhoven Date: Mon, 13 Apr 2026 11:53:48 +0200 Subject: [PATCH 11/29] Add desugaring for e2e app --- e2e/android/app/build.gradle | 5 +++++ .../reactnativetheoplayer/MainApplication.kt | 22 ++++++------------- 2 files changed, 12 insertions(+), 15 deletions(-) diff --git a/e2e/android/app/build.gradle b/e2e/android/app/build.gradle index 87b748d4d..74c1afb8b 100644 --- a/e2e/android/app/build.gradle +++ b/e2e/android/app/build.gradle @@ -94,6 +94,9 @@ android { keyPassword 'android' } } + compileOptions { + coreLibraryDesugaringEnabled true + } buildTypes { debug { signingConfig signingConfigs.debug @@ -119,6 +122,8 @@ dependencies { // The version of react-native is set by the React Native Gradle Plugin implementation("com.facebook.react:react-android") + coreLibraryDesugaring("com.android.tools:desugar_jdk_libs:2.1.5") + if (hermesEnabled.toBoolean()) { implementation("com.facebook.react:hermes-android") } else { diff --git a/e2e/android/app/src/main/java/com/reactnativetheoplayer/MainApplication.kt b/e2e/android/app/src/main/java/com/reactnativetheoplayer/MainApplication.kt index 1939bf063..2e5d462e2 100644 --- a/e2e/android/app/src/main/java/com/reactnativetheoplayer/MainApplication.kt +++ b/e2e/android/app/src/main/java/com/reactnativetheoplayer/MainApplication.kt @@ -15,24 +15,16 @@ import com.facebook.soloader.SoLoader import com.theoplayer.ReactTHEOplayerPackage class MainApplication : Application(), ReactApplication { - override val reactNativeHost: ReactNativeHost = - object : DefaultReactNativeHost(this) { - override fun getPackages(): List = + override val reactHost: ReactHost by lazy { + getDefaultReactHost( + context = applicationContext, + packageList = PackageList(this).packages.apply { // Packages that cannot be autolinked yet can be added manually here, for example: add(ReactTHEOplayerPackage()) - } - - override fun getJSMainModuleName(): String = "index" - - override fun getUseDeveloperSupport(): Boolean = BuildConfig.DEBUG - - override val isNewArchEnabled: Boolean = BuildConfig.IS_NEW_ARCHITECTURE_ENABLED - override val isHermesEnabled: Boolean = BuildConfig.IS_HERMES_ENABLED - } - - override val reactHost: ReactHost - get() = getDefaultReactHost(this.applicationContext, reactNativeHost) + }, + ) + } override fun onCreate() { super.onCreate() From 187ed991bf817218f93d235e3076d2be2689aa0c Mon Sep 17 00:00:00 2001 From: Tom Van Laerhoven Date: Mon, 13 Apr 2026 12:00:19 +0200 Subject: [PATCH 12/29] Drop deprecated ResizeEvent --- src/api/event/PlayerEvent.ts | 21 --------------------- src/api/player/PlayerEventMap.ts | 12 ------------ src/internal/THEOplayerView.tsx | 2 -- src/internal/adapter/WebEventForwarder.ts | 2 -- src/internal/adapter/event/PlayerEvents.ts | 13 ------------- 5 files changed, 50 deletions(-) diff --git a/src/api/event/PlayerEvent.ts b/src/api/event/PlayerEvent.ts index 314a6a1c9..5e2d93e73 100644 --- a/src/api/event/PlayerEvent.ts +++ b/src/api/event/PlayerEvent.ts @@ -69,27 +69,6 @@ export interface DimensionChangeEvent extends Event { - /** - * The player's current width. - */ - readonly width: number; - - /** - * The player's current height. - */ - readonly height: number; -} - /** * Dispatched when video is resized. * diff --git a/src/api/player/PlayerEventMap.ts b/src/api/player/PlayerEventMap.ts index 0a39dbeeb..65b31125d 100644 --- a/src/api/player/PlayerEventMap.ts +++ b/src/api/player/PlayerEventMap.ts @@ -12,7 +12,6 @@ import type { TimeUpdateEvent, PresentationModeChangeEvent, VolumeChangeEvent, - ResizeEvent, SeekedEvent, SeekingEvent, VideoResizeEvent, @@ -62,10 +61,6 @@ export enum PlayerEventType { WAITING = 'waiting', PRESENTATIONMODE_CHANGE = 'presentationmodechange', DESTROY = 'destroy', - /** - * @deprecated Use {@link PlayerEventType.DIMENSION_CHANGE} instead. This event is set for removal in version 11. - */ - RESIZE = 'resize', DIMENSION_CHANGE = 'dimensionchange', VIDEO_RESIZE = 'videoresize', } @@ -238,13 +233,6 @@ export interface PlayerEventMap { */ [PlayerEventType.DESTROY]: Event; - /** - * Dispatched when the player size changes. - * - * @deprecated Use {@link dimensionchange} instead. This event is set for removal in version 11. - */ - [PlayerEventType.RESIZE]: ResizeEvent; - /** * Dispatched when the player size changes. */ diff --git a/src/internal/THEOplayerView.tsx b/src/internal/THEOplayerView.tsx index 7ec47b997..b9a428d0c 100644 --- a/src/internal/THEOplayerView.tsx +++ b/src/internal/THEOplayerView.tsx @@ -39,7 +39,6 @@ import { DefaultTextTrackListEvent, DefaultVolumeChangeEvent, DefaultTimeupdateEvent, - DefaultResizeEvent, DefaultSeekingEvent, DefaultSeekedEvent, DefaultVideoResizeEvent, @@ -420,7 +419,6 @@ export class THEOplayerView extends PureComponent) => { const width = event.nativeEvent.width; const height = event.nativeEvent.height; - this._facade?.dispatchEvent(new DefaultResizeEvent(width, height)); this._facade?.dispatchEvent(new DefaultDimensionChangeEvent(width, height)); }; diff --git a/src/internal/adapter/WebEventForwarder.ts b/src/internal/adapter/WebEventForwarder.ts index dbc9459c1..b6d3c63ac 100644 --- a/src/internal/adapter/WebEventForwarder.ts +++ b/src/internal/adapter/WebEventForwarder.ts @@ -62,7 +62,6 @@ import { DefaultProgressEvent, DefaultRateChangeEvent, DefaultReadyStateChangeEvent, - DefaultResizeEvent, DefaultSeekedEvent, DefaultSeekingEvent, DefaultSegmentNotFoundEvent, @@ -289,7 +288,6 @@ export class WebEventForwarder { }; private readonly onDimensionChange = (event: NativeDimensionChangeEvent) => { - this._facade.dispatchEvent(new DefaultResizeEvent(event.width, event.height)); this._facade.dispatchEvent(new DefaultDimensionChangeEvent(event.width, event.height)); }; diff --git a/src/internal/adapter/event/PlayerEvents.ts b/src/internal/adapter/event/PlayerEvents.ts index 0f3414f5e..abf5852f6 100644 --- a/src/internal/adapter/event/PlayerEvents.ts +++ b/src/internal/adapter/event/PlayerEvents.ts @@ -30,7 +30,6 @@ import { Quality, RateChangeEvent, ReadyStateChangeEvent, - ResizeEvent, SeekedEvent, SeekingEvent, SegmentNotFoundEvent, @@ -103,18 +102,6 @@ export class DefaultVolumeChangeEvent extends BaseEvent implements ResizeEvent { - constructor( - public width: number, - public height: number, - ) { - super(PlayerEventType.RESIZE); - } -} - export class DefaultDimensionChangeEvent extends BaseEvent implements DimensionChangeEvent { constructor( public width: number, From 5a353ad7156cb33791edb373bce70432545d8465 Mon Sep 17 00:00:00 2001 From: Tom Van Laerhoven Date: Mon, 13 Apr 2026 12:04:37 +0200 Subject: [PATCH 13/29] Remove deprecated theolive property --- src/api/player/THEOplayer.ts | 7 ------- src/internal/adapter/THEOplayerAdapter.ts | 4 ---- src/internal/adapter/THEOplayerWebAdapter.ts | 4 ---- 3 files changed, 15 deletions(-) diff --git a/src/api/player/THEOplayer.ts b/src/api/player/THEOplayer.ts index a66289724..616899908 100644 --- a/src/api/player/THEOplayer.ts +++ b/src/api/player/THEOplayer.ts @@ -287,11 +287,4 @@ export interface THEOplayer extends EventDispatcher { * The API for THEOlive. */ readonly theoLive: TheoLiveAPI; - - /** - * The API for THEOlive. - * - * @deprecated use {@link THEOplayer.theoLive} instead. - */ - readonly theolive: TheoLiveAPI; } diff --git a/src/internal/adapter/THEOplayerAdapter.ts b/src/internal/adapter/THEOplayerAdapter.ts index c746ad7bd..f31feb3a4 100644 --- a/src/internal/adapter/THEOplayerAdapter.ts +++ b/src/internal/adapter/THEOplayerAdapter.ts @@ -243,10 +243,6 @@ export class THEOplayerAdapter extends DefaultEventDispatcher im return this._theoliveAdapter; } - get theolive(): TheoLiveAPI { - return this._theoliveAdapter; - } - set autoplay(autoplay: boolean) { this._state.autoplay = autoplay; NativePlayerModule.setAutoplay(this._view.nativeHandle, autoplay); diff --git a/src/internal/adapter/THEOplayerWebAdapter.ts b/src/internal/adapter/THEOplayerWebAdapter.ts index eee810e4f..1f4a1642e 100644 --- a/src/internal/adapter/THEOplayerWebAdapter.ts +++ b/src/internal/adapter/THEOplayerWebAdapter.ts @@ -374,10 +374,6 @@ export class THEOplayerWebAdapter extends DefaultEventDispatcher return this._theoliveAdapter; } - public get theolive(): TheoLiveAPI { - return this._theoliveAdapter; - } - public get version(): PlayerVersion { return { version: nativeVersion, From 03d8a9ac7286cd04df8a93c2e5929670133ad27f Mon Sep 17 00:00:00 2001 From: Tom Van Laerhoven Date: Mon, 13 Apr 2026 12:08:34 +0200 Subject: [PATCH 14/29] Drop deprecated integration property --- src/api/source/SourceDescription.ts | 22 ---------------------- 1 file changed, 22 deletions(-) diff --git a/src/api/source/SourceDescription.ts b/src/api/source/SourceDescription.ts index 0f6e77697..e303c545a 100644 --- a/src/api/source/SourceDescription.ts +++ b/src/api/source/SourceDescription.ts @@ -50,18 +50,6 @@ export type Sources = Source | Source[]; */ export type CrossOriginSetting = '' | 'anonymous' | 'use-credentials'; -/** - * The integration identifier of a source specific to a pre-integration, represented by a value from the following list: - *
- `'theolive'`: The source contains the THEOlive initialization url. - * - * @category Source - * @public - * @deprecated use {@link TypedSource.type} instead. - */ -export enum SourceIntegrationId { - THEO_LIVE = 'theolive' -} - /** * Describes the configuration of a player's source. * @@ -284,16 +272,6 @@ export interface TextTrackDescription { * @public */ export interface BaseSource { - /** - * The integration ID of the source. - * - * @remarks - *
- This can be used to signal that a source is specific to an integration. - * - * @deprecated use {@link TypedSource.type} instead. - */ - integration?: SourceIntegrationId; - /** * The cross-origin setting of the source. * From d83bb1a05a5291c305fa0a9dcf48953cd8ba665d Mon Sep 17 00:00:00 2001 From: Tom Van Laerhoven Date: Mon, 13 Apr 2026 12:10:58 +0200 Subject: [PATCH 15/29] Run prettier --- example/babel.config.js | 4 +--- example/package-lock.json | 2 +- src/internal/adapter/track/TextTrackStyleAdapter.ts | 8 ++++---- 3 files changed, 6 insertions(+), 8 deletions(-) diff --git a/example/babel.config.js b/example/babel.config.js index 740e17231..b86719fc5 100644 --- a/example/babel.config.js +++ b/example/babel.config.js @@ -1,6 +1,4 @@ module.exports = { presets: ['module:@react-native/babel-preset'], - plugins: [ - 'babel-plugin-react-compiler', - ], + plugins: ['babel-plugin-react-compiler'], }; diff --git a/example/package-lock.json b/example/package-lock.json index d5f4cc602..8c8463894 100644 --- a/example/package-lock.json +++ b/example/package-lock.json @@ -13317,7 +13317,7 @@ "version": "5.8.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", - "devOptional": true, + "dev": true, "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", diff --git a/src/internal/adapter/track/TextTrackStyleAdapter.ts b/src/internal/adapter/track/TextTrackStyleAdapter.ts index be106189f..7509a1162 100644 --- a/src/internal/adapter/track/TextTrackStyleAdapter.ts +++ b/src/internal/adapter/track/TextTrackStyleAdapter.ts @@ -77,14 +77,14 @@ export class TextTrackStyleAdapter implements TextTrackStyle { } get fontPath(): string | undefined { - return this._fontPath + return this._fontPath; } set fontPath(path: string) { - this._fontPath = path + this._fontPath = path; NativePlayerModule.setTextTrackStyle(this._view.nativeHandle, { - fontPath: path - }) + fontPath: path, + }); } get fontSize(): string | undefined { From 07e3b76ec654aeada4784be18a14d5dbc8d8a1a6 Mon Sep 17 00:00:00 2001 From: Tom Van Laerhoven Date: Mon, 13 Apr 2026 12:14:28 +0200 Subject: [PATCH 16/29] Add favicon --- example/web/public/index.html | 3 +++ 1 file changed, 3 insertions(+) diff --git a/example/web/public/index.html b/example/web/public/index.html index 4a6d88a29..310786e4b 100644 --- a/example/web/public/index.html +++ b/example/web/public/index.html @@ -14,6 +14,9 @@ + + +
From 8257cfa985a04eb16e1c859a609f5fc3a19d9d7b Mon Sep 17 00:00:00 2001 From: Tom Van Laerhoven Date: Mon, 13 Apr 2026 12:29:40 +0200 Subject: [PATCH 17/29] Update TheoLiveSource --- src/api/theolive/TheoLiveSource.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/api/theolive/TheoLiveSource.ts b/src/api/theolive/TheoLiveSource.ts index 87f77442c..479dc0a4b 100644 --- a/src/api/theolive/TheoLiveSource.ts +++ b/src/api/theolive/TheoLiveSource.ts @@ -1,4 +1,4 @@ -import { SourceIntegrationId, TypedSource } from 'react-native-theoplayer'; +import { TypedSource } from 'react-native-theoplayer'; import { WebrtcOptions } from './WebrtcOptions'; /** @@ -9,9 +9,9 @@ import { WebrtcOptions } from './WebrtcOptions'; */ export interface TheoLiveSource extends TypedSource { /** - * @deprecated use {@link TypedSource.type} instead. + * The source URL of the media resource. */ - integration: SourceIntegrationId.THEO_LIVE; + src: string; /** * The content type. From 75eb408d1f440ac12c5d21e32acfa1b9e43008d7 Mon Sep 17 00:00:00 2001 From: Tom Van Laerhoven Date: Mon, 13 Apr 2026 12:30:10 +0200 Subject: [PATCH 18/29] Update web peerDependency version --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index c08597723..d80ad1e8c 100644 --- a/package.json +++ b/package.json @@ -80,7 +80,7 @@ "peerDependencies": { "react": "*", "react-native": "*", - "theoplayer": "^9.12.0 || ^10" + "theoplayer": "^9.12.0 || ^10 || ^11" }, "peerDependenciesMeta": { "theoplayer": { From 3ccab4ed70e2caf13a037c01505d7955dbefda26 Mon Sep 17 00:00:00 2001 From: Tom Van Laerhoven Date: Mon, 13 Apr 2026 12:30:34 +0200 Subject: [PATCH 19/29] Update deprecated node version constraint --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index d80ad1e8c..4e8f69337 100644 --- a/package.json +++ b/package.json @@ -88,7 +88,7 @@ } }, "engines": { - "node": ">=16" + "node": ">=20" }, "eslintIgnore": [ "node_modules/", From 2738e3880aa794ad1526ed0a6b965e02062a4194 Mon Sep 17 00:00:00 2001 From: Tom Van Laerhoven Date: Mon, 13 Apr 2026 13:11:49 +0200 Subject: [PATCH 20/29] Update changelog --- CHANGELOG.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 41e62901e..1f0b164ac 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,11 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. ## [Unreleased] +### Added + +- Added support for player SDK v11. More info on the [migration documentation](./doc/migrating-to-react-native-theoplayer-11.md) page. +- Enabled core library desugaring for Android to support version 3.39.0 of the Google IMA SDK. + ### Changed - Upgraded example app to React-Native v0.84.1. @@ -15,6 +20,12 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. - Fixed an issue on Web where Google IMA could fail to initialize when used with `react-reverse-portal` due to the player container not being attached to the document yet. +### Removed + +- Removed deprecated `ResizeEvent` in favor of `DimensionChangeEvent`. +- Removed deprecated `player.theolive` property in favor of `player.theoLive`. +- Removed deprecated `source.integration` property in favor of `source.type`. + ## [10.13.0] - 26-03-27 ### Fixed From fb47c39c6dc94671c34d171cac594291db31e22c Mon Sep 17 00:00:00 2001 From: Tom Van Laerhoven Date: Mon, 13 Apr 2026 13:19:52 +0200 Subject: [PATCH 21/29] Update podspec file --- react-native-theoplayer.podspec | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/react-native-theoplayer.podspec b/react-native-theoplayer.podspec index fe642bd34..75885c65d 100644 --- a/react-native-theoplayer.podspec +++ b/react-native-theoplayer.podspec @@ -32,7 +32,7 @@ Pod::Spec.new do |s| s.license = package["license"] s.authors = package["author"] - s.platforms = { :ios => "13.4", :tvos => "13.4" } + s.platforms = { :ios => "15.0", :tvos => "15.0" } s.source = { :git => "https://www.theoplayer.com/.git", :tag => "#{s.version}" } s.source_files = 'ios/*.{h,m,swift}', 'ios/ads/*.swift', 'ios/casting/*.swift', 'ios/contentprotection/*.swift', 'ios/pip/*.swift', 'ios/backgroundAudio/*.swift', 'ios/cache/*.swift', 'ios/sideloadedMetadata/*.swift', 'ios/eventBroadcasting/*.swift' , 'ios/ui/*.swift', 'ios/presentationMode/*.swift', 'ios/viewController/*.swift', 'ios/THEOlive/*.swift', 'ios/THEOads/*.swift', 'ios/millicast/*.swift' @@ -43,37 +43,37 @@ Pod::Spec.new do |s| # THEOplayer Dependency puts "Adding THEOplayerSDK-core" - s.dependency "THEOplayerSDK-core", "~> 10.10" + s.dependency "THEOplayerSDK-core", "~> 11.0" # THEOlive Dependency puts "Adding THEOplayer-Integration-THEOlive" - s.dependency "THEOplayer-Integration-THEOlive", "~> 10.12" + s.dependency "THEOplayer-Integration-THEOlive", "~> 11.0" # Feature based integration dependencies if theofeatures.include?("GOOGLE_IMA") puts "Adding THEOplayer-Integration-GoogleIMA" - s.dependency "THEOplayer-Integration-GoogleIMA", "~> 10.12" + s.dependency "THEOplayer-Integration-GoogleIMA", "~> 11.0" end if theofeatures.include?("CHROMECAST") puts "Adding THEOplayer-Integration-GoogleCast" - s.ios.dependency "THEOplayer-Integration-GoogleCast", "~> 10.12" + s.ios.dependency "THEOplayer-Integration-GoogleCast", "~> 11.0" end if theofeatures.include?("THEO_ADS") puts "Adding THEOplayer-Integration-THEOads" - s.dependency "THEOplayer-Integration-THEOads", "~> 10.12" + s.dependency "THEOplayer-Integration-THEOads", "~> 11.0" end if theofeatures.include?("MILLICAST") puts "Adding THEOplayer-Integration-Millicast" - s.dependency "THEOplayer-Integration-Millicast", "~> 10.12" + s.dependency "THEOplayer-Integration-Millicast", "~> 11.0" end # Feature based connector dependencies if theofeatures.include?("SIDELOADED_TEXTTRACKS") puts "Adding THEOplayer-Connector-SideloadedSubtitle" - s.dependency "THEOplayer-Connector-SideloadedSubtitle", "~> 10.12" + s.dependency "THEOplayer-Connector-SideloadedSubtitle", "~> 11.0" end end From eefb559eb18d82f5371ff8f74f110841c8a4a275 Mon Sep 17 00:00:00 2001 From: Tom Van Laerhoven Date: Mon, 13 Apr 2026 13:23:02 +0200 Subject: [PATCH 22/29] Add changelog entry --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1f0b164ac..0c418c7c1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. ### Changed - Upgraded example app to React-Native v0.84.1. +- Changed the minimum supported iOS/tvOS version to 15.0, dropping support for iOS/tvOS 13 and 14. ### Fixed From 45607cf6ddd2d2245d23ee473149f6596fd16ca6 Mon Sep 17 00:00:00 2001 From: Tom Van Laerhoven Date: Thu, 16 Apr 2026 11:29:06 +0200 Subject: [PATCH 23/29] Add migration guide --- ...migrating-to-react-native-theoplayer-11.md | 41 +++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 doc/migrating-to-react-native-theoplayer-11.md diff --git a/doc/migrating-to-react-native-theoplayer-11.md b/doc/migrating-to-react-native-theoplayer-11.md new file mode 100644 index 000000000..7b343802e --- /dev/null +++ b/doc/migrating-to-react-native-theoplayer-11.md @@ -0,0 +1,41 @@ +# Migrating to THEOplayer React Native SDK 11.x + +This article will guide you through updating to THEOplayer React Native SDK version 11 (from version 10), +and the changes needed in your code. + +## Update React Native THEOplayer + +Run the following command to install THEOplayer React Native SDK version 11: + +```bash +npm install react-native-theoplayer@11 +``` + +## Breaking API changes + +- Removed deprecated `ResizeEvent` in favor of `DimensionChangeEvent`. +- Removed deprecated `player.theolive` property in favor of `player.theoLive`. +- Removed deprecated `source.integration` property in favor of `source.type`. + +## Breaking Changes on Web + +The breaking changes for the native Web SDK are listed in the v11 [changelog](https://optiview.dolby.com/docs/theoplayer/changelog/#-breaking-changes), +none of which impact the React Native SDK on Web. + +## Breaking Changes on iOS + +The breaking changes for the native Web SDK are listed in the v11 [changelog](https://optiview.dolby.com/docs/theoplayer/changelog/#-breaking-changes-2). + +The following updates in particular impact the React Native SDK on iOS. + +- The minimum supported iOS/tvOS version is now 15.0, dropping support for iOS/tvOS 13 and 14. + +## Breaking Changes on Android + +The breaking changes for the native Android SDK are listed in the v11 [changelog](https://optiview.dolby.com/docs/theoplayer/changelog/#-breaking-changes-1). + +The following updates in particular impact the React Native SDK on Android. + +- The Google IMA SDK integration now requires [core library desugaring](https://developer.android.com/studio/write/java8-support#library-desugaring) to be enabled. +See [our updated guide for Google IMA](https://optiview.dolby.com/docs/theoplayer/how-to-guides/ads/google-ima/#android-sdk) for instructions, or the +React Native THEOplayer [example app](https://github.com/THEOplayer/react-native-theoplayer/tree/develop/example) for a sample implementation. From 74e3965f63900c33e8de1d94ee00abe62a6e82af Mon Sep 17 00:00:00 2001 From: Tom Van Laerhoven Date: Thu, 16 Apr 2026 11:40:22 +0200 Subject: [PATCH 24/29] Bump package versions --- e2e/package.json | 2 +- example/package-lock.json | 40 +++++++++++++++++++-------------------- example/package.json | 6 +++--- package-lock.json | 12 ++++++------ package.json | 2 +- 5 files changed, 31 insertions(+), 31 deletions(-) diff --git a/e2e/package.json b/e2e/package.json index c351f8a68..e9e755871 100644 --- a/e2e/package.json +++ b/e2e/package.json @@ -14,7 +14,7 @@ "update-dependencies": "npx ncu '/@theoplayer\\/.*/' -u" }, "dependencies": { - "@theoplayer/react-native-ui": "^0.22.0", + "@theoplayer/react-native-ui": "^0.23.0", "react": "19.2.3", "react-dom": "19.2.3", "react-native": "npm:react-native-tvos@^0.84.1-0", diff --git a/example/package-lock.json b/example/package-lock.json index 8c8463894..43c6ef647 100644 --- a/example/package-lock.json +++ b/example/package-lock.json @@ -8,8 +8,8 @@ "name": "react-native-theoplayer-example", "version": "0.0.1", "dependencies": { - "@theoplayer/react-native-drm": "^1.10.0", - "@theoplayer/react-native-ui": "^0.22.0", + "@theoplayer/react-native-drm": "^1.11.0", + "@theoplayer/react-native-ui": "^0.23.0", "react": "19.2.3", "react-dom": "19.2.3", "react-native": "npm:react-native-tvos@^0.84.1-0", @@ -40,7 +40,7 @@ "eslint": "^8.57.1", "html-webpack-plugin": "^5.6.3", "react-native-svg-web": "^1.0.9", - "theoplayer": "^10", + "theoplayer": "^11", "typescript": "5.8.3", "webpack": "^5.105.0", "webpack-cli": "^6.0.1", @@ -51,7 +51,7 @@ } }, "..": { - "version": "10.13.0", + "version": "11.0.0", "license": "BSD-3-Clause-Clear", "dependencies": { "@theoplayer/cmcd-connector-web": "^1.4.0", @@ -72,7 +72,7 @@ "react": "^19.2.3", "react-native": "^0.84.1", "react-native-builder-bob": "^0.39.1", - "theoplayer": "^10.11.0", + "theoplayer": "^11.0.0", "typedoc": "^0.25.13", "typedoc-plugin-external-resolver": "^1.0.3", "typedoc-plugin-mdn-links": "^3.3.4", @@ -80,12 +80,12 @@ "typescript-eslint": "^8.30.1" }, "engines": { - "node": ">=16" + "node": ">=20" }, "peerDependencies": { "react": "*", "react-native": "*", - "theoplayer": "^9.12.0 || ^10" + "theoplayer": "^9.12.0 || ^10 || ^11" }, "peerDependenciesMeta": { "theoplayer": { @@ -3334,20 +3334,20 @@ } }, "node_modules/@theoplayer/react-native-drm": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@theoplayer/react-native-drm/-/react-native-drm-1.10.0.tgz", - "integrity": "sha512-s7QQMlpxVE8nmCTwzNaHbdIsEmoqUvdixoblW0oNwxks9ocyubOmHwxoc+TRalo2Q6dq/BzacHKCXp2F1KhFrg==", - "license": "SEE LICENSE AT https://www.theoplayer.com/terms", + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/@theoplayer/react-native-drm/-/react-native-drm-1.12.0.tgz", + "integrity": "sha512-n3+FBLEyBP43mDG3hk0iy6AcQhWoE3NoVWZsTL1LiHHcr4jJvTQLjQO3r3FHv4I5E337nojks1gVFVdYx7dbSg==", + "license": "BSD-3-Clause-Clear", "peerDependencies": { "react": "*", - "react-native-theoplayer": "^7 || ^8 || ^9 || ^10", - "theoplayer": "^7 || ^8 || ^9 || ^10" + "react-native-theoplayer": "^7 || ^8 || ^9 || ^10 || ^11", + "theoplayer": "^7 || ^8 || ^9 || ^10 || ^11" } }, "node_modules/@theoplayer/react-native-ui": { - "version": "0.22.0", - "resolved": "https://registry.npmjs.org/@theoplayer/react-native-ui/-/react-native-ui-0.22.0.tgz", - "integrity": "sha512-7nk/VBKIcOdN7f/WgewejSItzNIZ2qdej43qvhp2UREXWWcpppmR0oltYPL9P16oOaMoOMK8vAXMIxengomxJg==", + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@theoplayer/react-native-ui/-/react-native-ui-0.23.0.tgz", + "integrity": "sha512-NzRdsx2Z/466E3ZDTgQFqBrkRQ0v/1TtJv7Pv67NJMmotc0yXLOYwDy2pyL/QDyYUzmTrUX9A26VP10wsXSHig==", "license": "SEE LICENSE AT https://www.theoplayer.com/terms", "dependencies": { "@miblanchard/react-native-slider": "^2.6.0", @@ -3359,7 +3359,7 @@ "react-native": "*", "react-native-google-cast": "*", "react-native-svg": "^13.8.0 || ^14 || ^15", - "react-native-theoplayer": "^7 || ^8 || ^9 || ^10" + "react-native-theoplayer": "^7 || ^8 || ^9 || ^10 || ^11" } }, "node_modules/@types/babel__core": { @@ -13036,9 +13036,9 @@ "license": "MIT" }, "node_modules/theoplayer": { - "version": "10.6.1", - "resolved": "https://registry.npmjs.org/theoplayer/-/theoplayer-10.6.1.tgz", - "integrity": "sha512-mz3LpcChF0/pUWJwzJtMwKWyuqmv85Ao8eAFVmYFI0K+krjC+yAm28suFa7E6BITZfNTtwlDTY+ZPRDcxd6+ng==", + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/theoplayer/-/theoplayer-11.0.0.tgz", + "integrity": "sha512-pxjpNtd++m87H5ndEPlNbKpHhXCNbFDgnXB0g6RfTv/v7zSpSLwiB0F0vIJe5asaqEJ6pKH7kvpTgnaEN2TElw==", "license": "SEE LICENSE AT https://www.theoplayer.com/terms" }, "node_modules/thingies": { diff --git a/example/package.json b/example/package.json index ba0fd7ddb..4ea8890d7 100644 --- a/example/package.json +++ b/example/package.json @@ -15,8 +15,8 @@ "pod-update": "cd ios && RCT_NEW_ARCH_ENABLED=1 bundle exec pod update" }, "dependencies": { - "@theoplayer/react-native-drm": "^1.10.0", - "@theoplayer/react-native-ui": "^0.22.0", + "@theoplayer/react-native-drm": "^1.11.0", + "@theoplayer/react-native-ui": "^0.23.0", "react": "19.2.3", "react-dom": "19.2.3", "react-native": "npm:react-native-tvos@^0.84.1-0", @@ -47,7 +47,7 @@ "eslint": "^8.57.1", "html-webpack-plugin": "^5.6.3", "react-native-svg-web": "^1.0.9", - "theoplayer": "^10", + "theoplayer": "^11", "typescript": "5.8.3", "webpack": "^5.105.0", "webpack-cli": "^6.0.1", diff --git a/package-lock.json b/package-lock.json index 8c411dce4..eb8369f6e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -27,7 +27,7 @@ "react": "^19.2.3", "react-native": "^0.84.1", "react-native-builder-bob": "^0.39.1", - "theoplayer": "^10.11.0", + "theoplayer": "^11.0.0", "typedoc": "^0.25.13", "typedoc-plugin-external-resolver": "^1.0.3", "typedoc-plugin-mdn-links": "^3.3.4", @@ -35,12 +35,12 @@ "typescript-eslint": "^8.30.1" }, "engines": { - "node": ">=16" + "node": ">=20" }, "peerDependencies": { "react": "*", "react-native": "*", - "theoplayer": "^9.12.0 || ^10" + "theoplayer": "^9.12.0 || ^10 || ^11" }, "peerDependenciesMeta": { "theoplayer": { @@ -10936,9 +10936,9 @@ "dev": true }, "node_modules/theoplayer": { - "version": "10.13.0", - "resolved": "https://registry.npmjs.org/theoplayer/-/theoplayer-10.13.0.tgz", - "integrity": "sha512-RrHWZWFG9xEcNPwQV46mRJM1YouvS4A/ZB/0o2OM2GuFvZH65DUhsr3fml7YIXKa6iLUawvsuwHxMoM2MztNZQ==", + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/theoplayer/-/theoplayer-11.0.0.tgz", + "integrity": "sha512-pxjpNtd++m87H5ndEPlNbKpHhXCNbFDgnXB0g6RfTv/v7zSpSLwiB0F0vIJe5asaqEJ6pKH7kvpTgnaEN2TElw==", "license": "SEE LICENSE AT https://www.theoplayer.com/terms" }, "node_modules/throat": { diff --git a/package.json b/package.json index 4e8f69337..3619b6c2a 100644 --- a/package.json +++ b/package.json @@ -70,7 +70,7 @@ "react": "^19.2.3", "react-native": "^0.84.1", "react-native-builder-bob": "^0.39.1", - "theoplayer": "^10.11.0", + "theoplayer": "^11.0.0", "typedoc": "^0.25.13", "typedoc-plugin-external-resolver": "^1.0.3", "typedoc-plugin-mdn-links": "^3.3.4", From 9f927afafbe1b26fd3e890f0c6544a797f157260 Mon Sep 17 00:00:00 2001 From: Tom Van Laerhoven Date: Thu, 16 Apr 2026 11:58:46 +0200 Subject: [PATCH 25/29] Update DRM package --- example/package-lock.json | 4 ++-- example/package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/example/package-lock.json b/example/package-lock.json index 43c6ef647..4925024e5 100644 --- a/example/package-lock.json +++ b/example/package-lock.json @@ -8,7 +8,7 @@ "name": "react-native-theoplayer-example", "version": "0.0.1", "dependencies": { - "@theoplayer/react-native-drm": "^1.11.0", + "@theoplayer/react-native-drm": "^1.12.0", "@theoplayer/react-native-ui": "^0.23.0", "react": "19.2.3", "react-dom": "19.2.3", @@ -51,7 +51,7 @@ } }, "..": { - "version": "11.0.0", + "version": "10.13.0", "license": "BSD-3-Clause-Clear", "dependencies": { "@theoplayer/cmcd-connector-web": "^1.4.0", diff --git a/example/package.json b/example/package.json index 4ea8890d7..60f9eb982 100644 --- a/example/package.json +++ b/example/package.json @@ -15,7 +15,7 @@ "pod-update": "cd ios && RCT_NEW_ARCH_ENABLED=1 bundle exec pod update" }, "dependencies": { - "@theoplayer/react-native-drm": "^1.11.0", + "@theoplayer/react-native-drm": "^1.12.0", "@theoplayer/react-native-ui": "^0.23.0", "react": "19.2.3", "react-dom": "19.2.3", From 3abc3d9668180ac8f4881a8bea90ac06193fe85f Mon Sep 17 00:00:00 2001 From: Tom Van Laerhoven Date: Thu, 16 Apr 2026 12:57:56 +0200 Subject: [PATCH 26/29] Drop unused imports --- .../main/java/com/reactnativetheoplayer/MainApplication.kt | 6 ------ .../main/java/com/reactnativetheoplayer/MainApplication.kt | 6 ------ 2 files changed, 12 deletions(-) diff --git a/e2e/android/app/src/main/java/com/reactnativetheoplayer/MainApplication.kt b/e2e/android/app/src/main/java/com/reactnativetheoplayer/MainApplication.kt index 2e5d462e2..f96443c13 100644 --- a/e2e/android/app/src/main/java/com/reactnativetheoplayer/MainApplication.kt +++ b/e2e/android/app/src/main/java/com/reactnativetheoplayer/MainApplication.kt @@ -5,13 +5,7 @@ import com.facebook.react.PackageList import com.facebook.react.ReactApplication import com.facebook.react.ReactHost import com.facebook.react.ReactNativeApplicationEntryPoint.loadReactNative -import com.facebook.react.ReactNativeHost -import com.facebook.react.ReactPackage -import com.facebook.react.defaults.DefaultNewArchitectureEntryPoint.load import com.facebook.react.defaults.DefaultReactHost.getDefaultReactHost -import com.facebook.react.defaults.DefaultReactNativeHost -import com.facebook.react.soloader.OpenSourceMergedSoMapping -import com.facebook.soloader.SoLoader import com.theoplayer.ReactTHEOplayerPackage class MainApplication : Application(), ReactApplication { diff --git a/example/android/app/src/main/java/com/reactnativetheoplayer/MainApplication.kt b/example/android/app/src/main/java/com/reactnativetheoplayer/MainApplication.kt index 2e5d462e2..f96443c13 100644 --- a/example/android/app/src/main/java/com/reactnativetheoplayer/MainApplication.kt +++ b/example/android/app/src/main/java/com/reactnativetheoplayer/MainApplication.kt @@ -5,13 +5,7 @@ import com.facebook.react.PackageList import com.facebook.react.ReactApplication import com.facebook.react.ReactHost import com.facebook.react.ReactNativeApplicationEntryPoint.loadReactNative -import com.facebook.react.ReactNativeHost -import com.facebook.react.ReactPackage -import com.facebook.react.defaults.DefaultNewArchitectureEntryPoint.load import com.facebook.react.defaults.DefaultReactHost.getDefaultReactHost -import com.facebook.react.defaults.DefaultReactNativeHost -import com.facebook.react.soloader.OpenSourceMergedSoMapping -import com.facebook.soloader.SoLoader import com.theoplayer.ReactTHEOplayerPackage class MainApplication : Application(), ReactApplication { From 28513013ca75691290f10aa41c827966586beb4e Mon Sep 17 00:00:00 2001 From: Tom Van Laerhoven Date: Thu, 16 Apr 2026 13:21:15 +0200 Subject: [PATCH 27/29] Update cmcd connector --- package-lock.json | 10 +++++----- package.json | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index eb8369f6e..65bdba51a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,7 +9,7 @@ "version": "10.13.0", "license": "BSD-3-Clause-Clear", "dependencies": { - "@theoplayer/cmcd-connector-web": "^1.4.0", + "@theoplayer/cmcd-connector-web": "^1.5.0", "buffer": "^6.0.3" }, "devDependencies": { @@ -3137,12 +3137,12 @@ } }, "node_modules/@theoplayer/cmcd-connector-web": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@theoplayer/cmcd-connector-web/-/cmcd-connector-web-1.4.0.tgz", - "integrity": "sha512-fOl94/HKnJLiBwhy4KPLOtxcNksUHfCyXQTvTM0kVBdd+Y6DwgreGpk6RXeHpxzkVXgH0Sx1DjNutwfIqLk/yA==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@theoplayer/cmcd-connector-web/-/cmcd-connector-web-1.5.0.tgz", + "integrity": "sha512-eWElrE36ubYqaxcsc4iA8L1YwRB0m48rXl3OWjiQIZINdMUSyEB87999xEG9Y21WKVDCjG7yegnJzFBKnzttmQ==", "license": "MIT", "peerDependencies": { - "theoplayer": "^5 || ^6 || ^7 || ^8 || ^9 || ^10" + "theoplayer": "^5 || ^6 || ^7 || ^8 || ^9 || ^10 || ^11" } }, "node_modules/@types/babel__core": { diff --git a/package.json b/package.json index 3619b6c2a..7505ef920 100644 --- a/package.json +++ b/package.json @@ -109,7 +109,7 @@ ] }, "dependencies": { - "@theoplayer/cmcd-connector-web": "^1.4.0", + "@theoplayer/cmcd-connector-web": "^1.5.0", "buffer": "^6.0.3" } } From c518b20b309c5a74d17966e416ebe353e11d6ace Mon Sep 17 00:00:00 2001 From: Tom Van Laerhoven Date: Thu, 16 Apr 2026 13:24:21 +0200 Subject: [PATCH 28/29] Update lock files --- e2e/package-lock.json | 18 +++++++++--------- example/package-lock.json | 2 +- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/e2e/package-lock.json b/e2e/package-lock.json index 30a377b0e..dd0adc2ba 100644 --- a/e2e/package-lock.json +++ b/e2e/package-lock.json @@ -8,7 +8,7 @@ "name": "react-native-theoplayer-e2e", "version": "0.0.1", "dependencies": { - "@theoplayer/react-native-ui": "^0.22.0", + "@theoplayer/react-native-ui": "^0.23.0", "react": "19.2.3", "react-dom": "19.2.3", "react-native": "npm:react-native-tvos@^0.84.1-0", @@ -56,7 +56,7 @@ "version": "10.13.0", "license": "BSD-3-Clause-Clear", "dependencies": { - "@theoplayer/cmcd-connector-web": "^1.4.0", + "@theoplayer/cmcd-connector-web": "^1.5.0", "buffer": "^6.0.3" }, "devDependencies": { @@ -74,7 +74,7 @@ "react": "^19.2.3", "react-native": "^0.84.1", "react-native-builder-bob": "^0.39.1", - "theoplayer": "^10.11.0", + "theoplayer": "^11.0.0", "typedoc": "^0.25.13", "typedoc-plugin-external-resolver": "^1.0.3", "typedoc-plugin-mdn-links": "^3.3.4", @@ -82,12 +82,12 @@ "typescript-eslint": "^8.30.1" }, "engines": { - "node": ">=16" + "node": ">=20" }, "peerDependencies": { "react": "*", "react-native": "*", - "theoplayer": "^9.12.0 || ^10" + "theoplayer": "^9.12.0 || ^10 || ^11" }, "peerDependenciesMeta": { "theoplayer": { @@ -3336,9 +3336,9 @@ } }, "node_modules/@theoplayer/react-native-ui": { - "version": "0.22.0", - "resolved": "https://registry.npmjs.org/@theoplayer/react-native-ui/-/react-native-ui-0.22.0.tgz", - "integrity": "sha512-7nk/VBKIcOdN7f/WgewejSItzNIZ2qdej43qvhp2UREXWWcpppmR0oltYPL9P16oOaMoOMK8vAXMIxengomxJg==", + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@theoplayer/react-native-ui/-/react-native-ui-0.23.0.tgz", + "integrity": "sha512-NzRdsx2Z/466E3ZDTgQFqBrkRQ0v/1TtJv7Pv67NJMmotc0yXLOYwDy2pyL/QDyYUzmTrUX9A26VP10wsXSHig==", "license": "SEE LICENSE AT https://www.theoplayer.com/terms", "dependencies": { "@miblanchard/react-native-slider": "^2.6.0", @@ -3350,7 +3350,7 @@ "react-native": "*", "react-native-google-cast": "*", "react-native-svg": "^13.8.0 || ^14 || ^15", - "react-native-theoplayer": "^7 || ^8 || ^9 || ^10" + "react-native-theoplayer": "^7 || ^8 || ^9 || ^10 || ^11" } }, "node_modules/@types/babel__core": { diff --git a/example/package-lock.json b/example/package-lock.json index 4925024e5..f351f6626 100644 --- a/example/package-lock.json +++ b/example/package-lock.json @@ -54,7 +54,7 @@ "version": "10.13.0", "license": "BSD-3-Clause-Clear", "dependencies": { - "@theoplayer/cmcd-connector-web": "^1.4.0", + "@theoplayer/cmcd-connector-web": "^1.5.0", "buffer": "^6.0.3" }, "devDependencies": { From 2150d82486a11dc41b3557dada42fe3588010335 Mon Sep 17 00:00:00 2001 From: William Van Haevre Date: Thu, 16 Apr 2026 13:55:18 +0200 Subject: [PATCH 29/29] Drop Sideloaded texttracks feature for e2e tests. --- e2e/react-native-theoplayer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/e2e/react-native-theoplayer.json b/e2e/react-native-theoplayer.json index a91ca8d26..0ec39ba29 100644 --- a/e2e/react-native-theoplayer.json +++ b/e2e/react-native-theoplayer.json @@ -1,5 +1,5 @@ { "ios": { - "features": ["GOOGLE_IMA", "CHROMECAST", "SIDELOADED_TEXTTRACKS", "THEO_ADS", "MILLICAST"] + "features": ["GOOGLE_IMA", "CHROMECAST", "THEO_ADS", "MILLICAST"] } }