Chromium Code Reviews| Index: build/android/pylib/device/adb_wrapper.py |
| diff --git a/build/android/pylib/device/adb_wrapper.py b/build/android/pylib/device/adb_wrapper.py |
| index 36f8f484b00fbe2ec05c4c440ab13af10dde71f2..fa430f55e32f59da51b1e8664fb3cad0881c7222 100644 |
| --- a/build/android/pylib/device/adb_wrapper.py |
| +++ b/build/android/pylib/device/adb_wrapper.py |
| @@ -17,6 +17,7 @@ from pylib import cmd_helper |
| from pylib import constants |
| from pylib.device import decorators |
| from pylib.device import device_errors |
| +from pylib.device import device_filter |
| from pylib.utils import timeout_retry |
| @@ -158,12 +159,23 @@ class AdbWrapper(object): |
| cls._RunAdbCmd(['start-server'], timeout=timeout, retries=retries, |
| cpu_affinity=0) |
| - # TODO(craigdh): Determine the filter criteria that should be supported. |
| @classmethod |
| - def GetDevices(cls, timeout=_DEFAULT_TIMEOUT, retries=_DEFAULT_RETRIES): |
| + def GetDevices(cls, filters=None, timeout=_DEFAULT_TIMEOUT, |
| + retries=_DEFAULT_RETRIES): |
| + """DEPRECATED. Refer to Devices(...) below.""" |
| + # TODO(jbudorick): Remove this function once no more clients are using it. |
| + return cls.Devices(filters=filters, timeout=timeout, retries=retries) |
| + |
| + @classmethod |
| + def Devices(cls, filters=None, timeout=_DEFAULT_TIMEOUT, |
| + retries=_DEFAULT_RETRIES): |
| """Get the list of active attached devices. |
| Args: |
| + filters: (optional) A list of binary functions that take an AdbWrapper |
| + instance and a string description. Any device for which all provided |
| + filter functions do not return True will not be included in the |
| + returned list. |
| timeout: (optional) Timeout per try in seconds. |
| retries: (optional) Number of retries to attempt. |
| @@ -171,9 +183,18 @@ class AdbWrapper(object): |
| AdbWrapper instances. |
| """ |
| output = cls._RunAdbCmd(['devices'], timeout=timeout, retries=retries) |
| - lines = [line.split() for line in output.splitlines()] |
| - return [AdbWrapper(line[0]) for line in lines |
| - if len(line) == 2 and line[1] == 'device'] |
| + lines = (line.split() for line in output.splitlines()) |
| + devices = (AdbWrapper(line[0]) for line in lines if len(line) == 2) |
| + |
| + def matches_all_filters(device): |
| + for f in filters or (): |
| + if not f(device): |
| + logging.info('Device %s failed filter %s', device.GetDeviceSerial(), |
| + f.__name__) |
| + return False |
| + return True |
| + |
| + return [d for d in devices if matches_all_filters(d)] |
|
perezju
2015/04/16 08:57:55
optional nit: I would go for something a bit more
jbudorick
2015/04/16 13:53:14
landing as-is
|
| def GetDeviceSerial(self): |
| """Gets the device serial number associated with this object. |