You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
114 lines
3.5 KiB
114 lines
3.5 KiB
#import "NativePlugin.h"
|
|
#import "FLNativeView.h"
|
|
#import "PlayerView.h"
|
|
|
|
#import <AVKit/AVKit.h>
|
|
|
|
@interface NativePlugin ()
|
|
|
|
@property(nonatomic, strong) NSMutableArray *_Nonnull pipContentViewArray;
|
|
|
|
@end
|
|
|
|
@implementation NativePlugin
|
|
|
|
+ (void)updateAudioSession {
|
|
AVAudioSession *audioSession = [AVAudioSession sharedInstance];
|
|
NSError *categoryError = nil;
|
|
if (@available(iOS 14.5, *)) {
|
|
[audioSession
|
|
setCategory:AVAudioSessionCategoryPlayback
|
|
mode:AVAudioSessionModeMoviePlayback
|
|
options:
|
|
AVAudioSessionCategoryOptionOverrideMutedMicrophoneInterruption
|
|
error:&categoryError];
|
|
} else {
|
|
// Fallback on earlier versions
|
|
}
|
|
if (categoryError) {
|
|
NSLog(@"Set audio session category error: %@",
|
|
categoryError.localizedDescription);
|
|
}
|
|
NSError *activeError = nil;
|
|
[audioSession setActive:YES error:&activeError];
|
|
if (activeError) {
|
|
NSLog(@"Set audio session active error: %@",
|
|
activeError.localizedDescription);
|
|
}
|
|
}
|
|
|
|
+ (void)registerWithRegistrar:(NSObject<FlutterPluginRegistrar> *)registrar {
|
|
// must call this, otherwise pip will not possible
|
|
// https://github.com/jazzychad/PiPBugDemo
|
|
[NativePlugin updateAudioSession];
|
|
|
|
FlutterMethodChannel *channel =
|
|
[FlutterMethodChannel methodChannelWithName:@"native_plugin"
|
|
binaryMessenger:[registrar messenger]];
|
|
NativePlugin *instance = [[NativePlugin alloc] init];
|
|
|
|
FLNativeViewFactory *factory =
|
|
[[FLNativeViewFactory alloc] initWithMessenger:registrar.messenger];
|
|
[registrar registerViewFactory:factory withId:@"native_view"];
|
|
|
|
[registrar addMethodCallDelegate:instance channel:channel];
|
|
}
|
|
|
|
- (instancetype)init {
|
|
self = [super init];
|
|
if (self) {
|
|
_pipContentViewArray = [NSMutableArray array];
|
|
}
|
|
return self;
|
|
}
|
|
|
|
- (void)handleMethodCall:(FlutterMethodCall *)call
|
|
result:(FlutterResult)result {
|
|
if ([@"getPlatformVersion" isEqualToString:call.method]) {
|
|
result([@"iOS "
|
|
stringByAppendingString:[[UIDevice currentDevice] systemVersion]]);
|
|
} else if ([@"createPipContentView" isEqualToString:call.method]) {
|
|
PlayerView *playerView = [[PlayerView alloc] init];
|
|
|
|
// should control the play state by event of pip, optimize it later
|
|
[playerView play];
|
|
|
|
[self.pipContentViewArray addObject:playerView];
|
|
|
|
result(@((uint64_t)playerView));
|
|
} else if ([@"disposePipContentView" isEqualToString:call.method]) {
|
|
uint64_t viewId = [call.arguments unsignedLongLongValue];
|
|
for (PlayerView *playerView in self.pipContentViewArray) {
|
|
if ((uint64_t)playerView == viewId) {
|
|
[playerView pause];
|
|
[self.pipContentViewArray removeObject:playerView];
|
|
break;
|
|
}
|
|
}
|
|
} else if ([@"updatePipContentView" isEqualToString:call.method]) {
|
|
NSDictionary *data = call.arguments;
|
|
NSString *lang = data[@"lang"];
|
|
NSString *cn = data[@"cn"];
|
|
NSString *en = data[@"en"];
|
|
NSNumber *viewIdNum = data[@"viewId"];
|
|
dispatch_async(dispatch_get_main_queue(), ^{
|
|
if (viewIdNum != nil) {
|
|
uint64_t targetId = viewIdNum.unsignedLongLongValue;
|
|
for (PlayerView *playerView in self.pipContentViewArray) {
|
|
if ((uint64_t)playerView == targetId) {
|
|
[playerView updateWithLang:lang cn:cn en:en];
|
|
break;
|
|
}
|
|
}
|
|
} else {
|
|
PlayerView *playerView = [self.pipContentViewArray lastObject];
|
|
[playerView updateWithLang:lang cn:cn en:en];
|
|
}
|
|
});
|
|
result(nil);
|
|
} else {
|
|
result(FlutterMethodNotImplemented);
|
|
}
|
|
}
|
|
|
|
@end
|
|
|