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