react-native-theoplayer 1.7.0 → 1.7.2

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 (40) hide show
  1. package/android/build.gradle +7 -9
  2. package/android/src/main/java/com/theoplayer/VideoEventEmitter.java +148 -12
  3. package/android/src/main/java/com/theoplayer/drm/ContentProtectionModule.kt +4 -0
  4. package/android/src/main/java/com/theoplayer/track/MediaTrackEventType.java +11 -0
  5. package/android/src/main/java/com/theoplayer/track/MediaTrackType.java +11 -0
  6. package/android/src/main/java/com/theoplayer/track/TrackEventType.java +2 -1
  7. package/android/src/main/java/com/theoplayer/track/TrackListInfo.java +123 -101
  8. package/ios/THEOplayerRCTAdAggregator.swift +3 -0
  9. package/ios/THEOplayerRCTBridge.m +2 -0
  10. package/ios/THEOplayerRCTMetadataAggregator.swift +59 -45
  11. package/ios/THEOplayerRCTTrackEventTypes.swift +17 -0
  12. package/ios/THEOplayerRCTView.swift +27 -3
  13. package/ios/THEOplayerRCTViewAdEventHandler.swift +7 -5
  14. package/ios/THEOplayerRCTViewMediaTrackEventHandler.swift +185 -0
  15. package/ios/THEOplayerRCTViewTextTrackEventHandler.swift +26 -9
  16. package/lib/commonjs/api/THEOplayerView.js.map +1 -1
  17. package/lib/commonjs/api/event/TrackEvent.js +17 -1
  18. package/lib/commonjs/api/event/TrackEvent.js.map +1 -1
  19. package/lib/commonjs/internal/THEOplayerView.js +14 -0
  20. package/lib/commonjs/internal/THEOplayerView.js.map +1 -1
  21. package/lib/commonjs/internal/THEOplayerView.web.js +71 -20
  22. package/lib/commonjs/internal/THEOplayerView.web.js.map +1 -1
  23. package/lib/module/api/THEOplayerView.js.map +1 -1
  24. package/lib/module/api/event/TrackEvent.js +14 -0
  25. package/lib/module/api/event/TrackEvent.js.map +1 -1
  26. package/lib/module/internal/THEOplayerView.js +14 -0
  27. package/lib/module/internal/THEOplayerView.js.map +1 -1
  28. package/lib/module/internal/THEOplayerView.web.js +72 -21
  29. package/lib/module/internal/THEOplayerView.web.js.map +1 -1
  30. package/lib/typescript/lib/commonjs/api/event/TrackEvent.d.ts +4 -0
  31. package/lib/typescript/lib/module/api/event/TrackEvent.d.ts +2 -0
  32. package/lib/typescript/src/api/THEOplayerView.d.ts +11 -3
  33. package/lib/typescript/src/api/event/TrackEvent.d.ts +49 -3
  34. package/lib/typescript/src/internal/THEOplayerView.d.ts +5 -1
  35. package/lib/typescript/src/internal/THEOplayerView.web.d.ts +4 -1
  36. package/package.json +1 -1
  37. package/src/api/THEOplayerView.ts +13 -3
  38. package/src/api/event/TrackEvent.ts +58 -2
  39. package/src/internal/THEOplayerView.tsx +18 -0
  40. package/src/internal/THEOplayerView.web.tsx +80 -19
@@ -1,14 +1,12 @@
1
1
  buildscript {
2
- if (project == rootProject) {
3
- repositories {
4
- google()
5
- mavenCentral()
6
- }
2
+ repositories {
3
+ google()
4
+ mavenCentral()
5
+ }
7
6
 
8
- dependencies {
9
- classpath 'com.android.tools.build:gradle:4.2.2'
10
- classpath 'org.jetbrains.kotlin:kotlin-gradle-plugin:1.7.10'
11
- }
7
+ dependencies {
8
+ classpath 'com.android.tools.build:gradle:4.2.2'
9
+ classpath 'org.jetbrains.kotlin:kotlin-gradle-plugin:1.7.10'
12
10
  }
13
11
  }
14
12
 
@@ -42,19 +42,31 @@ import com.theoplayer.android.api.event.player.SeekedEvent;
42
42
  import com.theoplayer.android.api.event.player.SeekingEvent;
43
43
  import com.theoplayer.android.api.event.player.SegmentNotFoundEvent;
44
44
  import com.theoplayer.android.api.event.player.TimeUpdateEvent;
45
+ import com.theoplayer.android.api.event.track.mediatrack.audio.ActiveQualityChangedEvent;
46
+ import com.theoplayer.android.api.event.track.mediatrack.audio.AudioTrackEventTypes;
47
+ import com.theoplayer.android.api.event.track.mediatrack.audio.QualityChangedEvent;
48
+ import com.theoplayer.android.api.event.track.mediatrack.audio.list.AudioTrackListEventTypes;
49
+ import com.theoplayer.android.api.event.track.mediatrack.video.VideoTrackEventTypes;
50
+ import com.theoplayer.android.api.event.track.mediatrack.video.list.VideoTrackListEventTypes;
45
51
  import com.theoplayer.android.api.event.track.texttrack.AddCueEvent;
46
52
  import com.theoplayer.android.api.event.track.texttrack.RemoveCueEvent;
47
53
  import com.theoplayer.android.api.event.track.texttrack.TextTrackEventTypes;
48
54
  import com.theoplayer.android.api.event.track.texttrack.list.AddTrackEvent;
49
55
  import com.theoplayer.android.api.event.track.texttrack.list.RemoveTrackEvent;
50
56
  import com.theoplayer.android.api.event.track.texttrack.list.TextTrackListEventTypes;
57
+ import com.theoplayer.android.api.event.track.texttrack.list.TrackListChangeEvent;
51
58
  import com.theoplayer.android.api.player.Player;
52
59
  import com.theoplayer.android.api.player.track.mediatrack.MediaTrack;
60
+ import com.theoplayer.android.api.player.track.mediatrack.MediaTrackList;
53
61
  import com.theoplayer.android.api.player.track.mediatrack.quality.AudioQuality;
62
+ import com.theoplayer.android.api.player.track.mediatrack.quality.Quality;
54
63
  import com.theoplayer.android.api.player.track.mediatrack.quality.VideoQuality;
55
64
  import com.theoplayer.android.api.player.track.texttrack.TextTrack;
65
+ import com.theoplayer.track.MediaTrackEventType;
66
+ import com.theoplayer.track.MediaTrackType;
56
67
  import com.theoplayer.track.TextTrackCueEventType;
57
68
  import com.theoplayer.track.TrackEventType;
69
+ import com.theoplayer.track.TrackListInfo;
58
70
  import com.theoplayer.util.TypeUtils;
59
71
 
60
72
  import java.lang.annotation.Retention;
@@ -84,6 +96,8 @@ public class VideoEventEmitter {
84
96
  private static final String EVENT_SEGMENTNOTFOUND = "onNativeSegmentNotFound";
85
97
  private static final String EVENT_TEXTTRACK_LIST_EVENT = "onNativeTextTrackListEvent";
86
98
  private static final String EVENT_TEXTTRACK_EVENT = "onNativeTextTrackEvent";
99
+ private static final String EVENT_MEDIATRACK_LIST_EVENT = "onNativeMediaTrackListEvent";
100
+ private static final String EVENT_MEDIATRACK_EVENT = "onNativeMediaTrackEvent";
87
101
  private static final String EVENT_AD_EVENT = "onNativeAdEvent";
88
102
  private static final String EVENT_FULLSCREEN_WILL_PRESENT = "onNativeFullscreenPlayerWillPresent";
89
103
  private static final String EVENT_FULLSCREEN_DID_PRESENT = "onNativeFullscreenPlayerDidPresent";
@@ -111,6 +125,8 @@ public class VideoEventEmitter {
111
125
  EVENT_SEGMENTNOTFOUND,
112
126
  EVENT_TEXTTRACK_LIST_EVENT,
113
127
  EVENT_TEXTTRACK_EVENT,
128
+ EVENT_MEDIATRACK_LIST_EVENT,
129
+ EVENT_MEDIATRACK_EVENT,
114
130
  EVENT_AD_EVENT,
115
131
  EVENT_FULLSCREEN_WILL_PRESENT,
116
132
  EVENT_FULLSCREEN_DID_PRESENT,
@@ -138,6 +154,8 @@ public class VideoEventEmitter {
138
154
  EVENT_SEGMENTNOTFOUND,
139
155
  EVENT_TEXTTRACK_LIST_EVENT,
140
156
  EVENT_TEXTTRACK_EVENT,
157
+ EVENT_MEDIATRACK_LIST_EVENT,
158
+ EVENT_MEDIATRACK_EVENT,
141
159
  EVENT_AD_EVENT,
142
160
  EVENT_FULLSCREEN_WILL_PRESENT,
143
161
  EVENT_FULLSCREEN_DID_PRESENT,
@@ -167,13 +185,17 @@ public class VideoEventEmitter {
167
185
  private static final String EVENT_PROP_SEGMENTSTARTTIME = "segmentStartTime";
168
186
  private static final String EVENT_PROP_TRACK = "track";
169
187
  private static final String EVENT_PROP_TRACK_UID = "trackUid";
188
+ private static final String EVENT_PROP_TRACK_TYPE = "trackType";
170
189
  private static final String EVENT_PROP_CUE = "cue";
171
190
  private static final String EVENT_PROP_TYPE = "type";
191
+ private static final String EVENT_PROP_QUALITIES = "qualities";
172
192
 
173
193
  private final RCTEventEmitter eventEmitter;
174
194
  private int viewId = View.NO_ID;
175
195
  private final HashMap<EventType, EventListener> playerListeners = new HashMap<>();
176
196
  private final HashMap<EventType, EventListener> textTrackListeners = new HashMap<>();
197
+ private final HashMap<EventType, EventListener> audioTrackListeners = new HashMap<>();
198
+ private final HashMap<EventType, EventListener> videoTrackListeners = new HashMap<>();
177
199
  private final ReactTHEOplayerView playerView;
178
200
 
179
201
  private AdEventAdapter adEventAdapter;
@@ -204,6 +226,13 @@ public class VideoEventEmitter {
204
226
 
205
227
  textTrackListeners.put(TextTrackListEventTypes.ADDTRACK, (EventListener<AddTrackEvent>) this::onTextTrackAdd);
206
228
  textTrackListeners.put(TextTrackListEventTypes.REMOVETRACK, (EventListener<RemoveTrackEvent>) this::onTextTrackRemove);
229
+ textTrackListeners.put(TextTrackListEventTypes.TRACKLISTCHANGE, (EventListener<TrackListChangeEvent>) this::onTextTrackChange);
230
+ audioTrackListeners.put(AudioTrackListEventTypes.ADDTRACK, (EventListener<com.theoplayer.android.api.event.track.mediatrack.audio.list.AddTrackEvent>) this::onAudioTrackAdd);
231
+ audioTrackListeners.put(AudioTrackListEventTypes.REMOVETRACK, (EventListener<com.theoplayer.android.api.event.track.mediatrack.audio.list.RemoveTrackEvent>) this::onAudioTrackRemove);
232
+ audioTrackListeners.put(AudioTrackListEventTypes.TRACKLISTCHANGE, (EventListener<com.theoplayer.android.api.event.track.mediatrack.audio.list.TrackListChangeEvent>) this::onAudioTrackChange);
233
+ videoTrackListeners.put(VideoTrackListEventTypes.ADDTRACK, (EventListener<com.theoplayer.android.api.event.track.mediatrack.video.list.AddTrackEvent>) this::onVideoTrackAdd);
234
+ videoTrackListeners.put(VideoTrackListEventTypes.REMOVETRACK, (EventListener<com.theoplayer.android.api.event.track.mediatrack.video.list.RemoveTrackEvent>) this::onVideoTrackRemove);
235
+ videoTrackListeners.put(VideoTrackListEventTypes.TRACKLISTCHANGE, (EventListener<com.theoplayer.android.api.event.track.mediatrack.video.list.TrackListChangeEvent>) this::onVideoTrackChange);
207
236
  }
208
237
 
209
238
  public void setViewId(int viewId) {
@@ -345,24 +374,33 @@ public class VideoEventEmitter {
345
374
  receiveEvent(EVENT_SEGMENTNOTFOUND, payload);
346
375
  }
347
376
 
348
- private void onTextTrackAdd(@NonNull AddTrackEvent event) {
377
+ private void dispatchTextTrackEvent(TrackEventType eventType, TextTrack textTrack) {
349
378
  WritableMap payload = Arguments.createMap();
350
- TextTrack textTrack = event.getTrack();
351
379
  payload.putMap(EVENT_PROP_TRACK, playerView.getTextTrackInfo(textTrack));
352
- payload.putInt(EVENT_PROP_TYPE, TrackEventType.ADD_TRACK.type);
353
- textTrack.addEventListener(TextTrackEventTypes.ADDCUE, this::onTextTrackAddCue);
354
- textTrack.addEventListener(TextTrackEventTypes.REMOVECUE, this::onTextTrackRemoveCue);
380
+ payload.putInt(EVENT_PROP_TYPE, eventType.type);
381
+ switch (eventType) {
382
+ case ADD_TRACK:
383
+ textTrack.addEventListener(TextTrackEventTypes.ADDCUE, this::onTextTrackAddCue);
384
+ textTrack.addEventListener(TextTrackEventTypes.REMOVECUE, this::onTextTrackRemoveCue);
385
+ break;
386
+ case REMOVE_TRACK:
387
+ textTrack.removeEventListener(TextTrackEventTypes.ADDCUE, this::onTextTrackAddCue);
388
+ textTrack.removeEventListener(TextTrackEventTypes.REMOVECUE, this::onTextTrackRemoveCue);
389
+ break;
390
+ }
355
391
  receiveEvent(EVENT_TEXTTRACK_LIST_EVENT, payload);
356
392
  }
357
393
 
394
+ private void onTextTrackAdd(@NonNull AddTrackEvent event) {
395
+ dispatchTextTrackEvent(TrackEventType.ADD_TRACK, event.getTrack());
396
+ }
397
+
358
398
  private void onTextTrackRemove(@NonNull RemoveTrackEvent event) {
359
- WritableMap payload = Arguments.createMap();
360
- TextTrack textTrack = event.getTrack();
361
- payload.putMap(EVENT_PROP_TRACK, playerView.getTextTrackInfo(textTrack));
362
- payload.putInt(EVENT_PROP_TYPE, TrackEventType.REMOVE_TRACK.type);
363
- textTrack.removeEventListener(TextTrackEventTypes.ADDCUE, this::onTextTrackAddCue);
364
- textTrack.removeEventListener(TextTrackEventTypes.REMOVECUE, this::onTextTrackRemoveCue);
365
- receiveEvent(EVENT_TEXTTRACK_LIST_EVENT, payload);
399
+ dispatchTextTrackEvent(TrackEventType.REMOVE_TRACK, event.getTrack());
400
+ }
401
+
402
+ private void onTextTrackChange(@NonNull TrackListChangeEvent event) {
403
+ dispatchTextTrackEvent(TrackEventType.CHANGE_TRACK, event.getTrack());
366
404
  }
367
405
 
368
406
  private void onTextTrackAddCue(@NonNull AddCueEvent event) {
@@ -381,6 +419,84 @@ public class VideoEventEmitter {
381
419
  receiveEvent(EVENT_TEXTTRACK_EVENT, payload);
382
420
  }
383
421
 
422
+ private MediaTrack<AudioQuality> activeAudioTrack() {
423
+ return playerView.getPlayer() != null ? activeTrack(playerView.getPlayer().getAudioTracks()) : null;
424
+ }
425
+
426
+ private MediaTrack<VideoQuality> activeVideoTrack() {
427
+ return playerView.getPlayer() != null ? activeTrack(playerView.getPlayer().getVideoTracks()) : null;
428
+ }
429
+
430
+ private <T extends Quality> MediaTrack<T> activeTrack(final MediaTrackList<T> tracks) {
431
+ for (int i = 0; i < tracks.length(); i++) {
432
+ MediaTrack<T> track = tracks.getItem(i);
433
+ if (track.isEnabled()) {
434
+ return track;
435
+ }
436
+ }
437
+ return null;
438
+ }
439
+
440
+ private void onActiveQualityChanged(@NonNull QualityChangedEvent event) {
441
+ Quality quality = event.getQuality();
442
+ MediaTrackType trackType = quality instanceof AudioQuality ? MediaTrackType.AUDIO : MediaTrackType.VIDEO;
443
+ WritableMap payload = Arguments.createMap();
444
+ payload.putInt(EVENT_PROP_TYPE, MediaTrackEventType.ACTIVE_QUALITY_CHANGED.type);
445
+ payload.putInt(EVENT_PROP_TRACK_TYPE, trackType.type);
446
+ MediaTrack<? extends Quality> activeTrack = (trackType == MediaTrackType.AUDIO) ? activeAudioTrack() : activeVideoTrack();
447
+ if (activeTrack != null) {
448
+ payload.putInt(EVENT_PROP_TRACK_UID, activeTrack.getUid());
449
+ }
450
+ WritableArray qualities = Arguments.createArray();
451
+ qualities.pushMap(TrackListInfo.fromQuality(quality));
452
+ payload.putArray(EVENT_PROP_QUALITIES, qualities);
453
+ receiveEvent(EVENT_MEDIATRACK_EVENT, payload);
454
+ }
455
+
456
+ private <Q extends Quality> void dispatchMediaTrackEvent(TrackEventType eventType, MediaTrackType trackType, MediaTrack<Q> track) {
457
+ WritableMap payload = Arguments.createMap();
458
+ payload.putInt(EVENT_PROP_TYPE, eventType.type);
459
+ payload.putInt(EVENT_PROP_TRACK_TYPE, trackType.type);
460
+ payload.putMap(EVENT_PROP_TRACK, TrackListInfo.fromMediaTrack(track, trackType));
461
+ EventType<QualityChangedEvent<Q, ActiveQualityChangedEvent>> qualityChangedEventType =
462
+ (EventType<QualityChangedEvent<Q, ActiveQualityChangedEvent>>) (trackType == MediaTrackType.AUDIO ?
463
+ AudioTrackEventTypes.ACTIVEQUALITYCHANGEDEVENT : VideoTrackEventTypes.ACTIVEQUALITYCHANGEDEVENT);
464
+
465
+ switch (eventType) {
466
+ case ADD_TRACK:
467
+ track.addEventListener(qualityChangedEventType, this::onActiveQualityChanged);
468
+ break;
469
+ case REMOVE_TRACK:
470
+ track.removeEventListener(qualityChangedEventType, this::onActiveQualityChanged);
471
+ break;
472
+ }
473
+ receiveEvent(EVENT_MEDIATRACK_LIST_EVENT, payload);
474
+ }
475
+
476
+ private void onAudioTrackAdd(@NonNull com.theoplayer.android.api.event.track.mediatrack.audio.list.AddTrackEvent event) {
477
+ dispatchMediaTrackEvent(TrackEventType.ADD_TRACK, MediaTrackType.AUDIO, event.getTrack());
478
+ }
479
+
480
+ private void onVideoTrackAdd(@NonNull com.theoplayer.android.api.event.track.mediatrack.video.list.AddTrackEvent event) {
481
+ dispatchMediaTrackEvent(TrackEventType.ADD_TRACK, MediaTrackType.VIDEO, event.getTrack());
482
+ }
483
+
484
+ private void onAudioTrackRemove(@NonNull com.theoplayer.android.api.event.track.mediatrack.audio.list.RemoveTrackEvent event) {
485
+ dispatchMediaTrackEvent(TrackEventType.REMOVE_TRACK, MediaTrackType.AUDIO, event.getTrack());
486
+ }
487
+
488
+ private void onVideoTrackRemove(@NonNull com.theoplayer.android.api.event.track.mediatrack.video.list.RemoveTrackEvent event) {
489
+ dispatchMediaTrackEvent(TrackEventType.REMOVE_TRACK, MediaTrackType.VIDEO, event.getTrack());
490
+ }
491
+
492
+ private void onAudioTrackChange(@NonNull com.theoplayer.android.api.event.track.mediatrack.audio.list.TrackListChangeEvent event) {
493
+ dispatchMediaTrackEvent(TrackEventType.CHANGE_TRACK, MediaTrackType.AUDIO, event.getTrack());
494
+ }
495
+
496
+ private void onVideoTrackChange(@NonNull com.theoplayer.android.api.event.track.mediatrack.video.list.TrackListChangeEvent event) {
497
+ dispatchMediaTrackEvent(TrackEventType.CHANGE_TRACK, MediaTrackType.VIDEO, event.getTrack());
498
+ }
499
+
384
500
  public void onFullscreenWillPresent() {
385
501
  receiveEvent(EVENT_FULLSCREEN_WILL_PRESENT, null);
386
502
  }
@@ -418,6 +534,16 @@ public class VideoEventEmitter {
418
534
  player.getTextTracks().addEventListener(entry.getKey(), entry.getValue());
419
535
  }
420
536
 
537
+ // Attach audio track listeners
538
+ for (Map.Entry<EventType, EventListener> entry : audioTrackListeners.entrySet()) {
539
+ player.getAudioTracks().addEventListener(entry.getKey(), entry.getValue());
540
+ }
541
+
542
+ // Attach video track listeners
543
+ for (Map.Entry<EventType, EventListener> entry : videoTrackListeners.entrySet()) {
544
+ player.getVideoTracks().addEventListener(entry.getKey(), entry.getValue());
545
+ }
546
+
421
547
  // Attach AdStateHolder
422
548
  if (BuildConfig.EXTENSION_ADS) {
423
549
  adEventAdapter = new AdEventAdapter(playerView.getAdsApi(), payload -> receiveEvent(EVENT_AD_EVENT, payload));
@@ -435,6 +561,16 @@ public class VideoEventEmitter {
435
561
  player.getTextTracks().removeEventListener(entry.getKey(), entry.getValue());
436
562
  }
437
563
 
564
+ // Remove audio track listeners
565
+ for (Map.Entry<EventType, EventListener> entry : audioTrackListeners.entrySet()) {
566
+ player.getAudioTracks().removeEventListener(entry.getKey(), entry.getValue());
567
+ }
568
+
569
+ // Remove video track listeners
570
+ for (Map.Entry<EventType, EventListener> entry : videoTrackListeners.entrySet()) {
571
+ player.getVideoTracks().removeEventListener(entry.getKey(), entry.getValue());
572
+ }
573
+
438
574
  if (adEventAdapter != null) {
439
575
  adEventAdapter.destroy();
440
576
  }
@@ -56,6 +56,10 @@ class ContentProtectionModule(private val context: ReactApplicationContext) :
56
56
  fun registerContentProtectionIntegration(integrationId: String, keySystemIdStr: String) {
57
57
  val keySystemId = KeySystemAdapter.fromString(keySystemIdStr)
58
58
  if (keySystemId != null) {
59
+ // We only support Widevine currently.
60
+ if (keySystemId != KeySystemId.WIDEVINE) {
61
+ return
62
+ }
59
63
  handler.post {
60
64
  val factory = ProxyContentProtectionIntegrationFactory(integrationId, keySystemId, this)
61
65
  THEOplayerGlobal.getSharedInstance(context.applicationContext)
@@ -0,0 +1,11 @@
1
+ package com.theoplayer.track;
2
+
3
+ public enum MediaTrackEventType {
4
+ ACTIVE_QUALITY_CHANGED(0),
5
+ TARGET_QUALITY_CHANGED(1);
6
+
7
+ public final int type;
8
+ MediaTrackEventType(int type) {
9
+ this.type = type;
10
+ }
11
+ }
@@ -0,0 +1,11 @@
1
+ package com.theoplayer.track;
2
+
3
+ public enum MediaTrackType {
4
+ AUDIO(0),
5
+ VIDEO(1);
6
+
7
+ public final int type;
8
+ MediaTrackType(int type) {
9
+ this.type = type;
10
+ }
11
+ }
@@ -2,7 +2,8 @@ package com.theoplayer.track;
2
2
 
3
3
  public enum TrackEventType {
4
4
  ADD_TRACK(0),
5
- REMOVE_TRACK(1);
5
+ REMOVE_TRACK(1),
6
+ CHANGE_TRACK(2);
6
7
 
7
8
  public final int type;
8
9
  TrackEventType(int type) {
@@ -8,6 +8,7 @@ import com.facebook.react.bridge.WritableMap;
8
8
  import com.theoplayer.android.api.player.track.mediatrack.MediaTrack;
9
9
  import com.theoplayer.android.api.player.track.mediatrack.MediaTrackList;
10
10
  import com.theoplayer.android.api.player.track.mediatrack.quality.AudioQuality;
11
+ import com.theoplayer.android.api.player.track.mediatrack.quality.Quality;
11
12
  import com.theoplayer.android.api.player.track.mediatrack.quality.QualityList;
12
13
  import com.theoplayer.android.api.player.track.mediatrack.quality.VideoQuality;
13
14
  import com.theoplayer.android.api.player.track.texttrack.TextTrack;
@@ -90,122 +91,143 @@ public class TrackListInfo {
90
91
  return cuePayload;
91
92
  }
92
93
 
94
+ static public WritableMap fromQuality(@NonNull final Quality quality) {
95
+ return quality instanceof AudioQuality ? fromAudioQuality((AudioQuality)quality) : fromVideoQuality((VideoQuality) quality);
96
+ }
97
+
98
+ static public WritableMap fromAudioQuality(@NonNull final AudioQuality quality) {
99
+ WritableMap audioQualityPayload = Arguments.createMap();
100
+ audioQualityPayload.putString(PROP_ID, quality.getId());
101
+ audioQualityPayload.putInt(PROP_UID, quality.getUid());
102
+ audioQualityPayload.putString(PROP_CODECS, quality.getCodecs());
103
+ audioQualityPayload.putString(PROP_NAME, quality.getName());
104
+ audioQualityPayload.putDouble(PROP_BANDWIDTH, quality.getBandwidth());
105
+ audioQualityPayload.putDouble(PROP_AUDIO_SAMPLING_RATE, quality.getAudioSamplingRate());
106
+ return audioQualityPayload;
107
+ }
108
+
109
+ static public <Q extends Quality> WritableMap fromMediaTrack(@NonNull final MediaTrack<Q> track,
110
+ MediaTrackType trackType) {
111
+ //noinspection unchecked
112
+ return trackType == MediaTrackType.AUDIO ?
113
+ fromAudioTrack((MediaTrack<AudioQuality>)track) :
114
+ fromVideoTrack((MediaTrack<VideoQuality>)track);
115
+ }
116
+
117
+ static public WritableMap fromAudioTrack(@NonNull final MediaTrack<AudioQuality> audioTrack) {
118
+ WritableMap audioTrackPayload = Arguments.createMap();
119
+ audioTrackPayload.putString(PROP_ID, audioTrack.getId());
120
+ audioTrackPayload.putInt(PROP_UID, audioTrack.getUid());
121
+ audioTrackPayload.putString(PROP_KIND, audioTrack.getKind());
122
+ audioTrackPayload.putString(PROP_LABEL, audioTrack.getLabel());
123
+ audioTrackPayload.putString(PROP_LANGUAGE, audioTrack.getLanguage());
124
+
125
+ final QualityList<AudioQuality> qualityList = audioTrack.getQualities();
126
+ WritableArray qualities = Arguments.createArray();
127
+ if (qualityList != null) {
128
+ for (int j = 0; j < qualityList.length(); j++) {
129
+ qualities.pushMap(fromAudioQuality(qualityList.getItem(j)));
130
+ }
131
+ }
132
+ audioTrackPayload.putArray(PROP_QUALITIES, qualities);
133
+
134
+ final QualityList<AudioQuality> targetQualityList = audioTrack.getTargetQualities();
135
+ WritableArray targetQualities = Arguments.createArray();
136
+ if (targetQualityList != null) {
137
+ for (int j = 0; j < targetQualityList.length(); j++) {
138
+ final AudioQuality quality = targetQualityList.getItem(j);
139
+ WritableMap audioQualityPayload = Arguments.createMap();
140
+ audioQualityPayload.putInt(PROP_UID, quality.getUid());
141
+ targetQualities.pushMap(audioQualityPayload);
142
+ }
143
+ }
144
+ final AudioQuality activeQuality = audioTrack.getActiveQuality();
145
+ if (activeQuality != null) {
146
+ audioTrackPayload.putInt(PROP_ACTIVE_QUALITY, activeQuality.getUid());
147
+ }
148
+ final AudioQuality targetQuality = audioTrack.getTargetQuality();
149
+ if (targetQuality != null) {
150
+ audioTrackPayload.putInt(PROP_TARGET_QUALITY, targetQuality.getUid());
151
+ }
152
+ return audioTrackPayload;
153
+ }
154
+
93
155
  @NonNull
94
156
  public static WritableArray fromAudioTrackList(@NonNull final MediaTrackList<AudioQuality> audioTrackList) {
95
157
  WritableArray audioTracks = Arguments.createArray();
96
158
  for (int i = 0; i < audioTrackList.length(); i++) {
97
- final MediaTrack<AudioQuality> audioTrack = audioTrackList.getItem(i);
98
- WritableMap audioTrackPayload = Arguments.createMap();
99
- audioTrackPayload.putString(PROP_ID, audioTrack.getId());
100
- audioTrackPayload.putInt(PROP_UID, audioTrack.getUid());
101
- audioTrackPayload.putString(PROP_KIND, audioTrack.getKind());
102
- audioTrackPayload.putString(PROP_LABEL, audioTrack.getLabel());
103
- audioTrackPayload.putString(PROP_LANGUAGE, audioTrack.getLanguage());
104
-
105
- final QualityList<AudioQuality> qualityList = audioTrack.getQualities();
106
- WritableArray qualities = Arguments.createArray();
107
- if (qualityList != null) {
108
- for (int j = 0; j < qualityList.length(); j++) {
109
- final AudioQuality audioQuality = qualityList.getItem(j);
110
- WritableMap audioQualityPayload = Arguments.createMap();
111
- audioQualityPayload.putString(PROP_ID, audioQuality.getId());
112
- audioQualityPayload.putInt(PROP_UID, audioQuality.getUid());
113
- audioQualityPayload.putString(PROP_CODECS, audioQuality.getCodecs());
114
- audioQualityPayload.putString(PROP_NAME, audioQuality.getName());
115
- audioQualityPayload.putDouble(PROP_BANDWIDTH, audioQuality.getBandwidth());
116
- audioQualityPayload.putDouble(PROP_AUDIO_SAMPLING_RATE, audioQuality.getAudioSamplingRate());
117
- qualities.pushMap(audioQualityPayload);
118
- }
119
- }
120
- audioTrackPayload.putArray(PROP_QUALITIES, qualities);
121
-
122
- final QualityList<AudioQuality> targetQualityList = audioTrack.getTargetQualities();
123
- WritableArray targetQualities = Arguments.createArray();
124
- if (targetQualityList != null) {
125
- for (int j = 0; j < targetQualityList.length(); j++) {
126
- final AudioQuality quality = targetQualityList.getItem(j);
127
- WritableMap audioQualityPayload = Arguments.createMap();
128
- audioQualityPayload.putInt(PROP_UID, quality.getUid());
129
- targetQualities.pushMap(audioQualityPayload);
130
- }
131
- }
159
+ audioTracks.pushMap(fromAudioTrack(audioTrackList.getItem(i)));
160
+ }
161
+ return audioTracks;
162
+ }
132
163
 
133
- final AudioQuality activeQuality = audioTrack.getActiveQuality();
134
- if (activeQuality != null) {
135
- audioTrackPayload.putInt(PROP_ACTIVE_QUALITY, activeQuality.getUid());
136
- }
164
+ static public WritableMap fromVideoQuality(@NonNull final VideoQuality quality) {
165
+ WritableMap videoQualityPayload = Arguments.createMap();
166
+ videoQualityPayload.putString(PROP_ID, quality.getId());
167
+ videoQualityPayload.putInt(PROP_UID, quality.getUid());
168
+ videoQualityPayload.putString(PROP_CODECS, quality.getCodecs());
169
+ videoQualityPayload.putString(PROP_NAME, quality.getName());
170
+ videoQualityPayload.putDouble(PROP_BANDWIDTH, quality.getBandwidth());
171
+ videoQualityPayload.putDouble(PROP_WIDTH, quality.getWidth());
172
+ videoQualityPayload.putDouble(PROP_HEIGHT, quality.getHeight());
173
+ videoQualityPayload.putDouble(PROP_FRAMERATE, quality.getFrameRate());
174
+ return videoQualityPayload;
175
+ }
137
176
 
138
- final AudioQuality targetQuality = audioTrack.getTargetQuality();
139
- if (targetQuality != null) {
140
- audioTrackPayload.putInt(PROP_TARGET_QUALITY, targetQuality.getUid());
177
+ static public WritableMap fromVideoTrack(@NonNull final MediaTrack<VideoQuality> videoTrack) {
178
+ WritableMap videoTrackPayload = Arguments.createMap();
179
+ videoTrackPayload.putString(PROP_ID, videoTrack.getId());
180
+ videoTrackPayload.putInt(PROP_UID, videoTrack.getUid());
181
+ videoTrackPayload.putString(PROP_KIND, videoTrack.getKind());
182
+ videoTrackPayload.putString(PROP_LABEL, videoTrack.getLabel());
183
+ videoTrackPayload.putString(PROP_LANGUAGE, videoTrack.getLanguage());
184
+
185
+ final QualityList<VideoQuality> qualityList = videoTrack.getQualities();
186
+ WritableArray qualities = Arguments.createArray();
187
+
188
+ if (qualityList != null) {
189
+ // Sort qualities according to (height, bandwidth)
190
+ final QualityListAdapter<VideoQuality> sortedQualityList = new QualityListAdapter<>(qualityList);
191
+ sortedQualityList.sort(
192
+ (o, t1) ->
193
+ (o.getHeight() == t1.getHeight()) ?
194
+ Long.compare(t1.getBandwidth(), o.getBandwidth()) : Integer.compare(t1.getHeight(), o.getHeight())
195
+ );
196
+
197
+ for (final VideoQuality quality : sortedQualityList) {
198
+ qualities.pushMap(fromVideoQuality(quality));
141
199
  }
200
+ }
201
+ videoTrackPayload.putArray(PROP_QUALITIES, qualities);
202
+
203
+ final QualityList<VideoQuality> targetQualityList = videoTrack.getTargetQualities();
204
+ WritableArray targetQualities = Arguments.createArray();
205
+ if (targetQualityList != null) {
206
+ for (int j = 0; j < targetQualityList.length(); j++) {
207
+ final VideoQuality quality = targetQualityList.getItem(j);
208
+ WritableMap videoQualityPayload = Arguments.createMap();
209
+ videoQualityPayload.putInt(PROP_UID, quality.getUid());
210
+ targetQualities.pushMap(videoQualityPayload);
211
+ }
212
+ }
142
213
 
143
- audioTracks.pushMap(audioTrackPayload);
214
+ final VideoQuality activeQuality = videoTrack.getActiveQuality();
215
+ if (activeQuality != null) {
216
+ videoTrackPayload.putInt(PROP_ACTIVE_QUALITY, activeQuality.getUid());
144
217
  }
145
- return audioTracks;
218
+
219
+ final VideoQuality targetQuality = videoTrack.getTargetQuality();
220
+ if (targetQuality != null) {
221
+ videoTrackPayload.putInt(PROP_TARGET_QUALITY, targetQuality.getUid());
222
+ }
223
+ return videoTrackPayload;
146
224
  }
147
225
 
148
226
  @NonNull
149
227
  static public WritableArray fromVideoTrackList(@NonNull final MediaTrackList<VideoQuality> videoTrackList) {
150
228
  WritableArray videoTracks = Arguments.createArray();
151
229
  for (int i = 0; i < videoTrackList.length(); i++) {
152
- final MediaTrack<VideoQuality> videoTrack = videoTrackList.getItem(i);
153
- WritableMap videoTrackPayload = Arguments.createMap();
154
- videoTrackPayload.putString(PROP_ID, videoTrack.getId());
155
- videoTrackPayload.putInt(PROP_UID, videoTrack.getUid());
156
- videoTrackPayload.putString(PROP_KIND, videoTrack.getKind());
157
- videoTrackPayload.putString(PROP_LABEL, videoTrack.getLabel());
158
- videoTrackPayload.putString(PROP_LANGUAGE, videoTrack.getLanguage());
159
-
160
- final QualityList<VideoQuality> qualityList = videoTrack.getQualities();
161
- WritableArray qualities = Arguments.createArray();
162
-
163
- if (qualityList != null) {
164
- // Sort qualities according to (height, bandwidth)
165
- final QualityListAdapter<VideoQuality> sortedQualityList = new QualityListAdapter<>(qualityList);
166
- sortedQualityList.sort(
167
- (o, t1) ->
168
- (o.getHeight() == t1.getHeight()) ?
169
- Long.compare(t1.getBandwidth(), o.getBandwidth()) : Integer.compare(t1.getHeight(), o.getHeight())
170
- );
171
-
172
- for (final VideoQuality quality : sortedQualityList) {
173
- WritableMap videoQualityPayload = Arguments.createMap();
174
- videoQualityPayload.putString(PROP_ID, quality.getId());
175
- videoQualityPayload.putInt(PROP_UID, quality.getUid());
176
- videoQualityPayload.putString(PROP_CODECS, quality.getCodecs());
177
- videoQualityPayload.putString(PROP_NAME, quality.getName());
178
- videoQualityPayload.putDouble(PROP_BANDWIDTH, quality.getBandwidth());
179
- videoQualityPayload.putDouble(PROP_WIDTH, quality.getWidth());
180
- videoQualityPayload.putDouble(PROP_HEIGHT, quality.getHeight());
181
- videoQualityPayload.putDouble(PROP_FRAMERATE, quality.getFrameRate());
182
- qualities.pushMap(videoQualityPayload);
183
- }
184
- }
185
- videoTrackPayload.putArray(PROP_QUALITIES, qualities);
186
-
187
- final QualityList<VideoQuality> targetQualityList = videoTrack.getTargetQualities();
188
- WritableArray targetQualities = Arguments.createArray();
189
- if (targetQualityList != null) {
190
- for (int j = 0; j < targetQualityList.length(); j++) {
191
- final VideoQuality quality = targetQualityList.getItem(j);
192
- WritableMap videoQualityPayload = Arguments.createMap();
193
- videoQualityPayload.putInt(PROP_UID, quality.getUid());
194
- targetQualities.pushMap(videoQualityPayload);
195
- }
196
- }
197
-
198
- final VideoQuality activeQuality = videoTrack.getActiveQuality();
199
- if (activeQuality != null) {
200
- videoTrackPayload.putInt(PROP_ACTIVE_QUALITY, activeQuality.getUid());
201
- }
202
-
203
- final VideoQuality targetQuality = videoTrack.getTargetQuality();
204
- if (targetQuality != null) {
205
- videoTrackPayload.putInt(PROP_TARGET_QUALITY, targetQuality.getUid());
206
- }
207
-
208
- videoTracks.pushMap(videoTrackPayload);
230
+ videoTracks.pushMap(fromVideoTrack(videoTrackList.getItem(i)));
209
231
  }
210
232
  return videoTracks;
211
233
  }
@@ -40,6 +40,7 @@ let PROP_COMPANION_RESOURCE_URI: String = "resourceURI"
40
40
 
41
41
  class THEOplayerRCTAdAggregator {
42
42
 
43
+ #if ADS && (GOOGLE_IMA || GOOGLE_DAI)
43
44
  class func aggregateAd(ad: Ad, processAdBreak: Bool = true) -> [String:Any] {
44
45
  var adData: [String:Any] = [:]
45
46
  adData[PROP_AD_INTEGRATION] = ad.integration._rawValue
@@ -155,4 +156,6 @@ class THEOplayerRCTAdAggregator {
155
156
  }
156
157
  return nil
157
158
  }
159
+ #endif
160
+
158
161
  }
@@ -46,6 +46,8 @@ RCT_EXPORT_VIEW_PROPERTY(onNativeFullscreenPlayerDidDismiss, RCTDirectEventBlock
46
46
 
47
47
  RCT_EXPORT_VIEW_PROPERTY(onNativeTextTrackListEvent, RCTDirectEventBlock);
48
48
  RCT_EXPORT_VIEW_PROPERTY(onNativeTextTrackEvent, RCTDirectEventBlock);
49
+ RCT_EXPORT_VIEW_PROPERTY(onNativeMediaTrackListEvent, RCTDirectEventBlock);
50
+ RCT_EXPORT_VIEW_PROPERTY(onNativeMediaTrackEvent, RCTDirectEventBlock);
49
51
 
50
52
  RCT_EXPORT_VIEW_PROPERTY(onNativeAdEvent, RCTDirectEventBlock);
51
53