[IOS] Clean swift file of every space padded lines

This commit is contained in:
Axel Vencatareddy 2022-11-09 17:26:12 +01:00
parent 002f39181a
commit 2770ab553c

View File

@ -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()