feat: add plugins management (#3909)

This commit is contained in:
Olivier Bouillet
2024-06-25 08:55:32 +02:00
committed by GitHub
parent 3cfb96adb9
commit 91d27a6009
28 changed files with 828 additions and 140 deletions

View File

@@ -0,0 +1,2 @@
#import <React/RCTBridgeModule.h>
#import <React/RCTViewManager.h>

View File

@@ -0,0 +1,14 @@
#import <React/RCTBridgeModule.h>
@interface RCT_EXTERN_MODULE(VideoPluginSample, NSObject)
RCT_EXTERN_METHOD(setMetadata:
withResolver:(RCTPromiseResolveBlock)resolve
withRejecter:(RCTPromiseRejectBlock)reject)
+ (BOOL)requiresMainQueueSetup
{
return YES;
}
@end

View File

@@ -0,0 +1,67 @@
import react_native_video
import AVFoundation
import AVKit
@objc(VideoPluginSample)
class VideoPluginSample: NSObject, RNVPlugin {
private var _playerRateChangeObserver: NSKeyValueObservation?
private var _playerCurrentItemChangeObserver: NSKeyValueObservation?
private var _playerItemStatusObserver: NSKeyValueObservation?
/**
* create an init function to register the plugin
*/
override init() {
super.init()
ReactNativeVideoManager.shared.registerPlugin(plugin: self)
}
@objc(withResolver:withRejecter:)
func setMetadata(resolve:RCTPromiseResolveBlock,reject:RCTPromiseRejectBlock) -> Void {
resolve(true)
}
/*
* Handlers called on player creation and destructon
*/
func onInstanceCreated(id: String, player: Any) {
if player is AVPlayer {
let avPlayer = player as! AVPlayer
NSLog("plug onInstanceCreated")
_playerRateChangeObserver = avPlayer.observe(\.rate, options: [.old], changeHandler: handlePlaybackRateChange)
_playerCurrentItemChangeObserver = avPlayer.observe(\.currentItem, options: [.old], changeHandler: handleCurrentItemChange)
}
}
func onInstanceRemoved(id: String, player: Any) {
if player is AVPlayer {
let avPlayer = player as! AVPlayer
NSLog("plug onInstanceRemoved")
_playerRateChangeObserver?.invalidate()
_playerCurrentItemChangeObserver?.invalidate()
}
}
/**
* custom functions to be able to track AVPlayer state change
*/
func handlePlaybackRateChange(player: AVPlayer, change: NSKeyValueObservedChange<Float>) {
NSLog("plugin: handlePlaybackRateChange \(change.oldValue)")
}
func handlePlayerItemStatusChange(playerItem: AVPlayerItem, change _: NSKeyValueObservedChange<AVPlayerItem.Status>) {
NSLog("plugin: handlePlayerItemStatusChange \(playerItem.status)")
}
func handleCurrentItemChange(player: AVPlayer, change: NSKeyValueObservedChange<AVPlayerItem?>) {
NSLog("plugin: handleCurrentItemChange \(player.currentItem)")
guard let playerItem = player.currentItem else {
_playerItemStatusObserver?.invalidate()
return
}
_playerItemStatusObserver = playerItem.observe(\.status, options: [.new, .old], changeHandler: handlePlayerItemStatusChange)
}
}