diff --git a/packages/flutter_tools/lib/src/android/android_emulator.dart b/packages/flutter_tools/lib/src/android/android_emulator.dart index c8cec6d24fa..0379655693b 100644 --- a/packages/flutter_tools/lib/src/android/android_emulator.dart +++ b/packages/flutter_tools/lib/src/android/android_emulator.dart @@ -41,20 +41,22 @@ class AndroidEmulator extends Emulator { String get label => _properties['avd.ini.displayname']; @override - Future launch() async { - final Future launchResult = + Future launch() async { + final Future launchResult = runAsync([getEmulatorPath(), '-avd', id]) .then((RunResult runResult) { if (runResult.exitCode != 0) { printError('$runResult'); + return false; } + return true; }); // emulator continues running on a successful launch so if we // haven't quit within 3 seconds we assume that's a success and just // return. - await Future.any(>[ + return Future.any(>[ launchResult, - new Future.delayed(const Duration(seconds: 3)) + new Future.delayed(const Duration(seconds: 3)).then((_) => true) ]); } } diff --git a/packages/flutter_tools/lib/src/emulator.dart b/packages/flutter_tools/lib/src/emulator.dart index 81bbe2aa65f..d89921036ac 100644 --- a/packages/flutter_tools/lib/src/emulator.dart +++ b/packages/flutter_tools/lib/src/emulator.dart @@ -95,7 +95,7 @@ abstract class Emulator { return id == other.id; } - Future launch(); + Future launch(); @override String toString() => name; diff --git a/packages/flutter_tools/lib/src/ios/ios_emulators.dart b/packages/flutter_tools/lib/src/ios/ios_emulators.dart index d971c3b030b..c18bd710cee 100644 --- a/packages/flutter_tools/lib/src/ios/ios_emulators.dart +++ b/packages/flutter_tools/lib/src/ios/ios_emulators.dart @@ -36,12 +36,27 @@ class IOSEmulator extends Emulator { String get label => null; @override - Future launch() async { - final RunResult launchResult = - await runAsync(['open', '-a', getSimulatorPath()]); - if (launchResult.exitCode != 0) { - printError('$launchResult'); + Future launch() async { + Future launchSimulator(List additionalArgs) async { + final List args = ['open'] + .followedBy(additionalArgs) + .followedBy(['-a', getSimulatorPath()]); + + final RunResult launchResult = await runAsync(args); + if (launchResult.exitCode != 0) { + printError('$launchResult'); + return false; + } + return true; } + + // First run with `-n` to force a device to boot if there isn't already one + if (!await launchSimulator(['-n'])) + return false; + + // Run again to force it to Foreground (using -n doesn't force existing + // devices to the foreground) + return launchSimulator([]); } } diff --git a/packages/flutter_tools/test/emulator_test.dart b/packages/flutter_tools/test/emulator_test.dart index be36d5f8fe1..30b411a78d8 100644 --- a/packages/flutter_tools/test/emulator_test.dart +++ b/packages/flutter_tools/test/emulator_test.dart @@ -62,7 +62,7 @@ class _MockEmulator extends Emulator { final String label; @override - Future launch() { + Future launch() { throw new UnimplementedError('Not implemented in Mock'); } }