OLD | NEW |
1 # Copyright 2014 The Chromium Authors. All rights reserved. | 1 # Copyright 2014 The Chromium Authors. All rights reserved. |
2 # Use of this source code is governed by a BSD-style license that can be | 2 # Use of this source code is governed by a BSD-style license that can be |
3 # found in the LICENSE file. | 3 # found in the LICENSE file. |
4 | 4 |
5 """Provides a variety of device interactions based on adb. | 5 """Provides a variety of device interactions based on adb. |
6 | 6 |
7 Eventually, this will be based on adb_wrapper. | 7 Eventually, this will be based on adb_wrapper. |
8 """ | 8 """ |
9 # pylint: disable=unused-argument | 9 # pylint: disable=unused-argument |
10 | 10 |
(...skipping 27 matching lines...) Expand all Loading... |
38 from pylib.utils import zip_utils | 38 from pylib.utils import zip_utils |
39 | 39 |
40 _DEFAULT_TIMEOUT = 30 | 40 _DEFAULT_TIMEOUT = 30 |
41 _DEFAULT_RETRIES = 3 | 41 _DEFAULT_RETRIES = 3 |
42 | 42 |
43 # A sentinel object for default values | 43 # A sentinel object for default values |
44 # TODO(jbudorick,perezju): revisit how default values are handled by | 44 # TODO(jbudorick,perezju): revisit how default values are handled by |
45 # the timeout_retry decorators. | 45 # the timeout_retry decorators. |
46 DEFAULT = object() | 46 DEFAULT = object() |
47 | 47 |
48 _CONTROL_USB_CHARGING_COMMANDS = [ | 48 _CONTROL_CHARGING_COMMANDS = [ |
49 { | 49 { |
50 # Nexus 4 | 50 # Nexus 4 |
51 'witness_file': '/sys/module/pm8921_charger/parameters/disabled', | 51 'witness_file': '/sys/module/pm8921_charger/parameters/disabled', |
52 'enable_command': 'echo 0 > /sys/module/pm8921_charger/parameters/disabled', | 52 'enable_command': 'echo 0 > /sys/module/pm8921_charger/parameters/disabled', |
53 'disable_command': | 53 'disable_command': |
54 'echo 1 > /sys/module/pm8921_charger/parameters/disabled', | 54 'echo 1 > /sys/module/pm8921_charger/parameters/disabled', |
55 }, | 55 }, |
56 { | 56 { |
57 # Nexus 5 | 57 # Nexus 5 |
58 # Setting the HIZ bit of the bq24192 causes the charger to actually ignore | 58 # Setting the HIZ bit of the bq24192 causes the charger to actually ignore |
(...skipping 1353 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1412 """ | 1412 """ |
1413 result = {} | 1413 result = {} |
1414 # Skip the first line, which is just a header. | 1414 # Skip the first line, which is just a header. |
1415 for line in self.RunShellCommand( | 1415 for line in self.RunShellCommand( |
1416 ['dumpsys', 'battery'], check_return=True)[1:]: | 1416 ['dumpsys', 'battery'], check_return=True)[1:]: |
1417 k, v = line.split(': ', 1) | 1417 k, v = line.split(': ', 1) |
1418 result[k.strip()] = v.strip() | 1418 result[k.strip()] = v.strip() |
1419 return result | 1419 return result |
1420 | 1420 |
1421 @decorators.WithTimeoutAndRetriesFromInstance() | 1421 @decorators.WithTimeoutAndRetriesFromInstance() |
1422 def GetUsbCharging(self, timeout=None, retries=None): | 1422 def GetCharging(self, timeout=None, retries=None): |
1423 """Gets the USB charging state of the device. | 1423 """Gets the charging state of the device. |
1424 | 1424 |
1425 Args: | 1425 Args: |
1426 timeout: timeout in seconds | 1426 timeout: timeout in seconds |
1427 retries: number of retries | 1427 retries: number of retries |
1428 Returns: | 1428 Returns: |
1429 True if the device is charging via USB, false otherwise. | 1429 True if the device is charging, false otherwise. |
1430 """ | 1430 """ |
1431 return (self.GetBatteryInfo().get('USB powered', '').lower() | 1431 battery_info = self.GetBatteryInfo() |
1432 in ('true', '1', 'yes')) | 1432 for k in ('AC powered', 'USB powered', 'Wireless powered'): |
| 1433 if (k in battery_info and |
| 1434 battery_info[k].lower() in ('true', '1', 'yes')): |
| 1435 return True |
| 1436 return False |
1433 | 1437 |
1434 @decorators.WithTimeoutAndRetriesFromInstance() | 1438 @decorators.WithTimeoutAndRetriesFromInstance() |
1435 def SetUsbCharging(self, enabled, timeout=None, retries=None): | 1439 def SetCharging(self, enabled, timeout=None, retries=None): |
1436 """Enables or disables USB charging on the device. | 1440 """Enables or disables charging on the device. |
1437 | 1441 |
1438 Args: | 1442 Args: |
1439 enabled: A boolean indicating whether USB charging should be enabled or | 1443 enabled: A boolean indicating whether charging should be enabled or |
1440 disabled. | 1444 disabled. |
1441 timeout: timeout in seconds | 1445 timeout: timeout in seconds |
1442 retries: number of retries | 1446 retries: number of retries |
1443 """ | 1447 """ |
1444 if 'usb_charging_config' not in self._cache: | 1448 if 'charging_config' not in self._cache: |
1445 for c in _CONTROL_USB_CHARGING_COMMANDS: | 1449 for c in _CONTROL_CHARGING_COMMANDS: |
1446 if self.FileExists(c['witness_file']): | 1450 if self.FileExists(c['witness_file']): |
1447 self._cache['usb_charging_config'] = c | 1451 self._cache['charging_config'] = c |
1448 break | 1452 break |
1449 else: | 1453 else: |
1450 raise device_errors.CommandFailedError( | 1454 raise device_errors.CommandFailedError( |
1451 'Unable to find charging commands.') | 1455 'Unable to find charging commands.') |
1452 | 1456 |
1453 if enabled: | 1457 if enabled: |
1454 command = self._cache['usb_charging_config']['enable_command'] | 1458 command = self._cache['charging_config']['enable_command'] |
1455 else: | 1459 else: |
1456 command = self._cache['usb_charging_config']['disable_command'] | 1460 command = self._cache['charging_config']['disable_command'] |
1457 | 1461 |
1458 def set_and_verify_usb_charging(): | 1462 def set_and_verify_charging(): |
1459 self.RunShellCommand(command) | 1463 self.RunShellCommand(command, check_return=True) |
1460 return self.GetUsbCharging() == enabled | 1464 return self.GetCharging() == enabled |
1461 | 1465 |
1462 timeout_retry.WaitFor(set_and_verify_usb_charging, wait_period=1) | 1466 timeout_retry.WaitFor(set_and_verify_charging, wait_period=1) |
1463 | 1467 |
1464 @decorators.WithTimeoutAndRetriesFromInstance() | 1468 @decorators.WithTimeoutAndRetriesFromInstance() |
1465 def GetDevicePieWrapper(self, timeout=None, retries=None): | 1469 def GetDevicePieWrapper(self, timeout=None, retries=None): |
1466 """Gets the absolute path to the run_pie wrapper on the device. | 1470 """Gets the absolute path to the run_pie wrapper on the device. |
1467 | 1471 |
1468 We have to build our device executables to be PIE, but they need to be able | 1472 We have to build our device executables to be PIE, but they need to be able |
1469 to run on versions of android that don't support PIE (i.e. ICS and below). | 1473 to run on versions of android that don't support PIE (i.e. ICS and below). |
1470 To do so, we push a wrapper to the device that lets older android versions | 1474 To do so, we push a wrapper to the device that lets older android versions |
1471 run PIE executables. This method pushes that wrapper to the device if | 1475 run PIE executables. This method pushes that wrapper to the device if |
1472 necessary and returns the path to it. | 1476 necessary and returns the path to it. |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1515 """ | 1519 """ |
1516 if not devices: | 1520 if not devices: |
1517 devices = adb_wrapper.AdbWrapper.GetDevices() | 1521 devices = adb_wrapper.AdbWrapper.GetDevices() |
1518 if not devices: | 1522 if not devices: |
1519 raise device_errors.NoDevicesError() | 1523 raise device_errors.NoDevicesError() |
1520 devices = [d if isinstance(d, cls) else cls(d) for d in devices] | 1524 devices = [d if isinstance(d, cls) else cls(d) for d in devices] |
1521 if async: | 1525 if async: |
1522 return parallelizer.Parallelizer(devices) | 1526 return parallelizer.Parallelizer(devices) |
1523 else: | 1527 else: |
1524 return parallelizer.SyncParallelizer(devices) | 1528 return parallelizer.SyncParallelizer(devices) |
OLD | NEW |