tray_settings.cc revision eb525c5499e34cc9c4b825d6d9e75bb07cc06ace
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "ash/system/chromeos/settings/tray_settings.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/shell.h" 8eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ash/system/chromeos/power/power_status.h" 990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "ash/system/chromeos/power/power_status_view.h" 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/system/tray/actionable_view.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/system/tray/fixed_sized_image_view.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/system/tray/system_tray_delegate.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/system/tray/tray_constants.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h" 15868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/ash_resources.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/ash_strings.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/skia/include/core/SkColor.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/accessibility/accessible_view_state.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/resource/resource_bundle.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/image/image.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/image_view.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/label.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/layout/box_layout.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/layout/fill_layout.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/view.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ash { 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace internal { 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace tray { 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochclass SettingsDefaultView : public ActionableView, 34eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch public PowerStatus::Observer { 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit SettingsDefaultView(user::LoginStatus status) 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : login_status_(status), 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) label_(NULL), 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) power_status_view_(NULL) { 40eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch PowerStatus::Get()->AddObserver(this); 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetLayoutManager(new views::BoxLayout(views::BoxLayout::kHorizontal, 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ash::kTrayPopupPaddingHorizontal, 0, 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ash::kTrayPopupPaddingBetweenItems)); 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool power_view_right_align = false; 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (login_status_ != user::LOGGED_IN_NONE && 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) login_status_ != user::LOGGED_IN_LOCKED) { 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::ImageView* icon = 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new ash::internal::FixedSizedImageView(0, ash::kTrayPopupItemHeight); 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) icon->SetImage( 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rb.GetImageNamed(IDR_AURA_UBER_TRAY_SETTINGS).ToImageSkia()); 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddChildView(icon); 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::string16 text = rb.GetLocalizedString(IDS_ASH_STATUS_TRAY_SETTINGS); 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) label_ = new views::Label(text); 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddChildView(label_); 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetAccessibleName(text); 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) power_view_right_align = true; 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 63eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (PowerStatus::Get()->IsBatteryPresent()) { 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) power_status_view_ = new ash::internal::PowerStatusView( 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ash::internal::PowerStatusView::VIEW_DEFAULT, power_view_right_align); 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddChildView(power_status_view_); 67eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch OnPowerStatusChanged(); 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 71eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch virtual ~SettingsDefaultView() { 72eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch PowerStatus::Get()->RemoveObserver(this); 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Overridden from ash::internal::ActionableView. 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool PerformAction(const ui::Event& event) OVERRIDE { 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (login_status_ == user::LOGGED_IN_NONE || 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) login_status_ == user::LOGGED_IN_LOCKED) 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ash::Shell::GetInstance()->system_tray_delegate()->ShowSettings(); 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Overridden from views::View. 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Layout() OVERRIDE { 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::View::Layout(); 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (label_ && power_status_view_) { 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Let the box-layout do the layout first. Then move power_status_view_ 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to right align if it is created. 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Size size = power_status_view_->GetPreferredSize(); 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect bounds(size); 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bounds.set_x(width() - size.width() - ash::kTrayPopupPaddingBetweenItems); 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bounds.set_y((height() - size.height()) / 2); 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) power_status_view_->SetBoundsRect(bounds); 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Overridden from views::View. 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void ChildPreferredSizeChanged(views::View* child) OVERRIDE { 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::View::ChildPreferredSizeChanged(child); 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Layout(); 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 106eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Overridden from PowerStatus::Observer. 107eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch virtual void OnPowerStatusChanged() OVERRIDE { 108eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (!PowerStatus::Get()->IsBatteryPresent()) 109eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return; 110eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 111eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::string16 accessible_name = label_ ? 112eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch label_->text() + ASCIIToUTF16(", ") + 113eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch PowerStatus::Get()->GetAccessibleNameString() : 114eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch PowerStatus::Get()->GetAccessibleNameString(); 115eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch SetAccessibleName(accessible_name); 116eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 117eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) user::LoginStatus login_status_; 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::Label* label_; 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ash::internal::PowerStatusView* power_status_view_; 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(SettingsDefaultView); 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace tray 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TraySettings::TraySettings(SystemTray* system_tray) 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : SystemTrayItem(system_tray), 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) default_view_(NULL) { 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TraySettings::~TraySettings() { 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)views::View* TraySettings::CreateTrayView(user::LoginStatus status) { 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)views::View* TraySettings::CreateDefaultView(user::LoginStatus status) { 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((status == user::LOGGED_IN_NONE || status == user::LOGGED_IN_LOCKED) && 142eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch !PowerStatus::Get()->IsBatteryPresent()) 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(default_view_ == NULL); 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_view_ = new tray::SettingsDefaultView(status); 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return default_view_; 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)views::View* TraySettings::CreateDetailedView(user::LoginStatus status) { 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTIMPLEMENTED(); 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TraySettings::DestroyTrayView() { 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TraySettings::DestroyDefaultView() { 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_view_ = NULL; 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TraySettings::DestroyDetailedView() { 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TraySettings::UpdateAfterLoginStatusChange(user::LoginStatus status) { 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace internal 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace ash 170