diff --git a/packages/flutter_tools/lib/src/proxied_devices/devices.dart b/packages/flutter_tools/lib/src/proxied_devices/devices.dart index bbad15a1c1..ee3f8f49b5 100644 --- a/packages/flutter_tools/lib/src/proxied_devices/devices.dart +++ b/packages/flutter_tools/lib/src/proxied_devices/devices.dart @@ -58,7 +58,7 @@ class ProxiedDevices extends DeviceDiscovery { @override Future> devices({DeviceDiscoveryFilter? filter}) async => - _devices ?? await discoverDevices(filter: filter); + _filterDevices(_devices ?? await discoverDevices(), filter); @override Future> discoverDevices({ @@ -72,7 +72,14 @@ class ProxiedDevices extends DeviceDiscovery { ]; _devices = devices; - return devices; + return _filterDevices(devices, filter); + } + + Future> _filterDevices(List devices, DeviceDiscoveryFilter? filter) async { + if (filter == null) { + return devices; + } + return filter.filterDevices(devices); } @override diff --git a/packages/flutter_tools/test/general.shard/proxied_devices/proxied_devices_test.dart b/packages/flutter_tools/test/general.shard/proxied_devices/proxied_devices_test.dart index d97f19de33..a78b0d59f5 100644 --- a/packages/flutter_tools/test/general.shard/proxied_devices/proxied_devices_test.dart +++ b/packages/flutter_tools/test/general.shard/proxied_devices/proxied_devices_test.dart @@ -8,10 +8,12 @@ import 'dart:typed_data'; import 'package:flutter_tools/src/base/logger.dart'; import 'package:flutter_tools/src/daemon.dart'; +import 'package:flutter_tools/src/device.dart'; import 'package:flutter_tools/src/proxied_devices/devices.dart'; import 'package:test/fake.dart'; import '../../src/common.dart'; +import '../../src/fake_devices.dart'; void main() { late BufferLogger bufferLogger; @@ -225,26 +227,45 @@ void main() { }); }); + final Map fakeDevice = { + 'name': 'device-name', + 'id': 'device-id', + 'category': 'mobile', + 'platformType': 'android', + 'platform': 'android-arm', + 'emulator': true, + 'ephemeral': false, + 'sdk': 'Test SDK (1.2.3)', + 'capabilities': { + 'hotReload': true, + 'hotRestart': true, + 'screenshot': false, + 'fastStart': false, + 'flutterExit': true, + 'hardwareRendering': true, + 'startPaused': true, + }, + }; + final Map fakeDevice2 = { + 'name': 'device-name2', + 'id': 'device-id2', + 'category': 'mobile', + 'platformType': 'android', + 'platform': 'android-arm', + 'emulator': true, + 'ephemeral': false, + 'sdk': 'Test SDK (1.2.3)', + 'capabilities': { + 'hotReload': true, + 'hotRestart': true, + 'screenshot': false, + 'fastStart': false, + 'flutterExit': true, + 'hardwareRendering': true, + 'startPaused': true, + }, + }; group('ProxiedDevice', () { - final Map fakeDevice = { - 'name': 'device-name', - 'id': 'device-id', - 'category': 'mobile', - 'platformType': 'android', - 'platform': 'android-arm', - 'emulator': true, - 'ephemeral': false, - 'sdk': 'Test SDK (1.2.3)', - 'capabilities': { - 'hotReload': true, - 'hotRestart': true, - 'screenshot': false, - 'fastStart': false, - 'flutterExit': true, - 'hardwareRendering': true, - 'startPaused': true, - }, - }; testWithoutContext('calls stopApp without application package if not passed', () async { bufferLogger = BufferLogger.test(); final ProxiedDevices proxiedDevices = ProxiedDevices( @@ -259,6 +280,42 @@ void main() { expect(message.data['params'], {'deviceId': 'device-id', 'userIdentifier': 'user-id'}); }); }); + + group('ProxiedDevices', () { + testWithoutContext('devices respects the filter passed in', () async { + bufferLogger = BufferLogger.test(); + final ProxiedDevices proxiedDevices = ProxiedDevices( + clientDaemonConnection, + logger: bufferLogger, + ); + + final FakeDeviceDiscoveryFilter fakeFilter = FakeDeviceDiscoveryFilter(); + + final FakeDevice supportedDevice = FakeDevice('Device', 'supported'); + fakeFilter.filteredDevices = [ + supportedDevice, + ]; + + final Future> resultFuture = proxiedDevices.devices(filter: fakeFilter); + + final DaemonMessage message = await serverDaemonConnection.incomingCommands.first; + expect(message.data['id'], isNotNull); + expect(message.data['method'], 'device.discoverDevices'); + + serverDaemonConnection.sendResponse(message.data['id']!, >[ + fakeDevice, + fakeDevice2, + ]); + + final List result = await resultFuture; + expect(result.length, 1); + expect(result.first.id, supportedDevice.id); + + expect(fakeFilter.devices!.length, 2); + expect(fakeFilter.devices![0].id, fakeDevice['id']); + expect(fakeFilter.devices![1].id, fakeDevice2['id']); + }); + }); } class FakeDaemonStreams implements DaemonStreams { @@ -373,3 +430,14 @@ class FakeDaemonConnection extends Fake implements DaemonConnection { throw Exception('"$method" request failed'); } } + +class FakeDeviceDiscoveryFilter extends Fake implements DeviceDiscoveryFilter { + List? filteredDevices; + List? devices; + + @override + Future> filterDevices(List devices) async { + this.devices = devices; + return filteredDevices!; + } +}