16acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// Copyright (c) 2012 The Chromium Authors. All rights reserved. 26acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// Use of this source code is governed by a BSD-style license that can be 36acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// found in the LICENSE file. 46acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 56acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#include "ash/system/chromeos/settings/tray_settings.h" 66acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 76acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#include "ash/session/session_state_delegate.h" 86acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#include "ash/shell.h" 96acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#include "ash/system/chromeos/power/power_status.h" 106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#include "ash/system/chromeos/power/power_status_view.h" 116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#include "ash/system/tray/actionable_view.h" 126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#include "ash/system/tray/fixed_sized_image_view.h" 136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#include "ash/system/tray/system_tray_delegate.h" 146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#include "ash/system/tray/tray_constants.h" 156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#include "base/logging.h" 166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#include "base/strings/utf_string_conversions.h" 176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#include "grit/ash_resources.h" 186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#include "grit/ash_strings.h" 196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#include "third_party/skia/include/core/SkColor.h" 206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#include "ui/base/resource/resource_bundle.h" 216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#include "ui/gfx/image/image.h" 226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#include "ui/views/controls/image_view.h" 236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#include "ui/views/controls/label.h" 246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#include "ui/views/layout/box_layout.h" 256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#include "ui/views/layout/fill_layout.h" 266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#include "ui/views/view.h" 276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennnamespace ash { 296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennnamespace tray { 306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennclass SettingsDefaultView : public ActionableView, 326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn public PowerStatus::Observer { 336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn public: 346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn explicit SettingsDefaultView(user::LoginStatus status) 356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn : login_status_(status), 366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn label_(NULL), 376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn power_status_view_(NULL) { 386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn PowerStatus::Get()->AddObserver(this); 396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn SetLayoutManager(new views::BoxLayout(views::BoxLayout::kHorizontal, 406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn ash::kTrayPopupPaddingHorizontal, 0, 416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn ash::kTrayPopupPaddingBetweenItems)); 426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn bool power_view_right_align = false; 446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn bool userAddingRunning = ash::Shell::GetInstance() 456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn ->session_state_delegate() 466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn ->IsInSecondaryLoginScreen(); 476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if (login_status_ != user::LOGGED_IN_NONE && 496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn login_status_ != user::LOGGED_IN_LOCKED && !userAddingRunning) { 506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); 516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn views::ImageView* icon = 526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn new ash::FixedSizedImageView(0, ash::kTrayPopupItemHeight); 536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn icon->SetImage( 546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn rb.GetImageNamed(IDR_AURA_UBER_TRAY_SETTINGS).ToImageSkia()); 556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn icon->set_id(test::kSettingsTrayItemViewId); 566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn AddChildView(icon); 576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn base::string16 text = rb.GetLocalizedString(IDS_ASH_STATUS_TRAY_SETTINGS); 596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn label_ = new views::Label(text); 606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn AddChildView(label_); 616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn SetAccessibleName(text); 626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn power_view_right_align = true; 646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if (PowerStatus::Get()->IsBatteryPresent()) { 676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn power_status_view_ = new ash::PowerStatusView( 686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn ash::PowerStatusView::VIEW_DEFAULT, power_view_right_align); 696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn AddChildView(power_status_view_); 706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn OnPowerStatusChanged(); 716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn virtual ~SettingsDefaultView() { 756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn PowerStatus::Get()->RemoveObserver(this); 766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn // Overridden from ash::ActionableView. 796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn virtual bool PerformAction(const ui::Event& event) OVERRIDE { 806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn bool userAddingRunning = ash::Shell::GetInstance() 816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn ->session_state_delegate() 826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn ->IsInSecondaryLoginScreen(); 836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if (login_status_ == user::LOGGED_IN_NONE || 856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn login_status_ == user::LOGGED_IN_LOCKED || userAddingRunning) 866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn return false; 876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn ash::Shell::GetInstance()->system_tray_delegate()->ShowSettings(); 896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn return true; 906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn // Overridden from views::View. 936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn virtual void Layout() OVERRIDE { 946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn views::View::Layout(); 956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if (label_ && power_status_view_) { 976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn // Let the box-layout do the layout first. Then move power_status_view_ 986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn // to right align if it is created. 996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn gfx::Size size = power_status_view_->GetPreferredSize(); 1006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn gfx::Rect bounds(size); 1016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn bounds.set_x(width() - size.width() - ash::kTrayPopupPaddingBetweenItems); 1026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn bounds.set_y((height() - size.height()) / 2); 1036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn power_status_view_->SetBoundsRect(bounds); 1046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 1056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 1066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn // Overridden from views::View. 1086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn virtual void ChildPreferredSizeChanged(views::View* child) OVERRIDE { 1096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn views::View::ChildPreferredSizeChanged(child); 1106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn Layout(); 1116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 1126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn // Overridden from PowerStatus::Observer. 1146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn virtual void OnPowerStatusChanged() OVERRIDE { 1156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if (!PowerStatus::Get()->IsBatteryPresent()) 1166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn return; 1176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn base::string16 accessible_name = label_ ? 1196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn label_->text() + base::ASCIIToUTF16(", ") + 1206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn PowerStatus::Get()->GetAccessibleNameString(true) : 1216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn PowerStatus::Get()->GetAccessibleNameString(true); 1226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn SetAccessibleName(accessible_name); 1236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 1246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn private: 1266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn user::LoginStatus login_status_; 1276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn views::Label* label_; 1286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn ash::PowerStatusView* power_status_view_; 1296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn DISALLOW_COPY_AND_ASSIGN(SettingsDefaultView); 1316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn }; 1326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} // namespace tray 1346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennTraySettings::TraySettings(SystemTray* system_tray) 1366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn : SystemTrayItem(system_tray), 1376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn default_view_(NULL) { 1386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 1396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennTraySettings::~TraySettings() { 1416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 1426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennviews::View* TraySettings::CreateTrayView(user::LoginStatus status) { 1446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn return NULL; 1456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 1466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennviews::View* TraySettings::CreateDefaultView(user::LoginStatus status) { 1486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if ((status == user::LOGGED_IN_NONE || status == user::LOGGED_IN_LOCKED) && 1496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn !PowerStatus::Get()->IsBatteryPresent()) 1506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn return NULL; 1516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if (!ash::Shell::GetInstance()->system_tray_delegate()->ShouldShowSettings()) 1526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn return NULL; 1536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CHECK(default_view_ == NULL); 1546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn default_view_ = new tray::SettingsDefaultView(status); 1556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn return default_view_; 1566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 1576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennviews::View* TraySettings::CreateDetailedView(user::LoginStatus status) { 1596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn NOTIMPLEMENTED(); 1606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn return NULL; 1616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 1626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennvoid TraySettings::DestroyTrayView() { 1646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 1656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennvoid TraySettings::DestroyDefaultView() { 1676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn default_view_ = NULL; 1686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 1696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennvoid TraySettings::DestroyDetailedView() { 1716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 1726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennvoid TraySettings::UpdateAfterLoginStatusChange(user::LoginStatus status) { 1746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 1756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} // namespace ash 1776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn