summaryrefslogtreecommitdiffstats
path: root/chrome/browser/chromeos/status/power_menu_button.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/browser/chromeos/status/power_menu_button.cc')
-rw-r--r--chrome/browser/chromeos/status/power_menu_button.cc198
1 files changed, 109 insertions, 89 deletions
diff --git a/chrome/browser/chromeos/status/power_menu_button.cc b/chrome/browser/chromeos/status/power_menu_button.cc
index de10159..de942cb 100644
--- a/chrome/browser/chromeos/status/power_menu_button.cc
+++ b/chrome/browser/chromeos/status/power_menu_button.cc
@@ -6,7 +6,9 @@
#include "app/l10n_util.h"
#include "app/resource_bundle.h"
+#include "base/string_number_conversions.h"
#include "base/time.h"
+#include "base/utf_string_conversions.h"
#include "chrome/browser/chromeos/cros/cros_library.h"
#include "gfx/canvas.h"
#include "grit/generated_resources.h"
@@ -22,9 +24,13 @@ const int PowerMenuButton::kNumPowerImages = 12;
PowerMenuButton::PowerMenuButton()
: StatusAreaButton(this),
- ALLOW_THIS_IN_INITIALIZER_LIST(power_menu_(this)),
- icon_id_(-1) {
- UpdateIcon();
+ battery_is_present_(false),
+ line_power_on_(false),
+ battery_fully_charged_(false),
+ battery_percentage_(0.0),
+ icon_id_(-1),
+ ALLOW_THIS_IN_INITIALIZER_LIST(power_menu_(this)) {
+ UpdateIconAndLabelInfo();
CrosLibrary::Get()->GetPowerLibrary()->AddObserver(this);
}
@@ -44,45 +50,44 @@ menus::MenuModel::ItemType PowerMenuButton::GetTypeAt(int index) const {
}
string16 PowerMenuButton::GetLabelAt(int index) const {
- PowerLibrary* cros = CrosLibrary::Get()->GetPowerLibrary();
// The first item shows the percentage of battery left.
if (index == 0) {
- // If fully charged, always show 100% even if internal number is a bit less.
- double percent = cros->battery_fully_charged() ? 100 :
- cros->battery_percentage();
return l10n_util::GetStringFUTF16(IDS_STATUSBAR_BATTERY_PERCENTAGE,
- IntToString16(static_cast<int>(percent)));
- }
-
- // The second item shows the battery is charged if it is.
- if (cros->battery_fully_charged())
- return l10n_util::GetStringUTF16(IDS_STATUSBAR_BATTERY_IS_CHARGED);
-
- // If battery is in an intermediate charge state, we show how much time left.
- base::TimeDelta time = cros->line_power_on() ? cros->battery_time_to_full() :
- cros->battery_time_to_empty();
- if (time.InSeconds() == 0) {
- // If time is 0, then that means we are still calculating how much time.
- // Depending if line power is on, we either show a message saying that we
- // are calculating time until full or calculating remaining time.
- int msg = cros->line_power_on() ?
- IDS_STATUSBAR_BATTERY_CALCULATING_TIME_UNTIL_FULL :
- IDS_STATUSBAR_BATTERY_CALCULATING_TIME_UNTIL_EMPTY;
- return l10n_util::GetStringUTF16(msg);
+ base::IntToString16(static_cast<int>(battery_percentage_)));
+ } else if (index == 1) {
+ // The second item shows the battery is charged if it is.
+ if (battery_fully_charged_)
+ return l10n_util::GetStringUTF16(IDS_STATUSBAR_BATTERY_IS_CHARGED);
+
+ // If battery is in an intermediate charge state, show how much time left.
+ base::TimeDelta time = line_power_on_ ? battery_time_to_full_ :
+ battery_time_to_empty_;
+ if (time.InSeconds() == 0) {
+ // If time is 0, then that means we are still calculating how much time.
+ // Depending if line power is on, we either show a message saying that we
+ // are calculating time until full or calculating remaining time.
+ int msg = line_power_on_ ?
+ IDS_STATUSBAR_BATTERY_CALCULATING_TIME_UNTIL_FULL :
+ IDS_STATUSBAR_BATTERY_CALCULATING_TIME_UNTIL_EMPTY;
+ return l10n_util::GetStringUTF16(msg);
+ } else {
+ // Depending if line power is on, we either show a message saying XX:YY
+ // until full or XX:YY remaining where XX is number of hours and YY is
+ // number of minutes.
+ int msg = line_power_on_ ? IDS_STATUSBAR_BATTERY_TIME_UNTIL_FULL :
+ IDS_STATUSBAR_BATTERY_TIME_UNTIL_EMPTY;
+ int hour = time.InHours();
+ int min = (time - base::TimeDelta::FromHours(hour)).InMinutes();
+ string16 hour_str = base::IntToString16(hour);
+ string16 min_str = base::IntToString16(min);
+ // Append a "0" before the minute if it's only a single digit.
+ if (min < 10)
+ min_str = ASCIIToUTF16("0") + min_str;
+ return l10n_util::GetStringFUTF16(msg, hour_str, min_str);
+ }
} else {
- // Depending if line power is on, we either show a message saying XX:YY
- // until full or XX:YY remaining where XX is number of hours and YY is
- // number of minutes.
- int msg = cros->line_power_on() ? IDS_STATUSBAR_BATTERY_TIME_UNTIL_FULL :
- IDS_STATUSBAR_BATTERY_TIME_UNTIL_EMPTY;
- int hour = time.InHours();
- int min = (time - base::TimeDelta::FromHours(hour)).InMinutes();
- string16 hour_str = IntToString16(hour);
- string16 min_str = IntToString16(min);
- // Append a "0" before the minute if it's only a single digit.
- if (min < 10)
- min_str = ASCIIToUTF16("0") + min_str;
- return l10n_util::GetStringFUTF16(msg, hour_str, min_str);
+ NOTREACHED();
+ return string16();
}
}
@@ -99,7 +104,7 @@ void PowerMenuButton::RunMenu(views::View* source, const gfx::Point& pt) {
// PowerMenuButton, PowerLibrary::Observer implementation:
void PowerMenuButton::PowerChanged(PowerLibrary* obj) {
- UpdateIcon();
+ UpdateIconAndLabelInfo();
}
////////////////////////////////////////////////////////////////////////////////
@@ -120,59 +125,74 @@ void PowerMenuButton::DrawPowerIcon(gfx::Canvas* canvas, SkBitmap icon) {
canvas->DrawBitmapInt(icon, 0, kIconVerticalPadding);
}
-void PowerMenuButton::UpdateIcon() {
+void PowerMenuButton::UpdateIconAndLabelInfo() {
PowerLibrary* cros = CrosLibrary::Get()->GetPowerLibrary();
- icon_id_ = IDR_STATUSBAR_BATTERY_UNKNOWN;
- if (CrosLibrary::Get()->EnsureLoaded()) {
- if (!cros->battery_is_present()) {
- icon_id_ = IDR_STATUSBAR_BATTERY_MISSING;
- } else if (cros->line_power_on() && cros->battery_fully_charged()) {
- icon_id_ = IDR_STATUSBAR_BATTERY_CHARGED;
- } else {
- // Get the power image depending on battery percentage. Percentage is
- // from 0 to 100, so we need to convert that to 0 to kNumPowerImages - 1.
- // NOTE: Use an array rather than just calculating a resource number to
- // avoid creating implicit ordering dependencies on the resource values.
- static const int kChargingImages[kNumPowerImages] = {
- IDR_STATUSBAR_BATTERY_CHARGING_1,
- IDR_STATUSBAR_BATTERY_CHARGING_2,
- IDR_STATUSBAR_BATTERY_CHARGING_3,
- IDR_STATUSBAR_BATTERY_CHARGING_4,
- IDR_STATUSBAR_BATTERY_CHARGING_5,
- IDR_STATUSBAR_BATTERY_CHARGING_6,
- IDR_STATUSBAR_BATTERY_CHARGING_7,
- IDR_STATUSBAR_BATTERY_CHARGING_8,
- IDR_STATUSBAR_BATTERY_CHARGING_9,
- IDR_STATUSBAR_BATTERY_CHARGING_10,
- IDR_STATUSBAR_BATTERY_CHARGING_11,
- IDR_STATUSBAR_BATTERY_CHARGING_12,
- };
- static const int kDischargingImages[kNumPowerImages] = {
- IDR_STATUSBAR_BATTERY_DISCHARGING_1,
- IDR_STATUSBAR_BATTERY_DISCHARGING_2,
- IDR_STATUSBAR_BATTERY_DISCHARGING_3,
- IDR_STATUSBAR_BATTERY_DISCHARGING_4,
- IDR_STATUSBAR_BATTERY_DISCHARGING_5,
- IDR_STATUSBAR_BATTERY_DISCHARGING_6,
- IDR_STATUSBAR_BATTERY_DISCHARGING_7,
- IDR_STATUSBAR_BATTERY_DISCHARGING_8,
- IDR_STATUSBAR_BATTERY_DISCHARGING_9,
- IDR_STATUSBAR_BATTERY_DISCHARGING_10,
- IDR_STATUSBAR_BATTERY_DISCHARGING_11,
- IDR_STATUSBAR_BATTERY_DISCHARGING_12,
- };
-
- // If fully charged, always show 100% even if percentage is a bit less.
- double percent = cros->battery_fully_charged() ?
- 100 : cros->battery_percentage();
- int index = static_cast<int>(percent / 100.0 *
- nextafter(static_cast<float>(kNumPowerImages), 0));
- index = std::max(std::min(index, kNumPowerImages - 1), 0);
- icon_id_ = cros->line_power_on() ?
- kChargingImages[index] : kDischargingImages[index];
- }
+ if (!cros)
+ return;
+
+ bool cros_loaded = CrosLibrary::Get()->EnsureLoaded();
+ if (cros_loaded) {
+ battery_is_present_ = cros->battery_is_present();
+ line_power_on_ = cros->line_power_on();
+ battery_fully_charged_ = cros->battery_fully_charged();
+ battery_percentage_ = cros->battery_percentage();
+ // If fully charged, always show 100% even if internal number is a bit less.
+ // Note: we always call cros->battery_percentage() for test predictability.
+ if (battery_fully_charged_)
+ battery_percentage_ = 100.0;
+ battery_time_to_full_ = cros->battery_time_to_full();
+ battery_time_to_empty_ = cros->battery_time_to_empty();
+ }
+
+ if (!cros_loaded) {
+ icon_id_ = IDR_STATUSBAR_BATTERY_UNKNOWN;
+ } else if (!battery_is_present_) {
+ icon_id_ = IDR_STATUSBAR_BATTERY_MISSING;
+ } else if (line_power_on_ && battery_fully_charged_) {
+ icon_id_ = IDR_STATUSBAR_BATTERY_CHARGED;
+ } else {
+ // Get the power image depending on battery percentage. Percentage is
+ // from 0 to 100, so we need to convert that to 0 to kNumPowerImages - 1.
+ // NOTE: Use an array rather than just calculating a resource number to
+ // avoid creating implicit ordering dependencies on the resource values.
+ static const int kChargingImages[kNumPowerImages] = {
+ IDR_STATUSBAR_BATTERY_CHARGING_1,
+ IDR_STATUSBAR_BATTERY_CHARGING_2,
+ IDR_STATUSBAR_BATTERY_CHARGING_3,
+ IDR_STATUSBAR_BATTERY_CHARGING_4,
+ IDR_STATUSBAR_BATTERY_CHARGING_5,
+ IDR_STATUSBAR_BATTERY_CHARGING_6,
+ IDR_STATUSBAR_BATTERY_CHARGING_7,
+ IDR_STATUSBAR_BATTERY_CHARGING_8,
+ IDR_STATUSBAR_BATTERY_CHARGING_9,
+ IDR_STATUSBAR_BATTERY_CHARGING_10,
+ IDR_STATUSBAR_BATTERY_CHARGING_11,
+ IDR_STATUSBAR_BATTERY_CHARGING_12,
+ };
+ static const int kDischargingImages[kNumPowerImages] = {
+ IDR_STATUSBAR_BATTERY_DISCHARGING_1,
+ IDR_STATUSBAR_BATTERY_DISCHARGING_2,
+ IDR_STATUSBAR_BATTERY_DISCHARGING_3,
+ IDR_STATUSBAR_BATTERY_DISCHARGING_4,
+ IDR_STATUSBAR_BATTERY_DISCHARGING_5,
+ IDR_STATUSBAR_BATTERY_DISCHARGING_6,
+ IDR_STATUSBAR_BATTERY_DISCHARGING_7,
+ IDR_STATUSBAR_BATTERY_DISCHARGING_8,
+ IDR_STATUSBAR_BATTERY_DISCHARGING_9,
+ IDR_STATUSBAR_BATTERY_DISCHARGING_10,
+ IDR_STATUSBAR_BATTERY_DISCHARGING_11,
+ IDR_STATUSBAR_BATTERY_DISCHARGING_12,
+ };
+
+ int index = static_cast<int>(battery_percentage_ / 100.0 *
+ nextafter(static_cast<float>(kNumPowerImages), 0));
+ index = std::max(std::min(index, kNumPowerImages - 1), 0);
+ icon_id_ = line_power_on_ ?
+ kChargingImages[index] : kDischargingImages[index];
}
+
SetIcon(*ResourceBundle::GetSharedInstance().GetBitmapNamed(icon_id_));
+ SetTooltipText(UTF16ToWide(GetLabelAt(0)));
SchedulePaint();
}