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 #include "content/browser/battery_status/battery_status_manager_linux.h" | 5 #include "content/browser/battery_status/battery_status_manager_linux.h" |
6 | 6 |
7 #include "base/macros.h" | 7 #include "base/macros.h" |
| 8 #include "base/metrics/histogram.h" |
8 #include "base/threading/thread.h" | 9 #include "base/threading/thread.h" |
9 #include "base/values.h" | 10 #include "base/values.h" |
10 #include "content/browser/battery_status/battery_status_manager.h" | 11 #include "content/browser/battery_status/battery_status_manager.h" |
11 #include "content/public/browser/browser_thread.h" | 12 #include "content/public/browser/browser_thread.h" |
12 #include "dbus/bus.h" | 13 #include "dbus/bus.h" |
13 #include "dbus/message.h" | 14 #include "dbus/message.h" |
14 #include "dbus/object_path.h" | 15 #include "dbus/object_path.h" |
15 #include "dbus/object_proxy.h" | 16 #include "dbus/object_proxy.h" |
16 #include "dbus/property.h" | 17 #include "dbus/property.h" |
17 #include "dbus/values_util.h" | 18 #include "dbus/values_util.h" |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
89 proxy->CallMethodAndBlock(&method_call, | 90 proxy->CallMethodAndBlock(&method_call, |
90 dbus::ObjectProxy::TIMEOUT_USE_DEFAULT)); | 91 dbus::ObjectProxy::TIMEOUT_USE_DEFAULT)); |
91 | 92 |
92 if (response) { | 93 if (response) { |
93 dbus::MessageReader reader(response.get()); | 94 dbus::MessageReader reader(response.get()); |
94 reader.PopArrayOfObjectPaths(paths.get()); | 95 reader.PopArrayOfObjectPaths(paths.get()); |
95 } | 96 } |
96 return paths.Pass();; | 97 return paths.Pass();; |
97 } | 98 } |
98 | 99 |
| 100 void UpdateNumberBatteriesHistogram(int count) { |
| 101 UMA_HISTOGRAM_CUSTOM_COUNTS( |
| 102 "BatteryStatus.NumberBatteriesLinux", count, 1, 5, 6); |
| 103 } |
| 104 |
99 // Class that represents a dedicated thread which communicates with DBus to | 105 // Class that represents a dedicated thread which communicates with DBus to |
100 // obtain battery information and receives battery change notifications. | 106 // obtain battery information and receives battery change notifications. |
101 class BatteryStatusNotificationThread : public base::Thread { | 107 class BatteryStatusNotificationThread : public base::Thread { |
102 public: | 108 public: |
103 BatteryStatusNotificationThread( | 109 BatteryStatusNotificationThread( |
104 const BatteryStatusService::BatteryUpdateCallback& callback) | 110 const BatteryStatusService::BatteryUpdateCallback& callback) |
105 : base::Thread(kBatteryNotifierThreadName), | 111 : base::Thread(kBatteryNotifierThreadName), |
106 callback_(callback), | 112 callback_(callback), |
107 battery_proxy_(NULL) {} | 113 battery_proxy_(NULL) {} |
108 | 114 |
(...skipping 15 matching lines...) Expand all Loading... |
124 DCHECK(OnWatcherThread()); | 130 DCHECK(OnWatcherThread()); |
125 | 131 |
126 if (system_bus_) | 132 if (system_bus_) |
127 return; | 133 return; |
128 | 134 |
129 InitDBus(); | 135 InitDBus(); |
130 dbus::ObjectProxy* power_proxy = | 136 dbus::ObjectProxy* power_proxy = |
131 system_bus_->GetObjectProxy(kUPowerServiceName, | 137 system_bus_->GetObjectProxy(kUPowerServiceName, |
132 dbus::ObjectPath(kUPowerPath)); | 138 dbus::ObjectPath(kUPowerPath)); |
133 scoped_ptr<PathsVector> device_paths = GetPowerSourcesPaths(power_proxy); | 139 scoped_ptr<PathsVector> device_paths = GetPowerSourcesPaths(power_proxy); |
| 140 int num_batteries = 0; |
134 | 141 |
135 for (size_t i = 0; i < device_paths->size(); ++i) { | 142 for (size_t i = 0; i < device_paths->size(); ++i) { |
136 const dbus::ObjectPath& device_path = device_paths->at(i); | 143 const dbus::ObjectPath& device_path = device_paths->at(i); |
137 dbus::ObjectProxy* device_proxy = system_bus_->GetObjectProxy( | 144 dbus::ObjectProxy* device_proxy = system_bus_->GetObjectProxy( |
138 kUPowerServiceName, device_path); | 145 kUPowerServiceName, device_path); |
139 scoped_ptr<base::DictionaryValue> dictionary = | 146 scoped_ptr<base::DictionaryValue> dictionary = |
140 GetPropertiesAsDictionary(device_proxy); | 147 GetPropertiesAsDictionary(device_proxy); |
141 | 148 |
142 if (!dictionary) | 149 if (!dictionary) |
143 continue; | 150 continue; |
144 | 151 |
145 bool is_present = GetPropertyAsBoolean(*dictionary, "IsPresent", false); | 152 bool is_present = GetPropertyAsBoolean(*dictionary, "IsPresent", false); |
146 uint32 type = static_cast<uint32>( | 153 uint32 type = static_cast<uint32>( |
147 GetPropertyAsDouble(*dictionary, "Type", UPOWER_DEVICE_TYPE_UNKNOWN)); | 154 GetPropertyAsDouble(*dictionary, "Type", UPOWER_DEVICE_TYPE_UNKNOWN)); |
148 | 155 |
149 if (!is_present || type != UPOWER_DEVICE_TYPE_BATTERY) { | 156 if (!is_present || type != UPOWER_DEVICE_TYPE_BATTERY) { |
150 system_bus_->RemoveObjectProxy(kUPowerServiceName, | 157 system_bus_->RemoveObjectProxy(kUPowerServiceName, |
151 device_path, | 158 device_path, |
152 base::Bind(&base::DoNothing)); | 159 base::Bind(&base::DoNothing)); |
153 continue; | 160 continue; |
154 } | 161 } |
155 | 162 |
156 if (battery_proxy_) { | 163 if (battery_proxy_) { |
157 // TODO(timvolodine): add support for multiple batteries. Currently we | 164 // TODO(timvolodine): add support for multiple batteries. Currently we |
158 // only collect information from the first battery we encounter | 165 // only collect information from the first battery we encounter |
159 // (crbug.com/400780). | 166 // (crbug.com/400780). |
160 // TODO(timvolodine): add UMA logging for this case. | |
161 LOG(WARNING) << "multiple batteries found, " | 167 LOG(WARNING) << "multiple batteries found, " |
162 << "using status data of the first battery only."; | 168 << "using status data of the first battery only."; |
163 } else { | 169 } else { |
164 battery_proxy_ = device_proxy; | 170 battery_proxy_ = device_proxy; |
165 } | 171 } |
| 172 num_batteries++; |
166 } | 173 } |
167 | 174 |
| 175 UpdateNumberBatteriesHistogram(num_batteries); |
| 176 |
168 if (!battery_proxy_) { | 177 if (!battery_proxy_) { |
169 callback_.Run(blink::WebBatteryStatus()); | 178 callback_.Run(blink::WebBatteryStatus()); |
170 return; | 179 return; |
171 } | 180 } |
172 | 181 |
173 battery_proxy_->ConnectToSignal( | 182 battery_proxy_->ConnectToSignal( |
174 kUPowerDeviceName, | 183 kUPowerDeviceName, |
175 kUPowerDeviceSignalChanged, | 184 kUPowerDeviceSignalChanged, |
176 base::Bind(&BatteryStatusNotificationThread::BatteryChanged, | 185 base::Bind(&BatteryStatusNotificationThread::BatteryChanged, |
177 base::Unretained(this)), | 186 base::Unretained(this)), |
(...skipping 187 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
365 } | 374 } |
366 | 375 |
367 // static | 376 // static |
368 scoped_ptr<BatteryStatusManager> BatteryStatusManager::Create( | 377 scoped_ptr<BatteryStatusManager> BatteryStatusManager::Create( |
369 const BatteryStatusService::BatteryUpdateCallback& callback) { | 378 const BatteryStatusService::BatteryUpdateCallback& callback) { |
370 return scoped_ptr<BatteryStatusManager>( | 379 return scoped_ptr<BatteryStatusManager>( |
371 new BatteryStatusManagerLinux(callback)); | 380 new BatteryStatusManagerLinux(callback)); |
372 } | 381 } |
373 | 382 |
374 } // namespace content | 383 } // namespace content |
OLD | NEW |