1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
|
// 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 CONTENT_BROWSER_POWER_USAGE_MONITOR_IMPL_H_
#define CONTENT_BROWSER_POWER_USAGE_MONITOR_IMPL_H_
#include "base/basictypes.h"
#include "base/containers/hash_tables.h"
#include "base/gtest_prod_util.h"
#include "base/memory/singleton.h"
#include "base/power_monitor/power_monitor.h"
#include "base/time/time.h"
#include "content/common/content_export.h"
#include "content/public/browser/browser_message_filter.h"
#include "content/public/browser/notification_observer.h"
#include "content/public/browser/notification_registrar.h"
#include "device/battery/battery_status_service.h"
namespace content {
// Record statistics on power usage.
//
// Two main statics are recorded by this class:
// * Power.BatteryDischarge_{5,15,30} - delta between battery level when
// unplugged from wallpower, over the specified period - in minutes.
// * Power.BatteryDischargeRateWhenUnplugged - the rate of battery discharge
// from the device being unplugged until it's plugged back in, if said period
// was longer than 30 minutes.
//
// Heuristics:
// * Data collection starts after system uptime exceeds 30 minutes.
// * If the machine goes to sleep or all renderers are closed then the current
// measurement is cancelled.
class CONTENT_EXPORT PowerUsageMonitor : public base::PowerObserver,
public NotificationObserver {
public:
class SystemInterface {
public:
virtual ~SystemInterface() {}
virtual void ScheduleHistogramReport(base::TimeDelta delay) = 0;
virtual void CancelPendingHistogramReports() = 0;
// Record the battery discharge percent per hour over the time the system
// is on battery power, legal values [0,100].
virtual void RecordDischargePercentPerHour(int percent_per_hour) = 0;
// Allow tests to override clock.
virtual base::Time Now() = 0;
};
public:
PowerUsageMonitor();
~PowerUsageMonitor() override;
double discharge_amount() const {
return initial_battery_level_ - current_battery_level_;
}
// Start monitoring power usage.
// Note that the actual monitoring will be delayed until 30 minutes after
// system boot.
void Start();
void SetSystemInterfaceForTest(scoped_ptr<SystemInterface> interface);
// Overridden from base::PowerObserver:
void OnPowerStateChange(bool on_battery_power) override;
void OnResume() override;
void OnSuspend() override;
// Overridden from NotificationObserver:
void Observe(int type,
const NotificationSource& source,
const NotificationDetails& details) override;
private:
friend class PowerUsageMonitorTest;
FRIEND_TEST_ALL_PREFIXES(PowerUsageMonitorTest, OnBatteryStatusUpdate);
FRIEND_TEST_ALL_PREFIXES(PowerUsageMonitorTest, OnRenderProcessNotification);
// Start monitoring system power usage.
// This function may be called after a delay, see Start() for details.
void StartInternal();
void OnBatteryStatusUpdate(const device::BatteryStatus& status);
void OnRenderProcessNotification(int type, int rph_id);
void DischargeStarted(double battery_level);
void WallPowerConnected(double battery_level);
void CancelPendingHistogramReporting();
device::BatteryStatusService::BatteryUpdateCallback callback_;
scoped_ptr<device::BatteryStatusService::BatteryUpdateSubscription>
subscription_;
NotificationRegistrar registrar_;
scoped_ptr<SystemInterface> system_interface_;
// True if monitoring was started (Start() called).
bool started_;
// True if collecting metrics for the current discharge cycle e.g. if no
// renderers are open we don't keep track of discharge.
bool tracking_discharge_;
// True if the system is running on battery power, false if on wall power.
bool on_battery_power_;
// Battery level when wall power disconnected. [0.0, 1.0] - 0 if on wall
// power, 1 means fully charged.
double initial_battery_level_;
// Current battery level. [0.0, 1.0] - 0 if on wall power, 1 means fully
// charged.
double current_battery_level_;
// Timestamp when wall power was disconnected, null Time object otherwise.
base::Time start_discharge_time_;
// IDs of live renderer processes.
base::hash_set<int> live_renderer_ids_;
private:
DISALLOW_COPY_AND_ASSIGN(PowerUsageMonitor);
};
} // namespace content
#endif // CONTENT_BROWSER_POWER_USAGE_MONITOR_IMPL_H_
|