react-native-theoplayer 10.0.0 → 10.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (179) hide show
  1. package/CHANGELOG.md +31 -0
  2. package/android/build.gradle +5 -6
  3. package/android/src/main/AndroidManifest.xml +1 -1
  4. package/android/src/main/java/com/theoplayer/PlayerEventEmitter.kt +21 -9
  5. package/android/src/main/java/com/theoplayer/cache/CacheModule.kt +8 -9
  6. package/android/src/main/java/com/theoplayer/cast/CastEventAdapter.kt +11 -7
  7. package/android/src/main/java/com/theoplayer/media/ConditionalMediaButtonReceiver.kt +38 -0
  8. package/android/src/main/java/com/theoplayer/player/PlayerModule.kt +1 -1
  9. package/android/src/main/java/com/theoplayer/source/SourceAdapter.kt +1 -1
  10. package/android/src/main/java/com/theoplayer/theoads/THEOadsAdapter.kt +10 -1
  11. package/android/src/main/java/com/theoplayer/theoads/THEOadsEventAdapter.kt +6 -3
  12. package/android/src/main/java/com/theoplayer/theoads/THEOadsModule.kt +14 -0
  13. package/android/src/main/java/com/theoplayer/theolive/THEOliveEventAdapter.kt +21 -8
  14. package/android/src/main/java/com/theoplayer/theolive/THEOliveModule.kt +1 -1
  15. package/android/src/main/java/com/theoplayer/track/TextTrackStyleAdapter.kt +8 -1
  16. package/android/src/main/java/com/theoplayer/util/PayloadBuilder.kt +8 -0
  17. package/ios/THEOplayerRCTBridge.m +8 -1
  18. package/ios/THEOplayerRCTMainEventHandler.swift +24 -21
  19. package/ios/THEOplayerRCTPlayerAPI.swift +9 -0
  20. package/ios/THEOplayerRCTView.swift +19 -4
  21. package/ios/backgroundAudio/THEOplayerRCTNowPlayingManager.swift +96 -50
  22. package/ios/backgroundAudio/THEOplayerRCTRemoteCommandsManager.swift +0 -1
  23. package/ios/casting/THEOplayerRCTCastEventHandler.swift +1 -1
  24. package/ios/presentationMode/THEOplayerRCTPresentationModeManager.swift +26 -8
  25. package/ios/theoAds/THEOplayerRCTTHEOAdsAPI.swift +19 -0
  26. package/ios/theoAds/THEOplayerRCTTHEOAdsEventAdapter.swift +4 -2
  27. package/lib/commonjs/api/cache/hooks/useCachingTaskList.js +1 -1
  28. package/lib/commonjs/api/cache/hooks/useCachingTaskList.js.map +1 -1
  29. package/lib/commonjs/api/cache/hooks/useCachingTaskProgress.js +1 -1
  30. package/lib/commonjs/api/cache/hooks/useCachingTaskProgress.js.map +1 -1
  31. package/lib/commonjs/api/cache/hooks/useCachingTaskStatus.js +1 -1
  32. package/lib/commonjs/api/cache/hooks/useCachingTaskStatus.js.map +1 -1
  33. package/lib/commonjs/api/event/PlayerEvent.js +16 -0
  34. package/lib/commonjs/api/event/PlayerEvent.js.map +1 -1
  35. package/lib/commonjs/api/player/PlayerEventMap.js +2 -0
  36. package/lib/commonjs/api/player/PlayerEventMap.js.map +1 -1
  37. package/lib/commonjs/api/track/Quality.js +37 -0
  38. package/lib/commonjs/api/track/Quality.js.map +1 -1
  39. package/lib/commonjs/api/track/TextTrackStyle.js.map +1 -1
  40. package/lib/commonjs/internal/THEOplayerView.js +14 -4
  41. package/lib/commonjs/internal/THEOplayerView.js.map +1 -1
  42. package/lib/commonjs/internal/THEOplayerView.web.js +6 -7
  43. package/lib/commonjs/internal/THEOplayerView.web.js.map +1 -1
  44. package/lib/commonjs/internal/adapter/DefaultNativePlayerState.js +2 -0
  45. package/lib/commonjs/internal/adapter/DefaultNativePlayerState.js.map +1 -1
  46. package/lib/commonjs/internal/adapter/THEOplayerAdapter.js +35 -9
  47. package/lib/commonjs/internal/adapter/THEOplayerAdapter.js.map +1 -1
  48. package/lib/commonjs/internal/adapter/THEOplayerWebAdapter.js +21 -1
  49. package/lib/commonjs/internal/adapter/THEOplayerWebAdapter.js.map +1 -1
  50. package/lib/commonjs/internal/adapter/WebEventForwarder.js +7 -0
  51. package/lib/commonjs/internal/adapter/WebEventForwarder.js.map +1 -1
  52. package/lib/commonjs/internal/adapter/event/PlayerEvents.js +21 -1
  53. package/lib/commonjs/internal/adapter/event/PlayerEvents.js.map +1 -1
  54. package/lib/commonjs/internal/adapter/event/native/NativeTheoAdsEvent.js +4 -3
  55. package/lib/commonjs/internal/adapter/event/native/NativeTheoAdsEvent.js.map +1 -1
  56. package/lib/commonjs/internal/adapter/theoads/NativeInterstitialAdapter.js +68 -0
  57. package/lib/commonjs/internal/adapter/theoads/NativeInterstitialAdapter.js.map +1 -0
  58. package/lib/commonjs/internal/adapter/theoads/THEOAdsNativeAdapter.js +11 -2
  59. package/lib/commonjs/internal/adapter/theoads/THEOAdsNativeAdapter.js.map +1 -1
  60. package/lib/commonjs/internal/adapter/theolive/TheoLiveNativeAdapter.js.map +1 -1
  61. package/lib/commonjs/internal/adapter/track/TextTrackStyleAdapter.js +10 -0
  62. package/lib/commonjs/internal/adapter/track/TextTrackStyleAdapter.js.map +1 -1
  63. package/lib/commonjs/internal/utils/TypeUtils.js +4 -1
  64. package/lib/commonjs/internal/utils/TypeUtils.js.map +1 -1
  65. package/lib/commonjs/manifest.json +1 -1
  66. package/lib/module/api/cache/hooks/useCachingTaskList.js +1 -1
  67. package/lib/module/api/cache/hooks/useCachingTaskList.js.map +1 -1
  68. package/lib/module/api/cache/hooks/useCachingTaskProgress.js +1 -1
  69. package/lib/module/api/cache/hooks/useCachingTaskProgress.js.map +1 -1
  70. package/lib/module/api/cache/hooks/useCachingTaskStatus.js +1 -1
  71. package/lib/module/api/cache/hooks/useCachingTaskStatus.js.map +1 -1
  72. package/lib/module/api/event/PlayerEvent.js +18 -0
  73. package/lib/module/api/event/PlayerEvent.js.map +1 -1
  74. package/lib/module/api/player/PlayerEventMap.js +2 -0
  75. package/lib/module/api/player/PlayerEventMap.js.map +1 -1
  76. package/lib/module/api/track/Quality.js +34 -0
  77. package/lib/module/api/track/Quality.js.map +1 -1
  78. package/lib/module/api/track/TextTrackStyle.js.map +1 -1
  79. package/lib/module/internal/THEOplayerView.js +15 -5
  80. package/lib/module/internal/THEOplayerView.js.map +1 -1
  81. package/lib/module/internal/THEOplayerView.web.js +6 -7
  82. package/lib/module/internal/THEOplayerView.web.js.map +1 -1
  83. package/lib/module/internal/adapter/DefaultNativePlayerState.js +2 -0
  84. package/lib/module/internal/adapter/DefaultNativePlayerState.js.map +1 -1
  85. package/lib/module/internal/adapter/THEOplayerAdapter.js +36 -10
  86. package/lib/module/internal/adapter/THEOplayerAdapter.js.map +1 -1
  87. package/lib/module/internal/adapter/THEOplayerWebAdapter.js +21 -1
  88. package/lib/module/internal/adapter/THEOplayerWebAdapter.js.map +1 -1
  89. package/lib/module/internal/adapter/WebEventForwarder.js +8 -1
  90. package/lib/module/internal/adapter/WebEventForwarder.js.map +1 -1
  91. package/lib/module/internal/adapter/event/PlayerEvents.js +18 -0
  92. package/lib/module/internal/adapter/event/PlayerEvents.js.map +1 -1
  93. package/lib/module/internal/adapter/event/native/NativeTheoAdsEvent.js +4 -3
  94. package/lib/module/internal/adapter/event/native/NativeTheoAdsEvent.js.map +1 -1
  95. package/lib/module/internal/adapter/theoads/NativeInterstitialAdapter.js +61 -0
  96. package/lib/module/internal/adapter/theoads/NativeInterstitialAdapter.js.map +1 -0
  97. package/lib/module/internal/adapter/theoads/THEOAdsNativeAdapter.js +11 -2
  98. package/lib/module/internal/adapter/theoads/THEOAdsNativeAdapter.js.map +1 -1
  99. package/lib/module/internal/adapter/theolive/TheoLiveNativeAdapter.js.map +1 -1
  100. package/lib/module/internal/adapter/track/TextTrackStyleAdapter.js +10 -0
  101. package/lib/module/internal/adapter/track/TextTrackStyleAdapter.js.map +1 -1
  102. package/lib/module/internal/utils/TypeUtils.js +3 -0
  103. package/lib/module/internal/utils/TypeUtils.js.map +1 -1
  104. package/lib/module/manifest.json +1 -1
  105. package/lib/typescript/api/event/PlayerEvent.d.ts +36 -0
  106. package/lib/typescript/api/event/PlayerEvent.d.ts.map +1 -1
  107. package/lib/typescript/api/player/PlayerEventMap.d.ts +17 -2
  108. package/lib/typescript/api/player/PlayerEventMap.d.ts.map +1 -1
  109. package/lib/typescript/api/player/THEOplayer.d.ts +15 -1
  110. package/lib/typescript/api/player/THEOplayer.d.ts.map +1 -1
  111. package/lib/typescript/api/theoads/interstitial/Interstitial.d.ts +6 -0
  112. package/lib/typescript/api/theoads/interstitial/Interstitial.d.ts.map +1 -1
  113. package/lib/typescript/api/theolive/TheoLiveAPI.d.ts +1 -1
  114. package/lib/typescript/api/theolive/TheoLiveConfiguration.d.ts +1 -1
  115. package/lib/typescript/api/track/Quality.d.ts +1 -0
  116. package/lib/typescript/api/track/Quality.d.ts.map +1 -1
  117. package/lib/typescript/api/track/TextTrackStyle.d.ts +7 -0
  118. package/lib/typescript/api/track/TextTrackStyle.d.ts.map +1 -1
  119. package/lib/typescript/internal/THEOplayerView.d.ts +2 -1
  120. package/lib/typescript/internal/THEOplayerView.d.ts.map +1 -1
  121. package/lib/typescript/internal/THEOplayerView.web.d.ts.map +1 -1
  122. package/lib/typescript/internal/adapter/DefaultNativePlayerState.d.ts +2 -0
  123. package/lib/typescript/internal/adapter/DefaultNativePlayerState.d.ts.map +1 -1
  124. package/lib/typescript/internal/adapter/NativePlayerState.d.ts +2 -0
  125. package/lib/typescript/internal/adapter/NativePlayerState.d.ts.map +1 -1
  126. package/lib/typescript/internal/adapter/THEOplayerAdapter.d.ts +7 -3
  127. package/lib/typescript/internal/adapter/THEOplayerAdapter.d.ts.map +1 -1
  128. package/lib/typescript/internal/adapter/THEOplayerWebAdapter.d.ts +6 -0
  129. package/lib/typescript/internal/adapter/THEOplayerWebAdapter.d.ts.map +1 -1
  130. package/lib/typescript/internal/adapter/WebEventForwarder.d.ts +1 -0
  131. package/lib/typescript/internal/adapter/WebEventForwarder.d.ts.map +1 -1
  132. package/lib/typescript/internal/adapter/event/PlayerEvents.d.ts +14 -1
  133. package/lib/typescript/internal/adapter/event/PlayerEvents.d.ts.map +1 -1
  134. package/lib/typescript/internal/adapter/event/native/NativePlayerEvent.d.ts +11 -1
  135. package/lib/typescript/internal/adapter/event/native/NativePlayerEvent.d.ts.map +1 -1
  136. package/lib/typescript/internal/adapter/event/native/NativeTheoAdsEvent.d.ts +1 -1
  137. package/lib/typescript/internal/adapter/event/native/NativeTheoAdsEvent.d.ts.map +1 -1
  138. package/lib/typescript/internal/adapter/theoads/NativeInterstitialAdapter.d.ts +31 -0
  139. package/lib/typescript/internal/adapter/theoads/NativeInterstitialAdapter.d.ts.map +1 -0
  140. package/lib/typescript/internal/adapter/theoads/THEOAdsNativeAdapter.d.ts +3 -1
  141. package/lib/typescript/internal/adapter/theoads/THEOAdsNativeAdapter.d.ts.map +1 -1
  142. package/lib/typescript/internal/adapter/theoads/THEOAdsWebAdapter.d.ts +1 -1
  143. package/lib/typescript/internal/adapter/theoads/THEOAdsWebAdapter.d.ts.map +1 -1
  144. package/lib/typescript/internal/adapter/theolive/TheoLiveNativeAdapter.d.ts +1 -1
  145. package/lib/typescript/internal/adapter/theolive/TheoLiveNativeAdapter.d.ts.map +1 -1
  146. package/lib/typescript/internal/adapter/track/TextTrackStyleAdapter.d.ts +3 -0
  147. package/lib/typescript/internal/adapter/track/TextTrackStyleAdapter.d.ts.map +1 -1
  148. package/lib/typescript/internal/utils/TypeUtils.d.ts +1 -0
  149. package/lib/typescript/internal/utils/TypeUtils.d.ts.map +1 -1
  150. package/package.json +2 -1
  151. package/react-native-theoplayer.podspec +7 -7
  152. package/src/api/cache/hooks/useCachingTaskList.ts +1 -1
  153. package/src/api/cache/hooks/useCachingTaskProgress.ts +1 -1
  154. package/src/api/cache/hooks/useCachingTaskStatus.ts +1 -1
  155. package/src/api/event/PlayerEvent.ts +40 -0
  156. package/src/api/player/PlayerEventMap.ts +19 -0
  157. package/src/api/player/THEOplayer.ts +18 -1
  158. package/src/api/theoads/interstitial/Interstitial.ts +7 -0
  159. package/src/api/theolive/TheoLiveAPI.ts +1 -1
  160. package/src/api/theolive/TheoLiveConfiguration.ts +1 -1
  161. package/src/api/track/Quality.ts +15 -0
  162. package/src/api/track/TextTrackStyle.ts +8 -0
  163. package/src/internal/THEOplayerView.tsx +21 -6
  164. package/src/internal/THEOplayerView.web.tsx +4 -5
  165. package/src/internal/adapter/DefaultNativePlayerState.ts +2 -0
  166. package/src/internal/adapter/NativePlayerState.ts +2 -0
  167. package/src/internal/adapter/THEOplayerAdapter.ts +53 -21
  168. package/src/internal/adapter/THEOplayerWebAdapter.ts +26 -2
  169. package/src/internal/adapter/WebEventForwarder.ts +10 -0
  170. package/src/internal/adapter/event/PlayerEvents.ts +23 -0
  171. package/src/internal/adapter/event/native/NativePlayerEvent.ts +13 -1
  172. package/src/internal/adapter/event/native/NativeTheoAdsEvent.ts +8 -3
  173. package/src/internal/adapter/theoads/NativeInterstitialAdapter.ts +93 -0
  174. package/src/internal/adapter/theoads/THEOAdsNativeAdapter.ts +14 -3
  175. package/src/internal/adapter/theoads/THEOAdsWebAdapter.ts +1 -1
  176. package/src/internal/adapter/theolive/TheoLiveNativeAdapter.ts +1 -1
  177. package/src/internal/adapter/track/TextTrackStyleAdapter.ts +12 -0
  178. package/src/internal/utils/TypeUtils.ts +6 -0
  179. package/src/manifest.json +1 -1
@@ -50,12 +50,33 @@ export interface TimeUpdateEvent extends Event<PlayerEventType.TIME_UPDATE> {
50
50
  readonly currentProgramDateTime?: number;
51
51
  }
52
52
 
53
+ /**
54
+ * Dispatched when the player dimensions are updated.
55
+ *
56
+ * @category Events
57
+ * @category Player
58
+ * @public
59
+ */
60
+ export interface DimensionChangeEvent extends Event<PlayerEventType.DIMENSION_CHANGE> {
61
+ /**
62
+ * The player's current width.
63
+ */
64
+ readonly width: number;
65
+
66
+ /**
67
+ * The player's current height.
68
+ */
69
+ readonly height: number;
70
+ }
71
+
53
72
  /**
54
73
  * Dispatched when player is resized.
55
74
  *
56
75
  * @category Events
57
76
  * @category Player
58
77
  * @public
78
+ *
79
+ * @deprecated use {@link DimensionChangeEvent} instead. This event is set for removal in version 11.
59
80
  */
60
81
  export interface ResizeEvent extends Event<PlayerEventType.RESIZE> {
61
82
  /**
@@ -69,6 +90,25 @@ export interface ResizeEvent extends Event<PlayerEventType.RESIZE> {
69
90
  readonly height: number;
70
91
  }
71
92
 
93
+ /**
94
+ * Dispatched when video is resized.
95
+ *
96
+ * @category Events
97
+ * @category Player
98
+ * @public
99
+ */
100
+ export interface VideoResizeEvent extends Event<PlayerEventType.VIDEO_RESIZE> {
101
+ /**
102
+ * The video's current width.
103
+ */
104
+ readonly videoWidth: number;
105
+
106
+ /**
107
+ * The video's current height.
108
+ */
109
+ readonly videoHeight: number;
110
+ }
111
+
72
112
  /**
73
113
  * Dispatched when the player's duration changes.
74
114
  *
@@ -1,5 +1,6 @@
1
1
  import type { Event } from '../event/Event';
2
2
  import type {
3
+ DimensionChangeEvent,
3
4
  DurationChangeEvent,
4
5
  ErrorEvent,
5
6
  LoadedMetadataEvent,
@@ -13,6 +14,7 @@ import type {
13
14
  ResizeEvent,
14
15
  SeekedEvent,
15
16
  SeekingEvent,
17
+ VideoResizeEvent,
16
18
  } from '../event/PlayerEvent';
17
19
  import type { MediaTrackEvent, MediaTrackListEvent, TextTrackEvent, TextTrackListEvent } from '../event/TrackEvent';
18
20
  import type { AdEvent } from '../event/AdEvent';
@@ -58,7 +60,12 @@ export enum PlayerEventType {
58
60
  WAITING = 'waiting',
59
61
  PRESENTATIONMODE_CHANGE = 'presentationmodechange',
60
62
  DESTROY = 'destroy',
63
+ /**
64
+ * @deprecated Use {@link PlayerEventType.DIMENSION_CHANGE} instead. This event is set for removal in version 11.
65
+ */
61
66
  RESIZE = 'resize',
67
+ DIMENSION_CHANGE = 'dimensionchange',
68
+ VIDEO_RESIZE = 'videoresize',
62
69
  }
63
70
 
64
71
  /**
@@ -226,6 +233,18 @@ export interface PlayerEventMap {
226
233
 
227
234
  /**
228
235
  * Dispatched when the player size changes.
236
+ *
237
+ * @deprecated Use {@link dimensionchange} instead. This event is set for removal in version 11.
229
238
  */
230
239
  [PlayerEventType.RESIZE]: ResizeEvent;
240
+
241
+ /**
242
+ * Dispatched when the player size changes.
243
+ */
244
+ [PlayerEventType.DIMENSION_CHANGE]: DimensionChangeEvent;
245
+
246
+ /**
247
+ * Dispatched when the video size changes.
248
+ */
249
+ [PlayerEventType.VIDEO_RESIZE]: VideoResizeEvent;
231
250
  }
@@ -274,7 +274,24 @@ export interface THEOplayer extends EventDispatcher<PlayerEventMap> {
274
274
  readonly height: number | undefined;
275
275
 
276
276
  /**
277
- * The API for theolive.
277
+ * The width of the active video rendition, in pixels.
278
+ */
279
+ readonly videoWidth: number | undefined;
280
+
281
+ /**
282
+ * The height of the active video rendition, in pixels.
283
+ */
284
+ readonly videoHeight: number | undefined;
285
+
286
+ /**
287
+ * The API for THEOlive.
288
+ */
289
+ readonly theoLive: TheoLiveAPI;
290
+
291
+ /**
292
+ * The API for THEOlive.
293
+ *
294
+ * @deprecated use {@link THEOplayer.theoLive} instead.
278
295
  */
279
296
  readonly theolive: TheoLiveAPI;
280
297
  }
@@ -35,4 +35,11 @@ export interface Interstitial {
35
35
  *
36
36
  */
37
37
  duration: number | undefined;
38
+
39
+ /**
40
+ * The ad tag parameters that are used for this specific ad break.
41
+ * @remarks
42
+ * <br/> - The set values are combined and potentially override parameters set on the {@link TheoAdDescription.adTagParameters} or through {@link TheoAds.replaceAdTagParameters}.
43
+ */
44
+ adTagParameters: Record<string, string>;
38
45
  }
@@ -22,7 +22,7 @@ export interface HespLatencies {
22
22
  playerLatency?: number;
23
23
 
24
24
  /**
25
- * The total latency introduced by the theolive pipeline: from frame ingested till displayed on screen.
25
+ * The total latency introduced by the THEOlive pipeline: from frame ingested till displayed on screen.
26
26
  */
27
27
  theoliveLatency?: number
28
28
  }
@@ -40,7 +40,7 @@ export interface TheoLiveConfiguration {
40
40
  *
41
41
  * @remarks
42
42
  * <br/> - Available on iOS only.
43
- * <br/> - When enabled, theolive channels will be streamed using the legacy pipeline.
43
+ * <br/> - When enabled, THEOlive channels will be streamed using the legacy pipeline.
44
44
  *
45
45
  * @defaultValue `false`
46
46
  */
@@ -1,3 +1,5 @@
1
+ import { isArray } from '../../internal/utils/TypeUtils';
2
+
1
3
  /**
2
4
  * Represents a quality of a media track.
3
5
  *
@@ -80,6 +82,19 @@ export interface VideoQuality extends Quality {
80
82
  readonly firstFrame: number;
81
83
  }
82
84
 
85
+ export function isVideoQuality(qualities: Quality | Quality[] | undefined): qualities is VideoQuality {
86
+ if (!qualities) {
87
+ return false;
88
+ }
89
+
90
+ let quality = qualities;
91
+ if (isArray(qualities) && qualities.length > 0) {
92
+ quality = qualities[0];
93
+ }
94
+
95
+ return (quality as VideoQuality).height !== undefined;
96
+ }
97
+
83
98
  /**
84
99
  * Represents a quality of an audio track.
85
100
  *
@@ -28,6 +28,14 @@ export interface TextTrackStyle {
28
28
  */
29
29
  fontSize: string | undefined;
30
30
 
31
+ /**
32
+ * The path to a font in the Android `app/src/main/assets/` folder.
33
+ *
34
+ * @remarks
35
+ * Only supported on Android.
36
+ */
37
+ fontPath: string | undefined;
38
+
31
39
  /**
32
40
  * The background color for the text track.
33
41
  *
@@ -24,6 +24,7 @@ import {
24
24
  DefaultAirplayStateChangeEvent,
25
25
  DefaultChromecastChangeEvent,
26
26
  DefaultChromecastErrorEvent,
27
+ DefaultDimensionChangeEvent,
27
28
  DefaultDurationChangeEvent,
28
29
  DefaultErrorEvent,
29
30
  DefaultLoadedMetadataEvent,
@@ -41,6 +42,7 @@ import {
41
42
  DefaultResizeEvent,
42
43
  DefaultSeekingEvent,
43
44
  DefaultSeekedEvent,
45
+ DefaultVideoResizeEvent,
44
46
  } from './adapter/event/PlayerEvents';
45
47
  import type { NativeCastEvent } from './adapter/event/native/NativeCastEvent';
46
48
  import type {
@@ -62,9 +64,10 @@ import {
62
64
  NativeSegmentNotFoundEvent,
63
65
  NativeTimeUpdateEvent,
64
66
  NativeVolumeChangeEvent,
65
- NativeResizeEvent,
67
+ NativeDimensionChangeEvent,
66
68
  NativeSeekingEvent,
67
69
  NativeSeekedEvent,
70
+ NativeVideoResizeEvent,
68
71
  } from './adapter/event/native/NativePlayerEvent';
69
72
  import type { NativeAdEvent } from './adapter/event/native/NativeAdEvent';
70
73
  import { fromNativeTheoLiveEvent, NativeTheoLiveEvent } from './adapter/event/native/NativeTheoLiveEvent';
@@ -110,7 +113,8 @@ interface THEOplayerRCTViewProps {
110
113
  onNativeCastEvent: (event: NativeSyntheticEvent<NativeCastEvent>) => void;
111
114
  onNativePresentationModeChange: (event: NativeSyntheticEvent<NativePresentationModeChangeEvent>) => void;
112
115
  onNativeDeviceOrientationChanged: () => void;
113
- onNativeResize: (event: NativeSyntheticEvent<NativeResizeEvent>) => void;
116
+ onNativeDimensionChange: (event: NativeSyntheticEvent<NativeDimensionChangeEvent>) => void;
117
+ onNativeVideoResize: (event: NativeSyntheticEvent<NativeVideoResizeEvent>) => void;
114
118
  }
115
119
 
116
120
  interface THEOplayerRCTViewState {
@@ -151,6 +155,9 @@ export class THEOplayerView extends PureComponent<React.PropsWithChildren<THEOpl
151
155
  }
152
156
 
153
157
  componentWillUnmount() {
158
+ // Allow proper cleanup on the native player before destruction
159
+ this._facade.willUnmount();
160
+
154
161
  // Notify the player will be destroyed.
155
162
  const { onPlayerDestroy } = this.props;
156
163
  if (onPlayerDestroy) {
@@ -353,7 +360,7 @@ export class THEOplayerView extends PureComponent<React.PropsWithChildren<THEOpl
353
360
  };
354
361
 
355
362
  private _onTHEOadsEvent = (event: NativeSyntheticEvent<NativeTheoAdsEvent>) => {
356
- this._facade.dispatchEvent(fromNativeTheoAdsEvent(event));
363
+ this._facade.dispatchEvent(fromNativeTheoAdsEvent(this.nativeHandle, event));
357
364
  };
358
365
 
359
366
  private _onCastEvent = (event: NativeSyntheticEvent<NativeCastEvent>) => {
@@ -387,8 +394,15 @@ export class THEOplayerView extends PureComponent<React.PropsWithChildren<THEOpl
387
394
  );
388
395
  };
389
396
 
390
- private _onResize = (event: NativeSyntheticEvent<NativeResizeEvent>) => {
391
- this._facade.dispatchEvent(new DefaultResizeEvent(event.nativeEvent.width, event.nativeEvent.height));
397
+ private _onDimensionChange = (event: NativeSyntheticEvent<NativeDimensionChangeEvent>) => {
398
+ const width = event.nativeEvent.width;
399
+ const height = event.nativeEvent.height;
400
+ this._facade.dispatchEvent(new DefaultResizeEvent(width, height));
401
+ this._facade.dispatchEvent(new DefaultDimensionChangeEvent(width, height));
402
+ };
403
+
404
+ private _onVideoResize = (event: NativeSyntheticEvent<NativeVideoResizeEvent>) => {
405
+ this._facade.dispatchEvent(new DefaultVideoResizeEvent(event.nativeEvent.videoWidth, event.nativeEvent.videoHeight));
392
406
  };
393
407
 
394
408
  private _updatePoster = () => {
@@ -452,7 +466,8 @@ export class THEOplayerView extends PureComponent<React.PropsWithChildren<THEOpl
452
466
  onNativeCastEvent={this._onCastEvent}
453
467
  onNativePresentationModeChange={this._onPresentationModeChange}
454
468
  onNativeDeviceOrientationChanged={this._onDeviceOrientationChanged}
455
- onNativeResize={this._onResize}
469
+ onNativeDimensionChange={this._onDimensionChange}
470
+ onNativeVideoResize={this._onVideoResize}
456
471
  />
457
472
  {posterActive && <Poster uri={poster} style={posterStyle} />}
458
473
  {children}
@@ -4,7 +4,7 @@ import { ChromelessPlayer } from 'theoplayer';
4
4
  import { THEOplayerWebAdapter } from './adapter/THEOplayerWebAdapter';
5
5
 
6
6
  export function THEOplayerView(props: React.PropsWithChildren<THEOplayerViewProps>) {
7
- const { config, children } = props;
7
+ const { config, children, onPlayerReady, onPlayerDestroy } = props;
8
8
  const player = useRef<ChromelessPlayer | null>(null);
9
9
  const adapter = useRef<THEOplayerWebAdapter | null>(null);
10
10
  const container = useRef<null | HTMLDivElement>(null);
@@ -38,25 +38,24 @@ export function THEOplayerView(props: React.PropsWithChildren<THEOplayerViewProp
38
38
  window.nativePlayer = player;
39
39
 
40
40
  // Notify the player is ready
41
- props.onPlayerReady?.(adapter.current);
41
+ onPlayerReady?.(adapter.current);
42
42
  }
43
43
 
44
44
  // Clean-up
45
45
  return () => {
46
46
  // Notify the player will be destroyed.
47
- const { onPlayerDestroy } = props;
48
47
  if (adapter?.current && onPlayerDestroy) {
49
48
  onPlayerDestroy(adapter?.current);
50
49
  }
51
50
  adapter?.current?.destroy();
52
51
  };
53
- }, [container]);
52
+ }, [config, container, onPlayerReady, onPlayerDestroy]);
54
53
 
55
54
  return (
56
55
  // Note: `display: contents` causes an element's children to appear as if they were direct children of the element's parent,
57
56
  // ignoring the element itself.
58
57
  // It's necessary to make sure we do not interfere with the IMA container
59
- <div id={'theoplayer-root-container'} style={{ display: 'contents' }}>
58
+ <div id={'theoplayer-root-container'} style={{ display: CSS.supports('display', 'contents') ? 'contents' : 'flex' }}>
60
59
  {!CSS.supports('aspect-ratio', '16/9') ? (
61
60
  // Handle aspect-ratio 16/9 with padding-top: 56.25% to support older versions.
62
61
  // {@link https://www.w3schools.com/howto/howto_css_aspect_ratio.asp}
@@ -39,6 +39,8 @@ export class DefaultNativePlayerState extends DefaultTextTrackState implements N
39
39
  selectedVideoTrack: number | undefined = undefined;
40
40
  width: number | undefined = undefined;
41
41
  height: number | undefined = undefined;
42
+ videoWidth: number | undefined = undefined;
43
+ videoHeight: number | undefined = undefined;
42
44
 
43
45
  apply(state: Partial<NativePlayerState>): void {
44
46
  Object.assign(this, state);
@@ -33,6 +33,8 @@ export interface MediaTrackState {
33
33
  targetVideoQuality: number | number[] | undefined;
34
34
  selectedVideoTrack: number | undefined;
35
35
  selectedAudioTrack: number | undefined;
36
+ videoWidth: number | undefined;
37
+ videoHeight: number | undefined;
36
38
  }
37
39
 
38
40
  export interface TextTrackState {
@@ -1,46 +1,46 @@
1
1
  import { DefaultEventDispatcher } from './event/DefaultEventDispatcher';
2
2
  import {
3
3
  ABRConfiguration,
4
+ addTrack,
4
5
  AdsAPI,
6
+ AspectRatio,
7
+ BackgroundAudioConfiguration,
5
8
  CastAPI,
9
+ DimensionChangeEvent,
6
10
  DurationChangeEvent,
7
11
  EventBroadcastAPI,
12
+ findMediaTrackByUid,
13
+ isVideoQuality,
8
14
  LoadedMetadataEvent,
9
15
  MediaTrack,
10
16
  MediaTrackEvent,
17
+ MediaTrackEventType,
11
18
  MediaTrackListEvent,
19
+ MediaTrackType,
12
20
  NativeHandleType,
13
21
  PiPConfiguration,
14
22
  PlayerEventMap,
23
+ PlayerEventType,
24
+ PlayerVersion,
25
+ PreloadType,
26
+ PresentationMode,
15
27
  PresentationModeChangeEvent,
16
28
  ProgressEvent,
17
29
  RateChangeEvent,
30
+ removeTrack,
18
31
  RenderingTarget,
19
- ResizeEvent,
20
32
  SeekedEvent,
21
33
  SeekingEvent,
22
34
  SourceDescription,
23
35
  TextTrack,
36
+ TextTrackStyle,
24
37
  TheoAdsAPI,
25
38
  TheoLiveAPI,
26
39
  THEOplayer,
27
40
  THEOplayerView,
28
41
  TimeUpdateEvent,
29
- } from 'react-native-theoplayer';
30
- import {
31
- addTrack,
32
- AspectRatio,
33
- BackgroundAudioConfiguration,
34
- findMediaTrackByUid,
35
- MediaTrackEventType,
36
- MediaTrackType,
37
- PlayerEventType,
38
- PlayerVersion,
39
- PreloadType,
40
- PresentationMode,
41
- removeTrack,
42
- TextTrackStyle,
43
42
  TrackListEventType,
43
+ VideoResizeEvent,
44
44
  } from 'react-native-theoplayer';
45
45
  import { THEOplayerNativeAdsAdapter } from './ads/THEOplayerNativeAdsAdapter';
46
46
  import { THEOplayerNativeCastAdapter } from './cast/THEOplayerNativeCastAdapter';
@@ -90,7 +90,8 @@ export class THEOplayerAdapter extends DefaultEventDispatcher<PlayerEventMap> im
90
90
  this.addEventListener(PlayerEventType.MEDIA_TRACK, this.onMediaTrack);
91
91
  this.addEventListener(PlayerEventType.MEDIA_TRACK_LIST, this.onMediaTrackList);
92
92
  this.addEventListener(PlayerEventType.PRESENTATIONMODE_CHANGE, this.onPresentationModeChange);
93
- this.addEventListener(PlayerEventType.RESIZE, this.onResize);
93
+ this.addEventListener(PlayerEventType.DIMENSION_CHANGE, this.onDimensionChange);
94
+ this.addEventListener(PlayerEventType.VIDEO_RESIZE, this.onVideoResize);
94
95
  }
95
96
 
96
97
  private hasValidSource(): boolean {
@@ -117,11 +118,16 @@ export class THEOplayerAdapter extends DefaultEventDispatcher<PlayerEventMap> im
117
118
  this._state.currentProgramDateTime = event.currentProgramDateTime;
118
119
  };
119
120
 
120
- private onResize = (event: ResizeEvent) => {
121
+ private onDimensionChange = (event: DimensionChangeEvent) => {
121
122
  this._state.width = event.width;
122
123
  this._state.height = event.height;
123
124
  };
124
125
 
126
+ private onVideoResize = (event: VideoResizeEvent) => {
127
+ this._state.videoWidth = event.videoWidth;
128
+ this._state.videoHeight = event.videoHeight;
129
+ };
130
+
125
131
  private onLoadedMetadata = (event: LoadedMetadataEvent) => {
126
132
  this._state.duration = event.duration;
127
133
  this._state.audioTracks = event.audioTracks;
@@ -157,16 +163,24 @@ export class THEOplayerAdapter extends DefaultEventDispatcher<PlayerEventMap> im
157
163
  };
158
164
 
159
165
  private onMediaTrack = (event: MediaTrackEvent) => {
160
- const { subType, trackType, trackUid } = event;
166
+ const { subType, trackType, trackUid, qualities } = event;
161
167
  const tracks = trackType === MediaTrackType.VIDEO ? this._state.videoTracks : this._state.audioTracks;
162
168
  const track = findMediaTrackByUid(tracks, trackUid);
163
169
  switch (subType) {
164
170
  case MediaTrackEventType.ACTIVE_QUALITY_CHANGED:
171
+ if (!track) {
172
+ break;
173
+ }
174
+
165
175
  // Update local state
166
- if (track) {
167
- Object.assign(track, { ...track, activeQuality: event.qualities });
176
+ Object.assign(track, { ...track, activeQuality: qualities });
177
+
178
+ if (!isVideoQuality(qualities)) {
179
+ break;
168
180
  }
169
- break;
181
+
182
+ this._state.videoWidth = qualities.width;
183
+ this._state.videoHeight = qualities.height;
170
184
  }
171
185
  };
172
186
 
@@ -218,6 +232,10 @@ export class THEOplayerAdapter extends DefaultEventDispatcher<PlayerEventMap> im
218
232
  return this._theoAdsAdapter;
219
233
  }
220
234
 
235
+ get theoLive(): TheoLiveAPI {
236
+ return this._theoliveAdapter;
237
+ }
238
+
221
239
  get theolive(): TheoLiveAPI {
222
240
  return this._theoliveAdapter;
223
241
  }
@@ -524,4 +542,18 @@ export class THEOplayerAdapter extends DefaultEventDispatcher<PlayerEventMap> im
524
542
  get height(): number | undefined {
525
543
  return this._state.height;
526
544
  }
545
+
546
+ get videoWidth(): number | undefined {
547
+ return this._state.videoWidth;
548
+ }
549
+
550
+ get videoHeight(): number | undefined {
551
+ return this._state.videoHeight;
552
+ }
553
+
554
+ willUnmount(): void {
555
+ if (Platform.OS === 'ios') {
556
+ NativePlayerModule.willUnmount(this._view.nativeHandle);
557
+ }
558
+ }
527
559
  }
@@ -23,7 +23,7 @@ import {
23
23
  } from 'react-native-theoplayer';
24
24
  import { THEOplayerWebAdsAdapter } from './ads/THEOplayerWebAdsAdapter';
25
25
  import { THEOplayerWebCastAdapter } from './cast/THEOplayerWebCastAdapter';
26
- import type { MediaTrack as NativeMediaTrack, TextTrack as NativeTextTrack } from 'theoplayer';
26
+ import type { DimensionChangeEvent, MediaTrack as NativeMediaTrack, TextTrack as NativeTextTrack } from 'theoplayer';
27
27
  import { ChromelessPlayer as NativeChromelessPlayer, SourceDescription as NativeSourceDescription, version as nativeVersion } from 'theoplayer';
28
28
  import { findNativeQualitiesByUid, fromNativeMediaTrackList } from './web/TrackUtils';
29
29
  import type { ABRConfiguration, SourceDescription } from 'src/api/barrel';
@@ -62,6 +62,8 @@ export class THEOplayerWebAdapter extends DefaultEventDispatcher<PlayerEventMap>
62
62
  private _pipConfiguration: PiPConfiguration = defaultPipConfiguration;
63
63
  private _externalEventRouter: EventBroadcastAPI | undefined = undefined;
64
64
  private _cmcdConnector: CMCDConnector | undefined = undefined;
65
+ private _width: number | undefined = undefined;
66
+ private _height: number | undefined = undefined;
65
67
 
66
68
  constructor(player: NativeChromelessPlayer, config?: PlayerConfiguration) {
67
69
  super();
@@ -74,6 +76,7 @@ export class THEOplayerWebAdapter extends DefaultEventDispatcher<PlayerEventMap>
74
76
  this._eventForwarder = new WebEventForwarder(this._player, this);
75
77
  this._presentationModeManager = new WebPresentationModeManager(this._player, this);
76
78
  document.addEventListener('visibilitychange', this.onVisibilityChange);
79
+ this._player.addEventListener('dimensionchange', this.onPlayerDimensionChange);
77
80
 
78
81
  // Optionally create a media session connector
79
82
  if (config?.mediaControl?.mediaSessionEnabled !== false) {
@@ -367,6 +370,10 @@ export class THEOplayerWebAdapter extends DefaultEventDispatcher<PlayerEventMap>
367
370
  return this._castAdapter;
368
371
  }
369
372
 
373
+ public get theoLive(): TheoLiveAPI {
374
+ return this._theoliveAdapter;
375
+ }
376
+
370
377
  public get theolive(): TheoLiveAPI {
371
378
  return this._theoliveAdapter;
372
379
  }
@@ -387,6 +394,7 @@ export class THEOplayerWebAdapter extends DefaultEventDispatcher<PlayerEventMap>
387
394
  this._mediaSession = undefined;
388
395
  this._cmcdConnector?.destroy();
389
396
  this._cmcdConnector = undefined;
397
+ this._player?.removeEventListener('dimensionchange', this.onPlayerDimensionChange);
390
398
  this._player?.destroy();
391
399
  this._player = undefined;
392
400
  }
@@ -405,6 +413,14 @@ export class THEOplayerWebAdapter extends DefaultEventDispatcher<PlayerEventMap>
405
413
  this._mediaSession?.updateMediaSession();
406
414
  };
407
415
 
416
+ private readonly onPlayerDimensionChange = (event: DimensionChangeEvent) => {
417
+ if (!this._player) {
418
+ return;
419
+ }
420
+ this._width = event.width;
421
+ this._height = event.height;
422
+ };
423
+
408
424
  get nativeHandle(): NativeHandleType {
409
425
  return this._player;
410
426
  }
@@ -414,10 +430,18 @@ export class THEOplayerWebAdapter extends DefaultEventDispatcher<PlayerEventMap>
414
430
  }
415
431
 
416
432
  get width(): number | undefined {
417
- return this._player?.videoWidth;
433
+ return this._width;
418
434
  }
419
435
 
420
436
  get height(): number | undefined {
437
+ return this._height;
438
+ }
439
+
440
+ get videoWidth(): number | undefined {
441
+ return this._player?.videoWidth;
442
+ }
443
+
444
+ get videoHeight(): number | undefined {
421
445
  return this._player?.videoHeight;
422
446
  }
423
447
  }
@@ -43,6 +43,7 @@ import {
43
43
  DefaultAirplayStateChangeEvent,
44
44
  DefaultChromecastChangeEvent,
45
45
  DefaultChromecastErrorEvent,
46
+ DefaultDimensionChangeEvent,
46
47
  DefaultDurationChangeEvent,
47
48
  DefaultErrorEvent,
48
49
  DefaultLoadedMetadataEvent,
@@ -64,6 +65,7 @@ import {
64
65
  DefaultTheoLiveEvent,
65
66
  DefaultTheoLiveIntentToFallbackEvent,
66
67
  DefaultTimeupdateEvent,
68
+ DefaultVideoResizeEvent,
67
69
  DefaultVolumeChangeEvent,
68
70
  } from './event/PlayerEvents';
69
71
  import { fromNativeCue, fromNativeMediaTrack, fromNativeTextTrack } from './web/TrackUtils';
@@ -100,6 +102,7 @@ export class WebEventForwarder {
100
102
  this._player.addEventListener('segmentnotfound', this.onSegmentNotFound);
101
103
  this._player.addEventListener('volumechange', this.onVolumeChangeEvent);
102
104
  this._player.addEventListener('dimensionchange', this.onDimensionChange);
105
+ this._player.addEventListener('resize', this.onVideoResize);
103
106
 
104
107
  this._player.textTracks.addEventListener('addtrack', this.onAddTextTrack);
105
108
  this._player.textTracks.addEventListener('removetrack', this.onRemoveTextTrack);
@@ -147,6 +150,8 @@ export class WebEventForwarder {
147
150
  this._player.removeEventListener('ratechange', this.onPlaybackRateChange);
148
151
  this._player.removeEventListener('segmentnotfound', this.onSegmentNotFound);
149
152
  this._player.removeEventListener('volumechange', this.onVolumeChangeEvent);
153
+ this._player.removeEventListener('dimensionchange', this.onDimensionChange);
154
+ this._player.removeEventListener('resize', this.onVideoResize);
150
155
 
151
156
  this._player.textTracks.removeEventListener('addtrack', this.onAddTextTrack);
152
157
  this._player.textTracks.removeEventListener('removetrack', this.onRemoveTextTrack);
@@ -266,6 +271,11 @@ export class WebEventForwarder {
266
271
 
267
272
  private readonly onDimensionChange = (event: NativeDimensionChangeEvent) => {
268
273
  this._facade.dispatchEvent(new DefaultResizeEvent(event.width, event.height));
274
+ this._facade.dispatchEvent(new DefaultDimensionChangeEvent(event.width, event.height));
275
+ };
276
+
277
+ private readonly onVideoResize = (_event: NativeEvent<'resize'>) => {
278
+ this._facade.dispatchEvent(new DefaultVideoResizeEvent(this._player.videoWidth, this._player.videoHeight));
269
279
  };
270
280
 
271
281
  private readonly onAddTextTrack = (event: AddTrackEvent) => {
@@ -50,6 +50,8 @@ import {
50
50
  TheoLiveEndpoint,
51
51
  TheoLiveEndpointLoadedEvent,
52
52
  TheoLiveIntentToFallbackEvent,
53
+ DimensionChangeEvent,
54
+ VideoResizeEvent,
53
55
  } from 'react-native-theoplayer';
54
56
 
55
57
  export class DefaultLoadedMetadataEvent extends BaseEvent<PlayerEventType.LOADED_METADATA> implements LoadedMetadataEvent {
@@ -91,6 +93,9 @@ export class DefaultVolumeChangeEvent extends BaseEvent<PlayerEventType.VOLUME_C
91
93
  }
92
94
  }
93
95
 
96
+ /**
97
+ * @deprecated Use {@link DefaultDimensionChangeEvent} instead. This event is set for removal in version 11.
98
+ */
94
99
  export class DefaultResizeEvent extends BaseEvent<PlayerEventType.RESIZE> implements ResizeEvent {
95
100
  constructor(
96
101
  public width: number,
@@ -100,6 +105,24 @@ export class DefaultResizeEvent extends BaseEvent<PlayerEventType.RESIZE> implem
100
105
  }
101
106
  }
102
107
 
108
+ export class DefaultDimensionChangeEvent extends BaseEvent<PlayerEventType.DIMENSION_CHANGE> implements DimensionChangeEvent {
109
+ constructor(
110
+ public width: number,
111
+ public height: number,
112
+ ) {
113
+ super(PlayerEventType.DIMENSION_CHANGE);
114
+ }
115
+ }
116
+
117
+ export class DefaultVideoResizeEvent extends BaseEvent<PlayerEventType.VIDEO_RESIZE> implements VideoResizeEvent {
118
+ constructor(
119
+ public videoWidth: number,
120
+ public videoHeight: number,
121
+ ) {
122
+ super(PlayerEventType.VIDEO_RESIZE);
123
+ }
124
+ }
125
+
103
126
  export class DefaultErrorEvent extends BaseEvent<PlayerEventType.ERROR> implements ErrorEvent {
104
127
  constructor(public error: PlayerError) {
105
128
  super(PlayerEventType.ERROR);