react-native-tpstreams 1.0.5 → 1.0.6-dev.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.
- package/README.md +94 -542
- package/android/app/build/generated/source/codegen/java/com/facebook/react/viewmanagers/TPStreamsRNPlayerViewManagerDelegate.java +87 -0
- package/android/app/build/generated/source/codegen/java/com/facebook/react/viewmanagers/TPStreamsRNPlayerViewManagerInterface.java +34 -0
- package/android/app/build/generated/source/codegen/jni/CMakeLists.txt +36 -0
- package/android/app/build/generated/source/codegen/jni/TPStreamsPlayerViewSpec-generated.cpp +22 -0
- package/android/app/build/generated/source/codegen/jni/TPStreamsPlayerViewSpec.h +24 -0
- package/android/app/build/generated/source/codegen/jni/react/renderer/components/TPStreamsPlayerViewSpec/ComponentDescriptors.cpp +22 -0
- package/android/app/build/generated/source/codegen/jni/react/renderer/components/TPStreamsPlayerViewSpec/ComponentDescriptors.h +24 -0
- package/android/app/build/generated/source/codegen/jni/react/renderer/components/TPStreamsPlayerViewSpec/EventEmitters.cpp +107 -0
- package/android/app/build/generated/source/codegen/jni/react/renderer/components/TPStreamsPlayerViewSpec/EventEmitters.h +81 -0
- package/android/app/build/generated/source/codegen/jni/react/renderer/components/TPStreamsPlayerViewSpec/Props.cpp +32 -0
- package/android/app/build/generated/source/codegen/jni/react/renderer/components/TPStreamsPlayerViewSpec/Props.h +34 -0
- package/android/app/build/generated/source/codegen/jni/react/renderer/components/TPStreamsPlayerViewSpec/ShadowNodes.cpp +17 -0
- package/android/app/build/generated/source/codegen/jni/react/renderer/components/TPStreamsPlayerViewSpec/ShadowNodes.h +32 -0
- package/android/app/build/generated/source/codegen/jni/react/renderer/components/TPStreamsPlayerViewSpec/States.cpp +16 -0
- package/android/app/build/generated/source/codegen/jni/react/renderer/components/TPStreamsPlayerViewSpec/States.h +29 -0
- package/android/app/build/generated/source/codegen/jni/react/renderer/components/TPStreamsPlayerViewSpec/TPStreamsPlayerViewSpecJSI-generated.cpp +17 -0
- package/android/app/build/generated/source/codegen/jni/react/renderer/components/TPStreamsPlayerViewSpec/TPStreamsPlayerViewSpecJSI.h +19 -0
- package/ios/TPStreamsRNPlayerView.swift +75 -0
- package/package.json +1 -1
|
@@ -7,9 +7,19 @@ import AVFoundation
|
|
|
7
7
|
@objc(TPStreamsRNPlayerView)
|
|
8
8
|
class TPStreamsRNPlayerView: UIView {
|
|
9
9
|
|
|
10
|
+
private enum PlaybackState: Int {
|
|
11
|
+
case idle = 1
|
|
12
|
+
case buffering = 2
|
|
13
|
+
case ready = 3
|
|
14
|
+
case ended = 4
|
|
15
|
+
}
|
|
16
|
+
|
|
10
17
|
private var player: TPAVPlayer?
|
|
11
18
|
private var playerViewController: TPStreamPlayerViewController?
|
|
12
19
|
private var playerStatusObserver: NSKeyValueObservation?
|
|
20
|
+
private var playbackSpeedObserver: NSKeyValueObservation?
|
|
21
|
+
private var timeControlStatusObserver: NSKeyValueObservation?
|
|
22
|
+
private var playerStateObserver: NSKeyValueObservation?
|
|
13
23
|
private var setupScheduled = false
|
|
14
24
|
|
|
15
25
|
@objc var videoId: NSString = ""
|
|
@@ -25,6 +35,7 @@ class TPStreamsRNPlayerView: UIView {
|
|
|
25
35
|
@objc var onDuration: RCTDirectEventBlock?
|
|
26
36
|
@objc var onIsPlaying: RCTDirectEventBlock?
|
|
27
37
|
@objc var onPlaybackSpeed: RCTDirectEventBlock?
|
|
38
|
+
|
|
28
39
|
@objc var onPlayerStateChanged: RCTDirectEventBlock?
|
|
29
40
|
@objc var onIsPlayingChanged: RCTDirectEventBlock?
|
|
30
41
|
@objc var onPlaybackSpeedChanged: RCTDirectEventBlock?
|
|
@@ -96,6 +107,12 @@ class TPStreamsRNPlayerView: UIView {
|
|
|
96
107
|
private func removeObservers() {
|
|
97
108
|
playerStatusObserver?.invalidate()
|
|
98
109
|
playerStatusObserver = nil
|
|
110
|
+
playbackSpeedObserver?.invalidate()
|
|
111
|
+
playbackSpeedObserver = nil
|
|
112
|
+
timeControlStatusObserver?.invalidate()
|
|
113
|
+
timeControlStatusObserver = nil
|
|
114
|
+
playerStateObserver?.invalidate()
|
|
115
|
+
playerStateObserver = nil
|
|
99
116
|
}
|
|
100
117
|
|
|
101
118
|
private func createOfflinePlayer() -> TPAVPlayer? {
|
|
@@ -167,6 +184,9 @@ class TPStreamsRNPlayerView: UIView {
|
|
|
167
184
|
|
|
168
185
|
private func observePlayerChanges() {
|
|
169
186
|
setupSeekObserver()
|
|
187
|
+
setupPlayerStateObserver()
|
|
188
|
+
setupPlaybackSpeedObserver()
|
|
189
|
+
setupPlayingStateObserver()
|
|
170
190
|
}
|
|
171
191
|
|
|
172
192
|
private func setupSeekObserver() {
|
|
@@ -180,6 +200,61 @@ class TPStreamsRNPlayerView: UIView {
|
|
|
180
200
|
}
|
|
181
201
|
}
|
|
182
202
|
|
|
203
|
+
private func setupPlaybackSpeedObserver() {
|
|
204
|
+
guard let player = player else { return }
|
|
205
|
+
|
|
206
|
+
playbackSpeedObserver = player.observe(\.rate, options: [.new]) { [weak self] player, _ in
|
|
207
|
+
DispatchQueue.main.async {
|
|
208
|
+
self?.onPlaybackSpeedChanged?(["speed": player.rate])
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
private func setupPlayingStateObserver() {
|
|
214
|
+
guard let player = player else { return }
|
|
215
|
+
|
|
216
|
+
timeControlStatusObserver = player.observe(\.timeControlStatus, options: [.new, .initial]) { [weak self] player, _ in
|
|
217
|
+
DispatchQueue.main.async {
|
|
218
|
+
let isPlaying = player.timeControlStatus == .playing
|
|
219
|
+
self?.onIsPlayingChanged?(["isPlaying": isPlaying])
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
private func setupPlayerStateObserver() {
|
|
225
|
+
guard let player = player else { return }
|
|
226
|
+
|
|
227
|
+
playerStateObserver = player.observe(\.status, options: [.new, .initial]) { [weak self] player, _ in
|
|
228
|
+
DispatchQueue.main.async {
|
|
229
|
+
let state = self?.mapPlayerStateToAndroid(player.status) ?? PlaybackState.idle.rawValue
|
|
230
|
+
self?.onPlayerStateChanged?(["playbackState": state])
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
timeControlStatusObserver = player.observe(\.timeControlStatus, options: [.new, .initial]) { [weak self] player, _ in
|
|
235
|
+
DispatchQueue.main.async {
|
|
236
|
+
let state = self?.mapPlayerStateToAndroid(player.status, timeControlStatus: player.timeControlStatus) ?? PlaybackState.idle.rawValue
|
|
237
|
+
self?.onPlayerStateChanged?(["playbackState": state])
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
private func mapPlayerStateToAndroid(_ status: AVPlayer.Status, timeControlStatus: AVPlayer.TimeControlStatus? = nil) -> Int {
|
|
243
|
+
switch status {
|
|
244
|
+
case .unknown:
|
|
245
|
+
return PlaybackState.idle.rawValue // 1
|
|
246
|
+
case .readyToPlay:
|
|
247
|
+
if timeControlStatus == .waitingToPlayAtSpecifiedRate {
|
|
248
|
+
return PlaybackState.buffering.rawValue // 2
|
|
249
|
+
}
|
|
250
|
+
return PlaybackState.ready.rawValue // 3
|
|
251
|
+
case .failed:
|
|
252
|
+
return PlaybackState.idle.rawValue // 1
|
|
253
|
+
@unknown default:
|
|
254
|
+
return PlaybackState.idle.rawValue // 1
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
|
|
183
258
|
private func setupTokenDelegate() {
|
|
184
259
|
TPStreamsDownloadModule.shared?.setAccessTokenDelegate(self)
|
|
185
260
|
}
|