[flutter_tools] support multiple fuchsia devices (#55780)
Fixes #55765
We are currently only returning the first device from dev-finder, instead we need to look at the whole list.
diff --git a/packages/flutter_tools/lib/src/device.dart b/packages/flutter_tools/lib/src/device.dart
index e7df4b3..61d46ff 100644
--- a/packages/flutter_tools/lib/src/device.dart
+++ b/packages/flutter_tools/lib/src/device.dart
@@ -19,6 +19,8 @@
import 'build_info.dart';
import 'features.dart';
import 'fuchsia/fuchsia_device.dart';
+import 'fuchsia/fuchsia_sdk.dart';
+import 'fuchsia/fuchsia_workflow.dart';
import 'globals.dart' as globals;
import 'ios/devices.dart';
import 'ios/simulators.dart';
@@ -82,7 +84,12 @@
iosWorkflow: globals.iosWorkflow,
),
IOSSimulators(iosSimulatorUtils: globals.iosSimulatorUtils),
- FuchsiaDevices(),
+ FuchsiaDevices(
+ fuchsiaSdk: fuchsiaSdk,
+ logger: globals.logger,
+ fuchsiaWorkflow: fuchsiaWorkflow,
+ platform: globals.platform,
+ ),
FlutterTesterDevices(),
MacOSDevices(),
LinuxDevices(
diff --git a/packages/flutter_tools/lib/src/fuchsia/fuchsia_device.dart b/packages/flutter_tools/lib/src/fuchsia/fuchsia_device.dart
index 0ec719a..9cee2f6 100644
--- a/packages/flutter_tools/lib/src/fuchsia/fuchsia_device.dart
+++ b/packages/flutter_tools/lib/src/fuchsia/fuchsia_device.dart
@@ -5,6 +5,7 @@
import 'dart:async';
import 'package:meta/meta.dart';
+import 'package:platform/platform.dart';
import 'package:vm_service/vm_service.dart' as vm_service;
import '../application_package.dart';
@@ -136,56 +137,75 @@
}
}
+/// Device discovery for Fuchsia devices.
class FuchsiaDevices extends PollingDeviceDiscovery {
- FuchsiaDevices() : super('Fuchsia devices');
+ FuchsiaDevices({
+ @required Platform platform,
+ @required FuchsiaWorkflow fuchsiaWorkflow,
+ @required FuchsiaSdk fuchsiaSdk,
+ @required Logger logger,
+ }) : _platform = platform,
+ _fuchsiaWorkflow = fuchsiaWorkflow,
+ _fuchsiaSdk = fuchsiaSdk,
+ _logger = logger,
+ super('Fuchsia devices');
+
+ final Platform _platform;
+ final FuchsiaWorkflow _fuchsiaWorkflow;
+ final FuchsiaSdk _fuchsiaSdk;
+ final Logger _logger;
@override
- bool get supportsPlatform => isFuchsiaSupportedPlatform();
+ bool get supportsPlatform => isFuchsiaSupportedPlatform(_platform);
@override
- bool get canListAnything => fuchsiaWorkflow.canListDevices;
+ bool get canListAnything => _fuchsiaWorkflow.canListDevices;
@override
Future<List<Device>> pollingGetDevices({ Duration timeout }) async {
- if (!fuchsiaWorkflow.canListDevices) {
+ if (!_fuchsiaWorkflow.canListDevices) {
return <Device>[];
}
- final String text = await fuchsiaSdk.listDevices(timeout: timeout);
+ final List<String> text = (await _fuchsiaSdk.listDevices(timeout: timeout))
+ ?.split('\n');
if (text == null || text.isEmpty) {
return <Device>[];
}
- final List<FuchsiaDevice> devices = await parseListDevices(text);
+ final List<FuchsiaDevice> devices = <FuchsiaDevice>[];
+ for (final String line in text) {
+ final FuchsiaDevice device = await _parseDevice(line);
+ if (device == null) {
+ continue;
+ }
+ devices.add(device);
+ }
return devices;
}
@override
Future<List<String>> getDiagnostics() async => const <String>[];
-}
-@visibleForTesting
-Future<List<FuchsiaDevice>> parseListDevices(String text) async {
- final List<FuchsiaDevice> devices = <FuchsiaDevice>[];
- for (final String rawLine in text.trim().split('\n')) {
- final String line = rawLine.trim();
+ Future<FuchsiaDevice> _parseDevice(String text) async {
+ final String line = text.trim();
// ['ip', 'device name']
final List<String> words = line.split(' ');
if (words.length < 2) {
- continue;
+ return null;
}
final String name = words[1];
- final String resolvedHost = await fuchsiaSdk.fuchsiaDevFinder.resolve(
+ final String resolvedHost = await _fuchsiaSdk.fuchsiaDevFinder.resolve(
name,
local: false,
);
if (resolvedHost == null) {
- globals.printError('Failed to resolve host for Fuchsia device `$name`');
- continue;
+ _logger.printError('Failed to resolve host for Fuchsia device `$name`');
+ return null;
}
- devices.add(FuchsiaDevice(resolvedHost, name: name));
+ return FuchsiaDevice(resolvedHost, name: name);
}
- return devices;
}
+
class FuchsiaDevice extends Device {
FuchsiaDevice(String id, {this.name}) : super(
id,
@@ -451,7 +471,7 @@
}
@override
- bool get supportsScreenshot => isFuchsiaSupportedPlatform();
+ bool get supportsScreenshot => isFuchsiaSupportedPlatform(globals.platform);
@override
Future<void> takeScreenshot(File outputFile) async {
diff --git a/packages/flutter_tools/lib/src/fuchsia/fuchsia_sdk.dart b/packages/flutter_tools/lib/src/fuchsia/fuchsia_sdk.dart
index f86bbd0..16bc964 100644
--- a/packages/flutter_tools/lib/src/fuchsia/fuchsia_sdk.dart
+++ b/packages/flutter_tools/lib/src/fuchsia/fuchsia_sdk.dart
@@ -4,6 +4,8 @@
import 'dart:async';
+import 'package:platform/platform.dart';
+
import '../base/context.dart';
import '../base/file_system.dart';
import '../base/io.dart';
@@ -18,8 +20,8 @@
FuchsiaSdk get fuchsiaSdk => context.get<FuchsiaSdk>();
/// Returns [true] if the current platform supports Fuchsia targets.
-bool isFuchsiaSupportedPlatform() {
- return globals.platform.isLinux || globals.platform.isMacOS;
+bool isFuchsiaSupportedPlatform(Platform platform) {
+ return platform.isLinux || platform.isMacOS;
}
/// The Fuchsia SDK shell commands.
@@ -45,6 +47,8 @@
FuchsiaKernelCompiler get fuchsiaKernelCompiler =>
_fuchsiaKernelCompiler ??= FuchsiaKernelCompiler();
+ /// Returns any attached devices is a newline-denominated String.
+ ///
/// Example output:
/// $ device-finder list -full
/// > 192.168.42.56 paper-pulp-bush-angel
@@ -57,7 +61,7 @@
if (devices == null) {
return null;
}
- return devices.isNotEmpty ? devices[0] : null;
+ return devices.isNotEmpty ? devices.join('\n') : null;
}
/// Returns the fuchsia system logs for an attached device where
@@ -116,7 +120,7 @@
/// FUCHSIA_SSH_CONFIG) to find the ssh configuration needed to talk to
/// a device.
factory FuchsiaArtifacts.find() {
- if (!isFuchsiaSupportedPlatform()) {
+ if (!isFuchsiaSupportedPlatform(globals.platform)) {
// Don't try to find the artifacts on platforms that are not supported.
return FuchsiaArtifacts();
}