in src/com/facebook/buck/cli/AdbCommandRunner.java [65:138]
List<IDevice> filterDevices(IDevice[] allDevices,
AdbOptions adbOptions,
TargetDeviceOptions deviceOptions) {
if (allDevices.length == 0) {
console.printBuildFailure("No devices are found.");
return null;
}
List<IDevice> devices = Lists.newArrayList();
TriState emulatorsOnly = TriState.UNSPECIFIED;
if (deviceOptions.isEmulatorsOnlyModeEnabled() && adbOptions.isMultiInstallModeEnabled()) {
emulatorsOnly = TriState.UNSPECIFIED;
} else if (deviceOptions.isEmulatorsOnlyModeEnabled()) {
emulatorsOnly = TriState.TRUE;
} else if (deviceOptions.isRealDevicesOnlyModeEnabled()) {
emulatorsOnly = TriState.FALSE;
}
int onlineDevices = 0;
for (IDevice device : allDevices) {
boolean passed = false;
if (device.isOnline()) {
onlineDevices++;
boolean serialMatches = true;
if (deviceOptions.hasSerialNumber()) {
serialMatches = device.getSerialNumber().equals(deviceOptions.getSerialNumber());
}
boolean deviceTypeMatches;
if (emulatorsOnly.isSet()) {
// Only devices of specific type are accepted:
// either real devices only or emulators only.
deviceTypeMatches = (emulatorsOnly.asBoolean() == device.isEmulator());
} else {
// All online devices match.
deviceTypeMatches = true;
}
passed = serialMatches && deviceTypeMatches;
}
if (passed) {
devices.add(device);
}
}
// Filtered out all devices.
if (onlineDevices == 0) {
console.printBuildFailure("No devices are found.");
return null;
}
if (devices.isEmpty()) {
console.printBuildFailure(String.format(
"Found %d connected device(s), but none of them matches specified filter.", onlineDevices
));
return null;
}
// Found multiple devices but multi-install mode is not enabled.
if (!adbOptions.isMultiInstallModeEnabled() && devices.size() > 1) {
console.printBuildFailure(
String.format("%d device(s) matches specified device filter (1 expected).\n" +
"Either disconnect other devices or enable multi-install mode (%s).",
devices.size(), AdbOptions.MULTI_INSTALL_MODE_SHORT_ARG));
return null;
}
// Report if multiple devices are matching the filter.
if (devices.size() > 1) {
console.getStdOut().printf("Found " + devices.size() + " matching devices.\n");
}
return devices;
}