@picsa/capacitor-video-player 7.1.0 → 7.2.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 (69) hide show
  1. package/CapacitorVideoPlayer.podspec +17 -17
  2. package/LICENSE +21 -21
  3. package/android/build.gradle +71 -71
  4. package/android/src/main/AndroidManifest.xml +3 -3
  5. package/android/src/main/java/com/jeep/plugin/capacitor/capacitorvideoplayer/CapacitorVideoPlayer.java +71 -71
  6. package/android/src/main/java/com/jeep/plugin/capacitor/capacitorvideoplayer/CapacitorVideoPlayerPlugin.java +1256 -1256
  7. package/android/src/main/java/com/jeep/plugin/capacitor/capacitorvideoplayer/FullscreenExoPlayerFragment.java +1595 -1595
  8. package/android/src/main/java/com/jeep/plugin/capacitor/capacitorvideoplayer/Notifications/MyRunnable.java +21 -21
  9. package/android/src/main/java/com/jeep/plugin/capacitor/capacitorvideoplayer/Notifications/NotificationCenter.java +61 -61
  10. package/android/src/main/java/com/jeep/plugin/capacitor/capacitorvideoplayer/PickerVideo/AdapterVideoList.java +47 -47
  11. package/android/src/main/java/com/jeep/plugin/capacitor/capacitorvideoplayer/PickerVideo/ModelVideo.java +49 -49
  12. package/android/src/main/java/com/jeep/plugin/capacitor/capacitorvideoplayer/PickerVideo/PickerVideoFragment.java +119 -119
  13. package/android/src/main/java/com/jeep/plugin/capacitor/capacitorvideoplayer/PickerVideo/VideoRecyclerViewHolder.java +65 -65
  14. package/android/src/main/java/com/jeep/plugin/capacitor/capacitorvideoplayer/Utilities/FilesUtils.java +101 -101
  15. package/android/src/main/java/com/jeep/plugin/capacitor/capacitorvideoplayer/Utilities/FragmentUtils.java +32 -32
  16. package/android/src/main/res/drawable/bg_round_rect_white_50.xml +9 -9
  17. package/android/src/main/res/drawable/bg_rounded_rectangle_white_corner_rounded.xml +10 -10
  18. package/android/src/main/res/drawable/exo_close_btn.xml +11 -11
  19. package/android/src/main/res/drawable/gradient_transparent_middle.xml +12 -12
  20. package/android/src/main/res/drawable/ic_arrow_left.xml +5 -5
  21. package/android/src/main/res/drawable/ic_baseline_lq.xml +7 -7
  22. package/android/src/main/res/drawable/ic_exo_icon_fastforward.xml +35 -35
  23. package/android/src/main/res/drawable/ic_exo_icon_pause.xml +26 -26
  24. package/android/src/main/res/drawable/ic_exo_icon_play.xml +36 -36
  25. package/android/src/main/res/drawable/ic_exo_icon_rewind.xml +35 -35
  26. package/android/src/main/res/drawable/ic_expand.xml +5 -5
  27. package/android/src/main/res/drawable/ic_fit.xml +5 -5
  28. package/android/src/main/res/drawable/ic_image_background.xml +12 -12
  29. package/android/src/main/res/drawable/ic_img_16_9_background.xml +10 -10
  30. package/android/src/main/res/drawable/ic_img_9_16_background.xml +10 -10
  31. package/android/src/main/res/drawable/ic_outline_lock.xml +5 -5
  32. package/android/src/main/res/drawable/ic_outline_lock_open.xml +5 -5
  33. package/android/src/main/res/drawable/ic_pip_white.xml +5 -5
  34. package/android/src/main/res/drawable/ic_views.xml +18 -18
  35. package/android/src/main/res/drawable/ic_zoom.xml +5 -5
  36. package/android/src/main/res/layout/bridge_layout_main.xml +15 -15
  37. package/android/src/main/res/layout/exo_playback_control_view.xml +289 -289
  38. package/android/src/main/res/layout/exoplayer_layout_youtube.xml +361 -361
  39. package/android/src/main/res/layout/fragment_fs_exoplayer.xml +50 -50
  40. package/android/src/main/res/layout/fragment_picker_video.xml +21 -21
  41. package/android/src/main/res/layout/row_video.xml +76 -76
  42. package/android/src/main/res/values/colors.xml +14 -14
  43. package/android/src/main/res/values/strings.xml +3 -3
  44. package/android/src/main/res/values/styles.xml +3 -3
  45. package/dist/docs.json +14 -14
  46. package/ios/Plugin/CapacitorVideoPlayer.swift +63 -63
  47. package/ios/Plugin/CapacitorVideoPlayerPlugin.h +10 -10
  48. package/ios/Plugin/CapacitorVideoPlayerPlugin.m +22 -22
  49. package/ios/Plugin/CapacitorVideoPlayerPlugin.swift +631 -631
  50. package/ios/Plugin/Extensions/CapacitorVideoPlayerPlugin.AVPlayerViewController.swift +59 -59
  51. package/ios/Plugin/Extensions/CapacitorVideoPlayerPlugin.File.swift +126 -126
  52. package/ios/Plugin/Extensions/CapacitorVideoPlayerPlugin.Fullscreen.swift +94 -94
  53. package/ios/Plugin/Extensions/CapacitorVideoPlayerPlugin.Notifications.swift +140 -140
  54. package/ios/Plugin/Extensions/CapacitorVideoPlayerPlugin.Observers.swift +180 -180
  55. package/ios/Plugin/Info.plist +24 -24
  56. package/ios/Plugin/VideoPicker/VideoHelper.swift +127 -127
  57. package/ios/Plugin/VideoPicker/VideoPickerViewController.swift +144 -144
  58. package/ios/Plugin/VideoPlayer/Extensions/AVURLAsset.swift +18 -18
  59. package/ios/Plugin/VideoPlayer/Extensions/AllOrientationAVPlayerController.swift +12 -12
  60. package/ios/Plugin/VideoPlayer/Extensions/CMTime.swift +23 -23
  61. package/ios/Plugin/VideoPlayer/Extensions/LandscapeAVPlayerController.swift +12 -12
  62. package/ios/Plugin/VideoPlayer/Extensions/Notification.Name.swift +18 -18
  63. package/ios/Plugin/VideoPlayer/Extensions/PortraitAVPlayerController.swift +12 -12
  64. package/ios/Plugin/VideoPlayer/Extensions/View.swift +54 -54
  65. package/ios/Plugin/VideoPlayer/FullScreenVideoPlayerView.swift +601 -601
  66. package/ios/Plugin/VideoPlayer/Models/Video.swift +28 -28
  67. package/ios/Plugin/VideoPlayer/Models/VideoModel.swift +42 -42
  68. package/package.json +92 -92
  69. package/readme.md +196 -190
@@ -1,140 +1,140 @@
1
- //
2
- // CapacitorVideoPlayerPlugin.Notifications.swift
3
- // Plugin
4
- //
5
- // Created by Quéau Jean Pierre on 30/05/2021.
6
- // Copyright © 2021 Max Lynch. All rights reserved.
7
- //
8
-
9
- import Foundation
10
- import MediaPlayer
11
-
12
- // MARK: - Handle Notifications
13
-
14
- extension CapacitorVideoPlayerPlugin {
15
-
16
- // MARK: - playerItemPlay
17
-
18
- @objc func playerItemPlay(notification: Notification) {
19
- guard let info = notification.userInfo as? [String: Any] else { return }
20
- DispatchQueue.main.async {
21
- self.notifyListeners("jeepCapVideoPlayerPlay", data: info, retainUntilConsumed: true)
22
- return
23
- }
24
- }
25
-
26
- // MARK: - playerItemPause
27
-
28
- @objc func playerItemPause(notification: Notification) {
29
- guard let info = notification.userInfo as? [String: Any] else { return }
30
- DispatchQueue.main.async {
31
- self.notifyListeners("jeepCapVideoPlayerPause", data: info, retainUntilConsumed: true)
32
- return
33
- }
34
- }
35
-
36
- // MARK: - playerItemEnd
37
-
38
- @objc func playerItemEnd(notification: Notification) {
39
- guard let info = notification.userInfo as? [String: Any] else { return }
40
- DispatchQueue.main.async {
41
- self.notifyListeners("jeepCapVideoPlayerEnded", data: info, retainUntilConsumed: true)
42
- if self.mode == "fullscreen" {
43
- self.playerFullscreenExit()
44
- }
45
-
46
- return
47
- }
48
- }
49
-
50
- // MARK: - playerItemReady
51
-
52
- @objc func playerItemReady(notification: Notification) {
53
- guard let info = notification.userInfo as? [String: Any] else { return }
54
- guard let playerId = info["fromPlayerId"] as? String else { return}
55
- DispatchQueue.main.async {
56
- self.notifyListeners("jeepCapVideoPlayerReady", data: info, retainUntilConsumed: true)
57
- if self.mode == "fullscreen" && playerId == self.fsPlayerId {
58
- if let vPFSV = self.videoPlayerFullScreenView {
59
- vPFSV.play()
60
- }
61
- }
62
- return
63
- }
64
- }
65
-
66
- // MARK: - playerFullscreenDismiss
67
-
68
- @objc func playerFullscreenDismiss(notification: Notification) {
69
-
70
- var currentTime: Double = 0.0
71
- if let playerView = self.videoPlayerFullScreenView {
72
- currentTime = playerView.getRealCurrentTime()
73
- }
74
- let info: [String: Any] = ["dismiss": true, "currentTime": currentTime]
75
- DispatchQueue.main.async {
76
- if self.mode == "fullscreen" {
77
- if let vPFSV = self.videoPlayerFullScreenView {
78
- vPFSV.pause()
79
- }
80
- self.playerFullscreenExit()
81
- }
82
- self.notifyListeners("jeepCapVideoPlayerExit", data: info, retainUntilConsumed: true)
83
- return
84
- }
85
- }
86
-
87
- // MARK: - playerFullscreenExit
88
-
89
- func playerFullscreenExit() {
90
- if let vPFSV = self.videoPlayerFullScreenView {
91
- vPFSV.removeObservers()
92
- self.terminateNowPlayingInfo()
93
- vPFSV.videoPlayer.player = nil
94
- vPFSV.player = nil
95
- /*
96
- if self.displayMode == "landscape" {
97
- vPFSV.videoPlayer = PortraitAVPlayerController()
98
- } else if self.displayMode == "portrait" {
99
- vPFSV.videoPlayer = LandscapeAVPlayerController()
100
- } else {
101
- vPFSV.videoPlayer = AllOrientationAVPlayerController()
102
- }
103
- */
104
- self.videoPlayerFullScreenView = nil
105
- }
106
- if let viewController = self.bridge?.viewController {
107
- viewController.dismiss(animated: true, completion: {
108
- if self.backModeEnabled {
109
- if let audioSession = self.audioSession {
110
- do {
111
- try audioSession.setActive(false)
112
- self.audioSession = nil
113
- } catch {
114
- let error: String = "playerFullscreenExit: Failed to deactivate audio session category"
115
- print(error)
116
- }
117
- }
118
- }
119
- })
120
- }
121
- }
122
-
123
- private func terminateNowPlayingInfo() {
124
- if let vPFSV = self.videoPlayerFullScreenView {
125
- if let token = vPFSV.periodicTimeObserver {
126
- vPFSV.player?.removeTimeObserver(token)
127
- vPFSV.periodicTimeObserver = nil
128
- }
129
- let rcc = MPRemoteCommandCenter.shared()
130
- rcc.changePlaybackPositionCommand.isEnabled = false
131
- rcc.playCommand.isEnabled = false
132
- rcc.pauseCommand.isEnabled = false
133
- rcc.skipForwardCommand.isEnabled = false
134
- rcc.skipBackwardCommand.isEnabled = false
135
- MPNowPlayingInfoCenter.default().nowPlayingInfo = [:]
136
- MPNowPlayingInfoCenter.default().nowPlayingInfo = nil
137
- }
138
- }
139
-
140
- }
1
+ //
2
+ // CapacitorVideoPlayerPlugin.Notifications.swift
3
+ // Plugin
4
+ //
5
+ // Created by Quéau Jean Pierre on 30/05/2021.
6
+ // Copyright © 2021 Max Lynch. All rights reserved.
7
+ //
8
+
9
+ import Foundation
10
+ import MediaPlayer
11
+
12
+ // MARK: - Handle Notifications
13
+
14
+ extension CapacitorVideoPlayerPlugin {
15
+
16
+ // MARK: - playerItemPlay
17
+
18
+ @objc func playerItemPlay(notification: Notification) {
19
+ guard let info = notification.userInfo as? [String: Any] else { return }
20
+ DispatchQueue.main.async {
21
+ self.notifyListeners("jeepCapVideoPlayerPlay", data: info, retainUntilConsumed: true)
22
+ return
23
+ }
24
+ }
25
+
26
+ // MARK: - playerItemPause
27
+
28
+ @objc func playerItemPause(notification: Notification) {
29
+ guard let info = notification.userInfo as? [String: Any] else { return }
30
+ DispatchQueue.main.async {
31
+ self.notifyListeners("jeepCapVideoPlayerPause", data: info, retainUntilConsumed: true)
32
+ return
33
+ }
34
+ }
35
+
36
+ // MARK: - playerItemEnd
37
+
38
+ @objc func playerItemEnd(notification: Notification) {
39
+ guard let info = notification.userInfo as? [String: Any] else { return }
40
+ DispatchQueue.main.async {
41
+ self.notifyListeners("jeepCapVideoPlayerEnded", data: info, retainUntilConsumed: true)
42
+ if self.mode == "fullscreen" {
43
+ self.playerFullscreenExit()
44
+ }
45
+
46
+ return
47
+ }
48
+ }
49
+
50
+ // MARK: - playerItemReady
51
+
52
+ @objc func playerItemReady(notification: Notification) {
53
+ guard let info = notification.userInfo as? [String: Any] else { return }
54
+ guard let playerId = info["fromPlayerId"] as? String else { return}
55
+ DispatchQueue.main.async {
56
+ self.notifyListeners("jeepCapVideoPlayerReady", data: info, retainUntilConsumed: true)
57
+ if self.mode == "fullscreen" && playerId == self.fsPlayerId {
58
+ if let vPFSV = self.videoPlayerFullScreenView {
59
+ vPFSV.play()
60
+ }
61
+ }
62
+ return
63
+ }
64
+ }
65
+
66
+ // MARK: - playerFullscreenDismiss
67
+
68
+ @objc func playerFullscreenDismiss(notification: Notification) {
69
+
70
+ var currentTime: Double = 0.0
71
+ if let playerView = self.videoPlayerFullScreenView {
72
+ currentTime = playerView.getRealCurrentTime()
73
+ }
74
+ let info: [String: Any] = ["dismiss": true, "currentTime": currentTime]
75
+ DispatchQueue.main.async {
76
+ if self.mode == "fullscreen" {
77
+ if let vPFSV = self.videoPlayerFullScreenView {
78
+ vPFSV.pause()
79
+ }
80
+ self.playerFullscreenExit()
81
+ }
82
+ self.notifyListeners("jeepCapVideoPlayerExit", data: info, retainUntilConsumed: true)
83
+ return
84
+ }
85
+ }
86
+
87
+ // MARK: - playerFullscreenExit
88
+
89
+ func playerFullscreenExit() {
90
+ if let vPFSV = self.videoPlayerFullScreenView {
91
+ vPFSV.removeObservers()
92
+ self.terminateNowPlayingInfo()
93
+ vPFSV.videoPlayer.player = nil
94
+ vPFSV.player = nil
95
+ /*
96
+ if self.displayMode == "landscape" {
97
+ vPFSV.videoPlayer = PortraitAVPlayerController()
98
+ } else if self.displayMode == "portrait" {
99
+ vPFSV.videoPlayer = LandscapeAVPlayerController()
100
+ } else {
101
+ vPFSV.videoPlayer = AllOrientationAVPlayerController()
102
+ }
103
+ */
104
+ self.videoPlayerFullScreenView = nil
105
+ }
106
+ if let viewController = self.bridge?.viewController {
107
+ viewController.dismiss(animated: true, completion: {
108
+ if self.backModeEnabled {
109
+ if let audioSession = self.audioSession {
110
+ do {
111
+ try audioSession.setActive(false)
112
+ self.audioSession = nil
113
+ } catch {
114
+ let error: String = "playerFullscreenExit: Failed to deactivate audio session category"
115
+ print(error)
116
+ }
117
+ }
118
+ }
119
+ })
120
+ }
121
+ }
122
+
123
+ private func terminateNowPlayingInfo() {
124
+ if let vPFSV = self.videoPlayerFullScreenView {
125
+ if let token = vPFSV.periodicTimeObserver {
126
+ vPFSV.player?.removeTimeObserver(token)
127
+ vPFSV.periodicTimeObserver = nil
128
+ }
129
+ let rcc = MPRemoteCommandCenter.shared()
130
+ rcc.changePlaybackPositionCommand.isEnabled = false
131
+ rcc.playCommand.isEnabled = false
132
+ rcc.pauseCommand.isEnabled = false
133
+ rcc.skipForwardCommand.isEnabled = false
134
+ rcc.skipBackwardCommand.isEnabled = false
135
+ MPNowPlayingInfoCenter.default().nowPlayingInfo = [:]
136
+ MPNowPlayingInfoCenter.default().nowPlayingInfo = nil
137
+ }
138
+ }
139
+
140
+ }
@@ -1,180 +1,180 @@
1
- //
2
- // CapacitorVideoPlayerPlugin.Observers.swift
3
- // Plugin
4
- //
5
- // Created by Quéau Jean Pierre on 30/05/2021.
6
- // Copyright © 2021 Max Lynch. All rights reserved.
7
- //
8
-
9
- import Foundation
10
- import UIKit
11
- import AVFoundation
12
-
13
- extension CapacitorVideoPlayerPlugin {
14
-
15
- // MARK: - Add Observers
16
-
17
- // swiftlint:disable function_body_length
18
- @objc func addObserversToNotificationCenter() {
19
- // add Observers
20
-
21
- playObserver = NotificationCenter.default
22
- .addObserver(forName: .playerItemPlay, object: nil, queue: nil,
23
- using: playerItemPlay)
24
- pauseObserver = NotificationCenter.default
25
- .addObserver(forName: .playerItemPause, object: nil,
26
- queue: nil, using: playerItemPause)
27
- endObserver = NotificationCenter.default
28
- .addObserver(forName: .playerItemEnd, object: nil, queue: nil,
29
- using: playerItemEnd)
30
- readyObserver = NotificationCenter.default
31
- .addObserver(forName: .playerItemReady, object: nil,
32
- queue: nil, using: playerItemReady)
33
- fsDismissObserver = NotificationCenter.default
34
- .addObserver(forName: .playerFullscreenDismiss, object: nil,
35
- queue: nil, using: playerFullscreenDismiss)
36
- vpInternalObserver = NotificationCenter.default
37
- .addObserver(forName: .videoPathInternalReady, object: nil,
38
- queue: nil, using: videoPathInternalReady)
39
-
40
- backgroundObserver =
41
- NotificationCenter.default.addObserver(
42
- forName: UIApplication.didEnterBackgroundNotification,
43
- object: nil, queue: nil) { (_) in
44
- if self.backModeEnabled {
45
- isInBackgroundMode = true
46
- if !isInPIPMode &&
47
- self.videoPlayerFullScreenView != nil {
48
- self.videoPlayerFullScreenView?
49
- .videoPlayer.player = nil
50
-
51
- if let playerItem = self.videoPlayerFullScreenView?
52
- .playerItem {
53
- self.videoTrackEnable(playerItem: playerItem,
54
- enable: false)
55
- }
56
- }
57
- } else {
58
- if self.videoPlayerFullScreenView != nil {
59
-
60
- self.videoPlayerFullScreenView?
61
- .videoPlayer.player?.pause()
62
- }
63
- }
64
- }
65
- foregroundObserver =
66
- NotificationCenter.default.addObserver(forName: UIApplication.willEnterForegroundNotification, object: nil,
67
- queue: OperationQueue.main) { (_) in
68
-
69
- if self.backModeEnabled {
70
- isInBackgroundMode = false
71
- if !isInPIPMode && self.bgPlayer != nil &&
72
- self.videoPlayerFullScreenView != nil {
73
- //enable video track
74
- if let playerItem =
75
- self.videoPlayerFullScreenView?.playerItem {
76
- self.videoTrackEnable(playerItem: playerItem,
77
- enable: true)
78
- }
79
-
80
- self.videoPlayerFullScreenView?
81
- .videoPlayer.player = self.bgPlayer
82
- }
83
- } else {
84
- if self.videoPlayerFullScreenView != nil {
85
-
86
- if let playerItem =
87
- self.videoPlayerFullScreenView?.playerItem {
88
- self.videoTrackEnable(playerItem: playerItem,
89
- enable: true)
90
- }
91
- self.videoPlayerFullScreenView?
92
- .videoPlayer.player?.play()
93
- }
94
-
95
- }
96
- }
97
- }
98
- // swiftlint:enable function_body_length
99
-
100
- // MARK: - videoTrackEnable
101
-
102
- func videoTrackEnable(playerItem: AVPlayerItem, enable: Bool) {
103
- let tracks = playerItem.tracks
104
- for playerItemTrack in tracks {
105
- // Find the video tracks.
106
- if let mediaType = playerItemTrack.assetTrack?.mediaType {
107
- if mediaType == AVMediaType.video {
108
- // Enable/Disable the track.
109
- playerItemTrack.isEnabled = enable
110
- }
111
- }
112
- }
113
-
114
- }
115
-
116
- // MARK: - videoPathInternalReady
117
-
118
- // swiftlint:disable function_body_length
119
- func videoPathInternalReady(notification: Notification) {
120
- self.bridge?.viewController?.dismiss(animated: true, completion: {
121
- })
122
- guard let info = notification.userInfo as? [String: Any]
123
- else { return }
124
- guard let videoUrl = info["videoUrl"] as? URL else {
125
- NotificationCenter.default.post(
126
- name: .playerFullscreenDismiss, object: nil)
127
- return
128
- }
129
- guard let videoRate = info["videoRate"] as? Float else {
130
- NotificationCenter.default.post(
131
- name: .playerFullscreenDismiss, object: nil)
132
- return
133
- }
134
- guard let exitOnEnd = info["exitOnEnd"] as? Bool else {
135
- NotificationCenter.default.post(
136
- name: .playerFullscreenDismiss, object: nil)
137
- return
138
- }
139
- guard let loopOnEnd = info["loopOnEnd"] as? Bool else {
140
- NotificationCenter.default.post(
141
- name: .playerFullscreenDismiss, object: nil)
142
- return
143
- }
144
- guard let pipEnabled = info["pipEnabled"] as? Bool else {
145
- NotificationCenter.default.post(
146
- name: .playerFullscreenDismiss, object: nil)
147
- return
148
- }
149
- guard let showControls = info["showControls"] as? Bool else {
150
- NotificationCenter.default.post(
151
- name: .playerFullscreenDismiss, object: nil)
152
- return
153
- }
154
- guard let displayMode = info["displayMode"] as? String else {
155
- NotificationCenter.default.post(
156
- name: .playerFullscreenDismiss, object: nil)
157
- return
158
- }
159
- guard let backModeEnabled = info["backModeEnabled"] as? Bool else {
160
- NotificationCenter.default.post(
161
- name: .playerFullscreenDismiss, object: nil)
162
- return
163
- }
164
- guard let call = self.call else { return }
165
-
166
- self.createVideoPlayerFullscreenView(
167
- call: call, videoUrl: videoUrl,
168
- rate: videoRate, exitOnEnd: exitOnEnd,
169
- loopOnEnd: loopOnEnd, pipEnabled: pipEnabled,
170
- backModeEnabled: backModeEnabled,
171
- showControls: showControls,
172
- displayMode: displayMode,
173
- subTitleUrl: nil, subTitleLanguage: nil,
174
- subTitleOptions: nil, headers: nil,
175
- title: nil, smallTitle: nil, artwork: nil)
176
- return
177
- }
178
- // swiftlint:enable function_body_length
179
-
180
- }
1
+ //
2
+ // CapacitorVideoPlayerPlugin.Observers.swift
3
+ // Plugin
4
+ //
5
+ // Created by Quéau Jean Pierre on 30/05/2021.
6
+ // Copyright © 2021 Max Lynch. All rights reserved.
7
+ //
8
+
9
+ import Foundation
10
+ import UIKit
11
+ import AVFoundation
12
+
13
+ extension CapacitorVideoPlayerPlugin {
14
+
15
+ // MARK: - Add Observers
16
+
17
+ // swiftlint:disable function_body_length
18
+ @objc func addObserversToNotificationCenter() {
19
+ // add Observers
20
+
21
+ playObserver = NotificationCenter.default
22
+ .addObserver(forName: .playerItemPlay, object: nil, queue: nil,
23
+ using: playerItemPlay)
24
+ pauseObserver = NotificationCenter.default
25
+ .addObserver(forName: .playerItemPause, object: nil,
26
+ queue: nil, using: playerItemPause)
27
+ endObserver = NotificationCenter.default
28
+ .addObserver(forName: .playerItemEnd, object: nil, queue: nil,
29
+ using: playerItemEnd)
30
+ readyObserver = NotificationCenter.default
31
+ .addObserver(forName: .playerItemReady, object: nil,
32
+ queue: nil, using: playerItemReady)
33
+ fsDismissObserver = NotificationCenter.default
34
+ .addObserver(forName: .playerFullscreenDismiss, object: nil,
35
+ queue: nil, using: playerFullscreenDismiss)
36
+ vpInternalObserver = NotificationCenter.default
37
+ .addObserver(forName: .videoPathInternalReady, object: nil,
38
+ queue: nil, using: videoPathInternalReady)
39
+
40
+ backgroundObserver =
41
+ NotificationCenter.default.addObserver(
42
+ forName: UIApplication.didEnterBackgroundNotification,
43
+ object: nil, queue: nil) { (_) in
44
+ if self.backModeEnabled {
45
+ isInBackgroundMode = true
46
+ if !isInPIPMode &&
47
+ self.videoPlayerFullScreenView != nil {
48
+ self.videoPlayerFullScreenView?
49
+ .videoPlayer.player = nil
50
+
51
+ if let playerItem = self.videoPlayerFullScreenView?
52
+ .playerItem {
53
+ self.videoTrackEnable(playerItem: playerItem,
54
+ enable: false)
55
+ }
56
+ }
57
+ } else {
58
+ if self.videoPlayerFullScreenView != nil {
59
+
60
+ self.videoPlayerFullScreenView?
61
+ .videoPlayer.player?.pause()
62
+ }
63
+ }
64
+ }
65
+ foregroundObserver =
66
+ NotificationCenter.default.addObserver(forName: UIApplication.willEnterForegroundNotification, object: nil,
67
+ queue: OperationQueue.main) { (_) in
68
+
69
+ if self.backModeEnabled {
70
+ isInBackgroundMode = false
71
+ if !isInPIPMode && self.bgPlayer != nil &&
72
+ self.videoPlayerFullScreenView != nil {
73
+ //enable video track
74
+ if let playerItem =
75
+ self.videoPlayerFullScreenView?.playerItem {
76
+ self.videoTrackEnable(playerItem: playerItem,
77
+ enable: true)
78
+ }
79
+
80
+ self.videoPlayerFullScreenView?
81
+ .videoPlayer.player = self.bgPlayer
82
+ }
83
+ } else {
84
+ if self.videoPlayerFullScreenView != nil {
85
+
86
+ if let playerItem =
87
+ self.videoPlayerFullScreenView?.playerItem {
88
+ self.videoTrackEnable(playerItem: playerItem,
89
+ enable: true)
90
+ }
91
+ self.videoPlayerFullScreenView?
92
+ .videoPlayer.player?.play()
93
+ }
94
+
95
+ }
96
+ }
97
+ }
98
+ // swiftlint:enable function_body_length
99
+
100
+ // MARK: - videoTrackEnable
101
+
102
+ func videoTrackEnable(playerItem: AVPlayerItem, enable: Bool) {
103
+ let tracks = playerItem.tracks
104
+ for playerItemTrack in tracks {
105
+ // Find the video tracks.
106
+ if let mediaType = playerItemTrack.assetTrack?.mediaType {
107
+ if mediaType == AVMediaType.video {
108
+ // Enable/Disable the track.
109
+ playerItemTrack.isEnabled = enable
110
+ }
111
+ }
112
+ }
113
+
114
+ }
115
+
116
+ // MARK: - videoPathInternalReady
117
+
118
+ // swiftlint:disable function_body_length
119
+ func videoPathInternalReady(notification: Notification) {
120
+ self.bridge?.viewController?.dismiss(animated: true, completion: {
121
+ })
122
+ guard let info = notification.userInfo as? [String: Any]
123
+ else { return }
124
+ guard let videoUrl = info["videoUrl"] as? URL else {
125
+ NotificationCenter.default.post(
126
+ name: .playerFullscreenDismiss, object: nil)
127
+ return
128
+ }
129
+ guard let videoRate = info["videoRate"] as? Float else {
130
+ NotificationCenter.default.post(
131
+ name: .playerFullscreenDismiss, object: nil)
132
+ return
133
+ }
134
+ guard let exitOnEnd = info["exitOnEnd"] as? Bool else {
135
+ NotificationCenter.default.post(
136
+ name: .playerFullscreenDismiss, object: nil)
137
+ return
138
+ }
139
+ guard let loopOnEnd = info["loopOnEnd"] as? Bool else {
140
+ NotificationCenter.default.post(
141
+ name: .playerFullscreenDismiss, object: nil)
142
+ return
143
+ }
144
+ guard let pipEnabled = info["pipEnabled"] as? Bool else {
145
+ NotificationCenter.default.post(
146
+ name: .playerFullscreenDismiss, object: nil)
147
+ return
148
+ }
149
+ guard let showControls = info["showControls"] as? Bool else {
150
+ NotificationCenter.default.post(
151
+ name: .playerFullscreenDismiss, object: nil)
152
+ return
153
+ }
154
+ guard let displayMode = info["displayMode"] as? String else {
155
+ NotificationCenter.default.post(
156
+ name: .playerFullscreenDismiss, object: nil)
157
+ return
158
+ }
159
+ guard let backModeEnabled = info["backModeEnabled"] as? Bool else {
160
+ NotificationCenter.default.post(
161
+ name: .playerFullscreenDismiss, object: nil)
162
+ return
163
+ }
164
+ guard let call = self.call else { return }
165
+
166
+ self.createVideoPlayerFullscreenView(
167
+ call: call, videoUrl: videoUrl,
168
+ rate: videoRate, exitOnEnd: exitOnEnd,
169
+ loopOnEnd: loopOnEnd, pipEnabled: pipEnabled,
170
+ backModeEnabled: backModeEnabled,
171
+ showControls: showControls,
172
+ displayMode: displayMode,
173
+ subTitleUrl: nil, subTitleLanguage: nil,
174
+ subTitleOptions: nil, headers: nil,
175
+ title: nil, smallTitle: nil, artwork: nil)
176
+ return
177
+ }
178
+ // swiftlint:enable function_body_length
179
+
180
+ }