@picsa/capacitor-video-player 7.1.0 → 7.2.3
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/CapacitorVideoPlayer.podspec +17 -17
- package/LICENSE +21 -21
- package/android/build.gradle +71 -71
- package/android/src/main/AndroidManifest.xml +3 -3
- package/android/src/main/java/com/jeep/plugin/capacitor/capacitorvideoplayer/CapacitorVideoPlayer.java +71 -71
- package/android/src/main/java/com/jeep/plugin/capacitor/capacitorvideoplayer/CapacitorVideoPlayerPlugin.java +1256 -1256
- package/android/src/main/java/com/jeep/plugin/capacitor/capacitorvideoplayer/FullscreenExoPlayerFragment.java +1591 -1595
- package/android/src/main/java/com/jeep/plugin/capacitor/capacitorvideoplayer/Notifications/MyRunnable.java +21 -21
- package/android/src/main/java/com/jeep/plugin/capacitor/capacitorvideoplayer/Notifications/NotificationCenter.java +61 -61
- package/android/src/main/java/com/jeep/plugin/capacitor/capacitorvideoplayer/PickerVideo/AdapterVideoList.java +47 -47
- package/android/src/main/java/com/jeep/plugin/capacitor/capacitorvideoplayer/PickerVideo/ModelVideo.java +49 -49
- package/android/src/main/java/com/jeep/plugin/capacitor/capacitorvideoplayer/PickerVideo/PickerVideoFragment.java +119 -119
- package/android/src/main/java/com/jeep/plugin/capacitor/capacitorvideoplayer/PickerVideo/VideoRecyclerViewHolder.java +65 -65
- package/android/src/main/java/com/jeep/plugin/capacitor/capacitorvideoplayer/Utilities/FilesUtils.java +101 -101
- package/android/src/main/java/com/jeep/plugin/capacitor/capacitorvideoplayer/Utilities/FragmentUtils.java +32 -32
- package/android/src/main/res/drawable/bg_round_rect_white_50.xml +9 -9
- package/android/src/main/res/drawable/bg_rounded_rectangle_white_corner_rounded.xml +10 -10
- package/android/src/main/res/drawable/exo_close_btn.xml +11 -11
- package/android/src/main/res/drawable/gradient_transparent_middle.xml +12 -12
- package/android/src/main/res/drawable/ic_arrow_left.xml +5 -5
- package/android/src/main/res/drawable/ic_baseline_lq.xml +7 -7
- package/android/src/main/res/drawable/ic_exo_icon_fastforward.xml +35 -35
- package/android/src/main/res/drawable/ic_exo_icon_pause.xml +26 -26
- package/android/src/main/res/drawable/ic_exo_icon_play.xml +36 -36
- package/android/src/main/res/drawable/ic_exo_icon_rewind.xml +35 -35
- package/android/src/main/res/drawable/ic_expand.xml +5 -5
- package/android/src/main/res/drawable/ic_fit.xml +5 -5
- package/android/src/main/res/drawable/ic_image_background.xml +12 -12
- package/android/src/main/res/drawable/ic_img_16_9_background.xml +10 -10
- package/android/src/main/res/drawable/ic_img_9_16_background.xml +10 -10
- package/android/src/main/res/drawable/ic_outline_lock.xml +5 -5
- package/android/src/main/res/drawable/ic_outline_lock_open.xml +5 -5
- package/android/src/main/res/drawable/ic_pip_white.xml +5 -5
- package/android/src/main/res/drawable/ic_views.xml +18 -18
- package/android/src/main/res/drawable/ic_zoom.xml +5 -5
- package/android/src/main/res/layout/bridge_layout_main.xml +15 -15
- package/android/src/main/res/layout/exo_playback_control_view.xml +289 -289
- package/android/src/main/res/layout/exoplayer_layout_youtube.xml +361 -361
- package/android/src/main/res/layout/fragment_fs_exoplayer.xml +50 -50
- package/android/src/main/res/layout/fragment_picker_video.xml +21 -21
- package/android/src/main/res/layout/row_video.xml +76 -76
- package/android/src/main/res/values/colors.xml +14 -14
- package/android/src/main/res/values/strings.xml +3 -3
- package/android/src/main/res/values/styles.xml +3 -3
- package/dist/docs.json +14 -14
- package/ios/Plugin/CapacitorVideoPlayer.swift +63 -63
- package/ios/Plugin/CapacitorVideoPlayerPlugin.h +10 -10
- package/ios/Plugin/CapacitorVideoPlayerPlugin.m +22 -22
- package/ios/Plugin/CapacitorVideoPlayerPlugin.swift +631 -631
- package/ios/Plugin/Extensions/CapacitorVideoPlayerPlugin.AVPlayerViewController.swift +59 -59
- package/ios/Plugin/Extensions/CapacitorVideoPlayerPlugin.File.swift +126 -126
- package/ios/Plugin/Extensions/CapacitorVideoPlayerPlugin.Fullscreen.swift +94 -94
- package/ios/Plugin/Extensions/CapacitorVideoPlayerPlugin.Notifications.swift +140 -140
- package/ios/Plugin/Extensions/CapacitorVideoPlayerPlugin.Observers.swift +180 -180
- package/ios/Plugin/Info.plist +24 -24
- package/ios/Plugin/VideoPicker/VideoHelper.swift +127 -127
- package/ios/Plugin/VideoPicker/VideoPickerViewController.swift +144 -144
- package/ios/Plugin/VideoPlayer/Extensions/AVURLAsset.swift +18 -18
- package/ios/Plugin/VideoPlayer/Extensions/AllOrientationAVPlayerController.swift +12 -12
- package/ios/Plugin/VideoPlayer/Extensions/CMTime.swift +23 -23
- package/ios/Plugin/VideoPlayer/Extensions/LandscapeAVPlayerController.swift +12 -12
- package/ios/Plugin/VideoPlayer/Extensions/Notification.Name.swift +18 -18
- package/ios/Plugin/VideoPlayer/Extensions/PortraitAVPlayerController.swift +12 -12
- package/ios/Plugin/VideoPlayer/Extensions/View.swift +54 -54
- package/ios/Plugin/VideoPlayer/FullScreenVideoPlayerView.swift +601 -601
- package/ios/Plugin/VideoPlayer/Models/Video.swift +28 -28
- package/ios/Plugin/VideoPlayer/Models/VideoModel.swift +42 -42
- package/package.json +92 -92
- package/readme.md +227 -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
|
+
}
|