blob: eaad838b98ee9d31c27dae49663caa8013d57492 [file] [log] [blame]
// Copyright 2014 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import '../base/common.dart';
import '../base/process.dart';
import '../device.dart';
import '../emulator.dart';
import '../globals.dart' as globals;
import 'simulators.dart';
class IOSEmulators extends EmulatorDiscovery {
@override
bool get supportsPlatform => globals.platform.isMacOS;
@override
bool get canListAnything => globals.iosWorkflow?.canListEmulators ?? false;
@override
Future<List<Emulator>> get emulators async => getEmulators();
@override
bool get canLaunchAnything => canListAnything;
}
class IOSEmulator extends Emulator {
const IOSEmulator(String id) : super(id, true);
@override
String get name => 'iOS Simulator';
@override
String get manufacturer => 'Apple';
@override
Category get category => Category.mobile;
@override
PlatformType get platformType => PlatformType.ios;
@override
Future<void> launch({bool coldBoot = false}) async {
final String? simulatorPath = globals.xcode?.getSimulatorPath();
if (simulatorPath == null) {
throwToolExit('Could not find Simulator app');
}
Future<bool> launchSimulator(List<String> additionalArgs) async {
final List<String> args = <String>[
'open',
...additionalArgs,
'-a',
simulatorPath,
];
final RunResult launchResult = await globals.processUtils.run(args);
if (launchResult.exitCode != 0) {
globals.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(<String>['-n'])) {
return;
}
// Run again to force it to Foreground (using -n doesn't force existing
// devices to the foreground)
await launchSimulator(<String>[]);
}
}
/// Return the list of iOS Simulators (there can only be zero or one).
List<IOSEmulator> getEmulators() {
final String? simulatorPath = globals.xcode?.getSimulatorPath();
if (simulatorPath == null) {
return <IOSEmulator>[];
}
return <IOSEmulator>[const IOSEmulator(iosSimulatorId)];
}