Commit 472a020d authored by markuso's avatar markuso Committed by Commit bot

Implement device::BatteryStatus support for UPower daemon 0.99.x

The org.freedesktop.UPower API was changed when upgrading the UPower daemon
from version 0.9.23 to 0.99.x. The BatteryStatusManagerLinux used the
"Changed" signal which was replaced by the "PropertyChanged" signal.

Change the BatteryStatusManagerLinux to use the new UPower API
(and keep compatibility with the 0.9.23 version, which is still used in
Ubuntu 14.04 LTS).

1. use dbus::PropertySet: the dbus::PropertySet provides simple access to
the properties and connection to the property-changed notifications.

2. Use UPower method GetDisplayDevice:
The 'DisplayDevice' is a composite battery device. That was added in UPower
version 0.99.0. If we don't get that device or if it is no battery, then we
continue to enumerate all devices.

3. Listen to 'DeviceAdded' and 'DeviceRemoved' signals:
Re-enumerate battery devices if a device is added/removed.

4. Compatibility with UPower version < 0.99
Only old UPower versions need to connect to the 'Changed' signal.

5. Rewrite the existing unittests to use a BatteryStatusManagerLinux instance
with a dbus::MockBus and mock the dbus-methods/properties for the test.
Add more unittests:
- for changing device properties
- for the DisplayDevice
- for enumerating devices
- for the DeviceAdded and DeviceRemoved signals

Review-Url: https://codereview.chromium.org/2066503002
Cr-Commit-Position: refs/heads/master@{#413745}
parent b161f605
......@@ -14,7 +14,6 @@ if (is_mac) {
}
is_linux_without_udev = is_linux && !use_udev
is_linux_without_dbus = is_linux && !use_dbus
test("device_unittests") {
sources = [
......@@ -86,8 +85,9 @@ test("device_unittests") {
"//url",
]
if (!is_linux_without_dbus && !is_chromeos) {
if (is_linux && !is_chromeos && use_dbus) {
sources += [ "battery/battery_status_manager_linux_unittest.cc" ]
deps += [ "//dbus:test_support" ]
}
# HID and Serial:
......
......@@ -16,6 +16,7 @@ if (!is_android) {
"battery_monitor_impl.h",
"battery_status_manager_chromeos.cc",
"battery_status_manager_default.cc",
"battery_status_manager_linux-inl.h",
"battery_status_manager_linux.cc",
"battery_status_manager_linux.h",
"battery_status_manager_mac.cc",
......
......@@ -120,6 +120,7 @@
'battery_monitor_impl.h',
'battery_status_manager_chromeos.cc',
'battery_status_manager_default.cc',
'battery_status_manager_linux-inl.h',
'battery_status_manager_linux.cc',
'battery_status_manager_linux.h',
'battery_status_manager_mac.cc',
......
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef DEVICE_BATTERY_BATTERY_STATUS_MANAGER_LINUX_INL_H_
#define DEVICE_BATTERY_BATTERY_STATUS_MANAGER_LINUX_INL_H_
namespace device {
const char kUPowerInterfaceName[] = "org.freedesktop.UPower";
const char kUPowerServiceName[] = "org.freedesktop.UPower";
const char kUPowerMethodEnumerateDevices[] = "EnumerateDevices";
const char kUPowerMethodGetDisplayDevice[] = "GetDisplayDevice";
const char kUPowerPath[] = "/org/freedesktop/UPower";
const char kUPowerPropertyDaemonVersion[] = "DaemonVersion";
const char kUPowerSignalDeviceAdded[] = "DeviceAdded";
const char kUPowerSignalDeviceRemoved[] = "DeviceRemoved";
const char kUPowerDeviceInterfaceName[] = "org.freedesktop.UPower.Device";
const char kUPowerDevicePropertyIsPresent[] = "IsPresent";
const char kUPowerDevicePropertyPercentage[] = "Percentage";
const char kUPowerDevicePropertyState[] = "State";
const char kUPowerDevicePropertyTimeToEmpty[] = "TimeToEmpty";
const char kUPowerDevicePropertyTimeToFull[] = "TimeToFull";
const char kUPowerDevicePropertyType[] = "Type";
const char kUPowerDeviceSignalChanged[] = "Changed";
} // namespace device
#endif // DEVICE_BATTERY_BATTERY_STATUS_MANAGER_LINUX_INL_H_
......@@ -6,13 +6,13 @@
#include "device/battery/battery_export.h"
#include "device/battery/battery_status.mojom.h"
#include "device/battery/battery_status_manager.h"
namespace base {
class DictionaryValue;
}
namespace dbus {
class Bus;
} // namespace dbus
namespace device {
// UPowerDeviceState reflects the possible UPower.Device.State values,
// see upower.freedesktop.org/docs/Device.html#Device:State.
enum UPowerDeviceState {
......@@ -25,9 +25,50 @@ enum UPowerDeviceState {
UPOWER_DEVICE_STATE_PENDING_DISCHARGE = 6,
};
// Returns the BatteryStatus computed using the provided dictionary.
DEVICE_BATTERY_EXPORT BatteryStatus ComputeWebBatteryStatus(
const base::DictionaryValue& dictionary);
// UPowerDeviceType reflects the possible UPower.Device.Type values,
// see upower.freedesktop.org/docs/Device.html#Device:Type.
enum UPowerDeviceType {
UPOWER_DEVICE_TYPE_UNKNOWN = 0,
UPOWER_DEVICE_TYPE_LINE_POWER = 1,
UPOWER_DEVICE_TYPE_BATTERY = 2,
UPOWER_DEVICE_TYPE_UPS = 3,
UPOWER_DEVICE_TYPE_MONITOR = 4,
UPOWER_DEVICE_TYPE_MOUSE = 5,
UPOWER_DEVICE_TYPE_KEYBOARD = 6,
UPOWER_DEVICE_TYPE_PDA = 7,
UPOWER_DEVICE_TYPE_PHONE = 8,
};
// Creates a notification thread and delegates Start/Stop calls to it.
class DEVICE_BATTERY_EXPORT BatteryStatusManagerLinux
: public BatteryStatusManager {
public:
explicit BatteryStatusManagerLinux(
const BatteryStatusService::BatteryUpdateCallback& callback);
~BatteryStatusManagerLinux() override;
private:
friend class BatteryStatusManagerLinuxTest;
class BatteryStatusNotificationThread;
// BatteryStatusManager:
bool StartListeningBatteryChange() override;
void StopListeningBatteryChange() override;
// Starts the notifier thread if not already started and returns true on
// success.
bool StartNotifierThreadIfNecessary();
base::Thread* GetNotifierThreadForTesting();
static std::unique_ptr<BatteryStatusManagerLinux> CreateForTesting(
const BatteryStatusService::BatteryUpdateCallback& callback,
dbus::Bus* bus);
BatteryStatusService::BatteryUpdateCallback callback_;
std::unique_ptr<BatteryStatusNotificationThread> notifier_thread_;
DISALLOW_COPY_AND_ASSIGN(BatteryStatusManagerLinux);
};
} // namespace device
......
......@@ -192,7 +192,11 @@
['exclude', '^hid/'],
],
}],
['use_dbus==0', {
['OS=="linux" and use_dbus==1', {
'dependencies': [
'../dbus/dbus.gyp:dbus_test_support',
],
}, { # OS != "linux" or use_dbus==0
'sources!': [
'battery/battery_status_manager_linux_unittest.cc',
],
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment