| Index: tools/telemetry/telemetry/internal/platform/power_monitor/android_dumpsys_power_monitor.py
 | 
| diff --git a/tools/telemetry/telemetry/internal/platform/power_monitor/android_dumpsys_power_monitor.py b/tools/telemetry/telemetry/internal/platform/power_monitor/android_dumpsys_power_monitor.py
 | 
| index 6e363bb6f741f2b06276690a0da7680cd9da9584..eefdae885a607fb875a7c7865f031f597afe7588 100644
 | 
| --- a/tools/telemetry/telemetry/internal/platform/power_monitor/android_dumpsys_power_monitor.py
 | 
| +++ b/tools/telemetry/telemetry/internal/platform/power_monitor/android_dumpsys_power_monitor.py
 | 
| @@ -5,10 +5,9 @@
 | 
|  import csv
 | 
|  import logging
 | 
|  
 | 
| -from telemetry.internal.platform import power_monitor
 | 
| +from telemetry.internal.platform.power_monitor import android_power_monitor_base
 | 
|  
 | 
| -
 | 
| -class DumpsysPowerMonitor(power_monitor.PowerMonitor):
 | 
| +class DumpsysPowerMonitor(android_power_monitor_base.AndroidPowerMonitorBase):
 | 
|    """PowerMonitor that relies on the dumpsys batterystats to monitor the power
 | 
|    consumption of a single android application. This measure uses a heuristic
 | 
|    and is the same information end-users see with the battery application.
 | 
| @@ -29,57 +28,42 @@ class DumpsysPowerMonitor(power_monitor.PowerMonitor):
 | 
|    def CanMonitorPower(self):
 | 
|      result = self._platform.RunCommand('dumpsys batterystats -c')
 | 
|      DUMP_VERSION_INDEX = 0
 | 
| -    csvreader = csv.reader(result)
 | 
|      # Dumpsys power data is present in dumpsys versions 8 and 9
 | 
|      # which is found on L+ devices.
 | 
| -    if csvreader.next()[DUMP_VERSION_INDEX] in ['8', '9']:
 | 
| -      return True
 | 
| -    return False
 | 
| +    return (csv.reader(result).next()[DUMP_VERSION_INDEX] in ['8', '9'])
 | 
|  
 | 
|    def StartMonitoringPower(self, browser):
 | 
| +    self._CheckStart()
 | 
| +    assert browser
 | 
|      self._browser = browser
 | 
|      # Disable the charging of the device over USB. This is necessary because the
 | 
|      # device only collects information about power usage when the device is not
 | 
|      # charging.
 | 
| -    self._battery.SetCharging(False)
 | 
| +    self._ChargingOff(self._battery)
 | 
|  
 | 
|    def StopMonitoringPower(self):
 | 
| -    self._battery.SetCharging(True)
 | 
| -    if self._browser:
 | 
| -      package = self._browser._browser_backend.package
 | 
| -      self._browser = None
 | 
| +    self._CheckStop()
 | 
| +    assert self._browser
 | 
| +    self._ChargingOn(self._battery)
 | 
| +    package = self._browser._browser_backend.package
 | 
| +    self._browser = None
 | 
|  
 | 
| +    voltage = self._ParseVoltage(self._battery.GetBatteryInfo().get('voltage'))
 | 
|      power_data = self._battery.GetPowerData()
 | 
| -    battery_info = self._battery.GetBatteryInfo()
 | 
| -    voltage = battery_info.get('voltage')
 | 
| -    if voltage is None:
 | 
| -      # Converting at a nominal voltage of 4.0V, as those values are obtained by
 | 
| -      # a heuristic, and 4.0V is the voltage we set when using a monsoon device.
 | 
| -      voltage = 4.0
 | 
| -      logging.warning('Unable to get device voltage. Using %s.', voltage)
 | 
| -    else:
 | 
| -      voltage = float(voltage) / 1000
 | 
| -      logging.info('Device voltage at %s', voltage)
 | 
|      power_results = self.ProcessPowerData(power_data, voltage, package)
 | 
| -    if power_results['energy_consumption_mwh'] == 0:
 | 
| -      logging.warning('Power data is returning 0 for system total usage. %s'
 | 
| -                      % (power_data))
 | 
| -    if power_results['application_energy_consumption_mwh'] == 0:
 | 
| -      logging.warning('Power data is returning 0 usage for %s. %s'
 | 
| -                      % (package, power_data))
 | 
| +    self._LogPowerAnomalies(power_results, package)
 | 
|      return power_results
 | 
|  
 | 
|    @staticmethod
 | 
|    def ProcessPowerData(power_data, voltage, package):
 | 
| -    power_results = {'identifier': 'dumpsys', 'power_samples_mw': []}
 | 
| -    system_power = power_data['system_total']
 | 
| -    package_power = power_data['per_package'].get(package)
 | 
| -    if not package_power:
 | 
| +    package_power_data = power_data['per_package'].get(package)
 | 
| +    if not package_power_data:
 | 
|        logging.warning('No power data for %s in dumpsys output.' % package)
 | 
| -      package_consumption_mwh = 0
 | 
| +      package_power = 0
 | 
|      else:
 | 
| -      package_consumption_mwh = sum(package_power['data']) * voltage
 | 
| -    power_results['application_energy_consumption_mwh'] = \
 | 
| -        package_consumption_mwh
 | 
| -    power_results['energy_consumption_mwh'] = system_power * voltage
 | 
| -    return power_results
 | 
| +      package_power = sum(package_power_data['data'])
 | 
| +
 | 
| +    return {'identifier': 'dumpsys',
 | 
| +            'power_samples_mw': [],
 | 
| +            'energy_consumption_mwh': power_data['system_total'] * voltage,
 | 
| +            'application_energy_consumption_mwh': package_power * voltage}
 | 
| 
 |