Index: ash/system/chromeos/power/tray_power.cc |
diff --git a/ash/system/chromeos/power/tray_power.cc b/ash/system/chromeos/power/tray_power.cc |
index b07cceebb9172ba67fe2bcd071a2d1ad58e3f1dc..4fe4e6825f909b409f72770dd38c3b46c52873b4 100644 |
--- a/ash/system/chromeos/power/tray_power.cc |
+++ b/ash/system/chromeos/power/tray_power.cc |
@@ -5,30 +5,18 @@ |
#include "ash/system/chromeos/power/tray_power.h" |
#include "ash/ash_switches.h" |
-#include "ash/shell.h" |
-#include "ash/shell_delegate.h" |
#include "ash/system/chromeos/power/power_status_view.h" |
#include "ash/system/date/date_view.h" |
#include "ash/system/tray/tray_constants.h" |
#include "ash/system/tray/tray_notification_view.h" |
#include "ash/system/tray/tray_utils.h" |
#include "base/command_line.h" |
-#include "base/strings/string_number_conversions.h" |
-#include "base/strings/stringprintf.h" |
-#include "base/strings/utf_string_conversions.h" |
-#include "chromeos/dbus/power_supply_status.h" |
#include "grit/ash_resources.h" |
#include "grit/ash_strings.h" |
#include "third_party/icu/public/i18n/unicode/fieldpos.h" |
#include "third_party/icu/public/i18n/unicode/fmtable.h" |
-#include "third_party/skia/include/core/SkRect.h" |
#include "ui/base/accessibility/accessible_view_state.h" |
-#include "ui/base/l10n/l10n_util.h" |
#include "ui/base/resource/resource_bundle.h" |
-#include "ui/gfx/image/image.h" |
-#include "ui/gfx/image/image_skia.h" |
-#include "ui/gfx/image/image_skia_operations.h" |
-#include "ui/gfx/size.h" |
#include "ui/message_center/message_center.h" |
#include "ui/message_center/notification.h" |
#include "ui/views/controls/button/button.h" |
@@ -40,7 +28,6 @@ |
#include "ui/views/view.h" |
#include "ui/views/widget/widget.h" |
-using chromeos::PowerSupplyStatus; |
using message_center::MessageCenter; |
using message_center::Notification; |
@@ -48,11 +35,6 @@ namespace ash { |
namespace internal { |
namespace { |
-// Width and height of battery images. |
-const int kBatteryImageHeight = 25; |
-const int kBatteryImageWidth = 25; |
-// Number of different power states. |
-const int kNumPowerImages = 15; |
// Top/bottom padding of the text items. |
const int kPaddingVertical = 10; |
// Specify min width of status label for layout. |
@@ -61,31 +43,11 @@ const int kLabelMinWidth = 120; |
const int kCriticalSeconds = 5 * 60; |
const int kLowPowerSeconds = 15 * 60; |
const int kNoWarningSeconds = 30 * 60; |
-// Minimum battery percentage rendered in UI. |
-const int kMinBatteryPercent = 1; |
// Notification in battery percentage. |
const double kCriticalPercentage = 5.0; |
const double kLowPowerPercentage = 10.0; |
const double kNoWarningPercentage = 15.0; |
-base::string16 GetBatteryTimeAccessibilityString(int hour, int min) { |
- DCHECK(hour || min); |
- if (hour && !min) { |
- return Shell::GetInstance()->delegate()->GetTimeDurationLongString( |
- base::TimeDelta::FromHours(hour)); |
- } |
- if (min && !hour) { |
- return Shell::GetInstance()->delegate()->GetTimeDurationLongString( |
- base::TimeDelta::FromMinutes(min)); |
- } |
- return l10n_util::GetStringFUTF16( |
- IDS_ASH_STATUS_TRAY_BATTERY_TIME_ACCESSIBLE, |
- Shell::GetInstance()->delegate()->GetTimeDurationLongString( |
- base::TimeDelta::FromHours(hour)), |
- Shell::GetInstance()->delegate()->GetTimeDurationLongString( |
- base::TimeDelta::FromMinutes(min))); |
-} |
- |
} // namespace |
namespace tray { |
@@ -93,10 +55,7 @@ namespace tray { |
// This view is used only for the tray. |
class PowerTrayView : public views::ImageView { |
public: |
- PowerTrayView() |
- : battery_icon_index_(-1), |
- battery_icon_offset_(0), |
- battery_charging_unreliable_(false) { |
+ PowerTrayView() { |
UpdateImage(); |
} |
@@ -109,94 +68,42 @@ class PowerTrayView : public views::ImageView { |
state->role = ui::AccessibilityTypes::ROLE_PUSHBUTTON; |
} |
- void UpdatePowerStatus(const PowerSupplyStatus& status, |
- bool battery_alert) { |
- supply_status_ = status; |
- // Sanitize. |
- if (supply_status_.battery_is_full) |
- supply_status_.battery_percentage = 100.0; |
- |
+ void UpdateStatus(bool battery_alert) { |
UpdateImage(); |
- SetVisible(status.battery_is_present); |
+ SetVisible(PowerStatus::Get()->IsBatteryPresent()); |
if (battery_alert) { |
- accessible_name_ = TrayPower::GetAccessibleNameString(status); |
+ accessible_name_ = PowerStatus::Get()->GetAccessibleNameString(); |
NotifyAccessibilityEvent(ui::AccessibilityTypes::EVENT_ALERT, true); |
} |
} |
private: |
void UpdateImage() { |
- int index = TrayPower::GetBatteryImageIndex(supply_status_); |
- int offset = TrayPower::GetBatteryImageOffset(supply_status_); |
- bool charging_unreliable = |
- TrayPower::IsBatteryChargingUnreliable(supply_status_); |
- if (battery_icon_index_ != index || |
- battery_icon_offset_ != offset || |
- battery_charging_unreliable_ != charging_unreliable) { |
- battery_icon_index_ = index; |
- battery_icon_offset_ = offset; |
- battery_charging_unreliable_ = charging_unreliable; |
- if (battery_icon_index_ != -1) |
- SetImage(TrayPower::GetBatteryImage(battery_icon_index_, |
- battery_icon_offset_, |
- battery_charging_unreliable_, |
- ICON_LIGHT)); |
- } |
+ SetImage(PowerStatus::Get()->GetBatteryImage(PowerStatus::ICON_LIGHT)); |
} |
- PowerSupplyStatus supply_status_; |
base::string16 accessible_name_; |
- // Index of the current icon in the icon array image, or -1 if unknown. |
- int battery_icon_index_; |
- int battery_icon_offset_; |
- bool battery_charging_unreliable_; |
- |
DISALLOW_COPY_AND_ASSIGN(PowerTrayView); |
}; |
class PowerNotificationView : public TrayNotificationView { |
public: |
explicit PowerNotificationView(TrayPower* owner) |
- : TrayNotificationView(owner, 0), |
- battery_icon_index_(-1), |
- battery_icon_offset_(0), |
- battery_charging_unreliable_(false) { |
+ : TrayNotificationView(owner, 0) { |
power_status_view_ = |
new PowerStatusView(PowerStatusView::VIEW_NOTIFICATION, true); |
InitView(power_status_view_); |
} |
- void UpdatePowerStatus(const PowerSupplyStatus& status) { |
- int index = TrayPower::GetBatteryImageIndex(status); |
- int offset = TrayPower::GetBatteryImageOffset(status); |
- bool charging_unreliable = TrayPower::IsBatteryChargingUnreliable(status); |
- if (battery_icon_index_ != index || |
- battery_icon_offset_ != offset || |
- battery_charging_unreliable_ != charging_unreliable) { |
- battery_icon_index_ = index; |
- battery_icon_offset_ = offset; |
- battery_charging_unreliable_ = charging_unreliable; |
- if (battery_icon_index_ != -1) { |
- SetIconImage(TrayPower::GetBatteryImage( |
- battery_icon_index_, |
- battery_icon_offset_, |
- battery_charging_unreliable_, |
- ICON_DARK)); |
- } |
- } |
- power_status_view_->UpdatePowerStatus(status); |
+ void UpdateStatus() { |
+ SetIconImage(PowerStatus::Get()->GetBatteryImage(PowerStatus::ICON_DARK)); |
} |
private: |
PowerStatusView* power_status_view_; |
- // Index of the current icon in the icon array image, or -1 if unknown. |
- int battery_icon_index_; |
- int battery_icon_offset_; |
- bool battery_charging_unreliable_; |
- |
DISALLOW_COPY_AND_ASSIGN(PowerNotificationView); |
}; |
@@ -209,7 +116,8 @@ TrayPower::TrayPower(SystemTray* system_tray, MessageCenter* message_center) |
message_center_(message_center), |
power_tray_(NULL), |
notification_view_(NULL), |
- notification_state_(NOTIFICATION_NONE) { |
+ notification_state_(NOTIFICATION_NONE), |
+ usb_charger_was_connected_(false) { |
PowerStatus::Get()->AddObserver(this); |
} |
@@ -217,155 +125,29 @@ TrayPower::~TrayPower() { |
PowerStatus::Get()->RemoveObserver(this); |
} |
-// static |
-bool TrayPower::IsBatteryChargingUnreliable( |
- const chromeos::PowerSupplyStatus& supply_status) { |
- // Sometimes devices can get into a state where the battery is almost fully |
- // charged and the power subsystem reports "neither charging nor discharging" |
- // despite the battery not at 100%. For now, only report unreliable charging |
- // on USB. |
- // TODO(derat): Update this when the power manager code is refactored for M29. |
- return supply_status.battery_state == PowerSupplyStatus::CONNECTED_TO_USB; |
-} |
- |
-// static |
-int TrayPower::GetBatteryImageIndex( |
- const chromeos::PowerSupplyStatus& supply_status) { |
- int image_index = 0; |
- if (supply_status.battery_percentage >= 100) { |
- image_index = kNumPowerImages - 1; |
- } else if (!supply_status.battery_is_present) { |
- image_index = kNumPowerImages; |
- } else { |
- image_index = static_cast<int>(supply_status.battery_percentage / |
- 100.0 * (kNumPowerImages - 1)); |
- image_index = std::max(std::min(image_index, kNumPowerImages - 2), 0); |
- } |
- return image_index; |
-} |
- |
-// static |
-int TrayPower::GetBatteryImageOffset( |
- const chromeos::PowerSupplyStatus& supply_status) { |
- if (IsBatteryChargingUnreliable(supply_status) || |
- !supply_status.line_power_on) |
- return 0; |
- return 1; |
-} |
- |
-// static |
-gfx::ImageSkia TrayPower::GetBatteryImage(int image_index, |
- int image_offset, |
- bool charging_unreliable, |
- IconSet icon_set) { |
- gfx::Image all; |
- if (charging_unreliable) { |
- all = ui::ResourceBundle::GetSharedInstance().GetImageNamed( |
- icon_set == ICON_DARK ? |
- IDR_AURA_UBER_TRAY_POWER_SMALL_CHARGING_UNRELIABLE_DARK : |
- IDR_AURA_UBER_TRAY_POWER_SMALL_CHARGING_UNRELIABLE); |
- } else { |
- all = ui::ResourceBundle::GetSharedInstance().GetImageNamed( |
- icon_set == ICON_DARK ? |
- IDR_AURA_UBER_TRAY_POWER_SMALL_DARK : IDR_AURA_UBER_TRAY_POWER_SMALL); |
- } |
- gfx::Rect region( |
- image_offset * kBatteryImageWidth, |
- image_index * kBatteryImageHeight, |
- kBatteryImageWidth, kBatteryImageHeight); |
- return gfx::ImageSkiaOperations::ExtractSubset(*all.ToImageSkia(), region); |
-} |
- |
-// static |
-base::string16 TrayPower::GetAccessibleNameString( |
- const chromeos::PowerSupplyStatus& supply_status) { |
- ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); |
- if (supply_status.line_power_on && supply_status.battery_is_full) { |
- return rb.GetLocalizedString( |
- IDS_ASH_STATUS_TRAY_BATTERY_FULL_CHARGE_ACCESSIBLE); |
- } |
- bool charging_unreliable = |
- IsBatteryChargingUnreliable(supply_status); |
- if (supply_status.battery_percentage < 0.0f) { |
- if (charging_unreliable) { |
- return rb.GetLocalizedString( |
- IDS_ASH_STATUS_TRAY_BATTERY_CHARGING_UNRELIABLE_ACCESSIBLE); |
- } |
- return rb.GetLocalizedString( |
- IDS_ASH_STATUS_TRAY_BATTERY_CALCULATING_ACCESSIBLE); |
- } |
- base::string16 battery_percentage_accessbile = l10n_util::GetStringFUTF16( |
- supply_status.line_power_on ? |
- IDS_ASH_STATUS_TRAY_BATTERY_PERCENT_CHARGING_ACCESSIBLE: |
- IDS_ASH_STATUS_TRAY_BATTERY_PERCENT_ACCESSIBLE , |
- base::IntToString16(GetRoundedBatteryPercentage( |
- supply_status.battery_percentage))); |
- base::string16 battery_time_accessible = base::string16(); |
- if (charging_unreliable) { |
- battery_time_accessible = rb.GetLocalizedString( |
- IDS_ASH_STATUS_TRAY_BATTERY_CHARGING_UNRELIABLE_ACCESSIBLE); |
- } else { |
- if (supply_status.is_calculating_battery_time) { |
- battery_time_accessible = rb.GetLocalizedString( |
- IDS_ASH_STATUS_TRAY_BATTERY_CALCULATING_ACCESSIBLE); |
- } else { |
- base::TimeDelta time = base::TimeDelta::FromSeconds( |
- supply_status.line_power_on ? |
- supply_status.battery_seconds_to_full : |
- supply_status.battery_seconds_to_empty); |
- int hour = time.InHours(); |
- int min = (time - base::TimeDelta::FromHours(hour)).InMinutes(); |
- if (hour || min) { |
- base::string16 minute = min < 10 ? |
- ASCIIToUTF16("0") + base::IntToString16(min) : |
- base::IntToString16(min); |
- battery_time_accessible = |
- l10n_util::GetStringFUTF16( |
- supply_status.line_power_on ? |
- IDS_ASH_STATUS_TRAY_BATTERY_TIME_UNTIL_FULL_ACCESSIBLE : |
- IDS_ASH_STATUS_TRAY_BATTERY_TIME_LEFT_ACCESSIBLE, |
- GetBatteryTimeAccessibilityString(hour, min)); |
- } |
- } |
- } |
- return battery_time_accessible.empty() ? |
- battery_percentage_accessbile : |
- battery_percentage_accessbile + ASCIIToUTF16(". ") |
- + battery_time_accessible; |
-} |
- |
-// static |
-int TrayPower::GetRoundedBatteryPercentage(double battery_percentage) { |
- DCHECK(battery_percentage >= 0.0); |
- return std::max(kMinBatteryPercent, |
- static_cast<int>(battery_percentage + 0.5)); |
-} |
- |
views::View* TrayPower::CreateTrayView(user::LoginStatus status) { |
// There may not be enough information when this is created about whether |
// there is a battery or not. So always create this, and adjust visibility as |
// necessary. |
- PowerSupplyStatus power_status = PowerStatus::Get()->GetPowerSupplyStatus(); |
CHECK(power_tray_ == NULL); |
power_tray_ = new tray::PowerTrayView(); |
- power_tray_->UpdatePowerStatus(power_status, false); |
+ power_tray_->UpdateStatus(false); |
return power_tray_; |
} |
views::View* TrayPower::CreateDefaultView(user::LoginStatus status) { |
// Make sure icon status is up-to-date. (Also triggers stub activation). |
- RequestStatusUpdate(); |
+ PowerStatus::Get()->RequestStatusUpdate(); |
return NULL; |
} |
views::View* TrayPower::CreateNotificationView(user::LoginStatus status) { |
CHECK(notification_view_ == NULL); |
- PowerSupplyStatus power_status = PowerStatus::Get()->GetPowerSupplyStatus(); |
- if (!power_status.battery_is_present) |
+ if (!PowerStatus::Get()->IsBatteryPresent()) |
return NULL; |
notification_view_ = new PowerNotificationView(this); |
- notification_view_->UpdatePowerStatus(power_status); |
+ notification_view_->UpdateStatus(); |
return notification_view_; |
} |
@@ -388,13 +170,12 @@ void TrayPower::UpdateAfterShelfAlignmentChange(ShelfAlignment alignment) { |
SetTrayImageItemBorder(power_tray_, alignment); |
} |
-void TrayPower::OnPowerStatusChanged( |
- const chromeos::PowerSupplyStatus& status) { |
- bool battery_alert = UpdateNotificationState(status); |
+void TrayPower::OnPowerStatusChanged() { |
+ bool battery_alert = UpdateNotificationState(); |
if (power_tray_) |
- power_tray_->UpdatePowerStatus(status, battery_alert); |
+ power_tray_->UpdateStatus(battery_alert); |
if (notification_view_) |
- notification_view_->UpdatePowerStatus(status); |
+ notification_view_->UpdateStatus(); |
// Factory testing may place the battery into unusual states. |
if (CommandLine::ForCurrentProcess()->HasSwitch( |
@@ -402,28 +183,23 @@ void TrayPower::OnPowerStatusChanged( |
return; |
if (ash::switches::UseUsbChargerNotification()) |
- MaybeShowUsbChargerNotification(last_power_supply_status_, status); |
+ MaybeShowUsbChargerNotification(); |
if (battery_alert) |
ShowNotificationView(); |
else if (notification_state_ == NOTIFICATION_NONE) |
HideNotificationView(); |
- last_power_supply_status_ = status; |
-} |
- |
-void TrayPower::RequestStatusUpdate() const { |
- PowerStatus::Get()->RequestStatusUpdate(); |
+ usb_charger_was_connected_ = PowerStatus::Get()->IsUsbChargerConnected(); |
} |
-bool TrayPower::MaybeShowUsbChargerNotification( |
- const PowerSupplyStatus& old_status, |
- const PowerSupplyStatus& new_status) { |
+bool TrayPower::MaybeShowUsbChargerNotification() { |
ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); |
const char kNotificationId[] = "usb-charger"; |
+ bool usb_charger_is_connected = PowerStatus::Get()->IsUsbChargerConnected(); |
+ |
// Check for a USB charger being connected. |
- if (new_status.battery_state == PowerSupplyStatus::CONNECTED_TO_USB && |
- old_status.battery_state != PowerSupplyStatus::CONNECTED_TO_USB) { |
+ if (usb_charger_is_connected && !usb_charger_was_connected_) { |
scoped_ptr<Notification> notification(new Notification( |
message_center::NOTIFICATION_TYPE_SIMPLE, |
kNotificationId, |
@@ -440,35 +216,31 @@ bool TrayPower::MaybeShowUsbChargerNotification( |
// Check for unplug of a USB charger while the USB charger notification is |
// showing. |
- if (new_status.battery_state != PowerSupplyStatus::CONNECTED_TO_USB && |
- old_status.battery_state == PowerSupplyStatus::CONNECTED_TO_USB) { |
+ if (!usb_charger_is_connected && usb_charger_was_connected_) { |
message_center_->RemoveNotification(kNotificationId, false); |
return true; |
} |
return false; |
} |
-bool TrayPower::UpdateNotificationState( |
- const chromeos::PowerSupplyStatus& status) { |
- if (!status.battery_is_present || |
- status.is_calculating_battery_time || |
- status.battery_state == PowerSupplyStatus::CHARGING || |
- status.battery_state == |
- PowerSupplyStatus::NEITHER_CHARGING_NOR_DISCHARGING) { |
+bool TrayPower::UpdateNotificationState() { |
+ const PowerStatus& status = *PowerStatus::Get(); |
+ if (!status.IsBatteryPresent() || |
+ status.IsBatteryTimeBeingCalculated() || |
+ status.IsMainsChargerConnected()) { |
notification_state_ = NOTIFICATION_NONE; |
return false; |
} |
- if (TrayPower::IsBatteryChargingUnreliable(status)) { |
- return UpdateNotificationStateForRemainingPercentage( |
- status.battery_percentage); |
- } else { |
- return UpdateNotificationStateForRemainingTime( |
- status.battery_seconds_to_empty); |
- } |
+ return status.IsUsbChargerConnected() ? |
+ UpdateNotificationStateForRemainingPercentage() : |
+ UpdateNotificationStateForRemainingTime(); |
} |
-bool TrayPower::UpdateNotificationStateForRemainingTime(int remaining_seconds) { |
+bool TrayPower::UpdateNotificationStateForRemainingTime() { |
+ const int remaining_seconds = |
+ PowerStatus::Get()->GetBatteryTimeToEmpty().InSeconds(); |
+ |
if (remaining_seconds >= kNoWarningSeconds) { |
notification_state_ = NOTIFICATION_NONE; |
return false; |
@@ -498,8 +270,9 @@ bool TrayPower::UpdateNotificationStateForRemainingTime(int remaining_seconds) { |
return false; |
} |
-bool TrayPower::UpdateNotificationStateForRemainingPercentage( |
- double remaining_percentage) { |
+bool TrayPower::UpdateNotificationStateForRemainingPercentage() { |
+ const double remaining_percentage = PowerStatus::Get()->GetBatteryPercent(); |
+ |
if (remaining_percentage > kNoWarningPercentage) { |
notification_state_ = NOTIFICATION_NONE; |
return false; |