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
3// found in the LICENSE file.
4
5#ifndef CONTENT_BROWSER_POWER_PROFILER_POWER_PROFILER_SERVICE_H_
6#define CONTENT_BROWSER_POWER_PROFILER_POWER_PROFILER_SERVICE_H_
7
8#include "base/basictypes.h"
9#include "base/memory/singleton.h"
10#include "base/observer_list.h"
11#include "base/task_runner.h"
12#include "base/timer/timer.h"
13#include "content/browser/power_profiler/power_data_provider.h"
14#include "content/browser/power_profiler/power_profiler_observer.h"
15#include "content/common/content_export.h"
16
17namespace content {
18
19// A class used to query power information and notify the observers.
20class CONTENT_EXPORT PowerProfilerService {
21 public:
22  static PowerProfilerService* GetInstance();
23
24  // Add and remove an observer.
25  void AddObserver(PowerProfilerObserver* observer);
26  void RemoveObserver(PowerProfilerObserver* observer);
27
28  bool IsAvailable() const;
29  std::string GetAccuracyLevel() const;
30
31  virtual ~PowerProfilerService();
32
33 private:
34  enum Status {
35    UNINITIALIZED,
36    INITIALIZED,  // Initialized, profiling has not started.
37    PROFILING
38  };
39
40  friend struct DefaultSingletonTraits<PowerProfilerService>;
41  friend class PowerProfilerServiceTest;
42
43  PowerProfilerService();
44
45  PowerProfilerService(scoped_ptr<PowerDataProvider> provider,
46                       scoped_refptr<base::TaskRunner> task_runner,
47                       const base::TimeDelta& sample_period);
48
49  void Start();
50  void Stop();
51
52  // Query power data from PowerDataProvider, executes on the WorkerPool thread.
53  void QueryDataOnTaskRunner();
54
55  // Initiate the query on the UI thread, the task is delegated to
56  // QueryDataOnTaskRunner.
57  void QueryData();
58
59  // Executes on the UI thread.
60  void Notify(const PowerEventVector&);
61
62  base::RepeatingTimer<PowerProfilerService> query_power_timer_;
63  scoped_refptr<base::TaskRunner> task_runner_;
64
65  Status status_;
66
67  // Sampling period of power data measurement.
68  base::TimeDelta sample_period_;
69  ObserverList<PowerProfilerObserver> observers_;
70
71  scoped_ptr<PowerDataProvider> data_provider_;
72
73  DISALLOW_COPY_AND_ASSIGN(PowerProfilerService);
74};
75
76}  // namespace content
77
78#endif  // CONTENT_BROWSER_POWER_PROFILER_POWER_PROFILER_SERVICE_H_
79