From 65b8763b080270143bb48d4c044f4503af444a47 Mon Sep 17 00:00:00 2001 From: Mitch Ross Date: Thu, 7 May 2020 09:24:39 -0400 Subject: [PATCH 1/6] Swift conversion --- example/ios/Runner.xcodeproj/project.pbxproj | 19 +- .../xcshareddata/WorkspaceSettings.xcsettings | 8 + .../xcshareddata/xcschemes/Runner.xcscheme | 2 +- ios/.gitignore | 1 + ios/Assets/.gitkeep | 0 ios/Classes/FlutterVlcPlayerPlugin.h | 30 -- ios/Classes/FlutterVlcPlayerPlugin.m | 297 +----------------- ios/Classes/SwiftFlutterVlcPlayerPlugin.swift | 283 +++++++++++++++++ ios/flutter_vlc_player.podspec | 18 +- 9 files changed, 329 insertions(+), 329 deletions(-) create mode 100644 example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings mode change 100755 => 100644 ios/.gitignore mode change 100755 => 100644 ios/Assets/.gitkeep mode change 100755 => 100644 ios/Classes/FlutterVlcPlayerPlugin.h mode change 100755 => 100644 ios/Classes/FlutterVlcPlayerPlugin.m create mode 100644 ios/Classes/SwiftFlutterVlcPlayerPlugin.swift mode change 100755 => 100644 ios/flutter_vlc_player.podspec diff --git a/example/ios/Runner.xcodeproj/project.pbxproj b/example/ios/Runner.xcodeproj/project.pbxproj index bfd80962..47d74aef 100755 --- a/example/ios/Runner.xcodeproj/project.pbxproj +++ b/example/ios/Runner.xcodeproj/project.pbxproj @@ -10,7 +10,6 @@ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; 26DF11FAA5F98736591E80F5 /* libPods-Runner.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4F429098B10D1DBF010B1F /* libPods-Runner.a */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; - 9740EEB41CF90195004384FC /* Debug.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 9740EEB21CF90195004384FC /* Debug.xcconfig */; }; 978B8F6F1D3862AE00F588F7 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */; }; 97C146F31CF9000F007C117D /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 97C146F21CF9000F007C117D /* main.m */; }; 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; @@ -167,7 +166,7 @@ 97C146E61CF9000F007C117D /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 0910; + LastUpgradeCheck = 1140; ORGANIZATIONNAME = "The Chromium Authors"; TargetAttributes = { 97C146ED1CF9000F007C117D = { @@ -203,7 +202,6 @@ files = ( 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, - 9740EEB41CF90195004384FC /* Debug.xcconfig in Resources */, 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, ); @@ -316,7 +314,9 @@ isa = XCBuildConfiguration; baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; @@ -326,12 +326,14 @@ CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; @@ -364,6 +366,7 @@ isa = XCBuildConfiguration; baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; @@ -427,7 +430,9 @@ isa = XCBuildConfiguration; baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; @@ -437,12 +442,14 @@ CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; @@ -481,7 +488,9 @@ isa = XCBuildConfiguration; baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; @@ -491,12 +500,14 @@ CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; @@ -529,6 +540,7 @@ isa = XCBuildConfiguration; baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; @@ -626,6 +638,7 @@ isa = XCBuildConfiguration; baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; diff --git a/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 00000000..f9b0d7c5 --- /dev/null +++ b/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + PreviewsEnabled + + + diff --git a/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index ad6250a1..16396c3b 100755 --- a/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -1,6 +1,6 @@ -#import @interface FlutterVlcPlayerPlugin : NSObject @end - -@interface FLTPlayerView : NSObject - -/// View to show video over -@property (nonatomic, strong) UIView *hostedView; -/// Player showing video -@property (nonatomic, strong) VLCMediaPlayer *player; -/// result to comunicate back to Flutter -@property (nonatomic) FlutterResult result; -/// Set to indicate that aspect has been set which is only needed once. -@property (nonatomic, assign) BOOL aspectSet; - - -/// Initialize a new instance with the channel -/// @param methodChannel Method channel for communication from flutter -/// @param eventChannel Event channel for communication back to flutter -+ (instancetype)initWithChannels: (FlutterMethodChannel*) methodChannel andEventChannel:(FlutterEventChannel*) eventChannel; - -@end - -@interface FLTPlayerViewFactory : NSObject -+ (instancetype)initWithRegistrar : (NSObject*)registrar; -@end - -@interface FLTPlayerEventStreamHandler : NSObject - -@property (nonatomic) FlutterEventSink eventSink; - -@end \ No newline at end of file diff --git a/ios/Classes/FlutterVlcPlayerPlugin.m b/ios/Classes/FlutterVlcPlayerPlugin.m old mode 100755 new mode 100644 index 7d120c32..63ec0a27 --- a/ios/Classes/FlutterVlcPlayerPlugin.m +++ b/ios/Classes/FlutterVlcPlayerPlugin.m @@ -1,292 +1,15 @@ -// -// FlutterVlcPlayerPlugin.m -// flutter_vlc_player -// - #import "FlutterVlcPlayerPlugin.h" -#import "VLCMediaPlayer.h" - -@implementation FLTPlayerView - -NSObject *_messenger; - -+ (instancetype)initWithChannels: (FlutterMethodChannel*) methodChannel andEventChannel:(FlutterEventChannel*) eventChannel { - - // Initialize hostedView and set relevant parameters. - FLTPlayerView *instance = [[super alloc] init]; - UIView *hostedView = [[UIView alloc] init]; - hostedView.contentMode = UIViewContentModeScaleAspectFit; - hostedView.backgroundColor = [UIColor blackColor]; - hostedView.clipsToBounds = YES; - hostedView.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth; - instance.hostedView = hostedView; - - // Create event channel handler. - FLTPlayerEventStreamHandler* eventChannelHandler = [[FLTPlayerEventStreamHandler alloc] init]; - [eventChannel setStreamHandler:eventChannelHandler]; - - // Set method channel handler. - [methodChannel setMethodCallHandler:^(FlutterMethodCall * _Nonnull call, FlutterResult _Nonnull result) { - - instance.result = result; - - if([call.method isEqualToString:@"initialize"]) { - - NSString *url = call.arguments[@"url"]; - - VLCMediaPlayer *player = [[VLCMediaPlayer alloc] init]; - player.delegate = eventChannelHandler; - - instance.player = player; - - VLCMedia *media = [VLCMedia mediaWithURL:[NSURL URLWithString:url]]; - player.media = media; - player.position = 0.5; - player.drawable = instance.hostedView; - [player addObserver:instance forKeyPath:@"state" options:NSKeyValueObservingOptionNew context:nil]; - - result(nil); - return; - - } else if ([call.method isEqualToString:@"dispose"]) { - - [instance.player stop]; - return; - - } else if ([call.method isEqualToString:@"changeURL"]) { - - if(instance.player == nil) { - result([FlutterError errorWithCode:@"VLC_NOT_INITIALIZED" - message:@"The player has not yet been initialized." - details:nil]); - - return; - } - - [instance.player stop]; - - NSString *url = call.arguments[@"url"]; - VLCMedia *media = [VLCMedia mediaWithURL:[NSURL URLWithString:url]]; - instance.player.media = media; - - result(nil); - return; - - } else if ([call.method isEqualToString:@"getSnapshot"]) { - - UIView *drawable = instance.player.drawable; - CGSize size = drawable.frame.size; - - UIGraphicsBeginImageContextWithOptions(size, false, 0.0); - - CGRect rec = drawable.frame; - [drawable drawViewHierarchyInRect:rec afterScreenUpdates:false]; - - UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); - UIGraphicsEndImageContext(); - - NSString *byteArray = [UIImagePNGRepresentation(image) base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength]; - result(@{@"snapshot" : byteArray}); - - } else if ([call.method isEqualToString:@"setPlaybackState"]) { - - NSString *playbackState = call.arguments[@"playbackState"]; - - if([playbackState isEqualToString:@"play"]) { - [instance.player play]; - } else if ([playbackState isEqualToString:@"pause"]) { - [instance.player pause]; - } else if ([playbackState isEqualToString:@"stop"]) { - [instance.player stop]; - } - - result(nil); - return; - - } else if ([call.method isEqualToString:@"setPlaybackSpeed"]) { - - NSNumber *playbackSpeed = call.arguments[@"speed"]; - float rate = playbackSpeed.floatValue; - instance.player.rate = rate; - - result(nil); - return; - - } else if ([call.method isEqualToString:@"setTime"]) { - - VLCTime *time = [VLCTime timeWithNumber:call.arguments[@"time"]]; - instance.player.time = time; - - result(nil); - return; - - } - - }]; - - return instance; - -} - -- (nonnull UIView *)view { - return self.hostedView; -} - --(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{ - - // Player won't play if this aspect does't get set in response to the KV changing. - - if (self.aspectSet) return; - if (!self.player.isPlaying) return; - - [_player setDrawable:_hostedView]; - [_player setVideoAspectRatio:"0.7"]; - [_player setCurrentVideoTrackIndex:0]; - [_player setScaleFactor:0.0]; - NSString *aspectStr = [NSString stringWithUTF8String:[_player videoAspectRatio]]; - self.result(@{@"aspectRatio" : aspectStr}); - self.aspectSet = YES; -} - - -@end - - -@implementation FLTPlayerViewFactory -NSObject *_registrar; - -+ (instancetype)initWithRegistrar : (NSObject*)registrar { - _registrar = registrar; - return [[super alloc] init]; -} - -- (nonnull NSObject *)createWithFrame:(CGRect)frame viewIdentifier:(int64_t)viewId arguments:(NSObject *)messenger { - // Create method channel. - NSString *_methodChannelName = [NSString stringWithFormat:@"%@_%@",@"flutter_video_plugin/getVideoView", [NSString stringWithFormat:@"%lld", viewId]]; - FlutterMethodChannel* methodChannel = [FlutterMethodChannel - methodChannelWithName:_methodChannelName - binaryMessenger:[_registrar messenger]]; - - // Create event channel. - NSString *_eventChannelName = [NSString stringWithFormat:@"%@_%@",@"flutter_video_plugin/getVideoEvents", [NSString stringWithFormat:@"%lld", viewId]]; - FlutterEventChannel* eventChannel = [FlutterEventChannel - eventChannelWithName:_eventChannelName - binaryMessenger:[_registrar messenger]]; - - return [FLTPlayerView initWithChannels:methodChannel andEventChannel:eventChannel]; -} - - -@end - +#if __has_include() +#import +#else +// Support project import fallback if the generated compatibility header +// is not copied when this plugin is created as a library. +// https://forums.swift.org/t/swift-static-libraries-dont-copy-generated-objective-c-header/19816 +#import "flutter_vlc_player-Swift.h" +#endif @implementation FlutterVlcPlayerPlugin - -+ (void)registerWithRegistrar:(nonnull NSObject *)registrar { - [registrar registerViewFactory: [FLTPlayerViewFactory initWithRegistrar: registrar] withId:@"flutter_video_plugin/getVideoView"]; ++ (void)registerWithRegistrar:(NSObject*)registrar { + [SwiftFlutterVlcPlayerPlugin registerWithRegistrar:registrar]; } - -@end - -@implementation FLTPlayerEventStreamHandler - -- (FlutterError*)onListenWithArguments:(id)arguments eventSink:(FlutterEventSink)eventSink { - _eventSink = eventSink; - return nil; -} - -- (FlutterError*)onCancelWithArguments:(id)arguments { - _eventSink = nil; - return nil; -} - -- (void)mediaPlayerStateChanged:(NSNotification *)aNotification { - - VLCMediaPlayer *player = aNotification.object; - VLCMedia *media = player.media; - - NSArray* tracks = media.tracksInformation; - NSDictionary* track; - - float ratio = 0.0; - NSNumber* height = @0; - NSNumber* width = @0; - - if(player.currentVideoTrackIndex != -1){ - track = tracks[player.currentVideoTrackIndex]; - - height = [track objectForKey:@"height"]; - width = [track objectForKey:@"width"]; - - if(height != nil && width != nil && height > 0) { - ratio = width.floatValue / height.floatValue; - } - } - - switch(player.state){ - case VLCMediaPlayerStateESAdded: - case VLCMediaPlayerStateBuffering: - case VLCMediaPlayerStateOpening: - return; - - case VLCMediaPlayerStatePlaying: - _eventSink(@{ - @"name": @"buffering", - @"value": @(NO) - }); - - _eventSink(@{ - @"name": @"playing", - @"value": @(YES), - @"ratio": @(ratio), - @"height": height, - @"width": width, - @"length": media.length.value ?: @0 - }); - return; - - case VLCMediaPlayerStateEnded: - _eventSink(@{ - @"name": @"ended" - }); - - _eventSink(@{ - @"name": @"playing", - @"value": @(NO), - @"reason": @"EndReached" - }); - return; - - case VLCMediaPlayerStateError: - NSLog(@"(flutter_vlc_plugin) A VLC error occurred."); - return; - - case VLCMediaPlayerStatePaused: - case VLCMediaPlayerStateStopped: - _eventSink(@{ - @"name": @"buffering", - @"value": @(NO) - }); - - _eventSink(@{ - @"name": @"playing", - @"value": @(NO) - }); - return; - } -} - -- (void)mediaPlayerTimeChanged:(NSNotification *)aNotification { - - VLCMediaPlayer *player = aNotification.object; - - _eventSink(@{ - @"name": @"timeChanged", - @"value": player.time.value, - @"speed": @(player.rate), - }); - - return; -} - @end diff --git a/ios/Classes/SwiftFlutterVlcPlayerPlugin.swift b/ios/Classes/SwiftFlutterVlcPlayerPlugin.swift new file mode 100644 index 00000000..1e1ecc38 --- /dev/null +++ b/ios/Classes/SwiftFlutterVlcPlayerPlugin.swift @@ -0,0 +1,283 @@ +import Flutter +import UIKit +import MobileVLCKit + +public class SwiftFlutterVlcPlayerPlugin: NSObject, FlutterPlugin { + + private var factory: VLCViewFactory + public init(with registrar: FlutterPluginRegistrar) { + self.factory = VLCViewFactory(withRegistrar: registrar) + registrar.register(factory, withId: "flutter_video_plugin/getVideoView") + } + + public static func register(with registrar: FlutterPluginRegistrar) { + registrar.addApplicationDelegate(SwiftFlutterVlcPlayerPlugin(with: registrar)) + } + +} + + +public class VLCView: NSObject, FlutterPlatformView { + + + @IBOutlet private var hostedView: UIView! + private var vlcMediaPlayer: VLCMediaPlayer! + private var registrar: FlutterPluginRegistrar + private var channel: FlutterMethodChannel + private var eventChannel: FlutterEventChannel + private var player: VLCMediaPlayer + private var eventChannelHandler: VLCPlayerEventStreamHandler + private var aspectSet = false + + + + public init(withFrame frame: CGRect, withRegistrar registrar: FlutterPluginRegistrar, withId id: Int64){ + self.registrar = registrar + self.hostedView = UIView() + self.player = VLCMediaPlayer() + self.channel = FlutterMethodChannel(name: "flutter_video_plugin/getVideoView_\(id)", binaryMessenger: registrar.messenger()) + self.eventChannel = FlutterEventChannel(name: "flutter_video_plugin/getVideoEvents_\(id)", binaryMessenger: registrar.messenger()) + self.eventChannelHandler = VLCPlayerEventStreamHandler() + + + } + + public func view() -> UIView { + channel.setMethodCallHandler({ + [weak self] (call: FlutterMethodCall, result: @escaping FlutterResult) -> Void in + + guard let self = self else { return } + + if let arguments = call.arguments as? Dictionary + { + switch(FlutterMethodCallOption(rawValue: call.method)){ + case .initialize: + + guard let urlString = arguments["url"] as? String, let url = URL(string: urlString) else { + result(FlutterError(code: "500", + message: "Url is need to initialization", + details: nil) + ) + return + } + + let media = VLCMedia(url: url) + + + self.player.media = media + self.player.position = 0.5 + self.player.drawable = self.hostedView + self.player.delegate = self.eventChannelHandler + + result(nil) + return + case .setPlaybackState: + let playbackState = arguments["playbackState"] as? String + + if (playbackState == "play") { + self.player.play() + } else if (playbackState == "pause") { + self.player.pause() + } else if (playbackState == "stop") { + self.player.stop() + } + + result(nil) + return + case .dispose: + self.player.stop() + return + case .changeURL: + self.player.stop() + let url = arguments["url"] as? String + let media = VLCMedia(url: URL(string: url!)!) + self.player.media = media + result(nil) + return + + case .getSnapshot: + let drawable:UIView = self.player.drawable as! UIView + let size = drawable.frame.size + + UIGraphicsBeginImageContextWithOptions(size , _: false, _: 0.0) + + let rec = drawable.frame + drawable.drawHierarchy(in: rec , afterScreenUpdates: false) + + let image = UIGraphicsGetImageFromCurrentImageContext() + UIGraphicsEndImageContext() + + let byteArray = (image ?? UIImage()).pngData() + + result([ + "snapshot": byteArray + ]) + return + + case .setPlaybackSpeed: + + let playbackSpeed = arguments["speed"] as? String + let rate = (playbackSpeed! as NSString).floatValue + self.player.rate = rate + result(nil) + return + + case .setTime: + + let time = VLCTime(number: arguments["time"] as? NSNumber) + self.player.time = time + result(nil) + return + + default: + result(FlutterMethodNotImplemented) + return + } + } + + }) + + eventChannel.setStreamHandler(eventChannelHandler) + return hostedView + + } + + + +} + +class VLCPlayerEventStreamHandler:NSObject, FlutterStreamHandler, VLCMediaPlayerDelegate { + + private var eventSink: FlutterEventSink? + + + func onListen(withArguments arguments: Any?, eventSink events: @escaping FlutterEventSink) -> FlutterError? { + self.eventSink = events + return nil + } + + func onCancel(withArguments arguments: Any?) -> FlutterError? { + eventSink = nil + return nil + } + + + func mediaPlayerStateChanged(_ aNotification: Notification?) { + + let player = aNotification?.object as? VLCMediaPlayer + let media = player?.media + let tracks: [Any] = media?.tracksInformation ?? [""] //[Any] + var track:NSDictionary + + var ratio = Float(0.0) + var height = 0 + var width = 0 + + if player?.currentVideoTrackIndex != -1 { + if (player?.currentVideoTrackIndex) != nil { + track = tracks[0] as! NSDictionary + height = track["height"] as! Int + width = track["width"] as! Int + + if height != 0 && width != 0 { + ratio = Float(width / height) + } + + } + + } + + switch player?.state { + case .esAdded, .buffering, .opening: + return + case .playing: + eventSink?([ + "name": "buffering", + "value": NSNumber(value: false) + ]) + if let value = media?.length.value { + eventSink?([ + "name": "playing", + "value": NSNumber(value: true), + "ratio": NSNumber(value: ratio), + "height": height, + "width": width, + "length": value + ]) + } + return + case .ended: + eventSink?([ + "name": "ended" + ]) + eventSink?([ + "name": "playing", + "value": NSNumber(value: false), + "reason": "EndReached" + ]) + return + case .error: + print("(flutter_vlc_plugin) A VLC error occurred.") + return + case .paused, .stopped: + eventSink?([ + "name": "buffering", + "value": NSNumber(value: false) + ]) + eventSink?([ + "name": "playing", + "value": NSNumber(value: false) + ]) + return + default: + break + } + + } + + func mediaPlayerTimeChanged(_ aNotification: Notification!) { + + let player = aNotification?.object as? VLCMediaPlayer + + if let value = player?.time.value { + eventSink?([ + "name": "timeChanged", + "value": value, + "speed": NSNumber(value: player?.rate ?? 1.0) + ]) + } + + + } +} + + +public class VLCViewFactory: NSObject, FlutterPlatformViewFactory { + + private var registrar: FlutterPluginRegistrar? + + public init(withRegistrar registrar: FlutterPluginRegistrar){ + super.init() + self.registrar = registrar + } + + public func create(withFrame frame: CGRect, viewIdentifier viewId: Int64, arguments args: Any?) -> FlutterPlatformView { + let dictionary = args as! Dictionary + return VLCView(withFrame: CGRect(x: 0, y: 0, width: dictionary["width"] ?? 0, height: dictionary["height"] ?? 0), withRegistrar: registrar!,withId: viewId) + } + + public func createArgsCodec() -> FlutterMessageCodec & NSObjectProtocol { + return FlutterStandardMessageCodec(readerWriter: FlutterStandardReaderWriter()) + } +} + + +enum FlutterMethodCallOption :String{ + case initialize = "initialize" + case setPlaybackState = "setPlaybackState" + case dispose = "dispose" + case changeURL = "changeURL" + case getSnapshot = "getSnapshot" + case setPlaybackSpeed = "setPlaybackSpeed" + case setTime = "setTime" +} diff --git a/ios/flutter_vlc_player.podspec b/ios/flutter_vlc_player.podspec old mode 100755 new mode 100644 index 26f3bf89..bbed1bb5 --- a/ios/flutter_vlc_player.podspec +++ b/ios/flutter_vlc_player.podspec @@ -1,24 +1,26 @@ # -# To learn more about a Podspec see http://guides.cocoapods.org/syntax/podspec.html +# To learn more about a Podspec see http://guides.cocoapods.org/syntax/podspec.html. +# Run `pod lib lint flutter_vlc_player.podspec' to validate before publishing. # Pod::Spec.new do |s| s.name = 'flutter_vlc_player' - s.version = '0.0.3' - s.summary = 'A new Flutter project.' + s.version = '1.0.1' + s.summary = 'A new flutter plugin project.' s.description = <<-DESC -A new Flutter project. +A new flutter plugin project. DESC s.homepage = 'http://example.com' s.license = { :file => '../LICENSE' } s.author = { 'Your Company' => 'email@example.com' } s.source = { :path => '.' } s.source_files = 'Classes/**/*' - s.public_header_files = 'Classes/**/*.h' s.dependency 'Flutter' - - s.dependency 'MobileVLCKit', '~> 3.3.10' + s.dependency 'MobileVLCKit', '~> 3.3.11' s.static_framework = true + # Flutter.framework does not contain a i386 slice. Only x86_64 simulators are supported. + s.pod_target_xcconfig = { 'DEFINES_MODULE' => 'YES', 'VALID_ARCHS[sdk=iphonesimulator*]' => 'x86_64' } + s.swift_version = '5.0' s.ios.deployment_target = '9.0' -end +end From 0b377ba209e666464be1dfa71c156783822623b6 Mon Sep 17 00:00:00 2001 From: Mitch Ross Date: Thu, 7 May 2020 12:54:51 -0400 Subject: [PATCH 2/6] fix build issues, regenerate example app --- example/ios/.gitignore | 32 +++ example/ios/Flutter/AppFrameworkInfo.plist | 2 +- example/ios/Flutter/Debug.xcconfig | 0 example/ios/Flutter/Release.xcconfig | 0 example/ios/Podfile | 6 +- example/ios/Runner.xcodeproj/project.pbxproj | 266 ++++-------------- .../contents.xcworkspacedata | 0 .../xcshareddata/IDEWorkspaceChecks.plist | 0 .../xcshareddata/xcschemes/Runner.xcscheme | 10 +- .../contents.xcworkspacedata | 0 .../xcshareddata/IDEWorkspaceChecks.plist | 0 .../xcshareddata/WorkspaceSettings.xcsettings | 2 - example/ios/Runner/AppDelegate.h | 6 - example/ios/Runner/AppDelegate.m | 13 - example/ios/Runner/AppDelegate.swift | 13 + .../AppIcon.appiconset/Contents.json | 0 .../Icon-App-1024x1024@1x.png | Bin 11112 -> 10932 bytes .../AppIcon.appiconset/Icon-App-20x20@1x.png | Bin .../AppIcon.appiconset/Icon-App-20x20@2x.png | Bin .../AppIcon.appiconset/Icon-App-20x20@3x.png | Bin .../AppIcon.appiconset/Icon-App-29x29@1x.png | Bin .../AppIcon.appiconset/Icon-App-29x29@2x.png | Bin .../AppIcon.appiconset/Icon-App-29x29@3x.png | Bin .../AppIcon.appiconset/Icon-App-40x40@1x.png | Bin .../AppIcon.appiconset/Icon-App-40x40@2x.png | Bin .../AppIcon.appiconset/Icon-App-40x40@3x.png | Bin .../AppIcon.appiconset/Icon-App-60x60@2x.png | Bin .../AppIcon.appiconset/Icon-App-60x60@3x.png | Bin .../AppIcon.appiconset/Icon-App-76x76@1x.png | Bin .../AppIcon.appiconset/Icon-App-76x76@2x.png | Bin .../Icon-App-83.5x83.5@2x.png | Bin .../LaunchImage.imageset/Contents.json | 0 .../LaunchImage.imageset/LaunchImage.png | Bin .../LaunchImage.imageset/LaunchImage@2x.png | Bin .../LaunchImage.imageset/LaunchImage@3x.png | Bin .../LaunchImage.imageset/README.md | 0 .../Runner/Base.lproj/LaunchScreen.storyboard | 0 example/ios/Runner/Base.lproj/Main.storyboard | 0 example/ios/Runner/Info.plist | 11 +- example/ios/Runner/Runner-Bridging-Header.h | 1 + example/ios/Runner/main.m | 9 - example/test/widget_test.dart | 27 ++ ios/Classes/SwiftFlutterVlcPlayerPlugin.swift | 5 +- ios/flutter_vlc_player.podspec | 7 +- test/flutter_vlc_player_test.dart | 23 ++ 45 files changed, 178 insertions(+), 255 deletions(-) create mode 100644 example/ios/.gitignore mode change 100755 => 100644 example/ios/Flutter/AppFrameworkInfo.plist mode change 100755 => 100644 example/ios/Flutter/Debug.xcconfig mode change 100755 => 100644 example/ios/Flutter/Release.xcconfig mode change 100755 => 100644 example/ios/Podfile mode change 100755 => 100644 example/ios/Runner.xcodeproj/project.pbxproj mode change 100755 => 100644 example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata mode change 100755 => 100644 example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist mode change 100755 => 100644 example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme mode change 100755 => 100644 example/ios/Runner.xcworkspace/contents.xcworkspacedata mode change 100755 => 100644 example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist mode change 100755 => 100644 example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings delete mode 100755 example/ios/Runner/AppDelegate.h delete mode 100755 example/ios/Runner/AppDelegate.m create mode 100644 example/ios/Runner/AppDelegate.swift mode change 100755 => 100644 example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json mode change 100755 => 100644 example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png mode change 100755 => 100644 example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png mode change 100755 => 100644 example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png mode change 100755 => 100644 example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png mode change 100755 => 100644 example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png mode change 100755 => 100644 example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png mode change 100755 => 100644 example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png mode change 100755 => 100644 example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png mode change 100755 => 100644 example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png mode change 100755 => 100644 example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png mode change 100755 => 100644 example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png mode change 100755 => 100644 example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png mode change 100755 => 100644 example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png mode change 100755 => 100644 example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png mode change 100755 => 100644 example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png mode change 100755 => 100644 example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json mode change 100755 => 100644 example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png mode change 100755 => 100644 example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png mode change 100755 => 100644 example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png mode change 100755 => 100644 example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md mode change 100755 => 100644 example/ios/Runner/Base.lproj/LaunchScreen.storyboard mode change 100755 => 100644 example/ios/Runner/Base.lproj/Main.storyboard mode change 100755 => 100644 example/ios/Runner/Info.plist create mode 100644 example/ios/Runner/Runner-Bridging-Header.h delete mode 100755 example/ios/Runner/main.m create mode 100644 example/test/widget_test.dart create mode 100644 test/flutter_vlc_player_test.dart diff --git a/example/ios/.gitignore b/example/ios/.gitignore new file mode 100644 index 00000000..e96ef602 --- /dev/null +++ b/example/ios/.gitignore @@ -0,0 +1,32 @@ +*.mode1v3 +*.mode2v3 +*.moved-aside +*.pbxuser +*.perspectivev3 +**/*sync/ +.sconsign.dblite +.tags* +**/.vagrant/ +**/DerivedData/ +Icon? +**/Pods/ +**/.symlinks/ +profile +xcuserdata +**/.generated/ +Flutter/App.framework +Flutter/Flutter.framework +Flutter/Flutter.podspec +Flutter/Generated.xcconfig +Flutter/app.flx +Flutter/app.zip +Flutter/flutter_assets/ +Flutter/flutter_export_environment.sh +ServiceDefinitions.json +Runner/GeneratedPluginRegistrant.* + +# Exceptions to above rules. +!default.mode1v3 +!default.mode2v3 +!default.pbxuser +!default.perspectivev3 diff --git a/example/ios/Flutter/AppFrameworkInfo.plist b/example/ios/Flutter/AppFrameworkInfo.plist old mode 100755 new mode 100644 index 9367d483..6b4c0f78 --- a/example/ios/Flutter/AppFrameworkInfo.plist +++ b/example/ios/Flutter/AppFrameworkInfo.plist @@ -3,7 +3,7 @@ CFBundleDevelopmentRegion - en + $(DEVELOPMENT_LANGUAGE) CFBundleExecutable App CFBundleIdentifier diff --git a/example/ios/Flutter/Debug.xcconfig b/example/ios/Flutter/Debug.xcconfig old mode 100755 new mode 100644 diff --git a/example/ios/Flutter/Release.xcconfig b/example/ios/Flutter/Release.xcconfig old mode 100755 new mode 100644 diff --git a/example/ios/Podfile b/example/ios/Podfile old mode 100755 new mode 100644 index 60671892..d5a6946a --- a/example/ios/Podfile +++ b/example/ios/Podfile @@ -33,6 +33,9 @@ def parse_KV_file(file, separator='=') end target 'Runner' do + use_frameworks! + use_modular_headers! + # Flutter Pod copied_flutter_dir = File.join(__dir__, 'Flutter') @@ -75,9 +78,6 @@ target 'Runner' do end end -# Prevent Cocoapods from embedding a second Flutter framework and causing an error with the new Xcode build system. -install! 'cocoapods', :disable_input_output_paths => true - post_install do |installer| installer.pods_project.targets.each do |target| target.build_configurations.each do |config| diff --git a/example/ios/Runner.xcodeproj/project.pbxproj b/example/ios/Runner.xcodeproj/project.pbxproj old mode 100755 new mode 100644 index 47d74aef..6e83343e --- a/example/ios/Runner.xcodeproj/project.pbxproj +++ b/example/ios/Runner.xcodeproj/project.pbxproj @@ -8,13 +8,12 @@ /* Begin PBXBuildFile section */ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; - 26DF11FAA5F98736591E80F5 /* libPods-Runner.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4F429098B10D1DBF010B1F /* libPods-Runner.a */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; - 978B8F6F1D3862AE00F588F7 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */; }; - 97C146F31CF9000F007C117D /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 97C146F21CF9000F007C117D /* main.m */; }; + 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; + A9D86FB4F06E287FB4AE25E0 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 94D12D7C13D4A2D32D6FA4C6 /* Pods_Runner.framework */; }; /* End PBXBuildFile section */ /* Begin PBXCopyFilesBuildPhase section */ @@ -31,24 +30,23 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 042307F67E34FF5CF33CC5CB /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; + 1F4C2009653F3AEF1D8DAB60 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; + 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; + 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; - 7AFFD8ED1D35381100E5BB4D /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; - 7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; + 94D12D7C13D4A2D32D6FA4C6 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 97C146F21CF9000F007C117D /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 99D00B394711D92C026EF5DA /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; - AF4F429098B10D1DBF010B1F /* libPods-Runner.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Runner.a"; sourceTree = BUILT_PRODUCTS_DIR; }; - B8ECB9264574DFB838FC003F /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Pods/Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + C68CB3143740C2FFA027C642 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + F18E8FBD8B753ECD2497A53F /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -56,29 +54,30 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 26DF11FAA5F98736591E80F5 /* libPods-Runner.a in Frameworks */, + A9D86FB4F06E287FB4AE25E0 /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 501AA65262973F1C41FAA211 /* Frameworks */ = { + 1A1059993B77FC304540F3D1 /* Pods */ = { isa = PBXGroup; children = ( - AF4F429098B10D1DBF010B1F /* libPods-Runner.a */, + 1F4C2009653F3AEF1D8DAB60 /* Pods-Runner.debug.xcconfig */, + C68CB3143740C2FFA027C642 /* Pods-Runner.release.xcconfig */, + F18E8FBD8B753ECD2497A53F /* Pods-Runner.profile.xcconfig */, ); - name = Frameworks; + name = Pods; + path = Pods; sourceTree = ""; }; - 963DC04707CD559927B17E72 /* Pods */ = { + 68EAB08213E9FF633B32D632 /* Frameworks */ = { isa = PBXGroup; children = ( - 99D00B394711D92C026EF5DA /* Pods-Runner.debug.xcconfig */, - 042307F67E34FF5CF33CC5CB /* Pods-Runner.release.xcconfig */, - B8ECB9264574DFB838FC003F /* Pods-Runner.profile.xcconfig */, + 94D12D7C13D4A2D32D6FA4C6 /* Pods_Runner.framework */, ); - name = Pods; + name = Frameworks; sourceTree = ""; }; 9740EEB11CF90186004384FC /* Flutter */ = { @@ -98,8 +97,8 @@ 9740EEB11CF90186004384FC /* Flutter */, 97C146F01CF9000F007C117D /* Runner */, 97C146EF1CF9000F007C117D /* Products */, - 963DC04707CD559927B17E72 /* Pods */, - 501AA65262973F1C41FAA211 /* Frameworks */, + 1A1059993B77FC304540F3D1 /* Pods */, + 68EAB08213E9FF633B32D632 /* Frameworks */, ); sourceTree = ""; }; @@ -114,8 +113,6 @@ 97C146F01CF9000F007C117D /* Runner */ = { isa = PBXGroup; children = ( - 7AFFD8ED1D35381100E5BB4D /* AppDelegate.h */, - 7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */, 97C146FA1CF9000F007C117D /* Main.storyboard */, 97C146FD1CF9000F007C117D /* Assets.xcassets */, 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, @@ -123,6 +120,8 @@ 97C146F11CF9000F007C117D /* Supporting Files */, 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */, 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */, + 74858FAE1ED2DC5600515810 /* AppDelegate.swift */, + 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */, ); path = Runner; sourceTree = ""; @@ -130,7 +129,6 @@ 97C146F11CF9000F007C117D /* Supporting Files */ = { isa = PBXGroup; children = ( - 97C146F21CF9000F007C117D /* main.m */, ); name = "Supporting Files"; sourceTree = ""; @@ -142,14 +140,14 @@ isa = PBXNativeTarget; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - A962281F56E29E81F7ADEA7F /* [CP] Check Pods Manifest.lock */, + C38A7EC27FA01A9FA4D4D0C2 /* [CP] Check Pods Manifest.lock */, 9740EEB61CF901F6004384FC /* Run Script */, 97C146EA1CF9000F007C117D /* Sources */, 97C146EB1CF9000F007C117D /* Frameworks */, 97C146EC1CF9000F007C117D /* Resources */, 9705A1C41CF9048500538489 /* Embed Frameworks */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, - 01A7FC6AAF62780F10F207C4 /* [CP] Embed Pods Frameworks */, + 6C16DDC0666AA59926B93E59 /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -166,22 +164,20 @@ 97C146E61CF9000F007C117D /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 1140; - ORGANIZATIONNAME = "The Chromium Authors"; + LastUpgradeCheck = 1020; + ORGANIZATIONNAME = ""; TargetAttributes = { 97C146ED1CF9000F007C117D = { CreatedOnToolsVersion = 7.3.1; - DevelopmentTeam = 876SUF433Q; - ProvisioningStyle = Automatic; + LastSwiftMigration = 1100; }; }; }; buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; hasScannedForEncodings = 0; knownRegions = ( - English, en, Base, ); @@ -210,34 +206,37 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 01A7FC6AAF62780F10F207C4 /* [CP] Embed Pods Frameworks */ = { + 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( ); - name = "[CP] Embed Pods Frameworks"; + name = "Thin Binary"; outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; - showEnvVarsInLog = 0; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; }; - 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { + 6C16DDC0666AA59926B93E59 /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh", + "${PODS_ROOT}/../Flutter/Flutter.framework", ); - name = "Thin Binary"; + name = "[CP] Embed Pods Frameworks"; outputPaths = ( + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Flutter.framework", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed\n/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" thin\n"; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + showEnvVarsInLog = 0; }; 9740EEB61CF901F6004384FC /* Run Script */ = { isa = PBXShellScriptBuildPhase; @@ -253,7 +252,7 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; }; - A962281F56E29E81F7ADEA7F /* [CP] Check Pods Manifest.lock */ = { + C38A7EC27FA01A9FA4D4D0C2 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -282,8 +281,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 978B8F6F1D3862AE00F588F7 /* AppDelegate.m in Sources */, - 97C146F31CF9000F007C117D /* main.m in Sources */, + 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */, 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -314,9 +312,7 @@ isa = XCBuildConfiguration; baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; @@ -354,9 +350,10 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; + SUPPORTED_PLATFORMS = iphoneos; TARGETED_DEVICE_FAMILY = "1,2"; VALIDATE_PRODUCT = YES; }; @@ -366,12 +363,9 @@ isa = XCBuildConfiguration; baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CODE_SIGN_IDENTITY = "Apple Development"; - CODE_SIGN_STYLE = Automatic; + CLANG_ENABLE_MODULES = YES; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; - DEVELOPMENT_TEAM = 876SUF433Q; ENABLE_BITCODE = NO; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", @@ -383,45 +377,10 @@ "$(inherited)", "$(PROJECT_DIR)/Flutter", ); - OTHER_LDFLAGS = ( - "$(inherited)", - "-ObjC", - "-l\"bz2\"", - "-l\"c++\"", - "-l\"flutter_vlc_player\"", - "-l\"iconv\"", - "-l\"xml2\"", - "-l\"z\"", - "-framework", - "\"AVFoundation\"", - "-framework", - "\"AudioToolbox\"", - "-framework", - "\"CFNetwork\"", - "-framework", - "\"CoreGraphics\"", - "-framework", - "\"CoreMedia\"", - "-framework", - "\"CoreText\"", - "-framework", - "\"Flutter\"", - "-framework", - "\"MobileVLCKit\"", - "-framework", - "\"OpenGLES\"", - "-framework", - "\"QuartzCore\"", - "-framework", - "\"Security\"", - "-framework", - "\"VideoToolbox\"", - "-framework", - Flutter, - ); PRODUCT_BUNDLE_IDENTIFIER = com.flutterVlcPlayer.flutterVlcPlayerExample; PRODUCT_NAME = "$(TARGET_NAME)"; - PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_VERSION = 5.0; VERSIONING_SYSTEM = "apple-generic"; }; name = Profile; @@ -430,9 +389,7 @@ isa = XCBuildConfiguration; baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; @@ -476,7 +433,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -488,9 +445,7 @@ isa = XCBuildConfiguration; baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; @@ -528,9 +483,11 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; + SUPPORTED_PLATFORMS = iphoneos; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; TARGETED_DEVICE_FAMILY = "1,2"; VALIDATE_PRODUCT = YES; }; @@ -540,12 +497,9 @@ isa = XCBuildConfiguration; baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CODE_SIGN_IDENTITY = "Apple Development"; - CODE_SIGN_STYLE = Automatic; + CLANG_ENABLE_MODULES = YES; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; - DEVELOPMENT_TEAM = 876SUF433Q; ENABLE_BITCODE = NO; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", @@ -557,79 +511,11 @@ "$(inherited)", "$(PROJECT_DIR)/Flutter", ); - OTHER_LDFLAGS = ( - "$(inherited)", - "-ObjC", - "-l\"bz2\"", - "-l\"c++\"", - "-l\"flutter_vlc_player\"", - "-l\"iconv\"", - "-l\"xml2\"", - "-l\"z\"", - "-framework", - "\"AVFoundation\"", - "-framework", - "\"AudioToolbox\"", - "-framework", - "\"CFNetwork\"", - "-framework", - "\"CoreGraphics\"", - "-framework", - "\"CoreMedia\"", - "-framework", - "\"CoreText\"", - "-framework", - "\"Flutter\"", - "-framework", - "\"MobileVLCKit\"", - "-framework", - "\"OpenGLES\"", - "-framework", - "\"QuartzCore\"", - "-framework", - "\"Security\"", - "-framework", - "\"VideoToolbox\"", - "-framework", - Flutter, - ); - "OTHER_LDFLAGS[arch=*]" = ( - "$(inherited)", - "-ObjC", - "-l\"bz2\"", - "-l\"c++\"", - "-l\"flutter_vlc_player\"", - "-l\"iconv\"", - "-l\"xml2\"", - "-l\"z\"", - "-framework", - "\"AVFoundation\"", - "-framework", - "\"AudioToolbox\"", - "-framework", - "\"CFNetwork\"", - "-framework", - "\"CoreGraphics\"", - "-framework", - "\"CoreMedia\"", - "-framework", - "\"CoreText\"", - "-framework", - "\"Flutter\"", - "-framework", - "\"MobileVLCKit\"", - "-framework", - "\"OpenGLES\"", - "-framework", - "\"QuartzCore\"", - "-framework", - "\"Security\"", - "-framework", - "\"VideoToolbox\"", - ); PRODUCT_BUNDLE_IDENTIFIER = com.flutterVlcPlayer.flutterVlcPlayerExample; PRODUCT_NAME = "$(TARGET_NAME)"; - PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; VERSIONING_SYSTEM = "apple-generic"; }; name = Debug; @@ -638,12 +524,9 @@ isa = XCBuildConfiguration; baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CODE_SIGN_IDENTITY = "Apple Development"; - CODE_SIGN_STYLE = Automatic; + CLANG_ENABLE_MODULES = YES; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; - DEVELOPMENT_TEAM = 876SUF433Q; ENABLE_BITCODE = NO; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", @@ -655,45 +538,10 @@ "$(inherited)", "$(PROJECT_DIR)/Flutter", ); - OTHER_LDFLAGS = ( - "$(inherited)", - "-ObjC", - "-l\"bz2\"", - "-l\"c++\"", - "-l\"flutter_vlc_player\"", - "-l\"iconv\"", - "-l\"xml2\"", - "-l\"z\"", - "-framework", - "\"AVFoundation\"", - "-framework", - "\"AudioToolbox\"", - "-framework", - "\"CFNetwork\"", - "-framework", - "\"CoreGraphics\"", - "-framework", - "\"CoreMedia\"", - "-framework", - "\"CoreText\"", - "-framework", - "\"Flutter\"", - "-framework", - "\"MobileVLCKit\"", - "-framework", - "\"OpenGLES\"", - "-framework", - "\"QuartzCore\"", - "-framework", - "\"Security\"", - "-framework", - "\"VideoToolbox\"", - "-framework", - Flutter, - ); PRODUCT_BUNDLE_IDENTIFIER = com.flutterVlcPlayer.flutterVlcPlayerExample; PRODUCT_NAME = "$(TARGET_NAME)"; - PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_VERSION = 5.0; VERSIONING_SYSTEM = "apple-generic"; }; name = Release; diff --git a/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata old mode 100755 new mode 100644 diff --git a/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist old mode 100755 new mode 100644 diff --git a/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme old mode 100755 new mode 100644 index 16396c3b..a28140cf --- a/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -1,6 +1,6 @@ + + - - + + + + - BuildSystemType - Latest PreviewsEnabled diff --git a/example/ios/Runner/AppDelegate.h b/example/ios/Runner/AppDelegate.h deleted file mode 100755 index 36e21bbf..00000000 --- a/example/ios/Runner/AppDelegate.h +++ /dev/null @@ -1,6 +0,0 @@ -#import -#import - -@interface AppDelegate : FlutterAppDelegate - -@end diff --git a/example/ios/Runner/AppDelegate.m b/example/ios/Runner/AppDelegate.m deleted file mode 100755 index 59a72e90..00000000 --- a/example/ios/Runner/AppDelegate.m +++ /dev/null @@ -1,13 +0,0 @@ -#include "AppDelegate.h" -#include "GeneratedPluginRegistrant.h" - -@implementation AppDelegate - -- (BOOL)application:(UIApplication *)application - didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { - [GeneratedPluginRegistrant registerWithRegistry:self]; - // Override point for customization after application launch. - return [super application:application didFinishLaunchingWithOptions:launchOptions]; -} - -@end diff --git a/example/ios/Runner/AppDelegate.swift b/example/ios/Runner/AppDelegate.swift new file mode 100644 index 00000000..70693e4a --- /dev/null +++ b/example/ios/Runner/AppDelegate.swift @@ -0,0 +1,13 @@ +import UIKit +import Flutter + +@UIApplicationMain +@objc class AppDelegate: FlutterAppDelegate { + override func application( + _ application: UIApplication, + didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? + ) -> Bool { + GeneratedPluginRegistrant.register(with: self) + return super.application(application, didFinishLaunchingWithOptions: launchOptions) + } +} diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json old mode 100755 new mode 100644 diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png old mode 100755 new mode 100644 index 3d43d11e66f4de3da27ed045ca4fe38ad8b48094..dc9ada4725e9b0ddb1deab583e5b5102493aa332 GIT binary patch literal 10932 zcmeHN2~<R zh`|8`A_PQ1nSu(UMFx?8j8PC!!VDphaL#`F42fd#7Vlc`zIE4n%Y~eiz4y1j|NDpi z?<@|pSJ-HM`qifhf@m%MamgwK83`XpBA<+azdF#2QsT{X@z0A9Bq>~TVErigKH1~P zRX-!h-f0NJ4Mh++{D}J+K>~~rq}d%o%+4dogzXp7RxX4C>Km5XEI|PAFDmo;DFm6G zzjVoB`@qW98Yl0Kvc-9w09^PrsobmG*Eju^=3f?0o-t$U)TL1B3;sZ^!++3&bGZ!o-*6w?;oOhf z=A+Qb$scV5!RbG+&2S}BQ6YH!FKb0``VVX~T$dzzeSZ$&9=X$3)_7Z{SspSYJ!lGE z7yig_41zpQ)%5dr4ff0rh$@ky3-JLRk&DK)NEIHecf9c*?Z1bUB4%pZjQ7hD!A0r-@NF(^WKdr(LXj|=UE7?gBYGgGQV zidf2`ZT@pzXf7}!NH4q(0IMcxsUGDih(0{kRSez&z?CFA0RVXsVFw3^u=^KMtt95q z43q$b*6#uQDLoiCAF_{RFc{!H^moH_cmll#Fc^KXi{9GDl{>%+3qyfOE5;Zq|6#Hb zp^#1G+z^AXfRKaa9HK;%b3Ux~U@q?xg<2DXP%6k!3E)PA<#4$ui8eDy5|9hA5&{?v z(-;*1%(1~-NTQ`Is1_MGdQ{+i*ccd96ab$R$T3=% zw_KuNF@vI!A>>Y_2pl9L{9h1-C6H8<)J4gKI6{WzGBi<@u3P6hNsXG=bRq5c+z;Gc3VUCe;LIIFDmQAGy+=mRyF++u=drBWV8-^>0yE9N&*05XHZpPlE zxu@?8(ZNy7rm?|<+UNe0Vs6&o?l`Pt>P&WaL~M&#Eh%`rg@Mbb)J&@DA-wheQ>hRV z<(XhigZAT z>=M;URcdCaiO3d^?H<^EiEMDV+7HsTiOhoaMX%P65E<(5xMPJKxf!0u>U~uVqnPN7T!X!o@_gs3Ct1 zlZ_$5QXP4{Aj645wG_SNT&6m|O6~Tsl$q?nK*)(`{J4b=(yb^nOATtF1_aS978$x3 zx>Q@s4i3~IT*+l{@dx~Hst21fR*+5}S1@cf>&8*uLw-0^zK(+OpW?cS-YG1QBZ5q! zgTAgivzoF#`cSz&HL>Ti!!v#?36I1*l^mkrx7Y|K6L#n!-~5=d3;K<;Zqi|gpNUn_ z_^GaQDEQ*jfzh;`j&KXb66fWEk1K7vxQIMQ_#Wu_%3 z4Oeb7FJ`8I>Px;^S?)}2+4D_83gHEq>8qSQY0PVP?o)zAv3K~;R$fnwTmI-=ZLK`= zTm+0h*e+Yfr(IlH3i7gUclNH^!MU>id$Jw>O?2i0Cila#v|twub21@e{S2v}8Z13( zNDrTXZVgris|qYm<0NU(tAPouG!QF4ZNpZPkX~{tVf8xY690JqY1NVdiTtW+NqyRP zZ&;T0ikb8V{wxmFhlLTQ&?OP7 z;(z*<+?J2~z*6asSe7h`$8~Se(@t(#%?BGLVs$p``;CyvcT?7Y!{tIPva$LxCQ&4W z6v#F*);|RXvI%qnoOY&i4S*EL&h%hP3O zLsrFZhv&Hu5tF$Lx!8(hs&?!Kx5&L(fdu}UI5d*wn~A`nPUhG&Rv z2#ixiJdhSF-K2tpVL=)5UkXRuPAFrEW}7mW=uAmtVQ&pGE-&az6@#-(Te^n*lrH^m@X-ftVcwO_#7{WI)5v(?>uC9GG{lcGXYJ~Q8q zbMFl7;t+kV;|;KkBW2!P_o%Czhw&Q(nXlxK9ak&6r5t_KH8#1Mr-*0}2h8R9XNkr zto5-b7P_auqTJb(TJlmJ9xreA=6d=d)CVbYP-r4$hDn5|TIhB>SReMfh&OVLkMk-T zYf%$taLF0OqYF?V{+6Xkn>iX@TuqQ?&cN6UjC9YF&%q{Ut3zv{U2)~$>-3;Dp)*(? zg*$mu8^i=-e#acaj*T$pNowo{xiGEk$%DusaQiS!KjJH96XZ-hXv+jk%ard#fu=@Q z$AM)YWvE^{%tDfK%nD49=PI|wYu}lYVbB#a7wtN^Nml@CE@{Gv7+jo{_V?I*jkdLD zJE|jfdrmVbkfS>rN*+`#l%ZUi5_bMS<>=MBDNlpiSb_tAF|Zy`K7kcp@|d?yaTmB^ zo?(vg;B$vxS|SszusORgDg-*Uitzdi{dUV+glA~R8V(?`3GZIl^egW{a919!j#>f` znL1o_^-b`}xnU0+~KIFLQ)$Q6#ym%)(GYC`^XM*{g zv3AM5$+TtDRs%`2TyR^$(hqE7Y1b&`Jd6dS6B#hDVbJlUXcG3y*439D8MrK!2D~6gn>UD4Imctb z+IvAt0iaW73Iq$K?4}H`7wq6YkTMm`tcktXgK0lKPmh=>h+l}Y+pDtvHnG>uqBA)l zAH6BV4F}v$(o$8Gfo*PB>IuaY1*^*`OTx4|hM8jZ?B6HY;F6p4{`OcZZ(us-RVwDx zUzJrCQlp@mz1ZFiSZ*$yX3c_#h9J;yBE$2g%xjmGF4ca z&yL`nGVs!Zxsh^j6i%$a*I3ZD2SoNT`{D%mU=LKaEwbN(_J5%i-6Va?@*>=3(dQy` zOv%$_9lcy9+(t>qohkuU4r_P=R^6ME+wFu&LA9tw9RA?azGhjrVJKy&8=*qZT5Dr8g--d+S8zAyJ$1HlW3Olryt`yE zFIph~Z6oF&o64rw{>lgZISC6p^CBer9C5G6yq%?8tC+)7*d+ib^?fU!JRFxynRLEZ zj;?PwtS}Ao#9whV@KEmwQgM0TVP{hs>dg(1*DiMUOKHdQGIqa0`yZnHk9mtbPfoLx zo;^V6pKUJ!5#n`w2D&381#5#_t}AlTGEgDz$^;u;-vxDN?^#5!zN9ngytY@oTv!nc zp1Xn8uR$1Z;7vY`-<*?DfPHB;x|GUi_fI9@I9SVRv1)qETbNU_8{5U|(>Du84qP#7 z*l9Y$SgA&wGbj>R1YeT9vYjZuC@|{rajTL0f%N@>3$DFU=`lSPl=Iv;EjuGjBa$Gw zHD-;%YOE@<-!7-Mn`0WuO3oWuL6tB2cpPw~Nvuj|KM@))ixuDK`9;jGMe2d)7gHin zS<>k@!x;!TJEc#HdL#RF(`|4W+H88d4V%zlh(7#{q2d0OQX9*FW^`^_<3r$kabWAB z$9BONo5}*(%kx zOXi-yM_cmB3>inPpI~)duvZykJ@^^aWzQ=eQ&STUa}2uT@lV&WoRzkUoE`rR0)`=l zFT%f|LA9fCw>`enm$p7W^E@U7RNBtsh{_-7vVz3DtB*y#*~(L9+x9*wn8VjWw|Q~q zKFsj1Yl>;}%MG3=PY`$g$_mnyhuV&~O~u~)968$0b2!Jkd;2MtAP#ZDYw9hmK_+M$ zb3pxyYC&|CuAbtiG8HZjj?MZJBFbt`ryf+c1dXFuC z0*ZQhBzNBd*}s6K_G}(|Z_9NDV162#y%WSNe|FTDDhx)K!c(mMJh@h87@8(^YdK$&d*^WQe8Z53 z(|@MRJ$Lk-&ii74MPIs80WsOFZ(NX23oR-?As+*aq6b?~62@fSVmM-_*cb1RzZ)`5$agEiL`-E9s7{GM2?(KNPgK1(+c*|-FKoy}X(D_b#etO|YR z(BGZ)0Ntfv-7R4GHoXp?l5g#*={S1{u-QzxCGng*oWr~@X-5f~RA14b8~B+pLKvr4 zfgL|7I>jlak9>D4=(i(cqYf7#318!OSR=^`xxvI!bBlS??`xxWeg?+|>MxaIdH1U~#1tHu zB{QMR?EGRmQ_l4p6YXJ{o(hh-7Tdm>TAX380TZZZyVkqHNzjUn*_|cb?T? zt;d2s-?B#Mc>T-gvBmQZx(y_cfkXZO~{N zT6rP7SD6g~n9QJ)8F*8uHxTLCAZ{l1Y&?6v)BOJZ)=R-pY=Y=&1}jE7fQ>USS}xP#exo57uND0i*rEk@$;nLvRB@u~s^dwRf?G?_enN@$t* zbL%JO=rV(3Ju8#GqUpeE3l_Wu1lN9Y{D4uaUe`g>zlj$1ER$6S6@{m1!~V|bYkhZA z%CvrDRTkHuajMU8;&RZ&itnC~iYLW4DVkP<$}>#&(`UO>!n)Po;Mt(SY8Yb`AS9lt znbX^i?Oe9r_o=?})IHKHoQGKXsps_SE{hwrg?6dMI|^+$CeC&z@*LuF+P`7LfZ*yr+KN8B4{Nzv<`A(wyR@!|gw{zB6Ha ziwPAYh)oJ(nlqSknu(8g9N&1hu0$vFK$W#mp%>X~AU1ay+EKWcFdif{% z#4!4aoVVJ;ULmkQf!ke2}3hqxLK>eq|-d7Ly7-J9zMpT`?dxo6HdfJA|t)?qPEVBDv z{y_b?4^|YA4%WW0VZd8C(ZgQzRI5(I^)=Ub`Y#MHc@nv0w-DaJAqsbEHDWG8Ia6ju zo-iyr*sq((gEwCC&^TYBWt4_@|81?=B-?#P6NMff(*^re zYqvDuO`K@`mjm_Jd;mW_tP`3$cS?R$jR1ZN09$YO%_iBqh5ftzSpMQQtxKFU=FYmP zeY^jph+g<4>YO;U^O>-NFLn~-RqlHvnZl2yd2A{Yc1G@Ga$d+Q&(f^tnPf+Z7serIU};17+2DU_f4Z z@GaPFut27d?!YiD+QP@)T=77cR9~MK@bd~pY%X(h%L={{OIb8IQmf-!xmZkm8A0Ga zQSWONI17_ru5wpHg3jI@i9D+_Y|pCqVuHJNdHUauTD=R$JcD2K_liQisqG$(sm=k9;L* z!L?*4B~ql7uioSX$zWJ?;q-SWXRFhz2Jt4%fOHA=Bwf|RzhwqdXGr78y$J)LR7&3T zE1WWz*>GPWKZ0%|@%6=fyx)5rzUpI;bCj>3RKzNG_1w$fIFCZ&UR0(7S?g}`&Pg$M zf`SLsz8wK82Vyj7;RyKmY{a8G{2BHG%w!^T|Njr!h9TO2LaP^_f22Q1=l$QiU84ao zHe_#{S6;qrC6w~7{y(hs-?-j?lbOfgH^E=XcSgnwW*eEz{_Z<_iT7q6h&WAVr806i~>Gqn6rM z>3}bMG&oq%DIriqR35=rtEdos5L6z)YC*Xq0U-$_+Il@RaU zXYX%+``hR28`(B*uJ6G9&iz>|)PS%!)9N`7=LcmcxH}k69HPyT-%S zH7+jBCC<%76cg_H-n41cTqnKn`u_V9p~XaTLUe3s{KRPSTeK6apP4Jg%VQ$e#72ms zxyWzmGSRwN?=fRgpx!?W&ZsrLfuhAsRxm%;_|P@3@3~BJwY4ZVBJ3f&$5x>`^fD?d zI+z!v#$!gz%FtL*%mR^Uwa*8LJFZ_;X!y$cD??W#c)31l@ervOa_Qk86R{HJiZb$f z&&&0xYmB{@D@yl~^l5IXtB_ou{xFiYP(Jr<9Ce{jCN z<3Rf2TD%}_N?y>bgWq|{`RKd}n>P4e8Z-D+(fn^4)+|pv$DcR&i+RHNhv$71F*McT zl`phYBlb;wO`b7)*10XF6UXhY9`@UR*6-#(Zp`vyU(__*te6xYtV&N0(zjMtev{tZ zapmGin===teMXjsS0>CYxUy<2izOKOPai0}!B9+6q$s3CF8W{xUwz?A0ADO5&BsiB z{SFt|KehNd-S#eiDq!y&+mW9N_!wH-i~q|oNm=mEzkx}B?Ehe%q$tK8f=QY#*6rH9 zNHHaG(9WBqzP!!TMEktSVuh$i$4A^b25LK}&1*4W?ul*5pZYjL1OZ@X9?3W7Y|T6} z1SXx0Wn-|!A;fZGGlYn9a1Jz5^8)~v#mXhmm>um{QiGG459N}L<&qyD+sy_ixD@AP zW0XV6w#3(JW>TEV}MD=O0O>k5H>p#&|O zD2mGf0Cz7+>l7`NuzGobt;(o@vb9YiOpHN8QJ9Uva|i7R?7nnq;L_iq+ZqPv*oGu! zN@GuJ9fm;yrEFga63m?1qy|5&fd32<%$yP$llh}Udrp>~fb>M>R55I@BsGYhCj8m1 zC=ziFh4@hoytpfrJlr}FsV|C(aV4PZ^8^`G29(+!Bk8APa#PemJqkF zE{IzwPaE)I&r`OxGk*vPErm6sGKaQJ&6FODW$;gAl_4b_j!oH4yE@ zP~Cl4?kp>Ccc~Nm+0kjIb`U0N7}zrQEN5!Ju|}t}LeXi!baZOyhlWha5lq{Ld2rdo zGz7hAJQt<6^cxXTe0xZjmADL85cC&H+~Lt2siIIh{$~+U#&#^{Ub22IA|ea6 z5j12XLc`~dh$$1>3o0Cgvo*ybi$c*z>n=5L&X|>Wy1~eagk;lcEnf^2^2xB=e58Z` z@Rw{1ssK)NRV+2O6c<8qFl%efHE;uy!mq(Xi1P*H2}LMi z3EqWN2U?eW{J$lSFxDJg-=&RH!=6P9!y|S~gmjg)gPKGMxq6r9cNIhW` zS})-obO}Ao_`;=>@fAwU&=|5$J;?~!s4LN2&XiMXEl>zk9M}tVEg#kkIkbKp%Ig2QJ2aCILCM1E=aN*iuz>;q#T_I7aVM=E4$m_#OWLnXQnFUnu?~(X>$@NP zBJ@Zw>@bmErSuW7SR2=6535wh-R`WZ+5dLqwTvw}Ks8~4F#hh0$Qn^l-z=;>D~St( z-1yEjCCgd*z5qXa*bJ7H2Tk54KiX&=Vd}z?%dcc z`N8oeYUKe17&|B5A-++RHh8WQ%;gN{vf%05@jZF%wn1Z_yk#M~Cn(i@MB_mpcbLj5 zR#QAtC`k=tZ*h|){Mjz`7bNL zGWOW=bjQhX@`Vw^xn#cVwn28c2D9vOb0TLLy~-?-%gOyHSeJ9a>P}5OF5$n}k-pvUa*pvLw)KvG~>QjNWS3LY1f*OkFwPZ5qC@+3^Bt=HZbf`alKY#{pn zdY}NEIgo1sd)^TPxVzO{uvU$|Z-jkK0p1x##LexgQ$zx1^bNPOG*u2RmZkIM!zFVz zz|IsP3I?qrlmjGS2w_(azCvGTnf~flqogV@Q%mH{76uLU(>UB zQZ?*ys3BO&TV{Pj_qEa-hkH7mOMe_Bnu3%CXCgu90XNKf$N)PUc3Ei-&~@tT zI^49Lm^+=TrI=h4h=W@jW{GjWd{_kVuSzAL6Pi@HKYYnnNbtcYdIRww+jY$(30=#p8*if(mzbvau z00#}4Qf+gH&ce_&8y3Z@CZV>b%&Zr7xuPSSqOmoaP@arwPrMx^jQBQQi>YvBUdpBn zI``MZ3I3HLqp)@vk^E|~)zw$0$VI_RPsL9u(kqulmS`tnb%4U)hm{)h@bG*jw@Y*#MX;Th1wu3TrO}Srn_+YWYesEgkO1 zv?P8uWB)is;#&=xBBLf+y5e4?%y>_8$1KwkAJ8UcW|0CIz89{LydfJKr^RF=JFPi}MAv|ecbuZ!YcTSxsD$(Pr#W*oytl?@+2 zXBFb32Kf_G3~EgOS7C`8w!tx}DcCT%+#qa76VSbnHo;4(oJ7)}mm?b5V65ir`7Z}s zR2)m15b#E}z_2@rf34wo!M^CnVoi# ze+S(IK({C6u=Sm{1>F~?)8t&fZpOOPcby;I3jO;7^xmLKM(<%i-nyj9mgw9F1Lq4|DZUHZ4)V9&6fQM(ZxbG{h+}(koiTu`SQw6#6q2Yg z-d+1+MRp$zYT2neIR2cKij2!R;C~ooQ3<;^8)_Gch&ZyEtiQwmF0Mb_)6)4lVEBF< zklXS7hvtu30uJR`3OzcqUNOdYsfrKSGkIQAk|4=&#ggxdU4^Y(;)$8}fQ>lTgQdJ{ zzie8+1$3@E;|a`kzuFh9Se}%RHTmBg)h$eH;gttjL_)pO^10?!bNev6{mLMaQpY<< z7M^ZXrg>tw;vU@9H=khbff?@nu)Yw4G% zGxobPTUR2p_ed7Lvx?dkrN^>Cv$Axuwk;Wj{5Z@#$sK@f4{7SHg%2bpcS{(~s;L(mz@9r$cK@m~ef&vf%1@ z@8&@LLO2lQso|bJD6}+_L1*D^}>oqg~$NipL>QlP3 zM#ATSy@ycMkKs5-0X8nFAtMhO_=$DlWR+@EaZ}`YduRD4A2@!at3NYRHmlENea9IF zN*s>mi?zy*Vv+F+&4-o`Wj}P3mLGM*&M(z|;?d82>hQkkY?e-hJ47mWOLCPL*MO04 z3lE(n2RM=IIo;Z?I=sKJ_h=iJHbQ2<}WW0b@I6Qf-{T=Qn#@N0yG5xH&ofEy^mZMPzd22nR`t!Q)VkNgf*VOxE z$XhOunG3ZN#`Ks$Hp~}`OX5vmHP={GYUJ+-g0%PS$*Qi5+-40M47zJ24vK1#? zb$s^%r?+>#lw$mpZaMa1aO%wlPm3~cno_(S%U&-R;6eK(@`CjswAW2)HfZ>ptItaZ|XqQ z&sHVVL>WCe|E4iPb2~gS5ITs6xfg(kmt&3$YcI=zTuqj37t|+9ojCr(G^ul#p{>k) zM94pI>~5VZ$!*Qurq<@RIXgP3sx-2kL$1Q~da%rnNIh?)&+c~*&e~CYPDhPYjb+Xu zKg5w^XB3(_9{Waa4E(-J-Kq_u6t_k?a8kEHqai-N-4#`SRerO!h}!cS%SMC<)tGix zOzVP^_t!HN&HIPL-ZpcgWitHM&yFRC7!k4zSI+-<_uQ}|tX)n{Ib;X>Xx>i_d*KkH zCzogKQFpP1408_2!ofU|iBq2R8hW6G zuqJs9Tyw{u%-uWczPLkM!MfKfflt+NK9Vk8E!C>AsJwNDRoe2~cL+UvqNP|5J8t)( z0$iMa!jhudJ+fqFn+um&@Oj6qXJd_3-l`S^I1#0fnt!z3?D*hAHr*u(*wR@`4O z#avrtg%s`Fh{?$FtBFM^$@@hW!8ZfF4;=n0<8In&X}-Rp=cd0TqT_ne46$j^r}FzE z26vX^!PzScuQfFfl1HEZ{zL?G88mcc76zHGizWiykBf4m83Z${So-+dZ~YGhm*RO7 zB1gdIdqnFi?qw+lPRFW5?}CQ3Me3G^muvll&4iN+*5#_mmIu;loULMwb4lu9U*dFM z-Sr**(0Ei~u=$3<6>C-G6z4_LNCx||6YtjS)<;hf)YJTPKXW+w%hhCTUAInIse9>r zl2YU6nRb$u-FJlWN*{{%sm_gi_UP5{=?5}5^D2vPzM=oPfNw~azZQ#P zl5z8RtSSiTIpEohC15i-Q1Bk{3&ElsD0uGAOxvbk29VUDmmA0w;^v`W#0`};O3DVE z&+-ca*`YcN%z*#VXWK9Qa-OEME#fykF%|7o=1Y+eF;Rtv0W4~kKRDx9YBHOWhC%^I z$Jec0cC7o37}Xt}cu)NH5R}NT+=2Nap*`^%O)vz?+{PV<2~qX%TzdJOGeKj5_QjqR&a3*K@= P-1+_A+?hGkL;m(J7kc&K diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png old mode 100755 new mode 100644 diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png old mode 100755 new mode 100644 diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png old mode 100755 new mode 100644 diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png old mode 100755 new mode 100644 diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png old mode 100755 new mode 100644 diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png old mode 100755 new mode 100644 diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png old mode 100755 new mode 100644 diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png old mode 100755 new mode 100644 diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png old mode 100755 new mode 100644 diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png old mode 100755 new mode 100644 diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png old mode 100755 new mode 100644 diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png old mode 100755 new mode 100644 diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png old mode 100755 new mode 100644 diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png old mode 100755 new mode 100644 diff --git a/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json b/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json old mode 100755 new mode 100644 diff --git a/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png b/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png old mode 100755 new mode 100644 diff --git a/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png old mode 100755 new mode 100644 diff --git a/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png old mode 100755 new mode 100644 diff --git a/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md old mode 100755 new mode 100644 diff --git a/example/ios/Runner/Base.lproj/LaunchScreen.storyboard b/example/ios/Runner/Base.lproj/LaunchScreen.storyboard old mode 100755 new mode 100644 diff --git a/example/ios/Runner/Base.lproj/Main.storyboard b/example/ios/Runner/Base.lproj/Main.storyboard old mode 100755 new mode 100644 diff --git a/example/ios/Runner/Info.plist b/example/ios/Runner/Info.plist old mode 100755 new mode 100644 index 3a038b1c..53b9930a --- a/example/ios/Runner/Info.plist +++ b/example/ios/Runner/Info.plist @@ -3,7 +3,7 @@ CFBundleDevelopmentRegion - en + $(DEVELOPMENT_LANGUAGE) CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIdentifier @@ -26,6 +26,13 @@ LaunchScreen UIMainStoryboardFile Main + io.flutter.embedded_views_preview + + NSAppTransportSecurity + + NSAllowsArbitraryLoads + + UISupportedInterfaceOrientations UIInterfaceOrientationPortrait @@ -41,7 +48,5 @@ UIViewControllerBasedStatusBarAppearance - io.flutter.embedded_views_preview - diff --git a/example/ios/Runner/Runner-Bridging-Header.h b/example/ios/Runner/Runner-Bridging-Header.h new file mode 100644 index 00000000..308a2a56 --- /dev/null +++ b/example/ios/Runner/Runner-Bridging-Header.h @@ -0,0 +1 @@ +#import "GeneratedPluginRegistrant.h" diff --git a/example/ios/Runner/main.m b/example/ios/Runner/main.m deleted file mode 100755 index dff6597e..00000000 --- a/example/ios/Runner/main.m +++ /dev/null @@ -1,9 +0,0 @@ -#import -#import -#import "AppDelegate.h" - -int main(int argc, char* argv[]) { - @autoreleasepool { - return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); - } -} diff --git a/example/test/widget_test.dart b/example/test/widget_test.dart new file mode 100644 index 00000000..38179b65 --- /dev/null +++ b/example/test/widget_test.dart @@ -0,0 +1,27 @@ +// This is a basic Flutter widget test. +// +// To perform an interaction with a widget in your test, use the WidgetTester +// utility that Flutter provides. For example, you can send tap and scroll +// gestures. You can also use WidgetTester to find child widgets in the widget +// tree, read text, and verify that the values of widget properties are correct. + +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; + +import 'package:flutter_vlc_player_example/main.dart'; + +void main() { + testWidgets('Verify Platform version', (WidgetTester tester) async { + // Build our app and trigger a frame. + await tester.pumpWidget(MyApp()); + + // Verify that platform version is retrieved. + expect( + find.byWidgetPredicate( + (Widget widget) => widget is Text && + widget.data.startsWith('Running on:'), + ), + findsOneWidget, + ); + }); +} diff --git a/ios/Classes/SwiftFlutterVlcPlayerPlugin.swift b/ios/Classes/SwiftFlutterVlcPlayerPlugin.swift index 1e1ecc38..887e9c4e 100644 --- a/ios/Classes/SwiftFlutterVlcPlayerPlugin.swift +++ b/ios/Classes/SwiftFlutterVlcPlayerPlugin.swift @@ -262,8 +262,9 @@ public class VLCViewFactory: NSObject, FlutterPlatformViewFactory { } public func create(withFrame frame: CGRect, viewIdentifier viewId: Int64, arguments args: Any?) -> FlutterPlatformView { - let dictionary = args as! Dictionary - return VLCView(withFrame: CGRect(x: 0, y: 0, width: dictionary["width"] ?? 0, height: dictionary["height"] ?? 0), withRegistrar: registrar!,withId: viewId) + //Can pass args if necessary for intialization. For now default to empty Rect. + //let dictionary = args as! Dictionary + return VLCView(withFrame: CGRect(x: 0, y: 0, width: 0, height: 0), withRegistrar: registrar!,withId: viewId) } public func createArgsCodec() -> FlutterMessageCodec & NSObjectProtocol { diff --git a/ios/flutter_vlc_player.podspec b/ios/flutter_vlc_player.podspec index bbed1bb5..a94cbff2 100644 --- a/ios/flutter_vlc_player.podspec +++ b/ios/flutter_vlc_player.podspec @@ -4,7 +4,7 @@ # Pod::Spec.new do |s| s.name = 'flutter_vlc_player' - s.version = '1.0.1' + s.version = '0.0.1' s.summary = 'A new flutter plugin project.' s.description = <<-DESC A new flutter plugin project. @@ -15,12 +15,11 @@ A new flutter plugin project. s.source = { :path => '.' } s.source_files = 'Classes/**/*' s.dependency 'Flutter' + s.platform = :ios, '9.0' s.dependency 'MobileVLCKit', '~> 3.3.11' s.static_framework = true - + # Flutter.framework does not contain a i386 slice. Only x86_64 simulators are supported. s.pod_target_xcconfig = { 'DEFINES_MODULE' => 'YES', 'VALID_ARCHS[sdk=iphonesimulator*]' => 'x86_64' } s.swift_version = '5.0' - s.ios.deployment_target = '9.0' - end diff --git a/test/flutter_vlc_player_test.dart b/test/flutter_vlc_player_test.dart new file mode 100644 index 00000000..b8362627 --- /dev/null +++ b/test/flutter_vlc_player_test.dart @@ -0,0 +1,23 @@ +import 'package:flutter/services.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:flutter_vlc_player/flutter_vlc_player.dart'; + +void main() { + const MethodChannel channel = MethodChannel('flutter_vlc_player'); + + TestWidgetsFlutterBinding.ensureInitialized(); + + setUp(() { + channel.setMockMethodCallHandler((MethodCall methodCall) async { + return '42'; + }); + }); + + tearDown(() { + channel.setMockMethodCallHandler(null); + }); + + test('getPlatformVersion', () async { + expect(await FlutterVlcPlayer.platformVersion, '42'); + }); +} From 5f951462e3580e97357fcacf2d1c75b0fc8ae64f Mon Sep 17 00:00:00 2001 From: mitch Date: Fri, 8 May 2020 15:39:26 -0400 Subject: [PATCH 3/6] PR Comments --- README.md | 13 +++++++ example/ios/Flutter/.last_build_id | 1 + ios/Classes/SwiftFlutterVlcPlayerPlugin.swift | 36 +++++++++++++------ ios/flutter_vlc_player.podspec | 6 ++-- pubspec.yaml | 2 +- 5 files changed, 43 insertions(+), 15 deletions(-) create mode 100644 example/ios/Flutter/.last_build_id diff --git a/README.md b/README.md index 157dfd57..df1cb1be 100755 --- a/README.md +++ b/README.md @@ -5,6 +5,19 @@ A VLC-powered alternative to Flutter's video_player that supports iOS and Androi ## Installation +### Version 3.0 Upgrade For Existing Apps +For migration to version 3, the project is based in swift. Your existing project will need to migratate + + Delete existing ios folder from root of flutter project. + Run this command flutter create -i swift . + +This command will create only ios directory with swift support. See https://stackoverflow.com/questions/52244346/how-to-enable-swift-support-for-existing-project-in-flutter + +Change your project to use 9.0 +# Uncomment this line to define a global platform for your project + platform :ios, '9.0' + + ### iOS For iOS, you need to opt into the Flutter embedded views preview. This is done by adding the following to your project's `/ios/Runner/Info.plist` file (see example for details): diff --git a/example/ios/Flutter/.last_build_id b/example/ios/Flutter/.last_build_id new file mode 100644 index 00000000..f81a25ba --- /dev/null +++ b/example/ios/Flutter/.last_build_id @@ -0,0 +1 @@ +f813edef71cf277d40748be56e64d733 \ No newline at end of file diff --git a/ios/Classes/SwiftFlutterVlcPlayerPlugin.swift b/ios/Classes/SwiftFlutterVlcPlayerPlugin.swift index 887e9c4e..f0373887 100644 --- a/ios/Classes/SwiftFlutterVlcPlayerPlugin.swift +++ b/ios/Classes/SwiftFlutterVlcPlayerPlugin.swift @@ -54,6 +54,7 @@ public class VLCView: NSObject, FlutterPlatformView { case .initialize: guard let urlString = arguments["url"] as? String, let url = URL(string: urlString) else { + result(FlutterError(code: "500", message: "Url is need to initialization", details: nil) @@ -89,8 +90,18 @@ public class VLCView: NSObject, FlutterPlatformView { return case .changeURL: self.player.stop() - let url = arguments["url"] as? String - let media = VLCMedia(url: URL(string: url!)!) + + guard let urlString = arguments["url"] as? String, let url = URL(string: urlString) else { + + result(FlutterError(code: "500", + message: "Url is need to initialization", + details: nil) + ) + return + } + + let media = VLCMedia(url: url) + self.player.media = media result(nil) return @@ -164,6 +175,8 @@ class VLCPlayerEventStreamHandler:NSObject, FlutterStreamHandler, VLCMediaPlayer func mediaPlayerStateChanged(_ aNotification: Notification?) { + guard let eventSink = self.eventSink else { return } + let player = aNotification?.object as? VLCMediaPlayer let media = player?.media let tracks: [Any] = media?.tracksInformation ?? [""] //[Any] @@ -176,8 +189,8 @@ class VLCPlayerEventStreamHandler:NSObject, FlutterStreamHandler, VLCMediaPlayer if player?.currentVideoTrackIndex != -1 { if (player?.currentVideoTrackIndex) != nil { track = tracks[0] as! NSDictionary - height = track["height"] as! Int - width = track["width"] as! Int + height = (track["height"] as? Int ) ?? 0 + width = (track["width"] as? Int) ?? 0 if height != 0 && width != 0 { ratio = Float(width / height) @@ -188,15 +201,16 @@ class VLCPlayerEventStreamHandler:NSObject, FlutterStreamHandler, VLCMediaPlayer } switch player?.state { + case .esAdded, .buffering, .opening: return case .playing: - eventSink?([ + eventSink([ "name": "buffering", "value": NSNumber(value: false) ]) if let value = media?.length.value { - eventSink?([ + eventSink([ "name": "playing", "value": NSNumber(value: true), "ratio": NSNumber(value: ratio), @@ -207,10 +221,10 @@ class VLCPlayerEventStreamHandler:NSObject, FlutterStreamHandler, VLCMediaPlayer } return case .ended: - eventSink?([ + eventSink([ "name": "ended" ]) - eventSink?([ + eventSink([ "name": "playing", "value": NSNumber(value: false), "reason": "EndReached" @@ -220,11 +234,11 @@ class VLCPlayerEventStreamHandler:NSObject, FlutterStreamHandler, VLCMediaPlayer print("(flutter_vlc_plugin) A VLC error occurred.") return case .paused, .stopped: - eventSink?([ + eventSink([ "name": "buffering", "value": NSNumber(value: false) ]) - eventSink?([ + eventSink([ "name": "playing", "value": NSNumber(value: false) ]) @@ -273,7 +287,7 @@ public class VLCViewFactory: NSObject, FlutterPlatformViewFactory { } -enum FlutterMethodCallOption :String{ +enum FlutterMethodCallOption :String { case initialize = "initialize" case setPlaybackState = "setPlaybackState" case dispose = "dispose" diff --git a/ios/flutter_vlc_player.podspec b/ios/flutter_vlc_player.podspec index a94cbff2..7f225b72 100644 --- a/ios/flutter_vlc_player.podspec +++ b/ios/flutter_vlc_player.podspec @@ -4,12 +4,12 @@ # Pod::Spec.new do |s| s.name = 'flutter_vlc_player' - s.version = '0.0.1' + s.version = '3.0.0' s.summary = 'A new flutter plugin project.' s.description = <<-DESC -A new flutter plugin project. + A VLC-powered alternative to Flutter video_player. Supports multiple players on one screen. DESC - s.homepage = 'http://example.com' + s.homepage = 'https://github.com/solid-software/flutter_vlc_player' s.license = { :file => '../LICENSE' } s.author = { 'Your Company' => 'email@example.com' } s.source = { :path => '.' } diff --git a/pubspec.yaml b/pubspec.yaml index 581d239f..92ded1c0 100755 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,6 +1,6 @@ name: flutter_vlc_player description: A VLC-powered alternative to Flutter's video_player. Supports multiple players on one screen. -version: 2.0.0 +version: 3.0.0 homepage: https://github.com/solid-software/flutter_vlc_player environment: From 298450845449b93a62911d8e0fe554baf6b5a740 Mon Sep 17 00:00:00 2001 From: mitch Date: Fri, 8 May 2020 15:42:39 -0400 Subject: [PATCH 4/6] PR comments --- ios/Classes/SwiftFlutterVlcPlayerPlugin.swift | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/ios/Classes/SwiftFlutterVlcPlayerPlugin.swift b/ios/Classes/SwiftFlutterVlcPlayerPlugin.swift index f0373887..6c3739fc 100644 --- a/ios/Classes/SwiftFlutterVlcPlayerPlugin.swift +++ b/ios/Classes/SwiftFlutterVlcPlayerPlugin.swift @@ -231,8 +231,13 @@ class VLCPlayerEventStreamHandler:NSObject, FlutterStreamHandler, VLCMediaPlayer ]) return case .error: - print("(flutter_vlc_plugin) A VLC error occurred.") + eventSink(FlutterError(code: "500", + message: "Player State got an error", + details: nil) + ) + return + case .paused, .stopped: eventSink([ "name": "buffering", From ab95b7588f251170f7ec485d43b09d447a6c48cf Mon Sep 17 00:00:00 2001 From: mitch Date: Sat, 9 May 2020 20:03:30 -0400 Subject: [PATCH 5/6] Updated example app with Play/Pause --- example/ios/Flutter/.last_build_id | 2 +- example/ios/Runner.xcodeproj/project.pbxproj | 36 +++++++++++-------- example/lib/main.dart | 24 +++++++++++++ ios/Classes/SwiftFlutterVlcPlayerPlugin.swift | 2 +- 4 files changed, 48 insertions(+), 16 deletions(-) diff --git a/example/ios/Flutter/.last_build_id b/example/ios/Flutter/.last_build_id index f81a25ba..69faea91 100644 --- a/example/ios/Flutter/.last_build_id +++ b/example/ios/Flutter/.last_build_id @@ -1 +1 @@ -f813edef71cf277d40748be56e64d733 \ No newline at end of file +9a6723ad18e3f950fccdc81adda11616 \ No newline at end of file diff --git a/example/ios/Runner.xcodeproj/project.pbxproj b/example/ios/Runner.xcodeproj/project.pbxproj index 6e83343e..9fcbe26b 100644 --- a/example/ios/Runner.xcodeproj/project.pbxproj +++ b/example/ios/Runner.xcodeproj/project.pbxproj @@ -3,7 +3,7 @@ archiveVersion = 1; classes = { }; - objectVersion = 46; + objectVersion = 50; objects = { /* Begin PBXBuildFile section */ @@ -68,7 +68,6 @@ C68CB3143740C2FFA027C642 /* Pods-Runner.release.xcconfig */, F18E8FBD8B753ECD2497A53F /* Pods-Runner.profile.xcconfig */, ); - name = Pods; path = Pods; sourceTree = ""; }; @@ -225,13 +224,12 @@ buildActionMask = 2147483647; files = ( ); - inputPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh", - "${PODS_ROOT}/../Flutter/Flutter.framework", + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", ); name = "[CP] Embed Pods Frameworks"; - outputPaths = ( - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Flutter.framework", + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; @@ -310,7 +308,6 @@ /* Begin XCBuildConfiguration section */ 249021D3217E4FDB00AE95B9 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_NONNULL = YES; @@ -366,13 +363,17 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + DEVELOPMENT_TEAM = FVU6RGL532; ENABLE_BITCODE = NO; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", "$(PROJECT_DIR)/Flutter", ); INFOPLIST_FILE = Runner/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); LIBRARY_SEARCH_PATHS = ( "$(inherited)", "$(PROJECT_DIR)/Flutter", @@ -387,7 +388,6 @@ }; 97C147031CF9000F007C117D /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_NONNULL = YES; @@ -443,7 +443,6 @@ }; 97C147041CF9000F007C117D /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_NONNULL = YES; @@ -487,7 +486,8 @@ MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SUPPORTED_PLATFORMS = iphoneos; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; TARGETED_DEVICE_FAMILY = "1,2"; VALIDATE_PRODUCT = YES; }; @@ -500,13 +500,17 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + DEVELOPMENT_TEAM = FVU6RGL532; ENABLE_BITCODE = NO; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", "$(PROJECT_DIR)/Flutter", ); INFOPLIST_FILE = Runner/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); LIBRARY_SEARCH_PATHS = ( "$(inherited)", "$(PROJECT_DIR)/Flutter", @@ -527,13 +531,17 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + DEVELOPMENT_TEAM = FVU6RGL532; ENABLE_BITCODE = NO; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", "$(PROJECT_DIR)/Flutter", ); INFOPLIST_FILE = Runner/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); LIBRARY_SEARCH_PATHS = ( "$(inherited)", "$(PROJECT_DIR)/Flutter", diff --git a/example/lib/main.dart b/example/lib/main.dart index e118ee6a..208f588c 100755 --- a/example/lib/main.dart +++ b/example/lib/main.dart @@ -27,6 +27,7 @@ class MyAppScaffoldState extends State { VlcPlayerController _videoViewController; VlcPlayerController _videoViewController2; + bool isPlaying = true; @override void initState() { @@ -93,6 +94,12 @@ class MyAppScaffoldState extends State { ), ), ), + FlatButton( + child: isPlaying ? Icon(Icons.pause) : Icon(Icons.play_arrow) , + onPressed: () => { + playOrPauseVideo() + } + ), FlatButton( child: Text("Change URL"), onPressed: () => _videoViewController.setStreamUrl( @@ -126,6 +133,23 @@ class MyAppScaffoldState extends State { ); } + void playOrPauseVideo() { + String state = _videoViewController.playingState.toString(); + + if ( state == "PlayingState.PLAYING" ){ + _videoViewController.pause(); + setState(() { + isPlaying = false; + }); + } else { + _videoViewController.play(); + setState(() { + isPlaying = true; + }); + } + + } + void _createCameraImage() async { Uint8List file = await _videoViewController.takeSnapshot(); setState(() { diff --git a/ios/Classes/SwiftFlutterVlcPlayerPlugin.swift b/ios/Classes/SwiftFlutterVlcPlayerPlugin.swift index 6c3739fc..b2a717ba 100644 --- a/ios/Classes/SwiftFlutterVlcPlayerPlugin.swift +++ b/ios/Classes/SwiftFlutterVlcPlayerPlugin.swift @@ -199,7 +199,7 @@ class VLCPlayerEventStreamHandler:NSObject, FlutterStreamHandler, VLCMediaPlayer } } - + switch player?.state { case .esAdded, .buffering, .opening: From 10971427a6e34dcd6bb3b0bfc3b71306a4c51d6d Mon Sep 17 00:00:00 2001 From: Mitch Ross Date: Thu, 14 May 2020 10:19:53 -0400 Subject: [PATCH 6/6] permission changes --- example/ios/.gitignore | 0 example/ios/Flutter/.last_build_id | 0 example/ios/Flutter/AppFrameworkInfo.plist | 0 example/ios/Flutter/Debug.xcconfig | 0 example/ios/Flutter/Release.xcconfig | 0 example/ios/Podfile | 0 example/ios/Runner.xcodeproj/project.pbxproj | 0 .../project.xcworkspace/contents.xcworkspacedata | 0 .../xcshareddata/IDEWorkspaceChecks.plist | 0 .../xcshareddata/WorkspaceSettings.xcsettings | 0 .../xcshareddata/xcschemes/Runner.xcscheme | 0 .../ios/Runner.xcworkspace/contents.xcworkspacedata | 0 .../xcshareddata/IDEWorkspaceChecks.plist | 0 .../xcshareddata/WorkspaceSettings.xcsettings | 0 example/ios/Runner/AppDelegate.swift | 0 .../AppIcon.appiconset/Contents.json | 0 .../AppIcon.appiconset/Icon-App-1024x1024@1x.png | Bin .../AppIcon.appiconset/Icon-App-20x20@1x.png | Bin .../AppIcon.appiconset/Icon-App-20x20@2x.png | Bin .../AppIcon.appiconset/Icon-App-20x20@3x.png | Bin .../AppIcon.appiconset/Icon-App-29x29@1x.png | Bin .../AppIcon.appiconset/Icon-App-29x29@2x.png | Bin .../AppIcon.appiconset/Icon-App-29x29@3x.png | Bin .../AppIcon.appiconset/Icon-App-40x40@1x.png | Bin .../AppIcon.appiconset/Icon-App-40x40@2x.png | Bin .../AppIcon.appiconset/Icon-App-40x40@3x.png | Bin .../AppIcon.appiconset/Icon-App-60x60@2x.png | Bin .../AppIcon.appiconset/Icon-App-60x60@3x.png | Bin .../AppIcon.appiconset/Icon-App-76x76@1x.png | Bin .../AppIcon.appiconset/Icon-App-76x76@2x.png | Bin .../AppIcon.appiconset/Icon-App-83.5x83.5@2x.png | Bin .../LaunchImage.imageset/Contents.json | 0 .../LaunchImage.imageset/LaunchImage.png | Bin .../LaunchImage.imageset/LaunchImage@2x.png | Bin .../LaunchImage.imageset/LaunchImage@3x.png | Bin .../Assets.xcassets/LaunchImage.imageset/README.md | 0 .../ios/Runner/Base.lproj/LaunchScreen.storyboard | 0 example/ios/Runner/Base.lproj/Main.storyboard | 0 example/ios/Runner/Info.plist | 0 example/ios/Runner/Runner-Bridging-Header.h | 0 example/test/widget_test.dart | 0 ios/.gitignore | 0 ios/Assets/.gitkeep | 0 ios/Classes/FlutterVlcPlayerPlugin.h | 0 ios/Classes/FlutterVlcPlayerPlugin.m | 0 ios/Classes/SwiftFlutterVlcPlayerPlugin.swift | 0 ios/flutter_vlc_player.podspec | 0 test/flutter_vlc_player_test.dart | 0 48 files changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 example/ios/.gitignore mode change 100644 => 100755 example/ios/Flutter/.last_build_id mode change 100644 => 100755 example/ios/Flutter/AppFrameworkInfo.plist mode change 100644 => 100755 example/ios/Flutter/Debug.xcconfig mode change 100644 => 100755 example/ios/Flutter/Release.xcconfig mode change 100644 => 100755 example/ios/Podfile mode change 100644 => 100755 example/ios/Runner.xcodeproj/project.pbxproj mode change 100644 => 100755 example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata mode change 100644 => 100755 example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist mode change 100644 => 100755 example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings mode change 100644 => 100755 example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme mode change 100644 => 100755 example/ios/Runner.xcworkspace/contents.xcworkspacedata mode change 100644 => 100755 example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist mode change 100644 => 100755 example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings mode change 100644 => 100755 example/ios/Runner/AppDelegate.swift mode change 100644 => 100755 example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json mode change 100644 => 100755 example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png mode change 100644 => 100755 example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png mode change 100644 => 100755 example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png mode change 100644 => 100755 example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png mode change 100644 => 100755 example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png mode change 100644 => 100755 example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png mode change 100644 => 100755 example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png mode change 100644 => 100755 example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png mode change 100644 => 100755 example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png mode change 100644 => 100755 example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png mode change 100644 => 100755 example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png mode change 100644 => 100755 example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png mode change 100644 => 100755 example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png mode change 100644 => 100755 example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png mode change 100644 => 100755 example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png mode change 100644 => 100755 example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json mode change 100644 => 100755 example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png mode change 100644 => 100755 example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png mode change 100644 => 100755 example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png mode change 100644 => 100755 example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md mode change 100644 => 100755 example/ios/Runner/Base.lproj/LaunchScreen.storyboard mode change 100644 => 100755 example/ios/Runner/Base.lproj/Main.storyboard mode change 100644 => 100755 example/ios/Runner/Info.plist mode change 100644 => 100755 example/ios/Runner/Runner-Bridging-Header.h mode change 100644 => 100755 example/test/widget_test.dart mode change 100644 => 100755 ios/.gitignore mode change 100644 => 100755 ios/Assets/.gitkeep mode change 100644 => 100755 ios/Classes/FlutterVlcPlayerPlugin.h mode change 100644 => 100755 ios/Classes/FlutterVlcPlayerPlugin.m mode change 100644 => 100755 ios/Classes/SwiftFlutterVlcPlayerPlugin.swift mode change 100644 => 100755 ios/flutter_vlc_player.podspec mode change 100644 => 100755 test/flutter_vlc_player_test.dart diff --git a/example/ios/.gitignore b/example/ios/.gitignore old mode 100644 new mode 100755 diff --git a/example/ios/Flutter/.last_build_id b/example/ios/Flutter/.last_build_id old mode 100644 new mode 100755 diff --git a/example/ios/Flutter/AppFrameworkInfo.plist b/example/ios/Flutter/AppFrameworkInfo.plist old mode 100644 new mode 100755 diff --git a/example/ios/Flutter/Debug.xcconfig b/example/ios/Flutter/Debug.xcconfig old mode 100644 new mode 100755 diff --git a/example/ios/Flutter/Release.xcconfig b/example/ios/Flutter/Release.xcconfig old mode 100644 new mode 100755 diff --git a/example/ios/Podfile b/example/ios/Podfile old mode 100644 new mode 100755 diff --git a/example/ios/Runner.xcodeproj/project.pbxproj b/example/ios/Runner.xcodeproj/project.pbxproj old mode 100644 new mode 100755 diff --git a/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata old mode 100644 new mode 100755 diff --git a/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist old mode 100644 new mode 100755 diff --git a/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings old mode 100644 new mode 100755 diff --git a/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme old mode 100644 new mode 100755 diff --git a/example/ios/Runner.xcworkspace/contents.xcworkspacedata b/example/ios/Runner.xcworkspace/contents.xcworkspacedata old mode 100644 new mode 100755 diff --git a/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist old mode 100644 new mode 100755 diff --git a/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings old mode 100644 new mode 100755 diff --git a/example/ios/Runner/AppDelegate.swift b/example/ios/Runner/AppDelegate.swift old mode 100644 new mode 100755 diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json old mode 100644 new mode 100755 diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png old mode 100644 new mode 100755 diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png old mode 100644 new mode 100755 diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png old mode 100644 new mode 100755 diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png old mode 100644 new mode 100755 diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png old mode 100644 new mode 100755 diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png old mode 100644 new mode 100755 diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png old mode 100644 new mode 100755 diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png old mode 100644 new mode 100755 diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png old mode 100644 new mode 100755 diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png old mode 100644 new mode 100755 diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png old mode 100644 new mode 100755 diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png old mode 100644 new mode 100755 diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png old mode 100644 new mode 100755 diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png old mode 100644 new mode 100755 diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png old mode 100644 new mode 100755 diff --git a/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json b/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json old mode 100644 new mode 100755 diff --git a/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png b/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png old mode 100644 new mode 100755 diff --git a/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png old mode 100644 new mode 100755 diff --git a/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png old mode 100644 new mode 100755 diff --git a/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md old mode 100644 new mode 100755 diff --git a/example/ios/Runner/Base.lproj/LaunchScreen.storyboard b/example/ios/Runner/Base.lproj/LaunchScreen.storyboard old mode 100644 new mode 100755 diff --git a/example/ios/Runner/Base.lproj/Main.storyboard b/example/ios/Runner/Base.lproj/Main.storyboard old mode 100644 new mode 100755 diff --git a/example/ios/Runner/Info.plist b/example/ios/Runner/Info.plist old mode 100644 new mode 100755 diff --git a/example/ios/Runner/Runner-Bridging-Header.h b/example/ios/Runner/Runner-Bridging-Header.h old mode 100644 new mode 100755 diff --git a/example/test/widget_test.dart b/example/test/widget_test.dart old mode 100644 new mode 100755 diff --git a/ios/.gitignore b/ios/.gitignore old mode 100644 new mode 100755 diff --git a/ios/Assets/.gitkeep b/ios/Assets/.gitkeep old mode 100644 new mode 100755 diff --git a/ios/Classes/FlutterVlcPlayerPlugin.h b/ios/Classes/FlutterVlcPlayerPlugin.h old mode 100644 new mode 100755 diff --git a/ios/Classes/FlutterVlcPlayerPlugin.m b/ios/Classes/FlutterVlcPlayerPlugin.m old mode 100644 new mode 100755 diff --git a/ios/Classes/SwiftFlutterVlcPlayerPlugin.swift b/ios/Classes/SwiftFlutterVlcPlayerPlugin.swift old mode 100644 new mode 100755 diff --git a/ios/flutter_vlc_player.podspec b/ios/flutter_vlc_player.podspec old mode 100644 new mode 100755 diff --git a/test/flutter_vlc_player_test.dart b/test/flutter_vlc_player_test.dart old mode 100644 new mode 100755