react-native-theoplayer 1.7.1 → 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.
- package/android/src/main/java/com/theoplayer/VideoEventEmitter.java +148 -12
- package/android/src/main/java/com/theoplayer/track/MediaTrackEventType.java +11 -0
- package/android/src/main/java/com/theoplayer/track/MediaTrackType.java +11 -0
- package/android/src/main/java/com/theoplayer/track/TrackEventType.java +2 -1
- package/android/src/main/java/com/theoplayer/track/TrackListInfo.java +123 -101
- package/ios/THEOplayerRCTAdAggregator.swift +3 -0
- package/ios/THEOplayerRCTBridge.m +2 -0
- package/ios/THEOplayerRCTMetadataAggregator.swift +59 -45
- package/ios/THEOplayerRCTTrackEventTypes.swift +17 -0
- package/ios/THEOplayerRCTView.swift +27 -3
- package/ios/THEOplayerRCTViewAdEventHandler.swift +7 -5
- package/ios/THEOplayerRCTViewMediaTrackEventHandler.swift +185 -0
- package/ios/THEOplayerRCTViewTextTrackEventHandler.swift +26 -9
- package/lib/commonjs/api/THEOplayerView.js.map +1 -1
- package/lib/commonjs/api/event/TrackEvent.js +17 -1
- package/lib/commonjs/api/event/TrackEvent.js.map +1 -1
- package/lib/commonjs/internal/THEOplayerView.js +14 -0
- package/lib/commonjs/internal/THEOplayerView.js.map +1 -1
- package/lib/commonjs/internal/THEOplayerView.web.js +71 -20
- package/lib/commonjs/internal/THEOplayerView.web.js.map +1 -1
- package/lib/module/api/THEOplayerView.js.map +1 -1
- package/lib/module/api/event/TrackEvent.js +14 -0
- package/lib/module/api/event/TrackEvent.js.map +1 -1
- package/lib/module/internal/THEOplayerView.js +14 -0
- package/lib/module/internal/THEOplayerView.js.map +1 -1
- package/lib/module/internal/THEOplayerView.web.js +72 -21
- package/lib/module/internal/THEOplayerView.web.js.map +1 -1
- package/lib/typescript/lib/commonjs/api/event/TrackEvent.d.ts +4 -0
- package/lib/typescript/lib/module/api/event/TrackEvent.d.ts +2 -0
- package/lib/typescript/src/api/THEOplayerView.d.ts +11 -3
- package/lib/typescript/src/api/event/TrackEvent.d.ts +49 -3
- package/lib/typescript/src/internal/THEOplayerView.d.ts +5 -1
- package/lib/typescript/src/internal/THEOplayerView.web.d.ts +4 -1
- package/package.json +1 -1
- package/src/api/THEOplayerView.ts +13 -3
- package/src/api/event/TrackEvent.ts +58 -2
- package/src/internal/THEOplayerView.tsx +18 -0
- package/src/internal/THEOplayerView.web.tsx +80 -19
|
@@ -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
|
|
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,
|
|
353
|
-
|
|
354
|
-
|
|
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
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
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
|
}
|
|
@@ -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
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
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
|
-
|
|
134
|
-
|
|
135
|
-
|
|
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
|
-
|
|
139
|
-
|
|
140
|
-
|
|
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
|
-
|
|
214
|
+
final VideoQuality activeQuality = videoTrack.getActiveQuality();
|
|
215
|
+
if (activeQuality != null) {
|
|
216
|
+
videoTrackPayload.putInt(PROP_ACTIVE_QUALITY, activeQuality.getUid());
|
|
144
217
|
}
|
|
145
|
-
|
|
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
|
-
|
|
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
|
|