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