Merge pull request #3221 from lrusso/master

Fixing the PIP mode on iOS
This commit is contained in:
Olivier Bouillet
2023-09-04 23:42:01 +02:00
committed by GitHub
2 changed files with 36 additions and 20 deletions

View File

@@ -82,8 +82,8 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH
private let _videoCache:RCTVideoCachingHandler = RCTVideoCachingHandler()
#endif
#if TARGET_OS_IOS
private let _pip:RCTPictureInPicture = RCTPictureInPicture(self.onPictureInPictureStatusChanged, self.onRestoreUserInterfaceForPictureInPictureStop)
#if os(iOS)
private var _pip:RCTPictureInPicture? = nil
#endif
// Events
@@ -110,6 +110,14 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH
@objc var onRestoreUserInterfaceForPictureInPictureStop: RCTDirectEventBlock?
@objc var onGetLicense: RCTDirectEventBlock?
@objc var onReceiveAdEvent: RCTDirectEventBlock?
@objc func _onPictureInPictureStatusChanged() {
onPictureInPictureStatusChanged?([ "isActive": NSNumber(value: true)])
}
@objc func _onRestoreUserInterfaceForPictureInPictureStop() {
onPictureInPictureStatusChanged?([ "isActive": NSNumber(value: false)])
}
init(eventDispatcher:RCTEventDispatcher!) {
super.init(frame: CGRect(x: 0, y: 0, width: 100, height: 100))
@@ -119,6 +127,10 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH
_eventDispatcher = eventDispatcher
#if os(iOS)
_pip = RCTPictureInPicture(self._onPictureInPictureStatusChanged, self._onRestoreUserInterfaceForPictureInPictureStop)
#endif
NotificationCenter.default.addObserver(
self,
selector: #selector(applicationWillResignActive(notification:)),
@@ -175,7 +187,7 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH
}
@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
_playerLayer?.player = nil
_playerViewController?.player = nil
@@ -411,15 +423,21 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH
@objc
func setPictureInPicture(_ pictureInPicture:Bool) {
#if TARGET_OS_IOS
_pip.setPictureInPicture(pictureInPicture)
#if os(iOS)
let audioSession = AVAudioSession.sharedInstance()
do {
try audioSession.setCategory(.playback)
try audioSession.setActive(true, options: [])
} catch {
}
_pip?.setPictureInPicture(pictureInPicture)
#endif
}
@objc
func setRestoreUserInterfaceForPIPStopCompletionHandler(_ restore:Bool) {
#if TARGET_OS_IOS
_pip.setRestoreUserInterfaceForPIPStopCompletionHandler(restore)
#if os(iOS)
_pip?.setRestoreUserInterfaceForPIPStopCompletionHandler(restore)
#endif
}
@@ -753,6 +771,7 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH
viewController.view.frame = self.bounds
viewController.player = player
viewController.allowsPictureInPicturePlayback = true
return viewController
}
@@ -771,8 +790,8 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH
self.layer.addSublayer(_playerLayer)
}
self.layer.needsDisplayOnBoundsChange = true
#if TARGET_OS_IOS
_pip.setupPipController(_playerLayer)
#if os(iOS)
_pip?.setupPipController(_playerLayer)
#endif
}
}