blob: 9dc69b3e7699ffb5236632c845d4335e2accb99a [file] [log] [blame]
// Copyright (c) 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 ASH_SYSTEM_POWER_POWER_STATUS_H_
#define ASH_SYSTEM_POWER_POWER_STATUS_H_
#include <string>
#include <vector>
#include "ash/ash_export.h"
#include "base/macros.h"
#include "base/observer_list.h"
#include "base/strings/string16.h"
#include "base/time/time.h"
#include "chromeos/dbus/power_manager/power_supply_properties.pb.h"
#include "chromeos/dbus/power_manager_client.h"
#include "ui/gfx/image/image_skia.h"
namespace gfx {
struct VectorIcon;
}
namespace ash {
// PowerStatus is a singleton that receives updates about the system's
// power status from chromeos::PowerManagerClient and makes the information
// available to interested classes within Ash.
class ASH_EXPORT PowerStatus : public chromeos::PowerManagerClient::Observer {
public:
// Interface for classes that wish to be notified when the power status
// has changed.
class Observer {
public:
// Called when the power status changes.
virtual void OnPowerStatusChanged() = 0;
protected:
virtual ~Observer() {}
};
// Power source types.
enum DeviceType {
// Dedicated charger (AC adapter, USB power supply, etc.).
DEDICATED_CHARGER,
// Dual-role device.
DUAL_ROLE_USB,
};
// Information about an available power source.
struct PowerSource {
// ID provided by kernel.
std::string id;
// Type of power source.
DeviceType type;
// Message ID of a description for this port.
int description_id;
};
// Information about the battery image corresponding to the status at a given
// point in time. This can be cached and later compared to avoid unnecessarily
// updating onscreen icons (GetBatteryImage() creates a new image on each
// call).
struct BatteryImageInfo {
BatteryImageInfo()
: icon_badge(nullptr), alert_if_low(false), charge_percent(-1) {}
// Returns true if |this| and |o| are similar enough in terms of the image
// they'd generate.
bool ApproximatelyEqual(const BatteryImageInfo& o) const;
// The badge (lightning bolt, exclamation mark, etc) that should be drawn
// on top of the battery icon.
const gfx::VectorIcon* icon_badge;
// When true and |charge_percent| is very low, special colors will be used
// to alert the user.
bool alert_if_low;
double charge_percent;
};
// Maximum battery time-to-full or time-to-empty that should be displayed
// in the UI. If the current is close to zero, battery time estimates can
// get very large; avoid displaying these large numbers.
static const int kMaxBatteryTimeToDisplaySec;
// An alert_if_low badge is drawn over the battery icon if the battery is not
// connected to a charger and has less than |kCriticalBatteryChargePercentage|
// percentage of charge remaining.
static const double kCriticalBatteryChargePercentage;
// Sets the global instance. Must be called before any calls to Get().
static void Initialize();
// Destroys the global instance.
static void Shutdown();
// Returns true if the global instance is initialized.
static bool IsInitialized();
// Gets the global instance. Initialize must be called first.
static PowerStatus* Get();
// Returns true if |time|, a time returned by GetBatteryTimeToEmpty() or
// GetBatteryTimeToFull(), should be displayed in the UI.
// Less-than-a-minute or very large values aren't displayed.
static bool ShouldDisplayBatteryTime(const base::TimeDelta& time);
// Copies the hour and minute components of |time| to |hours| and |minutes|.
// The minute component is rounded rather than truncated: a |time| value
// corresponding to 92 seconds will produce a |minutes| value of 2, for
// example.
static void SplitTimeIntoHoursAndMinutes(const base::TimeDelta& time,
int* hours,
int* minutes);
// Adds or removes an observer.
void AddObserver(Observer* observer);
void RemoveObserver(Observer* observer);
// Requests updated status from the power manager.
void RequestStatusUpdate();
// Changes the power source to the source with the given ID.
void SetPowerSource(const std::string& id);
// Returns true if a battery is present.
bool IsBatteryPresent() const;
// Returns true if the battery is full. This also implies that a charger
// is connected.
bool IsBatteryFull() const;
// Returns true if the battery is charging. Note that this implies that a
// charger is connected but the converse is not necessarily true: the
// battery may be discharging even while a (perhaps low-power) charger is
// connected. Use Is*Connected() to test for the presence of a charger
// and also see IsBatteryDischargingOnLinePower().
bool IsBatteryCharging() const;
// Returns true if the battery is discharging (or neither charging nor
// discharging while not being full) while line power is connected.
bool IsBatteryDischargingOnLinePower() const;
// Returns the battery's remaining charge as a value in the range [0.0,
// 100.0].
double GetBatteryPercent() const;
// Returns the battery's remaining charge, rounded to an integer with a
// maximum value of 100.
int GetRoundedBatteryPercent() const;
// Returns true if the battery's time-to-full and time-to-empty estimates
// should not be displayed because the power manager is still calculating
// them.
bool IsBatteryTimeBeingCalculated() const;
// Returns the estimated time until the battery is empty (if line power
// is disconnected) or full (if line power is connected). These estimates
// should only be used if IsBatteryTimeBeingCalculated() returns false.
base::TimeDelta GetBatteryTimeToEmpty() const;
base::TimeDelta GetBatteryTimeToFull() const;
// Returns true if line power (including a charger of any type) is connected.
bool IsLinePowerConnected() const;
// Returns true if an official, non-USB charger is connected.
bool IsMainsChargerConnected() const;
// Returns true if a USB charger (which is likely to only support a low
// charging rate) is connected.
bool IsUsbChargerConnected() const;
// Returns true if the system allows some connected devices to function as
// either power sources or sinks.
bool SupportsDualRoleDevices() const;
// Returns true if at least one dual-role device is connected.
bool HasDualRoleDevices() const;
// Returns a list of available power sources which the user may select.
std::vector<PowerSource> GetPowerSources() const;
// Returns the ID of the currently used power source, or an empty string if no
// power source is selected.
std::string GetCurrentPowerSourceID() const;
// Returns information about the image that would be returned by
// GetBatteryImage(). This can be cached and compared against future objects
// returned by this method to avoid creating new images unnecessarily.
BatteryImageInfo GetBatteryImageInfo() const;
// A helper function called by GetBatteryImageInfo(). Populates the fields of
// |info|.
void CalculateBatteryImageInfo(BatteryImageInfo* info) const;
// Creates a new image that should be shown for the battery's current state.
static gfx::ImageSkia GetBatteryImage(const BatteryImageInfo& info,
int height,
SkColor bg_color,
SkColor fg_color);
// Returns an string describing the current state for accessibility.
base::string16 GetAccessibleNameString(bool full_description) const;
// Updates |proto_|. Does not notify observers.
void SetProtoForTesting(const power_manager::PowerSupplyProperties& proto);
protected:
PowerStatus();
~PowerStatus() override;
private:
// Overriden from PowerManagerClient::Observer.
void PowerChanged(const power_manager::PowerSupplyProperties& proto) override;
base::ObserverList<Observer> observers_;
// Current state.
power_manager::PowerSupplyProperties proto_;
DISALLOW_COPY_AND_ASSIGN(PowerStatus);
};
} // namespace ash
#endif // ASH_SYSTEM_POWER_POWER_STATUS_H_