[IOS] Clean swift file of every space padded lines
This commit is contained in:
parent
002f39181a
commit
2770ab553c
@ -11,31 +11,31 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH
|
|||||||
private var _source:VideoSource?
|
private var _source:VideoSource?
|
||||||
private var _playerBufferEmpty:Bool = true
|
private var _playerBufferEmpty:Bool = true
|
||||||
private var _playerLayer:AVPlayerLayer?
|
private var _playerLayer:AVPlayerLayer?
|
||||||
|
|
||||||
private var _playerViewController:RCTVideoPlayerViewController?
|
private var _playerViewController:RCTVideoPlayerViewController?
|
||||||
private var _videoURL:NSURL?
|
private var _videoURL:NSURL?
|
||||||
|
|
||||||
/* DRM */
|
/* DRM */
|
||||||
private var _drm:DRMParams?
|
private var _drm:DRMParams?
|
||||||
|
|
||||||
private var _localSourceEncryptionKeyScheme:String?
|
private var _localSourceEncryptionKeyScheme:String?
|
||||||
|
|
||||||
/* Required to publish events */
|
/* Required to publish events */
|
||||||
private var _eventDispatcher:RCTEventDispatcher?
|
private var _eventDispatcher:RCTEventDispatcher?
|
||||||
private var _videoLoadStarted:Bool = false
|
private var _videoLoadStarted:Bool = false
|
||||||
|
|
||||||
private var _pendingSeek:Bool = false
|
private var _pendingSeek:Bool = false
|
||||||
private var _pendingSeekTime:Float = 0.0
|
private var _pendingSeekTime:Float = 0.0
|
||||||
private var _lastSeekTime:Float = 0.0
|
private var _lastSeekTime:Float = 0.0
|
||||||
|
|
||||||
/* For sending videoProgress events */
|
/* For sending videoProgress events */
|
||||||
private var _controls:Bool = false
|
private var _controls:Bool = false
|
||||||
|
|
||||||
/* Keep track of any modifiers, need to be applied after each play */
|
/* Keep track of any modifiers, need to be applied after each play */
|
||||||
private var _volume:Float = 1.0
|
private var _volume:Float = 1.0
|
||||||
private var _rate:Float = 1.0
|
private var _rate:Float = 1.0
|
||||||
private var _maxBitRate:Float?
|
private var _maxBitRate:Float?
|
||||||
|
|
||||||
private var _automaticallyWaitsToMinimizeStalling:Bool = true
|
private var _automaticallyWaitsToMinimizeStalling:Bool = true
|
||||||
private var _muted:Bool = false
|
private var _muted:Bool = false
|
||||||
private var _paused:Bool = false
|
private var _paused:Bool = false
|
||||||
@ -59,18 +59,18 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH
|
|||||||
private var _filterName:String!
|
private var _filterName:String!
|
||||||
private var _filterEnabled:Bool = false
|
private var _filterEnabled:Bool = false
|
||||||
private var _presentingViewController:UIViewController?
|
private var _presentingViewController:UIViewController?
|
||||||
|
|
||||||
private var _resouceLoaderDelegate: RCTResourceLoaderDelegate?
|
private var _resouceLoaderDelegate: RCTResourceLoaderDelegate?
|
||||||
private var _playerObserver: RCTPlayerObserver = RCTPlayerObserver()
|
private var _playerObserver: RCTPlayerObserver = RCTPlayerObserver()
|
||||||
|
|
||||||
#if canImport(RCTVideoCache)
|
#if canImport(RCTVideoCache)
|
||||||
private let _videoCache:RCTVideoCachingHandler = RCTVideoCachingHandler()
|
private let _videoCache:RCTVideoCachingHandler = RCTVideoCachingHandler()
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if TARGET_OS_IOS
|
#if TARGET_OS_IOS
|
||||||
private let _pip:RCTPictureInPicture = RCTPictureInPicture(self.onPictureInPictureStatusChanged, self.onRestoreUserInterfaceForPictureInPictureStop)
|
private let _pip:RCTPictureInPicture = RCTPictureInPicture(self.onPictureInPictureStatusChanged, self.onRestoreUserInterfaceForPictureInPictureStop)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Events
|
// Events
|
||||||
@objc var onVideoLoadStart: RCTDirectEventBlock?
|
@objc var onVideoLoadStart: RCTDirectEventBlock?
|
||||||
@objc var onVideoLoad: RCTDirectEventBlock?
|
@objc var onVideoLoad: RCTDirectEventBlock?
|
||||||
@ -94,33 +94,33 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH
|
|||||||
@objc var onPictureInPictureStatusChanged: RCTDirectEventBlock?
|
@objc var onPictureInPictureStatusChanged: RCTDirectEventBlock?
|
||||||
@objc var onRestoreUserInterfaceForPictureInPictureStop: RCTDirectEventBlock?
|
@objc var onRestoreUserInterfaceForPictureInPictureStop: RCTDirectEventBlock?
|
||||||
@objc var onGetLicense: RCTDirectEventBlock?
|
@objc var onGetLicense: RCTDirectEventBlock?
|
||||||
|
|
||||||
init(eventDispatcher:RCTEventDispatcher!) {
|
init(eventDispatcher:RCTEventDispatcher!) {
|
||||||
super.init(frame: CGRect(x: 0, y: 0, width: 100, height: 100))
|
super.init(frame: CGRect(x: 0, y: 0, width: 100, height: 100))
|
||||||
|
|
||||||
_eventDispatcher = eventDispatcher
|
_eventDispatcher = eventDispatcher
|
||||||
|
|
||||||
NotificationCenter.default.addObserver(
|
NotificationCenter.default.addObserver(
|
||||||
self,
|
self,
|
||||||
selector: #selector(applicationWillResignActive(notification:)),
|
selector: #selector(applicationWillResignActive(notification:)),
|
||||||
name: UIApplication.willResignActiveNotification,
|
name: UIApplication.willResignActiveNotification,
|
||||||
object: nil
|
object: nil
|
||||||
)
|
)
|
||||||
|
|
||||||
NotificationCenter.default.addObserver(
|
NotificationCenter.default.addObserver(
|
||||||
self,
|
self,
|
||||||
selector: #selector(applicationDidEnterBackground(notification:)),
|
selector: #selector(applicationDidEnterBackground(notification:)),
|
||||||
name: UIApplication.didEnterBackgroundNotification,
|
name: UIApplication.didEnterBackgroundNotification,
|
||||||
object: nil
|
object: nil
|
||||||
)
|
)
|
||||||
|
|
||||||
NotificationCenter.default.addObserver(
|
NotificationCenter.default.addObserver(
|
||||||
self,
|
self,
|
||||||
selector: #selector(applicationWillEnterForeground(notification:)),
|
selector: #selector(applicationWillEnterForeground(notification:)),
|
||||||
name: UIApplication.willEnterForegroundNotification,
|
name: UIApplication.willEnterForegroundNotification,
|
||||||
object: nil
|
object: nil
|
||||||
)
|
)
|
||||||
|
|
||||||
NotificationCenter.default.addObserver(
|
NotificationCenter.default.addObserver(
|
||||||
self,
|
self,
|
||||||
selector: #selector(audioRouteChanged(notification:)),
|
selector: #selector(audioRouteChanged(notification:)),
|
||||||
@ -132,26 +132,26 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH
|
|||||||
_videoCache.playerItemPrepareText = playerItemPrepareText
|
_videoCache.playerItemPrepareText = playerItemPrepareText
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
required init?(coder aDecoder: NSCoder) {
|
required init?(coder aDecoder: NSCoder) {
|
||||||
super.init(coder: aDecoder)
|
super.init(coder: aDecoder)
|
||||||
}
|
}
|
||||||
|
|
||||||
deinit {
|
deinit {
|
||||||
NotificationCenter.default.removeObserver(self)
|
NotificationCenter.default.removeObserver(self)
|
||||||
self.removePlayerLayer()
|
self.removePlayerLayer()
|
||||||
_playerObserver.clearPlayer()
|
_playerObserver.clearPlayer()
|
||||||
}
|
}
|
||||||
|
|
||||||
// MARK: - App lifecycle handlers
|
// MARK: - App lifecycle handlers
|
||||||
|
|
||||||
@objc func applicationWillResignActive(notification:NSNotification!) {
|
@objc func applicationWillResignActive(notification:NSNotification!) {
|
||||||
if _playInBackground || _playWhenInactive || _paused {return}
|
if _playInBackground || _playWhenInactive || _paused {return}
|
||||||
|
|
||||||
_player?.pause()
|
_player?.pause()
|
||||||
_player?.rate = 0.0
|
_player?.rate = 0.0
|
||||||
}
|
}
|
||||||
|
|
||||||
@objc func applicationDidEnterBackground(notification:NSNotification!) {
|
@objc func applicationDidEnterBackground(notification:NSNotification!) {
|
||||||
if _playInBackground {
|
if _playInBackground {
|
||||||
// Needed to play sound in background. See https://developer.apple.com/library/ios/qa/qa1668/_index.html
|
// Needed to play sound in background. See https://developer.apple.com/library/ios/qa/qa1668/_index.html
|
||||||
@ -159,7 +159,7 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH
|
|||||||
_playerViewController?.player = nil
|
_playerViewController?.player = nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@objc func applicationWillEnterForeground(notification:NSNotification!) {
|
@objc func applicationWillEnterForeground(notification:NSNotification!) {
|
||||||
self.applyModifiers()
|
self.applyModifiers()
|
||||||
if _playInBackground {
|
if _playInBackground {
|
||||||
@ -167,9 +167,9 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH
|
|||||||
_playerViewController?.player = _player
|
_playerViewController?.player = _player
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// MARK: - Audio events
|
// MARK: - Audio events
|
||||||
|
|
||||||
@objc func audioRouteChanged(notification:NSNotification!) {
|
@objc func audioRouteChanged(notification:NSNotification!) {
|
||||||
if let userInfo = notification.userInfo {
|
if let userInfo = notification.userInfo {
|
||||||
let reason:AVAudioSession.RouteChangeReason! = userInfo[AVAudioSessionRouteChangeReasonKey] as? AVAudioSession.RouteChangeReason
|
let reason:AVAudioSession.RouteChangeReason! = userInfo[AVAudioSessionRouteChangeReasonKey] as? AVAudioSession.RouteChangeReason
|
||||||
@ -179,29 +179,29 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// MARK: - Progress
|
// MARK: - Progress
|
||||||
|
|
||||||
func sendProgressUpdate() {
|
func sendProgressUpdate() {
|
||||||
if let video = _player?.currentItem,
|
if let video = _player?.currentItem,
|
||||||
video == nil || video.status != AVPlayerItem.Status.readyToPlay {
|
video == nil || video.status != AVPlayerItem.Status.readyToPlay {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
let playerDuration:CMTime = RCTVideoUtils.playerItemDuration(_player)
|
let playerDuration:CMTime = RCTVideoUtils.playerItemDuration(_player)
|
||||||
if CMTIME_IS_INVALID(playerDuration) {
|
if CMTIME_IS_INVALID(playerDuration) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
let currentTime = _player?.currentTime()
|
let currentTime = _player?.currentTime()
|
||||||
let currentPlaybackTime = _player?.currentItem?.currentDate()
|
let currentPlaybackTime = _player?.currentItem?.currentDate()
|
||||||
let duration = CMTimeGetSeconds(playerDuration)
|
let duration = CMTimeGetSeconds(playerDuration)
|
||||||
let currentTimeSecs = CMTimeGetSeconds(currentTime ?? .zero)
|
let currentTimeSecs = CMTimeGetSeconds(currentTime ?? .zero)
|
||||||
|
|
||||||
NotificationCenter.default.post(name: NSNotification.Name("RCTVideo_progress"), object: nil, userInfo: [
|
NotificationCenter.default.post(name: NSNotification.Name("RCTVideo_progress"), object: nil, userInfo: [
|
||||||
"progress": NSNumber(value: currentTimeSecs / duration)
|
"progress": NSNumber(value: currentTimeSecs / duration)
|
||||||
])
|
])
|
||||||
|
|
||||||
if currentTimeSecs >= 0 {
|
if currentTimeSecs >= 0 {
|
||||||
onVideoProgress?([
|
onVideoProgress?([
|
||||||
"currentTime": NSNumber(value: Float(currentTimeSecs)),
|
"currentTime": NSNumber(value: Float(currentTimeSecs)),
|
||||||
@ -213,9 +213,9 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH
|
|||||||
])
|
])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// MARK: - Player and source
|
// MARK: - Player and source
|
||||||
|
|
||||||
@objc
|
@objc
|
||||||
func setSrc(_ source:NSDictionary!) {
|
func setSrc(_ source:NSDictionary!) {
|
||||||
_source = VideoSource(source)
|
_source = VideoSource(source)
|
||||||
@ -228,7 +228,7 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH
|
|||||||
removePlayerLayer()
|
removePlayerLayer()
|
||||||
_playerObserver.player = nil
|
_playerObserver.player = nil
|
||||||
_playerObserver.playerItem = nil
|
_playerObserver.playerItem = nil
|
||||||
|
|
||||||
// perform on next run loop, otherwise other passed react-props may not be set
|
// perform on next run loop, otherwise other passed react-props may not be set
|
||||||
RCTVideoUtils.delay()
|
RCTVideoUtils.delay()
|
||||||
.then{ [weak self] in
|
.then{ [weak self] in
|
||||||
@ -250,13 +250,13 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH
|
|||||||
DebugLog("Could not find video URL in source '\(self._source)'")
|
DebugLog("Could not find video URL in source '\(self._source)'")
|
||||||
throw NSError(domain: "", code: 0, userInfo: nil)
|
throw NSError(domain: "", code: 0, userInfo: nil)
|
||||||
}
|
}
|
||||||
|
|
||||||
#if canImport(RCTVideoCache)
|
#if canImport(RCTVideoCache)
|
||||||
if self._videoCache.shouldCache(source:source, textTracks:self._textTracks) {
|
if self._videoCache.shouldCache(source:source, textTracks:self._textTracks) {
|
||||||
return self._videoCache.playerItemForSourceUsingCache(uri: source.uri, assetOptions:assetOptions)
|
return self._videoCache.playerItemForSourceUsingCache(uri: source.uri, assetOptions:assetOptions)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if self._drm != nil || self._localSourceEncryptionKeyScheme != nil {
|
if self._drm != nil || self._localSourceEncryptionKeyScheme != nil {
|
||||||
self._resouceLoaderDelegate = RCTResourceLoaderDelegate(
|
self._resouceLoaderDelegate = RCTResourceLoaderDelegate(
|
||||||
asset: asset,
|
asset: asset,
|
||||||
@ -270,7 +270,7 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH
|
|||||||
return Promise{self.playerItemPrepareText(asset: asset, assetOptions:assetOptions)}
|
return Promise{self.playerItemPrepareText(asset: asset, assetOptions:assetOptions)}
|
||||||
}.then{[weak self] (playerItem:AVPlayerItem!) in
|
}.then{[weak self] (playerItem:AVPlayerItem!) in
|
||||||
guard let self = self else {throw NSError(domain: "", code: 0, userInfo: nil)}
|
guard let self = self else {throw NSError(domain: "", code: 0, userInfo: nil)}
|
||||||
|
|
||||||
self._player?.pause()
|
self._player?.pause()
|
||||||
self._playerItem = playerItem
|
self._playerItem = playerItem
|
||||||
self._playerObserver.playerItem = self._playerItem
|
self._playerObserver.playerItem = self._playerItem
|
||||||
@ -279,7 +279,7 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH
|
|||||||
if let maxBitRate = self._maxBitRate {
|
if let maxBitRate = self._maxBitRate {
|
||||||
self._playerItem?.preferredPeakBitRate = Double(maxBitRate)
|
self._playerItem?.preferredPeakBitRate = Double(maxBitRate)
|
||||||
}
|
}
|
||||||
|
|
||||||
self._player = self._player ?? AVPlayer()
|
self._player = self._player ?? AVPlayer()
|
||||||
DispatchQueue.global(qos: .default).async {
|
DispatchQueue.global(qos: .default).async {
|
||||||
self._player?.replaceCurrentItem(with: playerItem)
|
self._player?.replaceCurrentItem(with: playerItem)
|
||||||
@ -287,11 +287,11 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH
|
|||||||
self._playerObserver.player = self._player
|
self._playerObserver.player = self._player
|
||||||
self.applyModifiers()
|
self.applyModifiers()
|
||||||
self._player?.actionAtItemEnd = .none
|
self._player?.actionAtItemEnd = .none
|
||||||
|
|
||||||
if #available(iOS 10.0, *) {
|
if #available(iOS 10.0, *) {
|
||||||
self.setAutomaticallyWaitsToMinimizeStalling(self._automaticallyWaitsToMinimizeStalling)
|
self.setAutomaticallyWaitsToMinimizeStalling(self._automaticallyWaitsToMinimizeStalling)
|
||||||
}
|
}
|
||||||
|
|
||||||
//Perform on next run loop, otherwise onVideoLoadStart is nil
|
//Perform on next run loop, otherwise onVideoLoadStart is nil
|
||||||
self.onVideoLoadStart?([
|
self.onVideoLoadStart?([
|
||||||
"src": [
|
"src": [
|
||||||
@ -305,22 +305,22 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH
|
|||||||
}.catch{_ in }
|
}.catch{_ in }
|
||||||
_videoLoadStarted = true
|
_videoLoadStarted = true
|
||||||
}
|
}
|
||||||
|
|
||||||
@objc
|
@objc
|
||||||
func setDrm(_ drm:NSDictionary) {
|
func setDrm(_ drm:NSDictionary) {
|
||||||
_drm = DRMParams(drm)
|
_drm = DRMParams(drm)
|
||||||
}
|
}
|
||||||
|
|
||||||
@objc
|
@objc
|
||||||
func setLocalSourceEncryptionKeyScheme(_ keyScheme:String) {
|
func setLocalSourceEncryptionKeyScheme(_ keyScheme:String) {
|
||||||
_localSourceEncryptionKeyScheme = keyScheme
|
_localSourceEncryptionKeyScheme = keyScheme
|
||||||
}
|
}
|
||||||
|
|
||||||
func playerItemPrepareText(asset:AVAsset!, assetOptions:NSDictionary?) -> AVPlayerItem {
|
func playerItemPrepareText(asset:AVAsset!, assetOptions:NSDictionary?) -> AVPlayerItem {
|
||||||
if (_textTracks == nil) || _textTracks?.count==0 {
|
if (_textTracks == nil) || _textTracks?.count==0 {
|
||||||
return AVPlayerItem(asset: asset)
|
return AVPlayerItem(asset: asset)
|
||||||
}
|
}
|
||||||
|
|
||||||
// AVPlayer can't airplay AVMutableCompositions
|
// AVPlayer can't airplay AVMutableCompositions
|
||||||
_allowsExternalPlayback = false
|
_allowsExternalPlayback = false
|
||||||
let mixComposition = RCTVideoUtils.generateMixComposition(asset)
|
let mixComposition = RCTVideoUtils.generateMixComposition(asset)
|
||||||
@ -332,12 +332,12 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH
|
|||||||
if validTextTracks.count != _textTracks?.count {
|
if validTextTracks.count != _textTracks?.count {
|
||||||
setTextTracks(validTextTracks)
|
setTextTracks(validTextTracks)
|
||||||
}
|
}
|
||||||
|
|
||||||
return AVPlayerItem(asset: mixComposition)
|
return AVPlayerItem(asset: mixComposition)
|
||||||
}
|
}
|
||||||
|
|
||||||
// MARK: - Prop setters
|
// MARK: - Prop setters
|
||||||
|
|
||||||
@objc
|
@objc
|
||||||
func setResizeMode(_ mode: String?) {
|
func setResizeMode(_ mode: String?) {
|
||||||
if _controls {
|
if _controls {
|
||||||
@ -347,56 +347,56 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH
|
|||||||
}
|
}
|
||||||
_resizeMode = mode
|
_resizeMode = mode
|
||||||
}
|
}
|
||||||
|
|
||||||
@objc
|
@objc
|
||||||
func setPlayInBackground(_ playInBackground:Bool) {
|
func setPlayInBackground(_ playInBackground:Bool) {
|
||||||
_playInBackground = playInBackground
|
_playInBackground = playInBackground
|
||||||
}
|
}
|
||||||
|
|
||||||
@objc
|
@objc
|
||||||
func setPreventsDisplaySleepDuringVideoPlayback(_ preventsDisplaySleepDuringVideoPlayback:Bool) {
|
func setPreventsDisplaySleepDuringVideoPlayback(_ preventsDisplaySleepDuringVideoPlayback:Bool) {
|
||||||
_preventsDisplaySleepDuringVideoPlayback = preventsDisplaySleepDuringVideoPlayback
|
_preventsDisplaySleepDuringVideoPlayback = preventsDisplaySleepDuringVideoPlayback
|
||||||
self.applyModifiers()
|
self.applyModifiers()
|
||||||
}
|
}
|
||||||
|
|
||||||
@objc
|
@objc
|
||||||
func setAllowsExternalPlayback(_ allowsExternalPlayback:Bool) {
|
func setAllowsExternalPlayback(_ allowsExternalPlayback:Bool) {
|
||||||
_allowsExternalPlayback = allowsExternalPlayback
|
_allowsExternalPlayback = allowsExternalPlayback
|
||||||
_player?.allowsExternalPlayback = _allowsExternalPlayback
|
_player?.allowsExternalPlayback = _allowsExternalPlayback
|
||||||
}
|
}
|
||||||
|
|
||||||
@objc
|
@objc
|
||||||
func setPlayWhenInactive(_ playWhenInactive:Bool) {
|
func setPlayWhenInactive(_ playWhenInactive:Bool) {
|
||||||
_playWhenInactive = playWhenInactive
|
_playWhenInactive = playWhenInactive
|
||||||
}
|
}
|
||||||
|
|
||||||
@objc
|
@objc
|
||||||
func setPictureInPicture(_ pictureInPicture:Bool) {
|
func setPictureInPicture(_ pictureInPicture:Bool) {
|
||||||
#if TARGET_OS_IOS
|
#if TARGET_OS_IOS
|
||||||
_pip.setPictureInPicture(pictureInPicture)
|
_pip.setPictureInPicture(pictureInPicture)
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@objc
|
@objc
|
||||||
func setRestoreUserInterfaceForPIPStopCompletionHandler(_ restore:Bool) {
|
func setRestoreUserInterfaceForPIPStopCompletionHandler(_ restore:Bool) {
|
||||||
#if TARGET_OS_IOS
|
#if TARGET_OS_IOS
|
||||||
_pip.setRestoreUserInterfaceForPIPStopCompletionHandler(restore)
|
_pip.setRestoreUserInterfaceForPIPStopCompletionHandler(restore)
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@objc
|
@objc
|
||||||
func setIgnoreSilentSwitch(_ ignoreSilentSwitch:String?) {
|
func setIgnoreSilentSwitch(_ ignoreSilentSwitch:String?) {
|
||||||
_ignoreSilentSwitch = ignoreSilentSwitch
|
_ignoreSilentSwitch = ignoreSilentSwitch
|
||||||
RCTPlayerOperations.configureAudio(ignoreSilentSwitch:_ignoreSilentSwitch, mixWithOthers:_mixWithOthers)
|
RCTPlayerOperations.configureAudio(ignoreSilentSwitch:_ignoreSilentSwitch, mixWithOthers:_mixWithOthers)
|
||||||
applyModifiers()
|
applyModifiers()
|
||||||
}
|
}
|
||||||
|
|
||||||
@objc
|
@objc
|
||||||
func setMixWithOthers(_ mixWithOthers:String?) {
|
func setMixWithOthers(_ mixWithOthers:String?) {
|
||||||
_mixWithOthers = mixWithOthers
|
_mixWithOthers = mixWithOthers
|
||||||
applyModifiers()
|
applyModifiers()
|
||||||
}
|
}
|
||||||
|
|
||||||
@objc
|
@objc
|
||||||
func setPaused(_ paused:Bool) {
|
func setPaused(_ paused:Bool) {
|
||||||
if paused {
|
if paused {
|
||||||
@ -404,7 +404,7 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH
|
|||||||
_player?.rate = 0.0
|
_player?.rate = 0.0
|
||||||
} else {
|
} else {
|
||||||
RCTPlayerOperations.configureAudio(ignoreSilentSwitch:_ignoreSilentSwitch, mixWithOthers:_mixWithOthers)
|
RCTPlayerOperations.configureAudio(ignoreSilentSwitch:_ignoreSilentSwitch, mixWithOthers:_mixWithOthers)
|
||||||
|
|
||||||
if #available(iOS 10.0, *), !_automaticallyWaitsToMinimizeStalling {
|
if #available(iOS 10.0, *), !_automaticallyWaitsToMinimizeStalling {
|
||||||
_player?.playImmediately(atRate: _rate)
|
_player?.playImmediately(atRate: _rate)
|
||||||
} else {
|
} else {
|
||||||
@ -413,10 +413,10 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH
|
|||||||
}
|
}
|
||||||
_player?.rate = _rate
|
_player?.rate = _rate
|
||||||
}
|
}
|
||||||
|
|
||||||
_paused = paused
|
_paused = paused
|
||||||
}
|
}
|
||||||
|
|
||||||
@objc
|
@objc
|
||||||
func setCurrentTime(_ currentTime:Float) {
|
func setCurrentTime(_ currentTime:Float) {
|
||||||
let info:NSDictionary = [
|
let info:NSDictionary = [
|
||||||
@ -425,7 +425,7 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH
|
|||||||
]
|
]
|
||||||
setSeek(info)
|
setSeek(info)
|
||||||
}
|
}
|
||||||
|
|
||||||
@objc
|
@objc
|
||||||
func setSeek(_ info:NSDictionary!) {
|
func setSeek(_ info:NSDictionary!) {
|
||||||
let seekTime:NSNumber! = info["time"] as! NSNumber
|
let seekTime:NSNumber! = info["time"] as! NSNumber
|
||||||
@ -437,7 +437,7 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
let wasPaused = _paused
|
let wasPaused = _paused
|
||||||
|
|
||||||
RCTPlayerOperations.seek(
|
RCTPlayerOperations.seek(
|
||||||
player:player,
|
player:player,
|
||||||
playerItem:item,
|
playerItem:item,
|
||||||
@ -446,7 +446,7 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH
|
|||||||
seekTolerance:seekTolerance.floatValue)
|
seekTolerance:seekTolerance.floatValue)
|
||||||
.then{ [weak self] (finished:Bool) in
|
.then{ [weak self] (finished:Bool) in
|
||||||
guard let self = self else { return }
|
guard let self = self else { return }
|
||||||
|
|
||||||
self._playerObserver.addTimeObserverIfNotSet()
|
self._playerObserver.addTimeObserverIfNotSet()
|
||||||
if !wasPaused {
|
if !wasPaused {
|
||||||
self.setPaused(false)
|
self.setPaused(false)
|
||||||
@ -455,34 +455,34 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH
|
|||||||
"seekTime": seekTime,
|
"seekTime": seekTime,
|
||||||
"target": self.reactTag])
|
"target": self.reactTag])
|
||||||
}.catch{_ in }
|
}.catch{_ in }
|
||||||
|
|
||||||
_pendingSeek = false
|
_pendingSeek = false
|
||||||
}
|
}
|
||||||
|
|
||||||
@objc
|
@objc
|
||||||
func setRate(_ rate:Float) {
|
func setRate(_ rate:Float) {
|
||||||
_rate = rate
|
_rate = rate
|
||||||
applyModifiers()
|
applyModifiers()
|
||||||
}
|
}
|
||||||
|
|
||||||
@objc
|
@objc
|
||||||
func setMuted(_ muted:Bool) {
|
func setMuted(_ muted:Bool) {
|
||||||
_muted = muted
|
_muted = muted
|
||||||
applyModifiers()
|
applyModifiers()
|
||||||
}
|
}
|
||||||
|
|
||||||
@objc
|
@objc
|
||||||
func setVolume(_ volume:Float) {
|
func setVolume(_ volume:Float) {
|
||||||
_volume = volume
|
_volume = volume
|
||||||
applyModifiers()
|
applyModifiers()
|
||||||
}
|
}
|
||||||
|
|
||||||
@objc
|
@objc
|
||||||
func setMaxBitRate(_ maxBitRate:Float) {
|
func setMaxBitRate(_ maxBitRate:Float) {
|
||||||
_maxBitRate = maxBitRate
|
_maxBitRate = maxBitRate
|
||||||
_playerItem?.preferredPeakBitRate = Double(maxBitRate)
|
_playerItem?.preferredPeakBitRate = Double(maxBitRate)
|
||||||
}
|
}
|
||||||
|
|
||||||
@objc
|
@objc
|
||||||
func setPreferredForwardBufferDuration(_ preferredForwardBufferDuration:Float) {
|
func setPreferredForwardBufferDuration(_ preferredForwardBufferDuration:Float) {
|
||||||
_preferredForwardBufferDuration = preferredForwardBufferDuration
|
_preferredForwardBufferDuration = preferredForwardBufferDuration
|
||||||
@ -492,7 +492,7 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH
|
|||||||
// Fallback on earlier versions
|
// Fallback on earlier versions
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@objc
|
@objc
|
||||||
func setAutomaticallyWaitsToMinimizeStalling(_ waits:Bool) {
|
func setAutomaticallyWaitsToMinimizeStalling(_ waits:Bool) {
|
||||||
_automaticallyWaitsToMinimizeStalling = waits
|
_automaticallyWaitsToMinimizeStalling = waits
|
||||||
@ -502,8 +502,8 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH
|
|||||||
// Fallback on earlier versions
|
// Fallback on earlier versions
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
func applyModifiers() {
|
func applyModifiers() {
|
||||||
if _muted {
|
if _muted {
|
||||||
if !_controls {
|
if !_controls {
|
||||||
@ -514,17 +514,17 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH
|
|||||||
_player?.volume = _volume
|
_player?.volume = _volume
|
||||||
_player?.isMuted = false
|
_player?.isMuted = false
|
||||||
}
|
}
|
||||||
|
|
||||||
if #available(iOS 12.0, *) {
|
if #available(iOS 12.0, *) {
|
||||||
_player?.preventsDisplaySleepDuringVideoPlayback = _preventsDisplaySleepDuringVideoPlayback
|
_player?.preventsDisplaySleepDuringVideoPlayback = _preventsDisplaySleepDuringVideoPlayback
|
||||||
} else {
|
} else {
|
||||||
// Fallback on earlier versions
|
// Fallback on earlier versions
|
||||||
}
|
}
|
||||||
|
|
||||||
if let _maxBitRate = _maxBitRate {
|
if let _maxBitRate = _maxBitRate {
|
||||||
setMaxBitRate(_maxBitRate)
|
setMaxBitRate(_maxBitRate)
|
||||||
}
|
}
|
||||||
|
|
||||||
setSelectedAudioTrack(_selectedAudioTrackCriteria)
|
setSelectedAudioTrack(_selectedAudioTrackCriteria)
|
||||||
setSelectedTextTrack(_selectedTextTrackCriteria)
|
setSelectedTextTrack(_selectedTextTrackCriteria)
|
||||||
setResizeMode(_resizeMode)
|
setResizeMode(_resizeMode)
|
||||||
@ -533,30 +533,30 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH
|
|||||||
setPaused(_paused)
|
setPaused(_paused)
|
||||||
setAllowsExternalPlayback(_allowsExternalPlayback)
|
setAllowsExternalPlayback(_allowsExternalPlayback)
|
||||||
}
|
}
|
||||||
|
|
||||||
@objc
|
@objc
|
||||||
func setRepeat(_ `repeat`: Bool) {
|
func setRepeat(_ `repeat`: Bool) {
|
||||||
_repeat = `repeat`
|
_repeat = `repeat`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@objc
|
@objc
|
||||||
func setSelectedAudioTrack(_ selectedAudioTrack:NSDictionary?) {
|
func setSelectedAudioTrack(_ selectedAudioTrack:NSDictionary?) {
|
||||||
setSelectedAudioTrack(SelectedTrackCriteria(selectedAudioTrack))
|
setSelectedAudioTrack(SelectedTrackCriteria(selectedAudioTrack))
|
||||||
}
|
}
|
||||||
|
|
||||||
func setSelectedAudioTrack(_ selectedAudioTrack:SelectedTrackCriteria?) {
|
func setSelectedAudioTrack(_ selectedAudioTrack:SelectedTrackCriteria?) {
|
||||||
_selectedAudioTrackCriteria = selectedAudioTrack
|
_selectedAudioTrackCriteria = selectedAudioTrack
|
||||||
RCTPlayerOperations.setMediaSelectionTrackForCharacteristic(player:_player, characteristic: AVMediaCharacteristic.audible,
|
RCTPlayerOperations.setMediaSelectionTrackForCharacteristic(player:_player, characteristic: AVMediaCharacteristic.audible,
|
||||||
criteria:_selectedAudioTrackCriteria)
|
criteria:_selectedAudioTrackCriteria)
|
||||||
}
|
}
|
||||||
|
|
||||||
@objc
|
@objc
|
||||||
func setSelectedTextTrack(_ selectedTextTrack:NSDictionary?) {
|
func setSelectedTextTrack(_ selectedTextTrack:NSDictionary?) {
|
||||||
setSelectedTextTrack(SelectedTrackCriteria(selectedTextTrack))
|
setSelectedTextTrack(SelectedTrackCriteria(selectedTextTrack))
|
||||||
}
|
}
|
||||||
|
|
||||||
func setSelectedTextTrack(_ selectedTextTrack:SelectedTrackCriteria?) {
|
func setSelectedTextTrack(_ selectedTextTrack:SelectedTrackCriteria?) {
|
||||||
_selectedTextTrackCriteria = selectedTextTrack
|
_selectedTextTrackCriteria = selectedTextTrack
|
||||||
if (_textTracks != nil) { // sideloaded text tracks
|
if (_textTracks != nil) { // sideloaded text tracks
|
||||||
@ -566,19 +566,19 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH
|
|||||||
criteria:_selectedTextTrackCriteria)
|
criteria:_selectedTextTrackCriteria)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@objc
|
@objc
|
||||||
func setTextTracks(_ textTracks:[NSDictionary]?) {
|
func setTextTracks(_ textTracks:[NSDictionary]?) {
|
||||||
setTextTracks(textTracks?.map { TextTrack($0) })
|
setTextTracks(textTracks?.map { TextTrack($0) })
|
||||||
}
|
}
|
||||||
|
|
||||||
func setTextTracks(_ textTracks:[TextTrack]?) {
|
func setTextTracks(_ textTracks:[TextTrack]?) {
|
||||||
_textTracks = textTracks
|
_textTracks = textTracks
|
||||||
|
|
||||||
// in case textTracks was set after selectedTextTrack
|
// in case textTracks was set after selectedTextTrack
|
||||||
if (_selectedTextTrackCriteria != nil) {setSelectedTextTrack(_selectedTextTrackCriteria)}
|
if (_selectedTextTrackCriteria != nil) {setSelectedTextTrack(_selectedTextTrackCriteria)}
|
||||||
}
|
}
|
||||||
|
|
||||||
@objc
|
@objc
|
||||||
func setFullscreen(_ fullscreen:Bool) {
|
func setFullscreen(_ fullscreen:Bool) {
|
||||||
if fullscreen && !_fullscreenPlayerPresented && _player != nil {
|
if fullscreen && !_fullscreenPlayerPresented && _player != nil {
|
||||||
@ -586,10 +586,10 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH
|
|||||||
if _playerViewController == nil {
|
if _playerViewController == nil {
|
||||||
self.usePlayerViewController()
|
self.usePlayerViewController()
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set presentation style to fullscreen
|
// Set presentation style to fullscreen
|
||||||
_playerViewController?.modalPresentationStyle = .fullScreen
|
_playerViewController?.modalPresentationStyle = .fullScreen
|
||||||
|
|
||||||
// Find the nearest view controller
|
// Find the nearest view controller
|
||||||
var viewController:UIViewController! = self.firstAvailableUIViewController()
|
var viewController:UIViewController! = self.firstAvailableUIViewController()
|
||||||
if (viewController == nil) {
|
if (viewController == nil) {
|
||||||
@ -602,16 +602,16 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH
|
|||||||
}
|
}
|
||||||
if viewController != nil {
|
if viewController != nil {
|
||||||
_presentingViewController = viewController
|
_presentingViewController = viewController
|
||||||
|
|
||||||
self.onVideoFullscreenPlayerWillPresent?(["target": reactTag as Any])
|
self.onVideoFullscreenPlayerWillPresent?(["target": reactTag as Any])
|
||||||
|
|
||||||
viewController.present(viewController, animated:true, completion:{
|
viewController.present(viewController, animated:true, completion:{
|
||||||
self._playerViewController?.showsPlaybackControls = true
|
self._playerViewController?.showsPlaybackControls = true
|
||||||
self._fullscreenPlayerPresented = fullscreen
|
self._fullscreenPlayerPresented = fullscreen
|
||||||
self._playerViewController?.autorotate = self._fullscreenAutorotate
|
self._playerViewController?.autorotate = self._fullscreenAutorotate
|
||||||
|
|
||||||
self.onVideoFullscreenPlayerDidPresent?(["target": self.reactTag])
|
self.onVideoFullscreenPlayerDidPresent?(["target": self.reactTag])
|
||||||
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
} else if !fullscreen && _fullscreenPlayerPresented, let _playerViewController = _playerViewController {
|
} else if !fullscreen && _fullscreenPlayerPresented, let _playerViewController = _playerViewController {
|
||||||
@ -621,7 +621,7 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@objc
|
@objc
|
||||||
func setFullscreenAutorotate(_ autorotate:Bool) {
|
func setFullscreenAutorotate(_ autorotate:Bool) {
|
||||||
_fullscreenAutorotate = autorotate
|
_fullscreenAutorotate = autorotate
|
||||||
@ -629,7 +629,7 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH
|
|||||||
_playerViewController?.autorotate = autorotate
|
_playerViewController?.autorotate = autorotate
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@objc
|
@objc
|
||||||
func setFullscreenOrientation(_ orientation:String?) {
|
func setFullscreenOrientation(_ orientation:String?) {
|
||||||
_fullscreenOrientation = orientation
|
_fullscreenOrientation = orientation
|
||||||
@ -637,50 +637,50 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH
|
|||||||
_playerViewController?.preferredOrientation = orientation
|
_playerViewController?.preferredOrientation = orientation
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func usePlayerViewController() {
|
func usePlayerViewController() {
|
||||||
guard let _player = _player, let _playerItem = _playerItem else { return }
|
guard let _player = _player, let _playerItem = _playerItem else { return }
|
||||||
|
|
||||||
if _playerViewController == nil {
|
if _playerViewController == nil {
|
||||||
_playerViewController = createPlayerViewController(player:_player, withPlayerItem:_playerItem)
|
_playerViewController = createPlayerViewController(player:_player, withPlayerItem:_playerItem)
|
||||||
}
|
}
|
||||||
// to prevent video from being animated when resizeMode is 'cover'
|
// to prevent video from being animated when resizeMode is 'cover'
|
||||||
// resize mode must be set before subview is added
|
// resize mode must be set before subview is added
|
||||||
setResizeMode(_resizeMode)
|
setResizeMode(_resizeMode)
|
||||||
|
|
||||||
guard let _playerViewController = _playerViewController else { return }
|
guard let _playerViewController = _playerViewController else { return }
|
||||||
|
|
||||||
if _controls {
|
if _controls {
|
||||||
let viewController:UIViewController! = self.reactViewController()
|
let viewController:UIViewController! = self.reactViewController()
|
||||||
viewController.addChild(_playerViewController)
|
viewController.addChild(_playerViewController)
|
||||||
self.addSubview(_playerViewController.view)
|
self.addSubview(_playerViewController.view)
|
||||||
}
|
}
|
||||||
|
|
||||||
_playerObserver.playerViewController = _playerViewController
|
_playerObserver.playerViewController = _playerViewController
|
||||||
}
|
}
|
||||||
|
|
||||||
func createPlayerViewController(player:AVPlayer, withPlayerItem playerItem:AVPlayerItem) -> RCTVideoPlayerViewController {
|
func createPlayerViewController(player:AVPlayer, withPlayerItem playerItem:AVPlayerItem) -> RCTVideoPlayerViewController {
|
||||||
let viewController = RCTVideoPlayerViewController()
|
let viewController = RCTVideoPlayerViewController()
|
||||||
viewController.showsPlaybackControls = true
|
viewController.showsPlaybackControls = true
|
||||||
viewController.rctDelegate = self
|
viewController.rctDelegate = self
|
||||||
viewController.preferredOrientation = _fullscreenOrientation
|
viewController.preferredOrientation = _fullscreenOrientation
|
||||||
|
|
||||||
viewController.view.frame = self.bounds
|
viewController.view.frame = self.bounds
|
||||||
viewController.player = player
|
viewController.player = player
|
||||||
return viewController
|
return viewController
|
||||||
}
|
}
|
||||||
|
|
||||||
func usePlayerLayer() {
|
func usePlayerLayer() {
|
||||||
if let _player = _player {
|
if let _player = _player {
|
||||||
_playerLayer = AVPlayerLayer(player: _player)
|
_playerLayer = AVPlayerLayer(player: _player)
|
||||||
_playerLayer?.frame = self.bounds
|
_playerLayer?.frame = self.bounds
|
||||||
_playerLayer?.needsDisplayOnBoundsChange = true
|
_playerLayer?.needsDisplayOnBoundsChange = true
|
||||||
|
|
||||||
// to prevent video from being animated when resizeMode is 'cover'
|
// to prevent video from being animated when resizeMode is 'cover'
|
||||||
// resize mode must be set before layer is added
|
// resize mode must be set before layer is added
|
||||||
setResizeMode(_resizeMode)
|
setResizeMode(_resizeMode)
|
||||||
_playerObserver.playerLayer = _playerLayer
|
_playerObserver.playerLayer = _playerLayer
|
||||||
|
|
||||||
if let _playerLayer = _playerLayer {
|
if let _playerLayer = _playerLayer {
|
||||||
self.layer.addSublayer(_playerLayer)
|
self.layer.addSublayer(_playerLayer)
|
||||||
}
|
}
|
||||||
@ -690,7 +690,7 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@objc
|
@objc
|
||||||
func setControls(_ controls:Bool) {
|
func setControls(_ controls:Bool) {
|
||||||
if _controls != controls || ((_playerLayer == nil) && (_playerViewController == nil))
|
if _controls != controls || ((_playerLayer == nil) && (_playerViewController == nil))
|
||||||
@ -711,29 +711,29 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@objc
|
@objc
|
||||||
func setProgressUpdateInterval(_ progressUpdateInterval:Float) {
|
func setProgressUpdateInterval(_ progressUpdateInterval:Float) {
|
||||||
_playerObserver.replaceTimeObserverIfSet(Float64(progressUpdateInterval))
|
_playerObserver.replaceTimeObserverIfSet(Float64(progressUpdateInterval))
|
||||||
}
|
}
|
||||||
|
|
||||||
func removePlayerLayer() {
|
func removePlayerLayer() {
|
||||||
_resouceLoaderDelegate = nil
|
_resouceLoaderDelegate = nil
|
||||||
_playerLayer?.removeFromSuperlayer()
|
_playerLayer?.removeFromSuperlayer()
|
||||||
_playerLayer = nil
|
_playerLayer = nil
|
||||||
_playerObserver.playerLayer = nil
|
_playerObserver.playerLayer = nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// MARK: - RCTVideoPlayerViewControllerDelegate
|
// MARK: - RCTVideoPlayerViewControllerDelegate
|
||||||
|
|
||||||
func videoPlayerViewControllerWillDismiss(playerViewController:AVPlayerViewController) {
|
func videoPlayerViewControllerWillDismiss(playerViewController:AVPlayerViewController) {
|
||||||
if _playerViewController == playerViewController && _fullscreenPlayerPresented, let onVideoFullscreenPlayerWillDismiss = onVideoFullscreenPlayerWillDismiss {
|
if _playerViewController == playerViewController && _fullscreenPlayerPresented, let onVideoFullscreenPlayerWillDismiss = onVideoFullscreenPlayerWillDismiss {
|
||||||
_playerObserver.removePlayerViewControllerObservers()
|
_playerObserver.removePlayerViewControllerObservers()
|
||||||
onVideoFullscreenPlayerWillDismiss(["target": reactTag as Any])
|
onVideoFullscreenPlayerWillDismiss(["target": reactTag as Any])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
func videoPlayerViewControllerDidDismiss(playerViewController:AVPlayerViewController) {
|
func videoPlayerViewControllerDidDismiss(playerViewController:AVPlayerViewController) {
|
||||||
if _playerViewController == playerViewController && _fullscreenPlayerPresented {
|
if _playerViewController == playerViewController && _fullscreenPlayerPresented {
|
||||||
_fullscreenPlayerPresented = false
|
_fullscreenPlayerPresented = false
|
||||||
@ -741,15 +741,15 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH
|
|||||||
_playerViewController = nil
|
_playerViewController = nil
|
||||||
_playerObserver.playerViewController = nil
|
_playerObserver.playerViewController = nil
|
||||||
self.applyModifiers()
|
self.applyModifiers()
|
||||||
|
|
||||||
onVideoFullscreenPlayerDidDismiss?(["target": reactTag as Any])
|
onVideoFullscreenPlayerDidDismiss?(["target": reactTag as Any])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@objc
|
@objc
|
||||||
func setFilter(_ filterName:String!) {
|
func setFilter(_ filterName:String!) {
|
||||||
_filterName = filterName
|
_filterName = filterName
|
||||||
|
|
||||||
if !_filterEnabled {
|
if !_filterEnabled {
|
||||||
return
|
return
|
||||||
} else if let uri = _source?.uri, uri.contains("m3u8") {
|
} else if let uri = _source?.uri, uri.contains("m3u8") {
|
||||||
@ -757,7 +757,7 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH
|
|||||||
} else if _playerItem?.asset == nil {
|
} else if _playerItem?.asset == nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
let filter:CIFilter! = CIFilter(name: filterName)
|
let filter:CIFilter! = CIFilter(name: filterName)
|
||||||
if #available(iOS 9.0, *), let _playerItem = _playerItem {
|
if #available(iOS 9.0, *), let _playerItem = _playerItem {
|
||||||
self._playerItem?.videoComposition = AVVideoComposition(
|
self._playerItem?.videoComposition = AVVideoComposition(
|
||||||
@ -776,21 +776,21 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH
|
|||||||
// Fallback on earlier versions
|
// Fallback on earlier versions
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@objc
|
@objc
|
||||||
func setFilterEnabled(_ filterEnabled:Bool) {
|
func setFilterEnabled(_ filterEnabled:Bool) {
|
||||||
_filterEnabled = filterEnabled
|
_filterEnabled = filterEnabled
|
||||||
}
|
}
|
||||||
|
|
||||||
// MARK: - React View Management
|
// MARK: - React View Management
|
||||||
|
|
||||||
func insertReactSubview(view:UIView!, atIndex:Int) {
|
func insertReactSubview(view:UIView!, atIndex:Int) {
|
||||||
// We are early in the game and somebody wants to set a subview.
|
// We are early in the game and somebody wants to set a subview.
|
||||||
// That can only be in the context of playerViewController.
|
// That can only be in the context of playerViewController.
|
||||||
if !_controls && (_playerLayer == nil) && (_playerViewController == nil) {
|
if !_controls && (_playerLayer == nil) && (_playerViewController == nil) {
|
||||||
setControls(true)
|
setControls(true)
|
||||||
}
|
}
|
||||||
|
|
||||||
if _controls {
|
if _controls {
|
||||||
view.frame = self.bounds
|
view.frame = self.bounds
|
||||||
_playerViewController?.contentOverlayView?.insertSubview(view, at:atIndex)
|
_playerViewController?.contentOverlayView?.insertSubview(view, at:atIndex)
|
||||||
@ -799,7 +799,7 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH
|
|||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func removeReactSubview(subview:UIView!) {
|
func removeReactSubview(subview:UIView!) {
|
||||||
if _controls {
|
if _controls {
|
||||||
subview.removeFromSuperview()
|
subview.removeFromSuperview()
|
||||||
@ -808,12 +808,12 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH
|
|||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
override func layoutSubviews() {
|
override func layoutSubviews() {
|
||||||
super.layoutSubviews()
|
super.layoutSubviews()
|
||||||
if _controls, let _playerViewController = _playerViewController {
|
if _controls, let _playerViewController = _playerViewController {
|
||||||
_playerViewController.view.frame = bounds
|
_playerViewController.view.frame = bounds
|
||||||
|
|
||||||
// also adjust all subviews of contentOverlayView
|
// also adjust all subviews of contentOverlayView
|
||||||
for subview in _playerViewController.contentOverlayView?.subviews ?? [] {
|
for subview in _playerViewController.contentOverlayView?.subviews ?? [] {
|
||||||
subview.frame = bounds
|
subview.frame = bounds
|
||||||
@ -825,16 +825,16 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH
|
|||||||
CATransaction.commit()
|
CATransaction.commit()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// MARK: - Lifecycle
|
// MARK: - Lifecycle
|
||||||
|
|
||||||
override func removeFromSuperview() {
|
override func removeFromSuperview() {
|
||||||
_player?.pause()
|
_player?.pause()
|
||||||
_player = nil
|
_player = nil
|
||||||
_playerObserver.clearPlayer()
|
_playerObserver.clearPlayer()
|
||||||
|
|
||||||
self.removePlayerLayer()
|
self.removePlayerLayer()
|
||||||
|
|
||||||
if let _playerViewController = _playerViewController {
|
if let _playerViewController = _playerViewController {
|
||||||
_playerViewController.view.removeFromSuperview()
|
_playerViewController.view.removeFromSuperview()
|
||||||
_playerViewController.removeFromParent()
|
_playerViewController.removeFromParent()
|
||||||
@ -843,15 +843,15 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH
|
|||||||
self._playerViewController = nil
|
self._playerViewController = nil
|
||||||
_playerObserver.playerViewController = nil
|
_playerObserver.playerViewController = nil
|
||||||
}
|
}
|
||||||
|
|
||||||
_eventDispatcher = nil
|
_eventDispatcher = nil
|
||||||
NotificationCenter.default.removeObserver(self)
|
NotificationCenter.default.removeObserver(self)
|
||||||
|
|
||||||
super.removeFromSuperview()
|
super.removeFromSuperview()
|
||||||
}
|
}
|
||||||
|
|
||||||
// MARK: - Export
|
// MARK: - Export
|
||||||
|
|
||||||
@objc
|
@objc
|
||||||
func save(options:NSDictionary!, resolve: @escaping RCTPromiseResolveBlock, reject:@escaping RCTPromiseRejectBlock) {
|
func save(options:NSDictionary!, resolve: @escaping RCTPromiseResolveBlock, reject:@escaping RCTPromiseRejectBlock) {
|
||||||
RCTVideoSave.save(
|
RCTVideoSave.save(
|
||||||
@ -861,80 +861,80 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH
|
|||||||
playerItem:_playerItem
|
playerItem:_playerItem
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
func setLicenseResult(_ license:String!) {
|
func setLicenseResult(_ license:String!) {
|
||||||
_resouceLoaderDelegate?.setLicenseResult(license)
|
_resouceLoaderDelegate?.setLicenseResult(license)
|
||||||
}
|
}
|
||||||
|
|
||||||
func setLicenseResultError(_ error:String!) {
|
func setLicenseResultError(_ error:String!) {
|
||||||
_resouceLoaderDelegate?.setLicenseResultError(error)
|
_resouceLoaderDelegate?.setLicenseResultError(error)
|
||||||
}
|
}
|
||||||
|
|
||||||
// MARK: - RCTPlayerObserverHandler
|
// MARK: - RCTPlayerObserverHandler
|
||||||
|
|
||||||
func handleTimeUpdate(time:CMTime) {
|
func handleTimeUpdate(time:CMTime) {
|
||||||
sendProgressUpdate()
|
sendProgressUpdate()
|
||||||
}
|
}
|
||||||
|
|
||||||
func handleReadyForDisplay(changeObject: Any, change:NSKeyValueObservedChange<Bool>) {
|
func handleReadyForDisplay(changeObject: Any, change:NSKeyValueObservedChange<Bool>) {
|
||||||
onReadyForDisplay?([
|
onReadyForDisplay?([
|
||||||
"target": reactTag
|
"target": reactTag
|
||||||
])
|
])
|
||||||
}
|
}
|
||||||
|
|
||||||
// When timeMetadata is read the event onTimedMetadata is triggered
|
// When timeMetadata is read the event onTimedMetadata is triggered
|
||||||
func handleTimeMetadataChange(playerItem:AVPlayerItem, change:NSKeyValueObservedChange<[AVMetadataItem]?>) {
|
func handleTimeMetadataChange(playerItem:AVPlayerItem, change:NSKeyValueObservedChange<[AVMetadataItem]?>) {
|
||||||
guard let newValue = change.newValue, let _items = newValue, _items.count > 0 else {
|
guard let newValue = change.newValue, let _items = newValue, _items.count > 0 else {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
var metadata: [[String:String?]?] = []
|
var metadata: [[String:String?]?] = []
|
||||||
for item in _items {
|
for item in _items {
|
||||||
let value = item.value as? String
|
let value = item.value as? String
|
||||||
let identifier = item.identifier?.rawValue
|
let identifier = item.identifier?.rawValue
|
||||||
|
|
||||||
if let value = value {
|
if let value = value {
|
||||||
metadata.append(["value":value, "identifier":identifier])
|
metadata.append(["value":value, "identifier":identifier])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
onTimedMetadata?([
|
onTimedMetadata?([
|
||||||
"target": reactTag,
|
"target": reactTag,
|
||||||
"metadata": metadata
|
"metadata": metadata
|
||||||
])
|
])
|
||||||
}
|
}
|
||||||
|
|
||||||
// Handle player item status change.
|
// Handle player item status change.
|
||||||
func handlePlayerItemStatusChange(playerItem:AVPlayerItem, change:NSKeyValueObservedChange<AVPlayerItem.Status>) {
|
func handlePlayerItemStatusChange(playerItem:AVPlayerItem, change:NSKeyValueObservedChange<AVPlayerItem.Status>) {
|
||||||
guard let _playerItem = _playerItem else {
|
guard let _playerItem = _playerItem else {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if _playerItem.status == .readyToPlay {
|
if _playerItem.status == .readyToPlay {
|
||||||
handleReadyToPlay()
|
handleReadyToPlay()
|
||||||
} else if _playerItem.status == .failed {
|
} else if _playerItem.status == .failed {
|
||||||
handlePlaybackFailed()
|
handlePlaybackFailed()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func handleReadyToPlay() {
|
func handleReadyToPlay() {
|
||||||
guard let _playerItem = _playerItem else { return }
|
guard let _playerItem = _playerItem else { return }
|
||||||
var duration:Float = Float(CMTimeGetSeconds(_playerItem.asset.duration))
|
var duration:Float = Float(CMTimeGetSeconds(_playerItem.asset.duration))
|
||||||
|
|
||||||
if duration.isNaN {
|
if duration.isNaN {
|
||||||
duration = 0.0
|
duration = 0.0
|
||||||
}
|
}
|
||||||
|
|
||||||
var width: Float? = nil
|
var width: Float? = nil
|
||||||
var height: Float? = nil
|
var height: Float? = nil
|
||||||
var orientation = "undefined"
|
var orientation = "undefined"
|
||||||
|
|
||||||
if _playerItem.asset.tracks(withMediaType: AVMediaType.video).count > 0 {
|
if _playerItem.asset.tracks(withMediaType: AVMediaType.video).count > 0 {
|
||||||
let videoTrack = _playerItem.asset.tracks(withMediaType: .video)[0]
|
let videoTrack = _playerItem.asset.tracks(withMediaType: .video)[0]
|
||||||
width = Float(videoTrack.naturalSize.width)
|
width = Float(videoTrack.naturalSize.width)
|
||||||
height = Float(videoTrack.naturalSize.height)
|
height = Float(videoTrack.naturalSize.height)
|
||||||
let preferredTransform = videoTrack.preferredTransform
|
let preferredTransform = videoTrack.preferredTransform
|
||||||
|
|
||||||
if (videoTrack.naturalSize.width == preferredTransform.tx
|
if (videoTrack.naturalSize.width == preferredTransform.tx
|
||||||
&& videoTrack.naturalSize.height == preferredTransform.ty)
|
&& videoTrack.naturalSize.height == preferredTransform.ty)
|
||||||
|| (preferredTransform.tx == 0 && preferredTransform.ty == 0)
|
|| (preferredTransform.tx == 0 && preferredTransform.ty == 0)
|
||||||
@ -948,12 +948,12 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH
|
|||||||
height = Float(_playerItem.presentationSize.height)
|
height = Float(_playerItem.presentationSize.height)
|
||||||
orientation = _playerItem.presentationSize.width > _playerItem.presentationSize.height ? "landscape" : "portrait"
|
orientation = _playerItem.presentationSize.width > _playerItem.presentationSize.height ? "landscape" : "portrait"
|
||||||
}
|
}
|
||||||
|
|
||||||
if _pendingSeek {
|
if _pendingSeek {
|
||||||
setCurrentTime(_pendingSeekTime)
|
setCurrentTime(_pendingSeekTime)
|
||||||
_pendingSeek = false
|
_pendingSeek = false
|
||||||
}
|
}
|
||||||
|
|
||||||
if _videoLoadStarted {
|
if _videoLoadStarted {
|
||||||
onVideoLoad?(["duration": NSNumber(value: duration),
|
onVideoLoad?(["duration": NSNumber(value: duration),
|
||||||
"currentTime": NSNumber(value: Float(CMTimeGetSeconds(_playerItem.currentTime()))),
|
"currentTime": NSNumber(value: Float(CMTimeGetSeconds(_playerItem.currentTime()))),
|
||||||
@ -976,7 +976,7 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH
|
|||||||
_playerObserver.attachPlayerEventListeners()
|
_playerObserver.attachPlayerEventListeners()
|
||||||
applyModifiers()
|
applyModifiers()
|
||||||
}
|
}
|
||||||
|
|
||||||
func handlePlaybackFailed() {
|
func handlePlaybackFailed() {
|
||||||
guard let _playerItem = _playerItem else { return }
|
guard let _playerItem = _playerItem else { return }
|
||||||
onVideoError?(
|
onVideoError?(
|
||||||
@ -991,12 +991,12 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH
|
|||||||
"target": reactTag
|
"target": reactTag
|
||||||
])
|
])
|
||||||
}
|
}
|
||||||
|
|
||||||
func handlePlaybackBufferKeyEmpty(playerItem:AVPlayerItem, change:NSKeyValueObservedChange<Bool>) {
|
func handlePlaybackBufferKeyEmpty(playerItem:AVPlayerItem, change:NSKeyValueObservedChange<Bool>) {
|
||||||
_playerBufferEmpty = true
|
_playerBufferEmpty = true
|
||||||
onVideoBuffer?(["isBuffering": true, "target": reactTag as Any])
|
onVideoBuffer?(["isBuffering": true, "target": reactTag as Any])
|
||||||
}
|
}
|
||||||
|
|
||||||
// Continue playing (or not if paused) after being paused due to hitting an unbuffered zone.
|
// Continue playing (or not if paused) after being paused due to hitting an unbuffered zone.
|
||||||
func handlePlaybackLikelyToKeepUp(playerItem:AVPlayerItem, change:NSKeyValueObservedChange<Bool>) {
|
func handlePlaybackLikelyToKeepUp(playerItem:AVPlayerItem, change:NSKeyValueObservedChange<Bool>) {
|
||||||
if (!(_controls || _fullscreenPlayerPresented) || _playerBufferEmpty) && ((_playerItem?.isPlaybackLikelyToKeepUp) != nil) {
|
if (!(_controls || _fullscreenPlayerPresented) || _playerBufferEmpty) && ((_playerItem?.isPlaybackLikelyToKeepUp) != nil) {
|
||||||
@ -1005,7 +1005,7 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH
|
|||||||
_playerBufferEmpty = false
|
_playerBufferEmpty = false
|
||||||
onVideoBuffer?(["isBuffering": false, "target": reactTag as Any])
|
onVideoBuffer?(["isBuffering": false, "target": reactTag as Any])
|
||||||
}
|
}
|
||||||
|
|
||||||
func handlePlaybackRateChange(player: AVPlayer, change: NSKeyValueObservedChange<Float>) {
|
func handlePlaybackRateChange(player: AVPlayer, change: NSKeyValueObservedChange<Float>) {
|
||||||
guard let _player = _player else { return }
|
guard let _player = _player else { return }
|
||||||
onPlaybackRateChange?(["playbackRate": NSNumber(value: _player.rate),
|
onPlaybackRateChange?(["playbackRate": NSNumber(value: _player.rate),
|
||||||
@ -1016,26 +1016,26 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH
|
|||||||
_playbackStalled = false
|
_playbackStalled = false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func handleExternalPlaybackActiveChange(player: AVPlayer, change: NSKeyValueObservedChange<Bool>) {
|
func handleExternalPlaybackActiveChange(player: AVPlayer, change: NSKeyValueObservedChange<Bool>) {
|
||||||
guard let _player = _player else { return }
|
guard let _player = _player else { return }
|
||||||
onVideoExternalPlaybackChange?(["isExternalPlaybackActive": NSNumber(value: _player.isExternalPlaybackActive),
|
onVideoExternalPlaybackChange?(["isExternalPlaybackActive": NSNumber(value: _player.isExternalPlaybackActive),
|
||||||
"target": reactTag as Any])
|
"target": reactTag as Any])
|
||||||
}
|
}
|
||||||
|
|
||||||
func handleViewControllerOverlayViewFrameChange(overlayView:UIView, change:NSKeyValueObservedChange<CGRect>) {
|
func handleViewControllerOverlayViewFrameChange(overlayView:UIView, change:NSKeyValueObservedChange<CGRect>) {
|
||||||
let oldRect = change.oldValue
|
let oldRect = change.oldValue
|
||||||
let newRect = change.newValue
|
let newRect = change.newValue
|
||||||
if !oldRect!.equalTo(newRect!) {
|
if !oldRect!.equalTo(newRect!) {
|
||||||
if newRect!.equalTo(UIScreen.main.bounds) {
|
if newRect!.equalTo(UIScreen.main.bounds) {
|
||||||
NSLog("in fullscreen")
|
NSLog("in fullscreen")
|
||||||
|
|
||||||
self.reactViewController().view.frame = UIScreen.main.bounds
|
self.reactViewController().view.frame = UIScreen.main.bounds
|
||||||
self.reactViewController().view.setNeedsLayout()
|
self.reactViewController().view.setNeedsLayout()
|
||||||
} else {NSLog("not fullscreen")}
|
} else {NSLog("not fullscreen")}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@objc func handleDidFailToFinishPlaying(notification:NSNotification!) {
|
@objc func handleDidFailToFinishPlaying(notification:NSNotification!) {
|
||||||
let error:NSError! = notification.userInfo?[AVPlayerItemFailedToPlayToEndTimeErrorKey] as? NSError
|
let error:NSError! = notification.userInfo?[AVPlayerItemFailedToPlayToEndTimeErrorKey] as? NSError
|
||||||
onVideoError?(
|
onVideoError?(
|
||||||
@ -1050,15 +1050,15 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH
|
|||||||
"target": reactTag
|
"target": reactTag
|
||||||
])
|
])
|
||||||
}
|
}
|
||||||
|
|
||||||
@objc func handlePlaybackStalled(notification:NSNotification!) {
|
@objc func handlePlaybackStalled(notification:NSNotification!) {
|
||||||
onPlaybackStalled?(["target": reactTag as Any])
|
onPlaybackStalled?(["target": reactTag as Any])
|
||||||
_playbackStalled = true
|
_playbackStalled = true
|
||||||
}
|
}
|
||||||
|
|
||||||
@objc func handlePlayerItemDidReachEnd(notification:NSNotification!) {
|
@objc func handlePlayerItemDidReachEnd(notification:NSNotification!) {
|
||||||
onVideoEnd?(["target": reactTag as Any])
|
onVideoEnd?(["target": reactTag as Any])
|
||||||
|
|
||||||
if _repeat {
|
if _repeat {
|
||||||
let item:AVPlayerItem! = notification.object as? AVPlayerItem
|
let item:AVPlayerItem! = notification.object as? AVPlayerItem
|
||||||
item.seek(to: CMTime.zero)
|
item.seek(to: CMTime.zero)
|
||||||
@ -1068,7 +1068,7 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH
|
|||||||
_playerObserver.removePlayerTimeObserver()
|
_playerObserver.removePlayerTimeObserver()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//unused
|
//unused
|
||||||
// @objc func handleAVPlayerAccess(notification:NSNotification!) {
|
// @objc func handleAVPlayerAccess(notification:NSNotification!) {
|
||||||
// let accessLog:AVPlayerItemAccessLog! = (notification.object as! AVPlayerItem).accessLog()
|
// let accessLog:AVPlayerItemAccessLog! = (notification.object as! AVPlayerItem).accessLog()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user