Unverified Commit 2d9902d9 authored by Christopher Fujino's avatar Christopher Fujino Committed by GitHub

Cleanup ios devices (#52568)

parent dc8ffe04
......@@ -76,7 +76,11 @@ class DeviceManager {
androidWorkflow: androidWorkflow,
processManager: globals.processManager,
),
IOSDevices(),
IOSDevices(
platform: globals.platform,
xcdevice: globals.xcdevice,
iosWorkflow: globals.iosWorkflow,
),
IOSSimulators(iosSimulatorUtils: globals.iosSimulatorUtils),
FuchsiaDevices(),
FlutterTesterDevices(),
......
......@@ -27,25 +27,51 @@ import '../protocol_discovery.dart';
import '../vmservice.dart';
import 'fallback_discovery.dart';
import 'ios_deploy.dart';
import 'ios_workflow.dart';
import 'mac.dart';
class IOSDevices extends PollingDeviceDiscovery {
IOSDevices() : super('iOS devices');
// TODO(fujino): make these required and remove fallbacks once internal invocations migrated
IOSDevices({
Platform platform,
XCDevice xcdevice,
IOSWorkflow iosWorkflow,
}) : _platform = platform ?? globals.platform,
_xcdevice = xcdevice ?? globals.xcdevice,
_iosWorkflow = iosWorkflow ?? globals.iosWorkflow,
super('iOS devices');
final Platform _platform;
final XCDevice _xcdevice;
final IOSWorkflow _iosWorkflow;
@override
bool get supportsPlatform => globals.platform.isMacOS;
bool get supportsPlatform => _platform.isMacOS;
@override
bool get canListAnything => globals.iosWorkflow.canListDevices;
bool get canListAnything => _iosWorkflow.canListDevices;
@override
Future<List<Device>> pollingGetDevices({ Duration timeout }) {
return IOSDevice.getAttachedDevices(
globals.platform, globals.xcdevice, timeout: timeout);
Future<List<Device>> pollingGetDevices({ Duration timeout }) async {
if (!_platform.isMacOS) {
throw UnsupportedError(
'Control of iOS devices or simulators only supported on macOS.'
);
}
return await _xcdevice.getAvailableTetheredIOSDevices(timeout: timeout);
}
@override
Future<List<String>> getDiagnostics() => IOSDevice.getDiagnostics(globals.platform, globals.xcdevice);
Future<List<String>> getDiagnostics() async {
if (!_platform.isMacOS) {
return const <String>[
'Control of iOS devices or simulators only supported on macOS.'
];
}
return await _xcdevice.getDiagnostics();
}
}
class IOSDevice extends Device {
......@@ -57,10 +83,13 @@ class IOSDevice extends Device {
@required Platform platform,
@required Artifacts artifacts,
@required IOSDeploy iosDeploy,
@required Logger logger,
})
: _sdkVersion = sdkVersion,
_iosDeploy = iosDeploy,
_fileSystem = fileSystem,
_logger = logger,
_platform = platform,
super(
id,
category: Category.mobile,
......@@ -82,6 +111,8 @@ class IOSDevice extends Device {
final String _sdkVersion;
final IOSDeploy _iosDeploy;
final FileSystem _fileSystem;
final Logger _logger;
final Platform _platform;
/// May be 0 if version cannot be parsed.
int get majorSdkVersion {
......@@ -113,22 +144,6 @@ class IOSDevice extends Device {
@override
bool get supportsStartPaused => false;
static Future<List<IOSDevice>> getAttachedDevices(Platform platform, XCDevice xcdevice, { Duration timeout }) async {
if (!platform.isMacOS) {
throw UnsupportedError('Control of iOS devices or simulators only supported on macOS.');
}
return await xcdevice.getAvailableTetheredIOSDevices(timeout: timeout);
}
static Future<List<String>> getDiagnostics(Platform platform, XCDevice xcdevice) async {
if (!platform.isMacOS) {
return const <String>['Control of iOS devices or simulators only supported on macOS.'];
}
return await xcdevice.getDiagnostics();
}
@override
Future<bool> isAppInstalled(IOSApp app) async {
bool result;
......@@ -138,7 +153,7 @@ class IOSDevice extends Device {
deviceId: id,
);
} on ProcessException catch (e) {
globals.printError(e.message);
_logger.printError(e.message);
return false;
}
return result;
......@@ -151,7 +166,7 @@ class IOSDevice extends Device {
Future<bool> installApp(IOSApp app) async {
final Directory bundle = _fileSystem.directory(app.deviceBundlePath);
if (!bundle.existsSync()) {
globals.printError('Could not find application bundle at ${bundle.path}; have you run "flutter build ios"?');
_logger.printError('Could not find application bundle at ${bundle.path}; have you run "flutter build ios"?');
return false;
}
......@@ -163,14 +178,14 @@ class IOSDevice extends Device {
launchArguments: <String>[],
);
} on ProcessException catch (e) {
globals.printError(e.message);
_logger.printError(e.message);
return false;
}
if (installationResult != 0) {
globals.printError('Could not install ${bundle.path} on $id.');
globals.printError('Try launching Xcode and selecting "Product > Run" to fix the problem:');
globals.printError(' open ios/Runner.xcworkspace');
globals.printError('');
_logger.printError('Could not install ${bundle.path} on $id.');
_logger.printError('Try launching Xcode and selecting "Product > Run" to fix the problem:');
_logger.printError(' open ios/Runner.xcworkspace');
_logger.printError('');
return false;
}
return true;
......@@ -185,11 +200,11 @@ class IOSDevice extends Device {
bundleId: app.id,
);
} on ProcessException catch (e) {
globals.printError(e.message);
_logger.printError(e.message);
return false;
}
if (uninstallationResult != 0) {
globals.printError('Could not uninstall ${app.id} on $id.');
_logger.printError('Could not uninstall ${app.id} on $id.');
return false;
}
return true;
......@@ -212,7 +227,7 @@ class IOSDevice extends Device {
if (!prebuiltApplication) {
// TODO(chinmaygarde): Use mainPath, route.
globals.printTrace('Building ${package.name} for $id');
_logger.printTrace('Building ${package.name} for $id');
// Step 1: Build the precompiled/DBC application if necessary.
final XcodeBuildResult buildResult = await buildXcodeProject(
......@@ -223,9 +238,9 @@ class IOSDevice extends Device {
activeArch: cpuArchitecture,
);
if (!buildResult.success) {
globals.printError('Could not build the precompiled application for the device.');
_logger.printError('Could not build the precompiled application for the device.');
await diagnoseXcodeBuildFailure(buildResult);
globals.printError('');
_logger.printError('');
return LaunchResult.failed();
}
packageId = buildResult.xcodeBuildExecution?.buildSettings['PRODUCT_BUNDLE_IDENTIFIER'];
......@@ -240,7 +255,7 @@ class IOSDevice extends Device {
// Step 2: Check that the application exists at the specified path.
final Directory bundle = _fileSystem.directory(package.deviceBundlePath);
if (!bundle.existsSync()) {
globals.printError('Could not find the built application bundle at ${bundle.path}.');
_logger.printError('Could not find the built application bundle at ${bundle.path}.');
return LaunchResult.failed();
}
......@@ -267,7 +282,7 @@ class IOSDevice extends Device {
// "system_debug_ios" integration test in the CI, which simulates a
// home-screen launch.
if (debuggingOptions.debuggingEnabled &&
globals.platform.environment['FLUTTER_TOOLS_DEBUG_WITHOUT_CHECKED_MODE'] != 'true') ...<String>[
_platform.environment['FLUTTER_TOOLS_DEBUG_WITHOUT_CHECKED_MODE'] != 'true') ...<String>[
'--enable-checked-mode',
'--verify-entry-points',
],
......@@ -282,13 +297,13 @@ class IOSDevice extends Device {
if (platformArgs['trace-startup'] as bool ?? false) '--trace-startup',
];
final Status installStatus = globals.logger.startProgress(
final Status installStatus = _logger.startProgress(
'Installing and launching...',
timeout: timeoutConfiguration.slowOperation);
try {
ProtocolDiscovery observatoryDiscovery;
if (debuggingOptions.debuggingEnabled) {
globals.printTrace('Debugging is enabled, connecting to observatory');
_logger.printTrace('Debugging is enabled, connecting to observatory');
observatoryDiscovery = ProtocolDiscovery.observatory(
getLogReader(app: package),
portForwarder: portForwarder,
......@@ -303,10 +318,10 @@ class IOSDevice extends Device {
launchArguments: launchArguments,
);
if (installationResult != 0) {
globals.printError('Could not run ${bundle.path} on $id.');
globals.printError('Try launching Xcode and selecting "Product > Run" to fix the problem:');
globals.printError(' open ios/Runner.xcworkspace');
globals.printError('');
_logger.printError('Could not run ${bundle.path} on $id.');
_logger.printError('Try launching Xcode and selecting "Product > Run" to fix the problem:');
_logger.printError(' open ios/Runner.xcworkspace');
_logger.printError('');
return LaunchResult.failed();
}
......@@ -314,9 +329,9 @@ class IOSDevice extends Device {
return LaunchResult.succeeded();
}
globals.printTrace('Application launched on the device. Waiting for observatory port.');
_logger.printTrace('Application launched on the device. Waiting for observatory port.');
final FallbackDiscovery fallbackDiscovery = FallbackDiscovery(
logger: globals.logger,
logger: _logger,
mDnsObservatoryDiscovery: MDnsObservatoryDiscovery.instance,
portForwarder: portForwarder,
protocolDiscovery: observatoryDiscovery,
......@@ -334,7 +349,7 @@ class IOSDevice extends Device {
}
return LaunchResult.succeeded(observatoryUri: localUri);
} on ProcessException catch (e) {
globals.printError(e.message);
_logger.printError(e.message);
return LaunchResult.failed();
} finally {
installStatus.stop();
......
......@@ -2,13 +2,9 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import '../base/context.dart';
import '../doctor.dart';
import '../globals.dart' as globals;
// TODO(fujino): remove once internal references replaced by `globals.iosWorkflow`
IOSWorkflow get iosWorkflow => context.get<IOSWorkflow>();
class IOSWorkflow implements Workflow {
const IOSWorkflow();
......
......@@ -354,6 +354,7 @@ class XCDevice {
sdkVersion: _sdkVersion(deviceProperties),
artifacts: globals.artifacts,
fileSystem: globals.fs,
logger: globals.logger,
iosDeploy: globals.iosDeploy,
platform: globals.platform,
));
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment