blob: bd273e8b51c28b7cae0ca74130b18a9b42b21889 [file]
// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "base/command_line.h"
#include "base/trace_event/trace_event.h"
#include "sky/shell/platform/ios/FlutterAppDelegate.h"
#include "sky/shell/platform/ios/framework/Headers/FlutterViewController.h"
#include "sky/shell/switches.h"
NSURL* URLForSwitch(const char* name) {
auto cmd = *base::CommandLine::ForCurrentProcess();
NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];
if (cmd.HasSwitch(name)) {
auto url = [NSURL fileURLWithPath:@(cmd.GetSwitchValueASCII(name).c_str())];
[defaults setURL:url forKey:@(name)];
[defaults synchronize];
return url;
}
return [defaults URLForKey:@(name)];
}
@implementation FlutterAppDelegate
- (BOOL)application:(UIApplication*)application
didFinishLaunchingWithOptions:(NSDictionary*)launchOptions {
TRACE_EVENT0("flutter", "applicationDidFinishLaunchingWithOptions");
#if TARGET_IPHONE_SIMULATOR
FlutterDartProject* project = [[FlutterDartProject alloc]
initWithFLXArchive:URLForSwitch(sky::shell::switches::kFLX)
dartMain:URLForSwitch(sky::shell::switches::kMainDartFile)
packages:URLForSwitch(sky::shell::switches::kPackages)];
#else
NSString* bundlePath =
[[NSBundle mainBundle] pathForResource:@"FlutterApplication"
ofType:@"framework"
inDirectory:@"Frameworks"];
NSBundle* bundle = [NSBundle bundleWithPath:bundlePath];
FlutterDartProject* project =
[[FlutterDartProject alloc] initWithPrecompiledDartBundle:bundle];
#endif
CGRect frame = [UIScreen mainScreen].bounds;
UIWindow* window = [[UIWindow alloc] initWithFrame:frame];
FlutterViewController* viewController =
[[FlutterViewController alloc] initWithProject:project
nibName:nil
bundle:nil];
window.rootViewController = viewController;
[viewController release];
self.window = window;
[window release];
[self.window makeKeyAndVisible];
return YES;
}
// Use the NSNotificationCenter to notify services when we're opened with URLs.
// TODO(jackson): Revisit this API once we have more services using URLs to make
// it more typed and less brittle
- (BOOL)application:(UIApplication *)app
openURL:(NSURL *)url
sourceApplication:(NSString *)sourceApplication
annotation:(id)annotation
{
NSDictionary *dict = [@{
@"handled": [NSMutableDictionary dictionary],
@"url": url,
@"sourceApplication": sourceApplication,
} mutableCopy];
if (annotation != nil)
[dict setValue:annotation forKey:@"annotation"];
[[NSNotificationCenter defaultCenter] postNotificationName:@"openURL"
object:self
userInfo:dict];
BOOL handled = ((NSNumber *)dict[@"handled"][@"value"]).boolValue;
return handled;
}
@end