Make DeviceDomain echo a msg if doctor says it can't list anything (#9749)
This message will be picked up by IntelliJ and shown to the user in a toast.
diff --git a/packages/flutter_tools/lib/src/android/android_device.dart b/packages/flutter_tools/lib/src/android/android_device.dart
index b99cce6..a6ceda2 100644
--- a/packages/flutter_tools/lib/src/android/android_device.dart
+++ b/packages/flutter_tools/lib/src/android/android_device.dart
@@ -17,6 +17,7 @@
import '../build_info.dart';
import '../commands/build_apk.dart';
import '../device.dart';
+import '../doctor.dart';
import '../globals.dart';
import '../protocol_discovery.dart';
@@ -27,12 +28,15 @@
const String _defaultAdbPath = 'adb';
class AndroidDevices extends PollingDeviceDiscovery {
- AndroidDevices() : super('AndroidDevices');
+ AndroidDevices() : super('Android devices');
@override
bool get supportsPlatform => true;
@override
+ bool get canListAnything => doctor.androidWorkflow.canListDevices;
+
+ @override
List<Device> pollingGetDevices() => getAdbDevices();
}
diff --git a/packages/flutter_tools/lib/src/commands/daemon.dart b/packages/flutter_tools/lib/src/commands/daemon.dart
index 9c94345..d97cd6f 100644
--- a/packages/flutter_tools/lib/src/commands/daemon.dart
+++ b/packages/flutter_tools/lib/src/commands/daemon.dart
@@ -62,12 +62,7 @@
final int code = await daemon.onExit;
if (code != 0)
throwToolExit('Daemon exited with non-zero exit code: $code', exitCode: code);
- }, onError: _handleError);
- }
-
- dynamic _handleError(dynamic error, StackTrace stackTrace) {
- printError('Error from flutter daemon: $error', stackTrace: stackTrace);
- return null;
+ });
}
}
@@ -76,7 +71,9 @@
typedef Future<dynamic> CommandHandler(Map<String, dynamic> args);
class Daemon {
- Daemon(Stream<Map<String, dynamic>> commandStream, this.sendCommand, {
+ Daemon(
+ Stream<Map<String, dynamic>> commandStream,
+ this.sendCommand, {
this.daemonCommand,
this.notifyingLogger,
this.logToStdout: false
@@ -87,7 +84,7 @@
_registerDomain(deviceDomain = new DeviceDomain(this));
// Start listening.
- commandStream.listen(
+ _commandSubscription = commandStream.listen(
_handleRequest,
onDone: () {
if (!_onExitCompleter.isCompleted)
@@ -99,6 +96,7 @@
DaemonDomain daemonDomain;
AppDomain appDomain;
DeviceDomain deviceDomain;
+ StreamSubscription<Map<String, dynamic>> _commandSubscription;
final DispatchCommand sendCommand;
final DaemonCommand daemonCommand;
@@ -143,10 +141,15 @@
void _send(Map<String, dynamic> map) => sendCommand(map);
- void shutdown() {
+ void shutdown({dynamic error}) {
+ _commandSubscription?.cancel();
_domainMap.values.forEach((Domain domain) => domain.dispose());
- if (!_onExitCompleter.isCompleted)
- _onExitCompleter.complete(0);
+ if (!_onExitCompleter.isCompleted) {
+ if (error == null)
+ _onExitCompleter.complete(0);
+ else
+ _onExitCompleter.completeError(error);
+ }
}
}
@@ -539,6 +542,18 @@
if (!discoverer.supportsPlatform)
return;
+ if (!discoverer.canListAnything) {
+ sendEvent(
+ 'daemon.showMessage',
+ <String, String>{
+ 'title': 'Unable to list devices',
+ 'message':
+ 'Unable to discover ${discoverer.name}. Please run '
+ '"flutter doctor" to diagnose potential issues',
+ },
+ );
+ }
+
_discoverers.add(discoverer);
discoverer.onAdded.listen(_onDeviceEvent('device.added'));
@@ -650,7 +665,8 @@
});
void stdoutCommandResponse(Map<String, dynamic> command) {
- stdout.writeln('[${JSON.encode(command, toEncodable: _jsonEncodeObject)}]');
+ final String encoded = JSON.encode(command, toEncodable: _jsonEncodeObject);
+ stdout.writeln('[$encoded]');
}
dynamic _jsonEncodeObject(dynamic object) {
diff --git a/packages/flutter_tools/lib/src/device.dart b/packages/flutter_tools/lib/src/device.dart
index b356690..6898806 100644
--- a/packages/flutter_tools/lib/src/device.dart
+++ b/packages/flutter_tools/lib/src/device.dart
@@ -92,6 +92,11 @@
/// An abstract class to discover and enumerate a specific type of devices.
abstract class DeviceDiscovery {
bool get supportsPlatform;
+
+ /// Whether this device discovery is capable of listing any devices given the
+ /// current environment configuration.
+ bool get canListAnything;
+
List<Device> get devices;
}
diff --git a/packages/flutter_tools/lib/src/ios/devices.dart b/packages/flutter_tools/lib/src/ios/devices.dart
index f61d486..2b769f1 100644
--- a/packages/flutter_tools/lib/src/ios/devices.dart
+++ b/packages/flutter_tools/lib/src/ios/devices.dart
@@ -27,12 +27,15 @@
const Duration kPortForwardTimeout = const Duration(seconds: 10);
class IOSDevices extends PollingDeviceDiscovery {
- IOSDevices() : super('IOSDevices');
+ IOSDevices() : super('iOS devices');
@override
bool get supportsPlatform => platform.isMacOS;
@override
+ bool get canListAnything => doctor.iosWorkflow.canListDevices;
+
+ @override
List<Device> pollingGetDevices() => IOSDevice.getAttachedDevices();
}
diff --git a/packages/flutter_tools/lib/src/ios/simulators.dart b/packages/flutter_tools/lib/src/ios/simulators.dart
index 1f5f3e7..c4721aa 100644
--- a/packages/flutter_tools/lib/src/ios/simulators.dart
+++ b/packages/flutter_tools/lib/src/ios/simulators.dart
@@ -16,6 +16,7 @@
import '../base/process_manager.dart';
import '../build_info.dart';
import '../device.dart';
+import '../doctor.dart';
import '../flx.dart' as flx;
import '../globals.dart';
import '../protocol_discovery.dart';
@@ -27,12 +28,15 @@
const String _kFlutterTestDeviceSuffix = '(Flutter)';
class IOSSimulators extends PollingDeviceDiscovery {
- IOSSimulators() : super('IOSSimulators');
+ IOSSimulators() : super('iOS simulators');
@override
bool get supportsPlatform => platform.isMacOS;
@override
+ bool get canListAnything => doctor.iosWorkflow.canListDevices;
+
+ @override
List<Device> pollingGetDevices() => IOSSimulatorUtils.instance.getAttachedDevices();
}