| // Copyright 2013 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 BASE_POWER_MONITOR_POWER_MONITOR_SOURCE_H_ | 
 | #define BASE_POWER_MONITOR_POWER_MONITOR_SOURCE_H_ | 
 |  | 
 | #include "base/base_export.h" | 
 | #include "base/macros.h" | 
 | #include "base/memory/ref_counted.h" | 
 | #include "base/observer_list_threadsafe.h" | 
 | #include "base/synchronization/lock.h" | 
 |  | 
 | namespace base { | 
 |  | 
 | class PowerMonitor; | 
 |  | 
 | // Communicates power state changes to the power monitor. | 
 | class BASE_EXPORT PowerMonitorSource { | 
 |  public: | 
 |   PowerMonitorSource(); | 
 |   virtual ~PowerMonitorSource(); | 
 |  | 
 |   // Normalized list of power events. | 
 |   enum PowerEvent { | 
 |     POWER_STATE_EVENT,  // The Power status of the system has changed. | 
 |     SUSPEND_EVENT,      // The system is being suspended. | 
 |     RESUME_EVENT        // The system is being resumed. | 
 |   }; | 
 |  | 
 |   // Is the computer currently on battery power. Can be called on any thread. | 
 |   bool IsOnBatteryPower(); | 
 |  | 
 |  protected: | 
 |   friend class PowerMonitorTest; | 
 |  | 
 |   // Friend function that is allowed to access the protected ProcessPowerEvent. | 
 |   friend void ProcessPowerEventHelper(PowerEvent); | 
 |  | 
 |   // Get the process-wide PowerMonitorSource (if not present, returns NULL). | 
 |   static PowerMonitorSource* Get(); | 
 |  | 
 |   // ProcessPowerEvent should only be called from a single thread, most likely | 
 |   // the UI thread or, in child processes, the IO thread. | 
 |   static void ProcessPowerEvent(PowerEvent event_id); | 
 |  | 
 |   // Platform-specific method to check whether the system is currently | 
 |   // running on battery power.  Returns true if running on batteries, | 
 |   // false otherwise. | 
 |   virtual bool IsOnBatteryPowerImpl() = 0; | 
 |  | 
 |   // Sets the initial state for |on_battery_power_|, which defaults to false | 
 |   // since not all implementations can provide the value at construction. May | 
 |   // only be called before a base::PowerMonitor has been created. | 
 |   void SetInitialOnBatteryPowerState(bool on_battery_power); | 
 |  | 
 |  private: | 
 |   bool on_battery_power_ = false; | 
 |   bool suspended_ = false; | 
 |  | 
 |   // This lock guards access to on_battery_power_, to ensure that | 
 |   // IsOnBatteryPower can be called from any thread. | 
 |   Lock battery_lock_; | 
 |  | 
 |   DISALLOW_COPY_AND_ASSIGN(PowerMonitorSource); | 
 | }; | 
 |  | 
 | }  // namespace base | 
 |  | 
 | #endif  // BASE_POWER_MONITOR_POWER_MONITOR_SOURCE_H_ |