Unverified Commit 25a3121d authored by Jonah Williams's avatar Jonah Williams Committed by GitHub

Prefer ephemeral devices from command line run (#34802)

parent 4c56b66f
...@@ -517,12 +517,8 @@ abstract class FlutterCommand extends Command<void> { ...@@ -517,12 +517,8 @@ abstract class FlutterCommand extends Command<void> {
} }
devices = devices.where((Device device) => device.isSupported()).toList(); devices = devices.where((Device device) => device.isSupported()).toList();
// If the user has not specified all devices and has multiple connected
// then filter then list by those supported in the current project. If
// this ends up with a single device we can proceed as normal.
if (devices.length > 1 && !deviceManager.hasSpecifiedAllDevices && !deviceManager.hasSpecifiedDeviceId) { if (devices.length > 1 && !deviceManager.hasSpecifiedAllDevices && !deviceManager.hasSpecifiedDeviceId) {
final FlutterProject flutterProject = FlutterProject.current(); devices = filterDevices(devices);
devices.removeWhere((Device device) => !device.isSupportedForProject(flutterProject));
} }
if (devices.isEmpty) { if (devices.isEmpty) {
...@@ -698,3 +694,24 @@ abstract class FastFlutterCommand extends FlutterCommand { ...@@ -698,3 +694,24 @@ abstract class FastFlutterCommand extends FlutterCommand {
); );
} }
} }
// If the user has not specified all devices and has multiple connected
// then filter the list by those supported in the current project and
// remove non-ephemeral device types. If this ends up with a single
// device we can proceed as normal.
@visibleForTesting
List<Device> filterDevices(List<Device> devices) {
final FlutterProject flutterProject = FlutterProject.current();
devices = devices
.where((Device device) => device.isSupportedForProject(flutterProject))
.toList();
// Note: ephemeral is nullable for device types where this is not well
// defined.
if (devices.any((Device device) => device.ephemeral == true)) {
devices = devices
.where((Device device) => device.ephemeral == true)
.toList();
}
return devices;
}
...@@ -4,6 +4,8 @@ ...@@ -4,6 +4,8 @@
import 'package:flutter_tools/src/cache.dart'; import 'package:flutter_tools/src/cache.dart';
import 'package:flutter_tools/src/base/time.dart'; import 'package:flutter_tools/src/base/time.dart';
import 'package:flutter_tools/src/device.dart';
import 'package:flutter_tools/src/project.dart';
import 'package:flutter_tools/src/usage.dart'; import 'package:flutter_tools/src/usage.dart';
import 'package:flutter_tools/src/base/common.dart'; import 'package:flutter_tools/src/base/common.dart';
import 'package:flutter_tools/src/runner/flutter_command.dart'; import 'package:flutter_tools/src/runner/flutter_command.dart';
...@@ -289,6 +291,43 @@ void main() { ...@@ -289,6 +291,43 @@ void main() {
FlutterVersion: () => betaVersion, FlutterVersion: () => betaVersion,
}); });
}); });
group('Filter devices', () {
MockDevice ephemeral;
MockDevice nonEphemeralOne;
MockDevice nonEphemeralTwo;
MockDevice unsupported;
setUp(() {
ephemeral = MockDevice(true);
nonEphemeralOne = MockDevice(false);
nonEphemeralTwo = MockDevice(false);
unsupported = MockDevice(true, false);
});
test('chooses ephemeral device', () {
final List<Device> filtered = filterDevices(<Device>[
ephemeral,
nonEphemeralOne,
nonEphemeralTwo,
unsupported,
]);
expect(filtered.single, ephemeral);
});
test('does not remove all non-ephemeral', () {
final List<Device> filtered = filterDevices(<Device>[
nonEphemeralOne,
nonEphemeralTwo,
]);
expect(filtered, <Device>[
nonEphemeralOne,
nonEphemeralTwo,
]);
});
});
} }
...@@ -309,3 +348,15 @@ class FakeCommand extends FlutterCommand { ...@@ -309,3 +348,15 @@ class FakeCommand extends FlutterCommand {
} }
class MockVersion extends Mock implements FlutterVersion {} class MockVersion extends Mock implements FlutterVersion {}
class MockDevice extends Mock implements Device {
MockDevice(this.ephemeral, [this._isSupported = true]);
@override
final bool ephemeral;
bool _isSupported;
@override
bool isSupportedForProject(FlutterProject flutterProject) => _isSupported;
}
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