diff options
Diffstat (limited to 'chromium/ash/system/chromeos/power/power_status_view.cc')
-rw-r--r-- | chromium/ash/system/chromeos/power/power_status_view.cc | 221 |
1 files changed, 221 insertions, 0 deletions
diff --git a/chromium/ash/system/chromeos/power/power_status_view.cc b/chromium/ash/system/chromeos/power/power_status_view.cc new file mode 100644 index 00000000000..f0fe4b1397a --- /dev/null +++ b/chromium/ash/system/chromeos/power/power_status_view.cc @@ -0,0 +1,221 @@ +// 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/chromeos/power/power_status_view.h" + +#include "ash/shell.h" +#include "ash/shell_delegate.h" +#include "ash/system/chromeos/power/power_status.h" +#include "ash/system/chromeos/power/tray_power.h" +#include "ash/system/tray/fixed_sized_image_view.h" +#include "ash/system/tray/tray_constants.h" +#include "base/strings/string_number_conversions.h" +#include "base/strings/utf_string_conversions.h" +#include "grit/ash_strings.h" +#include "ui/base/l10n/l10n_util.h" +#include "ui/base/l10n/time_format.h" +#include "ui/base/resource/resource_bundle.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 { + +// Padding between battery status text and battery icon on default view. +const int kPaddingBetweenBatteryStatusAndIcon = 3; + +PowerStatusView::PowerStatusView(ViewType view_type, + bool default_view_right_align) + : default_view_right_align_(default_view_right_align), + status_label_(NULL), + time_label_(NULL), + time_status_label_(NULL), + percentage_label_(NULL), + icon_(NULL), + view_type_(view_type) { + PowerStatus::Get()->AddObserver(this); + if (view_type == VIEW_DEFAULT) { + time_status_label_ = new views::Label; + percentage_label_ = new views::Label; + percentage_label_->SetEnabledColor(kHeaderTextColorNormal); + LayoutDefaultView(); + } else { + status_label_ = new views::Label; + time_label_ = new views::Label; + LayoutNotificationView(); + } + OnPowerStatusChanged(); +} + +PowerStatusView::~PowerStatusView() { + PowerStatus::Get()->RemoveObserver(this); +} + +void PowerStatusView::OnPowerStatusChanged() { + view_type_ == VIEW_DEFAULT ? + UpdateTextForDefaultView() : UpdateTextForNotificationView(); + + if (icon_) { + icon_->SetImage( + PowerStatus::Get()->GetBatteryImage(PowerStatus::ICON_DARK)); + icon_->SetVisible(true); + } +} + +void PowerStatusView::LayoutDefaultView() { + if (default_view_right_align_) { + views::BoxLayout* layout = + new views::BoxLayout(views::BoxLayout::kHorizontal, 0, 0, + kPaddingBetweenBatteryStatusAndIcon); + SetLayoutManager(layout); + + AddChildView(percentage_label_); + AddChildView(time_status_label_); + + icon_ = new views::ImageView; + AddChildView(icon_); + } else { + // PowerStatusView is left aligned on the system tray pop up item. + views::BoxLayout* layout = + new views::BoxLayout(views::BoxLayout::kHorizontal, 0, 0, + kTrayPopupPaddingBetweenItems); + SetLayoutManager(layout); + + icon_ = + new ash::internal::FixedSizedImageView(0, ash::kTrayPopupItemHeight); + AddChildView(icon_); + + AddChildView(percentage_label_); + AddChildView(time_status_label_); + } +} + +void PowerStatusView::LayoutNotificationView() { + SetLayoutManager( + new views::BoxLayout(views::BoxLayout::kVertical, 0, 0, 1)); + status_label_->SetHorizontalAlignment(gfx::ALIGN_LEFT); + AddChildView(status_label_); + + time_label_->SetHorizontalAlignment(gfx::ALIGN_LEFT); + AddChildView(time_label_); +} + +void PowerStatusView::UpdateTextForDefaultView() { + const PowerStatus& status = *PowerStatus::Get(); + ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); + base::string16 battery_percentage; + base::string16 battery_time_status; + + if (status.IsBatteryFull()) { + battery_time_status = + rb.GetLocalizedString(IDS_ASH_STATUS_TRAY_BATTERY_FULL); + } else { + battery_percentage = l10n_util::GetStringFUTF16( + IDS_ASH_STATUS_TRAY_BATTERY_PERCENT_ONLY, + base::IntToString16(status.GetRoundedBatteryPercent())); + if (status.IsUsbChargerConnected()) { + battery_time_status = rb.GetLocalizedString( + IDS_ASH_STATUS_TRAY_BATTERY_CHARGING_UNRELIABLE); + } else if (status.IsBatteryTimeBeingCalculated()) { + battery_time_status = + rb.GetLocalizedString(IDS_ASH_STATUS_TRAY_BATTERY_CALCULATING); + } else { + base::TimeDelta time = status.IsBatteryCharging() ? + status.GetBatteryTimeToFull() : status.GetBatteryTimeToEmpty(); + if (PowerStatus::ShouldDisplayBatteryTime(time) && + !status.IsBatteryDischargingOnLinePower()) { + int hour = 0, min = 0; + PowerStatus::SplitTimeIntoHoursAndMinutes(time, &hour, &min); + base::string16 minute = min < 10 ? + ASCIIToUTF16("0") + base::IntToString16(min) : + base::IntToString16(min); + battery_time_status = + l10n_util::GetStringFUTF16( + status.IsBatteryCharging() ? + IDS_ASH_STATUS_TRAY_BATTERY_TIME_UNTIL_FULL_SHORT : + IDS_ASH_STATUS_TRAY_BATTERY_TIME_LEFT_SHORT, + base::IntToString16(hour), + minute); + } + } + battery_percentage = battery_time_status.empty() ? + battery_percentage : battery_percentage + ASCIIToUTF16(" - "); + } + percentage_label_->SetVisible(!battery_percentage.empty()); + percentage_label_->SetText(battery_percentage); + time_status_label_->SetVisible(!battery_time_status.empty()); + time_status_label_->SetText(battery_time_status); +} + +void PowerStatusView::UpdateTextForNotificationView() { + const PowerStatus& status = *PowerStatus::Get(); + if (status.IsBatteryFull()) { + 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(status.GetRoundedBatteryPercent()))); + } + + const base::TimeDelta time = status.IsBatteryCharging() ? + status.GetBatteryTimeToFull() : status.GetBatteryTimeToEmpty(); + + if (status.IsUsbChargerConnected()) { + time_label_->SetText( + ui::ResourceBundle::GetSharedInstance().GetLocalizedString( + IDS_ASH_STATUS_TRAY_BATTERY_CHARGING_UNRELIABLE)); + } else if (status.IsBatteryTimeBeingCalculated()) { + time_label_->SetText( + ui::ResourceBundle::GetSharedInstance().GetLocalizedString( + IDS_ASH_STATUS_TRAY_BATTERY_CALCULATING)); + } else if (PowerStatus::ShouldDisplayBatteryTime(time) && + !status.IsBatteryDischargingOnLinePower()) { + int hour = 0, min = 0; + PowerStatus::SplitTimeIntoHoursAndMinutes(time, &hour, &min); + if (status.IsBatteryCharging()) { + time_label_->SetText( + l10n_util::GetStringFUTF16( + IDS_ASH_STATUS_TRAY_BATTERY_TIME_UNTIL_FULL, + base::IntToString16(hour), + base::IntToString16(min))); + } else { + // This is a low battery warning prompting the user in minutes. + time_label_->SetText(ui::TimeFormat::TimeRemaining( + base::TimeDelta::FromMinutes(hour * 60 + min))); + } + } else { + time_label_->SetText(base::string16()); + } +} + +void PowerStatusView::ChildPreferredSizeChanged(views::View* child) { + PreferredSizeChanged(); +} + +gfx::Size PowerStatusView::GetPreferredSize() { + gfx::Size size = views::View::GetPreferredSize(); + return gfx::Size(size.width(), kTrayPopupItemHeight); +} + +int PowerStatusView::GetHeightForWidth(int width) { + return kTrayPopupItemHeight; +} + +void PowerStatusView::Layout() { + views::View::Layout(); + + // Move the time_status_label_ closer to percentage_label_. + if (percentage_label_ && time_status_label_ && + percentage_label_->visible() && time_status_label_->visible()) { + time_status_label_->SetX(percentage_label_->bounds().right() + 1); + } +} + +} // namespace internal +} // namespace ash |