summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ash/ash.gyp2
-rw-r--r--ash/ash_strings.grd6
-rw-r--r--ash/system/power/power_status_view.cc187
-rw-r--r--ash/system/power/power_status_view.h65
-rw-r--r--ash/system/power/tray_power.cc215
-rw-r--r--ash/system/power/tray_power.h14
-rw-r--r--ash/system/settings/tray_settings.cc107
-rw-r--r--ash/system/settings/tray_settings.h13
-rw-r--r--ash/system/tray/system_tray.cc7
-rw-r--r--ash/system/tray/system_tray.h7
-rw-r--r--chrome/browser/chromeos/system/ash_system_tray_delegate.cc5
11 files changed, 414 insertions, 214 deletions
diff --git a/ash/ash.gyp b/ash/ash.gyp
index 3eee1e1..af2f46e 100644
--- a/ash/ash.gyp
+++ b/ash/ash.gyp
@@ -142,6 +142,8 @@
'system/network/tray_sms.cc',
'system/network/tray_sms.h',
'system/power/power_status_observer.h',
+ 'system/power/power_status_view.cc',
+ 'system/power/power_status_view.h',
'system/power/power_supply_status.cc',
'system/power/power_supply_status.h',
'system/power/tray_power.cc',
diff --git a/ash/ash_strings.grd b/ash/ash_strings.grd
index d2f78ee..e28fbbf 100644
--- a/ash/ash_strings.grd
+++ b/ash/ash_strings.grd
@@ -357,6 +357,9 @@ Press Search key to cancel.
<message name="IDS_ASH_STATUS_TRAY_BATTERY_PERCENT" desc="The label in the tray dialog to show the remaining battery power as a percent.">
Battery: <ph name="percentage">$1<ex>56</ex></ph>%
</message>
+ <message name="IDS_ASH_STATUS_TRAY_BATTERY_PERCENT_ONLY" desc="The label in the tray bubble setting row to show the remaining battery power as a percent.">
+ <ph name="percentage">$1<ex>56</ex></ph>%
+ </message>
<message name="IDS_ASH_STATUS_TRAY_BATTERY_TIME_UNTIL_FULL" desc="The label in the tray dialog to show a time estimate until the battery is fully charged.">
<ph name="hour">$1<ex>2</ex></ph>h <ph name="minute">$2<ex>53</ex></ph>m until full
</message>
@@ -366,6 +369,9 @@ Press Search key to cancel.
<message name="IDS_ASH_STATUS_TRAY_BATTERY_CALCULATING" desc="The label in the tray dialog indicating that the time to charge or discharge the battery is being calculated.">
Calculating...
</message>
+ <message name="IDS_ASH_STATUS_TRAY_BATTERY_TIME_ONLY" desc="The label in the tray bubble settings row to show a time estimate until the battery is empty.">
+ <ph name="hour">$1<ex>2</ex></ph>h<ph name="minute">$2<ex>53</ex></ph>m
+ </message>
<message name="IDS_ASH_STATUS_TRAY_IP" desc="The label for the IP address of the network:">
IP Address
</message>
diff --git a/ash/system/power/power_status_view.cc b/ash/system/power/power_status_view.cc
new file mode 100644
index 0000000..cd47f71
--- /dev/null
+++ b/ash/system/power/power_status_view.cc
@@ -0,0 +1,187 @@
+// Copyright (c) 2012 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.
+
+#include "ash/system/power/power_status_view.h"
+
+#include "ash/system/power/tray_power.h"
+#include "ash/system/tray/tray_constants.h"
+#include "base/string_number_conversions.h"
+#include "base/utf_string_conversions.h"
+#include "grit/ash_strings.h"
+#include "ui/base/resource/resource_bundle.h"
+#include "ui/base/l10n/l10n_util.h"
+#include "ui/views/controls/image_view.h"
+#include "ui/views/controls/label.h"
+#include "ui/views/layout/box_layout.h"
+#include "ui/views/layout/grid_layout.h"
+
+namespace ash {
+namespace internal {
+
+namespace {
+
+// Top/bottom padding of the text items.
+const int kPaddingVertical = 10;
+// Specify min width of status label for layout.
+const int kLabelMinWidth = 120;
+// Padding between battery status text and battery icon on default view.
+const int kPaddingBetweenBatteryStatusAndIcon = 3;
+} // namespace
+
+PowerStatusView::PowerStatusView(ViewType view_type)
+ : status_label_(NULL),
+ time_label_(NULL),
+ time_status_label_(NULL),
+ icon_(NULL),
+ view_type_(view_type) {
+ if (view_type == VIEW_DEFAULT) {
+ time_status_label_ = new views::Label;
+ LayoutDefaultView();
+ } else {
+ status_label_ = new views::Label;
+ time_label_ = new views::Label;
+ LayoutNotificationView();
+ }
+ Update();
+}
+
+void PowerStatusView::UpdatePowerStatus(const PowerSupplyStatus& status) {
+ supply_status_ = status;
+ // Sanitize.
+ if (supply_status_.battery_is_full)
+ supply_status_.battery_percentage = 100.0;
+
+ Update();
+}
+
+void PowerStatusView::LayoutDefaultView() {
+ views::BoxLayout* layout =
+ new views::BoxLayout(views::BoxLayout::kHorizontal, 0, 0,
+ kPaddingBetweenBatteryStatusAndIcon);
+ SetLayoutManager(layout);
+
+ time_status_label_->SetHorizontalAlignment(views::Label::ALIGN_RIGHT);
+ AddChildView(time_status_label_);
+
+ icon_ = new views::ImageView;
+ AddChildView(icon_);
+}
+
+void PowerStatusView::LayoutNotificationView() {
+ SetLayoutManager(
+ new views::BoxLayout(views::BoxLayout::kVertical, 0, 0, 1));
+ status_label_->SetHorizontalAlignment(views::Label::ALIGN_LEFT);
+ AddChildView(status_label_);
+
+ time_label_->SetHorizontalAlignment(views::Label::ALIGN_LEFT);
+ AddChildView(time_label_);
+}
+
+void PowerStatusView::UpdateText() {
+ view_type_ == VIEW_DEFAULT ?
+ UpdateTextForDefaultView() : UpdateTextForNotificationView();
+}
+
+void PowerStatusView::UpdateTextForDefaultView() {
+ int hour = 0;
+ int min = 0;
+ if (!supply_status_.is_calculating_battery_time) {
+ base::TimeDelta time = base::TimeDelta::FromSeconds(
+ supply_status_.averaged_battery_time_to_empty);
+ hour = time.InHours();
+ min = (time - base::TimeDelta::FromHours(hour)).InMinutes();
+ }
+
+ if (supply_status_.line_power_on && supply_status_.battery_is_full) {
+ time_status_label_->SetText(
+ ui::ResourceBundle::GetSharedInstance().GetLocalizedString(
+ IDS_ASH_STATUS_TRAY_BATTERY_FULL));
+ } else {
+ string16 battery_percentage = l10n_util::GetStringFUTF16(
+ IDS_ASH_STATUS_TRAY_BATTERY_PERCENT_ONLY,
+ base::IntToString16(
+ static_cast<int>(supply_status_.battery_percentage)));
+ string16 battery_time = string16();
+ if (supply_status_.is_calculating_battery_time) {
+ battery_time =
+ ui::ResourceBundle::GetSharedInstance().GetLocalizedString(
+ IDS_ASH_STATUS_TRAY_BATTERY_CALCULATING);
+ } else if (hour || min){
+ battery_time =
+ l10n_util::GetStringFUTF16(
+ IDS_ASH_STATUS_TRAY_BATTERY_TIME_ONLY,
+ base::IntToString16(hour),
+ base::IntToString16(min)) +
+ ASCIIToUTF16(" - ");
+ }
+ string16 battery_status = battery_time + battery_percentage;
+ time_status_label_->SetText(battery_status);
+ }
+}
+
+void PowerStatusView::UpdateTextForNotificationView() {
+ int hour = 0;
+ int min = 0;
+ if (!supply_status_.is_calculating_battery_time) {
+ base::TimeDelta time = base::TimeDelta::FromSeconds(
+ supply_status_.line_power_on ?
+ supply_status_.averaged_battery_time_to_full :
+ supply_status_.averaged_battery_time_to_empty);
+ hour = time.InHours();
+ min = (time - base::TimeDelta::FromHours(hour)).InMinutes();
+ }
+
+ if (supply_status_.line_power_on && supply_status_.battery_is_full) {
+ status_label_->SetText(
+ ui::ResourceBundle::GetSharedInstance().GetLocalizedString(
+ IDS_ASH_STATUS_TRAY_BATTERY_FULL));
+ } else {
+ status_label_->SetText(
+ l10n_util::GetStringFUTF16(
+ IDS_ASH_STATUS_TRAY_BATTERY_PERCENT,
+ base::IntToString16(
+ static_cast<int>(supply_status_.battery_percentage))));
+ }
+
+ if (supply_status_.is_calculating_battery_time) {
+ time_label_->SetText(
+ ui::ResourceBundle::GetSharedInstance().GetLocalizedString(
+ IDS_ASH_STATUS_TRAY_BATTERY_CALCULATING));
+ } else if (hour || min) {
+ time_label_->SetText(
+ l10n_util::GetStringFUTF16(
+ supply_status_.line_power_on ?
+ IDS_ASH_STATUS_TRAY_BATTERY_TIME_UNTIL_FULL :
+ IDS_ASH_STATUS_TRAY_BATTERY_TIME_UNTIL_EMPTY,
+ base::IntToString16(hour),
+ base::IntToString16(min)));
+ } else {
+ time_label_->SetText(string16());
+ }
+
+}
+
+void PowerStatusView::UpdateIcon() {
+ if (icon_) {
+ icon_->SetImage(TrayPower::GetBatteryImage(supply_status_, ICON_DARK));
+ icon_->SetVisible(true);
+ }
+}
+
+void PowerStatusView::Update() {
+ UpdateText();
+ UpdateIcon();
+}
+
+void PowerStatusView::ChildPreferredSizeChanged(views::View* child) {
+ PreferredSizeChanged();
+}
+
+gfx::Size PowerStatusView::GetPreferredSize() {
+ gfx::Size size = views::View::GetPreferredSize();
+ return gfx::Size(size.width(), kTrayPopupItemHeight);
+}
+
+} // namespace internal
+} // namespace ash
diff --git a/ash/system/power/power_status_view.h b/ash/system/power/power_status_view.h
new file mode 100644
index 0000000..a673c1a
--- /dev/null
+++ b/ash/system/power/power_status_view.h
@@ -0,0 +1,65 @@
+// Copyright (c) 2012 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_VIEW_H_
+#define ASH_SYSTEM_POWER_POWER_STATUS_VIEW_H_
+#pragma once
+
+#include "ash/system/power/power_supply_status.h"
+#include "ui/views/view.h"
+
+namespace views {
+class ImageView;
+class Label;
+}
+
+namespace ash {
+namespace internal {
+
+class PowerStatusView : public views::View {
+ public:
+ enum ViewType {
+ VIEW_DEFAULT,
+ VIEW_NOTIFICATION
+ };
+
+ explicit PowerStatusView(ViewType view_type);
+ virtual ~PowerStatusView() {}
+
+ void UpdatePowerStatus(const PowerSupplyStatus& status);
+
+ // Overridden from views::View.
+ virtual gfx::Size GetPreferredSize() OVERRIDE;
+
+ private:
+ void LayoutDefaultView();
+ void LayoutNotificationView();
+ void UpdateText();
+ void UpdateIcon();
+ void Update();
+ void UpdateTextForDefaultView();
+ void UpdateTextForNotificationView();
+
+ // Overridden from views::View.
+ virtual void ChildPreferredSizeChanged(views::View* child) OVERRIDE;
+
+ // labels used only for VIEW_NOTIFICATION.
+ views::Label* status_label_;
+ views::Label* time_label_;
+
+ // labels used only for VIEW_DEFAULT.
+ views::Label* time_status_label_;
+
+ views::ImageView* icon_;
+ ViewType view_type_;
+
+ PowerSupplyStatus supply_status_;
+
+ DISALLOW_COPY_AND_ASSIGN(PowerStatusView);
+};
+
+} // namespace internal
+} // namespace ash
+
+#endif // ASH_SYSTEM_POWER_POWER_STATUS_VIEW_H_
diff --git a/ash/system/power/tray_power.cc b/ash/system/power/tray_power.cc
index b851a75..6a8d07c 100644
--- a/ash/system/power/tray_power.cc
+++ b/ash/system/power/tray_power.cc
@@ -7,6 +7,7 @@
#include "ash/ash_switches.h"
#include "ash/shell.h"
#include "ash/system/date/date_view.h"
+#include "ash/system/power/power_status_view.h"
#include "ash/system/power/power_supply_status.h"
#include "ash/system/tray/system_tray_delegate.h"
#include "ash/system/tray/tray_constants.h"
@@ -53,40 +54,6 @@ const int kCriticalSeconds = 5 * 60;
const int kLowPowerSeconds = 15 * 60;
const int kNoWarningSeconds = 30 * 60;
-enum IconSet {
- ICON_LIGHT,
- ICON_DARK
-};
-
-gfx::ImageSkia GetBatteryImage(const PowerSupplyStatus& supply_status,
- IconSet icon_set) {
- gfx::ImageSkia image;
- gfx::Image all = ui::ResourceBundle::GetSharedInstance().GetImageNamed(
- icon_set == ICON_DARK ?
- IDR_AURA_UBER_TRAY_POWER_SMALL_DARK : IDR_AURA_UBER_TRAY_POWER_SMALL);
-
- 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 {
- double percentage = supply_status.is_calculating_battery_time ? 100.0 :
- supply_status.battery_percentage;
- image_index = static_cast<int>(percentage / 100.0 * (kNumPowerImages - 1));
- image_index = std::max(std::min(image_index, kNumPowerImages - 2), 0);
- }
-
- // TODO(mbolohan): Remove the 2px offset when the assets are centered. See
- // crbug.com/119832.
- SkIRect region = SkIRect::MakeXYWH(
- (supply_status.line_power_on ? kBatteryImageWidth : 0) + 2,
- image_index * kBatteryImageHeight,
- kBatteryImageWidth - 2, kBatteryImageHeight);
- all.ToImageSkia()->extractSubset(&image, region);
- return image;
-}
-
} // namespace
namespace tray {
@@ -113,7 +80,7 @@ class PowerTrayView : public views::ImageView {
private:
void UpdateImage() {
- SetImage(GetBatteryImage(supply_status_, ICON_LIGHT));
+ SetImage(TrayPower::GetBatteryImage(supply_status_, ICON_LIGHT));
}
PowerSupplyStatus supply_status_;
@@ -121,148 +88,6 @@ class PowerTrayView : public views::ImageView {
DISALLOW_COPY_AND_ASSIGN(PowerTrayView);
};
-// This view is used only for the popup.
-class PowerStatusView : public views::View {
- public:
- enum ViewType {
- VIEW_DEFAULT,
- VIEW_NOTIFICATION
- };
-
- explicit PowerStatusView(ViewType view_type) : icon_(NULL) {
- status_label_ = new views::Label;
- time_label_ = new views::Label;
-
- if (view_type == VIEW_DEFAULT)
- LayoutDefaultView();
- else
- LayoutNotificationView();
-
- Update();
- }
-
- virtual ~PowerStatusView() {
- }
-
- void UpdatePowerStatus(const PowerSupplyStatus& status) {
- supply_status_ = status;
- // Sanitize.
- if (supply_status_.battery_is_full)
- supply_status_.battery_percentage = 100.0;
-
- Update();
- }
-
- private:
- void LayoutDefaultView() {
- set_border(views::Border::CreateEmptyBorder(
- kPaddingVertical, kTrayPopupPaddingHorizontal,
- kPaddingVertical, kTrayPopupPaddingHorizontal));
-
- status_label_->SetHorizontalAlignment(views::Label::ALIGN_RIGHT);
- time_label_->SetHorizontalAlignment(views::Label::ALIGN_RIGHT);
-
- icon_ = new views::ImageView;
-
- views::GridLayout* layout = new views::GridLayout(this);
- SetLayoutManager(layout);
-
- views::ColumnSet* columns = layout->AddColumnSet(0);
-
- columns->AddPaddingColumn(0, kTrayPopupPaddingHorizontal);
- // Status + Time
- columns->AddColumn(views::GridLayout::FILL, views::GridLayout::FILL,
- 0, views::GridLayout::USE_PREF, 0, kLabelMinWidth);
-
- columns->AddPaddingColumn(0, kTrayPopupPaddingHorizontal/2);
-
- // Icon
- columns->AddColumn(views::GridLayout::FILL, views::GridLayout::FILL,
- 0, views::GridLayout::USE_PREF, 0, 0);
-
- columns->AddPaddingColumn(0, kTrayPopupPaddingHorizontal);
-
- layout->AddPaddingRow(0, kPaddingVertical);
-
- layout->StartRow(0, 0);
- layout->AddView(status_label_);
- layout->AddView(icon_, 1, 3); // 3 rows for icon
-
- layout->AddPaddingRow(0, kPaddingVertical/3);
- layout->StartRow(0, 0);
- layout->AddView(time_label_);
-
- layout->AddPaddingRow(0, kPaddingVertical);
- }
-
- void LayoutNotificationView() {
- SetLayoutManager(
- new views::BoxLayout(views::BoxLayout::kVertical, 0, 0, 1));
- status_label_->SetHorizontalAlignment(views::Label::ALIGN_LEFT);
- AddChildView(status_label_);
-
- time_label_->SetHorizontalAlignment(views::Label::ALIGN_LEFT);
- AddChildView(time_label_);
- }
-
- void UpdateText() {
- base::TimeDelta time = base::TimeDelta::FromSeconds(
- supply_status_.line_power_on ?
- supply_status_.averaged_battery_time_to_full :
- supply_status_.averaged_battery_time_to_empty);
- int hour = time.InHours();
- int min = (time - base::TimeDelta::FromHours(hour)).InMinutes();
-
- if (supply_status_.line_power_on && !hour && !min) {
- status_label_->SetText(
- ui::ResourceBundle::GetSharedInstance().GetLocalizedString(
- IDS_ASH_STATUS_TRAY_BATTERY_FULL));
- } else {
- status_label_->SetText(
- l10n_util::GetStringFUTF16(
- IDS_ASH_STATUS_TRAY_BATTERY_PERCENT,
- base::IntToString16(
- static_cast<int>(supply_status_.battery_percentage))));
- }
-
- if (supply_status_.is_calculating_battery_time) {
- time_label_->SetText(
- ui::ResourceBundle::GetSharedInstance().GetLocalizedString(
- IDS_ASH_STATUS_TRAY_BATTERY_CALCULATING));
- } else if (hour || min) {
- time_label_->SetText(
- l10n_util::GetStringFUTF16(
- supply_status_.line_power_on ?
- IDS_ASH_STATUS_TRAY_BATTERY_TIME_UNTIL_FULL :
- IDS_ASH_STATUS_TRAY_BATTERY_TIME_UNTIL_EMPTY,
- base::IntToString16(hour),
- base::IntToString16(min)));
- } else {
- time_label_->SetText(string16());
- }
- }
-
- void UpdateIcon() {
- if (icon_) {
- icon_->SetImage(GetBatteryImage(supply_status_, ICON_DARK));
- icon_->SetVisible(true);
- }
- }
-
- void Update() {
- UpdateText();
- UpdateIcon();
- }
-
- views::Label* status_label_;
- views::Label* time_label_;
- views::ImageView* icon_;
-
- PowerSupplyStatus supply_status_;
-
- DISALLOW_COPY_AND_ASSIGN(PowerStatusView);
-};
-
class PowerNotificationView : public TrayNotificationView {
public:
explicit PowerNotificationView(TrayPower* tray)
@@ -274,7 +99,7 @@ class PowerNotificationView : public TrayNotificationView {
}
void UpdatePowerStatus(const PowerSupplyStatus& status) {
- SetIconImage(GetBatteryImage(status, ICON_DARK));
+ SetIconImage(TrayPower::GetBatteryImage(status, ICON_DARK));
power_status_view_->UpdatePowerStatus(status);
}
@@ -285,14 +110,13 @@ class PowerNotificationView : public TrayNotificationView {
private:
TrayPower* tray_;
- tray::PowerStatusView* power_status_view_;
+ PowerStatusView* power_status_view_;
DISALLOW_COPY_AND_ASSIGN(PowerNotificationView);
};
} // namespace tray
-using tray::PowerStatusView;
using tray::PowerNotificationView;
TrayPower::TrayPower()
@@ -304,6 +128,37 @@ TrayPower::TrayPower()
TrayPower::~TrayPower() {
}
+// static
+gfx::ImageSkia TrayPower::GetBatteryImage(
+ const PowerSupplyStatus& supply_status,
+ IconSet icon_set) {
+ gfx::ImageSkia image;
+ gfx::Image all = ui::ResourceBundle::GetSharedInstance().GetImageNamed(
+ icon_set == ICON_DARK ?
+ IDR_AURA_UBER_TRAY_POWER_SMALL_DARK : IDR_AURA_UBER_TRAY_POWER_SMALL);
+
+ 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 {
+ double percentage = supply_status.is_calculating_battery_time ? 100.0 :
+ supply_status.battery_percentage;
+ image_index = static_cast<int>(percentage / 100.0 * (kNumPowerImages - 1));
+ image_index = std::max(std::min(image_index, kNumPowerImages - 2), 0);
+ }
+
+ // TODO(mbolohan): Remove the 2px offset when the assets are centered. See
+ // crbug.com/119832.
+ SkIRect region = SkIRect::MakeXYWH(
+ (supply_status.line_power_on ? kBatteryImageWidth : 0) + 2,
+ image_index * kBatteryImageHeight,
+ kBatteryImageWidth - 2, kBatteryImageHeight);
+ all.ToImageSkia()->extractSubset(&image, region);
+ return image;
+}
+
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
diff --git a/ash/system/power/tray_power.h b/ash/system/power/tray_power.h
index 864d14e..491d5e8 100644
--- a/ash/system/power/tray_power.h
+++ b/ash/system/power/tray_power.h
@@ -9,6 +9,12 @@
#include "ash/system/power/power_status_observer.h"
#include "ash/system/tray/system_tray_item.h"
+class SkBitmap;
+
+namespace gfx {
+class ImageSkia;
+}
+
namespace ash {
namespace internal {
@@ -17,12 +23,20 @@ class PowerNotificationView;
class PowerTrayView;
}
+enum IconSet {
+ ICON_LIGHT,
+ ICON_DARK
+};
+
class TrayPower : public SystemTrayItem,
public PowerStatusObserver {
public:
TrayPower();
virtual ~TrayPower();
+ static gfx::ImageSkia GetBatteryImage(const PowerSupplyStatus& supply_status,
+ IconSet icon_set);
+
private:
enum NotificationState {
NOTIFICATION_NONE,
diff --git a/ash/system/settings/tray_settings.cc b/ash/system/settings/tray_settings.cc
index fee44ec..1685338 100644
--- a/ash/system/settings/tray_settings.cc
+++ b/ash/system/settings/tray_settings.cc
@@ -5,6 +5,7 @@
#include "ash/system/settings/tray_settings.h"
#include "ash/shell.h"
+#include "ash/system/power/power_status_view.h"
#include "ash/system/tray/system_tray_delegate.h"
#include "ash/system/tray/tray_constants.h"
#include "ash/system/tray/tray_views.h"
@@ -22,49 +23,96 @@
#include "ui/views/layout/fill_layout.h"
#include "ui/views/view.h"
-namespace {
+namespace ash {
+namespace internal {
-class SettingsView : public ash::internal::ActionableView {
+namespace tray {
+
+class SettingsDefaultView : public ash::internal::ActionableView {
public:
- SettingsView() {
+ explicit SettingsDefaultView(user::LoginStatus status)
+ : login_status_(status),
+ power_status_view_(NULL) {
SetLayoutManager(new views::BoxLayout(views::BoxLayout::kHorizontal,
ash::kTrayPopupPaddingHorizontal, 0,
ash::kTrayPopupPaddingBetweenItems));
- ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
- views::ImageView* icon =
- new ash::internal::FixedSizedImageView(0, ash::kTrayPopupItemHeight);
- icon->SetImage(rb.GetImageNamed(IDR_AURA_UBER_TRAY_SETTINGS).ToImageSkia());
- AddChildView(icon);
+ if (login_status_ != user::LOGGED_IN_NONE &&
+ login_status_ != user::LOGGED_IN_LOCKED) {
+ ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
+ views::ImageView* icon =
+ new ash::internal::FixedSizedImageView(0, ash::kTrayPopupItemHeight);
+ icon->SetImage(
+ rb.GetImageNamed(IDR_AURA_UBER_TRAY_SETTINGS).ToImageSkia());
+ AddChildView(icon);
+
+ string16 text = rb.GetLocalizedString(IDS_ASH_STATUS_TRAY_SETTINGS);
+ label_ = new views::Label(text);
+ AddChildView(label_);
+ SetAccessibleName(text);
+ }
+
+ PowerSupplyStatus power_status =
+ ash::Shell::GetInstance()->tray_delegate()->GetPowerSupplyStatus();
+ if (power_status.battery_is_present) {
+ power_status_view_ = new ash::internal::PowerStatusView(
+ ash::internal::PowerStatusView::VIEW_DEFAULT);
+ AddChildView(power_status_view_);
+ UpdatePowerStatus(power_status);
+ }
+ }
- string16 text = rb.GetLocalizedString(
- IDS_ASH_STATUS_TRAY_SETTINGS);
- label_ = new views::Label(text);
- AddChildView(label_);
+ virtual ~SettingsDefaultView() {}
- SetAccessibleName(text);
+ void UpdatePowerStatus(const PowerSupplyStatus& status) {
+ if (power_status_view_)
+ power_status_view_->UpdatePowerStatus(status);
}
- virtual ~SettingsView() {}
-
// Overridden from ash::internal::ActionableView.
virtual bool PerformAction(const views::Event& event) OVERRIDE {
+ if (login_status_ == user::LOGGED_IN_NONE ||
+ login_status_ == user::LOGGED_IN_LOCKED)
+ return false;
+
ash::Shell::GetInstance()->tray_delegate()->ShowSettings();
return true;
}
+ // Overridden from views::View.
+ virtual void Layout() OVERRIDE {
+ // Let the box-layout do the layout first. Then move power_status_view_
+ // to right align if it is created.
+ views::View::Layout();
+
+ if (power_status_view_) {
+ gfx::Size size = power_status_view_->GetPreferredSize();
+ gfx::Rect bounds(size);
+ bounds.set_x(width() - size.width() - ash::kTrayPopupPaddingBetweenItems);
+ bounds.set_y((height() - size.height()) / 2);
+ power_status_view_->SetBoundsRect(bounds);
+ }
+ }
+
+ // Overridden from views::View.
+ virtual void ChildPreferredSizeChanged(views::View* child) OVERRIDE {
+ views::View::ChildPreferredSizeChanged(child);
+ Layout();
+ }
+
private:
+ user::LoginStatus login_status_;
views::Label* label_;
+ ash::internal::PowerStatusView* power_status_view_;
- DISALLOW_COPY_AND_ASSIGN(SettingsView);
-};
+ DISALLOW_COPY_AND_ASSIGN(SettingsDefaultView);
+ };
-} // namespace
-
-namespace ash {
-namespace internal {
+} // namespace tray
-TraySettings::TraySettings() {}
+TraySettings::TraySettings()
+ : default_view_(NULL) {
+}
TraySettings::~TraySettings() {}
@@ -73,10 +121,14 @@ views::View* TraySettings::CreateTrayView(user::LoginStatus status) {
}
views::View* TraySettings::CreateDefaultView(user::LoginStatus status) {
- if (status == user::LOGGED_IN_NONE || status == user::LOGGED_IN_LOCKED)
+ if ((status == user::LOGGED_IN_NONE || status == user::LOGGED_IN_LOCKED) &&
+ (!ash::Shell::GetInstance()->tray_delegate()->
+ GetPowerSupplyStatus().battery_is_present))
return NULL;
- return new SettingsView;
+ CHECK(default_view_ == NULL);
+ default_view_ = new tray::SettingsDefaultView(status);
+ return default_view_;
}
views::View* TraySettings::CreateDetailedView(user::LoginStatus status) {
@@ -88,6 +140,7 @@ void TraySettings::DestroyTrayView() {
}
void TraySettings::DestroyDefaultView() {
+ default_view_ = NULL;
}
void TraySettings::DestroyDetailedView() {
@@ -96,5 +149,11 @@ void TraySettings::DestroyDetailedView() {
void TraySettings::UpdateAfterLoginStatusChange(user::LoginStatus status) {
}
+// Overridden from PowerStatusObserver.
+void TraySettings::OnPowerStatusChanged(const PowerSupplyStatus& status) {
+ if (default_view_)
+ default_view_->UpdatePowerStatus(status);
+}
+
} // namespace internal
} // namespace ash
diff --git a/ash/system/settings/tray_settings.h b/ash/system/settings/tray_settings.h
index 18536fe..1b9ca97 100644
--- a/ash/system/settings/tray_settings.h
+++ b/ash/system/settings/tray_settings.h
@@ -6,12 +6,18 @@
#define ASH_SYSTEM_SETTINGS_TRAY_SETTINGS_H_
#pragma once
+#include "ash/system/power/power_status_observer.h"
#include "ash/system/tray/system_tray_item.h"
namespace ash {
namespace internal {
-class TraySettings : public SystemTrayItem {
+namespace tray {
+class SettingsDefaultView;
+}
+
+class TraySettings : public SystemTrayItem,
+ public PowerStatusObserver {
public:
TraySettings();
virtual ~TraySettings();
@@ -26,6 +32,11 @@ class TraySettings : public SystemTrayItem {
virtual void DestroyDetailedView() OVERRIDE;
virtual void UpdateAfterLoginStatusChange(user::LoginStatus status) OVERRIDE;
+ // Overridden from PowerStatusObserver.
+ virtual void OnPowerStatusChanged(const PowerSupplyStatus& status) OVERRIDE;
+
+ tray::SettingsDefaultView* default_view_;
+
DISALLOW_COPY_AND_ASSIGN(TraySettings);
};
diff --git a/ash/system/tray/system_tray.cc b/ash/system/tray/system_tray.cc
index b2b9eca..1e5ba66 100644
--- a/ash/system/tray/system_tray.cc
+++ b/ash/system/tray/system_tray.cc
@@ -135,7 +135,6 @@ SystemTray::SystemTray()
ime_observer_(NULL),
locale_observer_(NULL),
network_observer_(NULL),
- power_status_observer_(NULL),
update_observer_(NULL),
user_observer_(NULL),
should_show_launcher_(false),
@@ -181,6 +180,7 @@ void SystemTray::CreateItems() {
internal::TrayIME* tray_ime = new internal::TrayIME;
internal::TrayLocale* tray_locale = new internal::TrayLocale;
internal::TrayUpdate* tray_update = new internal::TrayUpdate;
+ internal::TraySettings* tray_settings = new internal::TraySettings();
accessibility_observer_ = tray_accessibility;
audio_observer_ = tray_volume;
@@ -192,7 +192,8 @@ void SystemTray::CreateItems() {
ime_observer_ = tray_ime;
locale_observer_ = tray_locale;
network_observer_ = tray_network;
- power_status_observer_ = tray_power;
+ power_status_observers_.AddObserver(tray_power);
+ power_status_observers_.AddObserver(tray_settings);
update_observer_ = tray_update;
user_observer_ = tray_user;
@@ -209,7 +210,7 @@ void SystemTray::CreateItems() {
AddTrayItem(tray_update);
AddTrayItem(tray_accessibility);
AddTrayItem(tray_caps_lock);
- AddTrayItem(new internal::TraySettings());
+ AddTrayItem(tray_settings);
AddTrayItem(tray_date);
SetVisible(ash::Shell::GetInstance()->tray_delegate()->
GetTrayVisibilityOnStartup());
diff --git a/ash/system/tray/system_tray.h b/ash/system/tray/system_tray.h
index 650799a..8cee819 100644
--- a/ash/system/tray/system_tray.h
+++ b/ash/system/tray/system_tray.h
@@ -7,6 +7,7 @@
#pragma once
#include "ash/ash_export.h"
+#include "ash/system/power/power_supply_status.h"
#include "ash/system/tray/tray_background_view.h"
#include "ash/system/tray/tray_views.h"
#include "ash/system/user/login_status.h"
@@ -131,8 +132,8 @@ class ASH_EXPORT SystemTray : public internal::TrayBackgroundView {
NetworkObserver* network_observer() const {
return network_observer_;
}
- PowerStatusObserver* power_status_observer() const {
- return power_status_observer_;
+ ObserverList<PowerStatusObserver>& power_status_observers() {
+ return power_status_observers_;
}
UpdateObserver* update_observer() const {
return update_observer_;
@@ -221,7 +222,7 @@ class ASH_EXPORT SystemTray : public internal::TrayBackgroundView {
IMEObserver* ime_observer_;
LocaleObserver* locale_observer_;
NetworkObserver* network_observer_;
- PowerStatusObserver* power_status_observer_;
+ ObserverList<PowerStatusObserver> power_status_observers_;
UpdateObserver* update_observer_;
UserObserver* user_observer_;
diff --git a/chrome/browser/chromeos/system/ash_system_tray_delegate.cc b/chrome/browser/chromeos/system/ash_system_tray_delegate.cc
index 1e7aa7f..c5118c7 100644
--- a/chrome/browser/chromeos/system/ash_system_tray_delegate.cc
+++ b/chrome/browser/chromeos/system/ash_system_tray_delegate.cc
@@ -932,9 +932,8 @@ class SystemTrayDelegate : public ash::SystemTrayDelegate,
virtual void PowerChanged(const PowerSupplyStatus& power_status) OVERRIDE {
power_supply_status_ = power_status;
- ash::PowerStatusObserver* observer = tray_->power_status_observer();
- if (observer)
- observer->OnPowerStatusChanged(power_status);
+ FOR_EACH_OBSERVER(ash::PowerStatusObserver, tray_->power_status_observers(),
+ OnPowerStatusChanged(power_status));
}
virtual void SystemResumed() OVERRIDE {