react-native-tpstreams 1.0.4 → 1.0.5-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.
Files changed (21) hide show
  1. package/README.md +94 -542
  2. package/TPStreamsRNPlayerView.podspec +1 -1
  3. package/android/app/build/generated/source/codegen/java/com/facebook/react/viewmanagers/TPStreamsRNPlayerViewManagerDelegate.java +87 -0
  4. package/android/app/build/generated/source/codegen/java/com/facebook/react/viewmanagers/TPStreamsRNPlayerViewManagerInterface.java +34 -0
  5. package/android/app/build/generated/source/codegen/jni/CMakeLists.txt +36 -0
  6. package/android/app/build/generated/source/codegen/jni/TPStreamsPlayerViewSpec-generated.cpp +22 -0
  7. package/android/app/build/generated/source/codegen/jni/TPStreamsPlayerViewSpec.h +24 -0
  8. package/android/app/build/generated/source/codegen/jni/react/renderer/components/TPStreamsPlayerViewSpec/ComponentDescriptors.cpp +22 -0
  9. package/android/app/build/generated/source/codegen/jni/react/renderer/components/TPStreamsPlayerViewSpec/ComponentDescriptors.h +24 -0
  10. package/android/app/build/generated/source/codegen/jni/react/renderer/components/TPStreamsPlayerViewSpec/EventEmitters.cpp +107 -0
  11. package/android/app/build/generated/source/codegen/jni/react/renderer/components/TPStreamsPlayerViewSpec/EventEmitters.h +81 -0
  12. package/android/app/build/generated/source/codegen/jni/react/renderer/components/TPStreamsPlayerViewSpec/Props.cpp +32 -0
  13. package/android/app/build/generated/source/codegen/jni/react/renderer/components/TPStreamsPlayerViewSpec/Props.h +34 -0
  14. package/android/app/build/generated/source/codegen/jni/react/renderer/components/TPStreamsPlayerViewSpec/ShadowNodes.cpp +17 -0
  15. package/android/app/build/generated/source/codegen/jni/react/renderer/components/TPStreamsPlayerViewSpec/ShadowNodes.h +32 -0
  16. package/android/app/build/generated/source/codegen/jni/react/renderer/components/TPStreamsPlayerViewSpec/States.cpp +16 -0
  17. package/android/app/build/generated/source/codegen/jni/react/renderer/components/TPStreamsPlayerViewSpec/States.h +29 -0
  18. package/android/app/build/generated/source/codegen/jni/react/renderer/components/TPStreamsPlayerViewSpec/TPStreamsPlayerViewSpecJSI-generated.cpp +17 -0
  19. package/android/app/build/generated/source/codegen/jni/react/renderer/components/TPStreamsPlayerViewSpec/TPStreamsPlayerViewSpecJSI.h +19 -0
  20. package/ios/TPStreamsRNPlayerView.swift +75 -0
  21. 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
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-native-tpstreams",
3
- "version": "1.0.4",
3
+ "version": "1.0.5-dev.0",
4
4
  "description": "Video component for TPStreams",
5
5
  "main": "./lib/module/index.js",
6
6
  "types": "./lib/typescript/src/index.d.ts",