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 SERVICES_DEVICE_BATTERY_BATTERY_STATUS_SERVICE_H_
6 #define SERVICES_DEVICE_BATTERY_BATTERY_STATUS_SERVICE_H_
7 
8 #include <memory>
9 
10 #include "base/callback_list.h"
11 #include "base/macros.h"
12 #include "services/device/public/mojom/battery_status.mojom.h"
13 
14 namespace base {
15 class SingleThreadTaskRunner;
16 }
17 
18 namespace device {
19 class BatteryStatusManager;
20 
21 class BatteryStatusService {
22  public:
23   typedef base::RepeatingCallback<void(const mojom::BatteryStatus&)>
24       BatteryUpdateCallback;
25   typedef base::CallbackList<void(const mojom::BatteryStatus&)>
26       BatteryUpdateCallbackList;
27   typedef BatteryUpdateCallbackList::Subscription BatteryUpdateSubscription;
28 
29   // Returns the BatteryStatusService singleton.
30   static BatteryStatusService* GetInstance();
31 
32   // NOTE: These must be public due to internal stashing of the global
33   // BatteryStatusService object in an std::unique_ptr. Clients should use only
34   // the static GetInstance() method above.
35   BatteryStatusService();
36   virtual ~BatteryStatusService();
37 
38   // Adds a callback to receive battery status updates.  Must be called on the
39   // main thread. The callback itself will be called on the main thread as well.
40   // NOTE: The callback may be run before AddCallback returns!
41   std::unique_ptr<BatteryUpdateSubscription> AddCallback(
42       const BatteryUpdateCallback& callback);
43 
44   // Gracefully clean-up.
45   void Shutdown();
46 
47   // Injects a custom battery status manager for testing purposes.
48   void SetBatteryManagerForTesting(
49       std::unique_ptr<BatteryStatusManager> test_battery_manager);
50 
51   // Returns callback to invoke when battery is changed. Used for testing.
52   const BatteryUpdateCallback& GetUpdateCallbackForTesting() const;
53 
54  private:
55   friend class BatteryStatusServiceTest;
56 
57   // Updates current battery status and sends new status to interested
58   // render processes. Can be called on any thread via a callback.
59   void NotifyConsumers(const mojom::BatteryStatus& status);
60   void NotifyConsumersOnMainThread(const mojom::BatteryStatus& status);
61   void ConsumersChanged();
62 
63   scoped_refptr<base::SingleThreadTaskRunner> main_thread_task_runner_;
64   std::unique_ptr<BatteryStatusManager> battery_fetcher_;
65   BatteryUpdateCallbackList callback_list_;
66   BatteryUpdateCallback update_callback_;
67   mojom::BatteryStatus status_;
68   bool status_updated_;
69   bool is_shutdown_;
70 
71   DISALLOW_COPY_AND_ASSIGN(BatteryStatusService);
72 };
73 
74 }  // namespace device
75 
76 #endif  // SERVICES_DEVICE_BATTERY_BATTERY_STATUS_SERVICE_H_
77