diff options
-rw-r--r-- | ash/ash.gyp | 2 | ||||
-rw-r--r-- | ash/ash_strings.grd | 6 | ||||
-rw-r--r-- | ash/system/power/power_status_view.cc | 187 | ||||
-rw-r--r-- | ash/system/power/power_status_view.h | 65 | ||||
-rw-r--r-- | ash/system/power/tray_power.cc | 215 | ||||
-rw-r--r-- | ash/system/power/tray_power.h | 14 | ||||
-rw-r--r-- | ash/system/settings/tray_settings.cc | 107 | ||||
-rw-r--r-- | ash/system/settings/tray_settings.h | 13 | ||||
-rw-r--r-- | ash/system/tray/system_tray.cc | 7 | ||||
-rw-r--r-- | ash/system/tray/system_tray.h | 7 | ||||
-rw-r--r-- | chrome/browser/chromeos/system/ash_system_tray_delegate.cc | 5 |
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 { |