tray_settings.cc revision 868fa2fe829687343ffae624259930155e16dbd8
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" 890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "ash/system/chromeos/power/power_status_view.h" 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/system/tray/actionable_view.h" 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/system/tray/fixed_sized_image_view.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/system/tray/system_tray_delegate.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/system/tray/tray_constants.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h" 14868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 1590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "chromeos/dbus/power_manager_client.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) 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class SettingsDefaultView : public ActionableView { 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit SettingsDefaultView(user::LoginStatus status) 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : login_status_(status), 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) label_(NULL), 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) power_status_view_(NULL) { 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetLayoutManager(new views::BoxLayout(views::BoxLayout::kHorizontal, 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ash::kTrayPopupPaddingHorizontal, 0, 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ash::kTrayPopupPaddingBetweenItems)); 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool power_view_right_align = false; 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (login_status_ != user::LOGGED_IN_NONE && 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) login_status_ != user::LOGGED_IN_LOCKED) { 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::ImageView* icon = 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new ash::internal::FixedSizedImageView(0, ash::kTrayPopupItemHeight); 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) icon->SetImage( 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rb.GetImageNamed(IDR_AURA_UBER_TRAY_SETTINGS).ToImageSkia()); 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddChildView(icon); 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::string16 text = rb.GetLocalizedString(IDS_ASH_STATUS_TRAY_SETTINGS); 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) label_ = new views::Label(text); 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddChildView(label_); 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetAccessibleName(text); 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) power_view_right_align = true; 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) chromeos::PowerSupplyStatus power_status = 6290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) chromeos::PowerManagerHandler::Get()->GetPowerSupplyStatus(); 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (power_status.battery_is_present) { 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_); 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdatePowerStatus(power_status); 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~SettingsDefaultView() {} 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) void UpdatePowerStatus(const chromeos::PowerSupplyStatus& status) { 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!power_status_view_) 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) power_status_view_->UpdatePowerStatus(status); 77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::string16 accessible_name = label_ ? 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) label_->text() + ASCIIToUTF16(", ") + 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) power_status_view_->accessible_name() : 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) power_status_view_->accessible_name(); 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetAccessibleName(accessible_name); 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Overridden from ash::internal::ActionableView. 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool PerformAction(const ui::Event& event) OVERRIDE { 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (login_status_ == user::LOGGED_IN_NONE || 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) login_status_ == user::LOGGED_IN_LOCKED) 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ash::Shell::GetInstance()->system_tray_delegate()->ShowSettings(); 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Overridden from views::View. 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Layout() OVERRIDE { 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::View::Layout(); 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (label_ && power_status_view_) { 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Let the box-layout do the layout first. Then move power_status_view_ 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to right align if it is created. 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Size size = power_status_view_->GetPreferredSize(); 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect bounds(size); 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bounds.set_x(width() - size.width() - ash::kTrayPopupPaddingBetweenItems); 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bounds.set_y((height() - size.height()) / 2); 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) power_status_view_->SetBoundsRect(bounds); 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Overridden from views::View. 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void ChildPreferredSizeChanged(views::View* child) OVERRIDE { 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::View::ChildPreferredSizeChanged(child); 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Layout(); 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) user::LoginStatus login_status_; 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::Label* label_; 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ash::internal::PowerStatusView* power_status_view_; 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(SettingsDefaultView); 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace tray 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TraySettings::TraySettings(SystemTray* system_tray) 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : SystemTrayItem(system_tray), 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) default_view_(NULL) { 12890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) chromeos::PowerManagerHandler::Get()->AddObserver(this); 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TraySettings::~TraySettings() { 13290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (chromeos::PowerManagerHandler::IsInitialized()) 13390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) chromeos::PowerManagerHandler::Get()->RemoveObserver(this); 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) && 14290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) (chromeos::PowerManagerHandler::IsInitialized() && 14390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) !chromeos::PowerManagerHandler::Get()-> 14490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) GetPowerSupplyStatus().battery_is_present)) 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(default_view_ == NULL); 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_view_ = new tray::SettingsDefaultView(status); 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return default_view_; 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)views::View* TraySettings::CreateDetailedView(user::LoginStatus status) { 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTIMPLEMENTED(); 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TraySettings::DestroyTrayView() { 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TraySettings::DestroyDefaultView() { 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_view_ = NULL; 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TraySettings::DestroyDetailedView() { 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TraySettings::UpdateAfterLoginStatusChange(user::LoginStatus status) { 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void TraySettings::OnPowerStatusChanged( 17190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const chromeos::PowerSupplyStatus& status) { 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (default_view_) 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_view_->UpdatePowerStatus(status); 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace internal 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace ash 178