tray_settings.cc revision c5cede9ae108bb15f6b7a8aea21c7e1fefa2834c
1cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar// Use of this source code is governed by a BSD-style license that can be
3cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar// found in the LICENSE file.
4cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar
5cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar#include "ash/system/chromeos/settings/tray_settings.h"
6cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar
7cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar#include "ash/shell.h"
8cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar#include "ash/system/chromeos/power/power_status.h"
9cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar#include "ash/system/chromeos/power/power_status_view.h"
10cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar#include "ash/system/tray/actionable_view.h"
11cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar#include "ash/system/tray/fixed_sized_image_view.h"
12cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar#include "ash/system/tray/system_tray_delegate.h"
13cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar#include "ash/system/tray/tray_constants.h"
14cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar#include "base/logging.h"
15cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar#include "base/strings/utf_string_conversions.h"
16cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar#include "grit/ash_resources.h"
17cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar#include "grit/ash_strings.h"
18cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar#include "third_party/skia/include/core/SkColor.h"
19cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar#include "ui/base/resource/resource_bundle.h"
20cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar#include "ui/gfx/image/image.h"
21cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar#include "ui/views/controls/image_view.h"
22cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar#include "ui/views/controls/label.h"
23cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar#include "ui/views/layout/box_layout.h"
24cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar#include "ui/views/layout/fill_layout.h"
25cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar#include "ui/views/view.h"
26cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar
27cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaarnamespace ash {
28cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaarnamespace tray {
29cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar
30cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaarclass SettingsDefaultView : public ActionableView,
31cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar                            public PowerStatus::Observer {
32cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar public:
33cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar  explicit SettingsDefaultView(user::LoginStatus status)
3488364df7b6429fa96bb5130ea73bd40b0629e30eEric Christopher      : login_status_(status),
3588364df7b6429fa96bb5130ea73bd40b0629e30eEric Christopher        label_(NULL),
3688364df7b6429fa96bb5130ea73bd40b0629e30eEric Christopher        power_status_view_(NULL) {
37cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar    PowerStatus::Get()->AddObserver(this);
38cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar    SetLayoutManager(new views::BoxLayout(views::BoxLayout::kHorizontal,
39cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar        ash::kTrayPopupPaddingHorizontal, 0,
40cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar        ash::kTrayPopupPaddingBetweenItems));
41cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar
42cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar    bool power_view_right_align = false;
43cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar    if (login_status_ != user::LOGGED_IN_NONE &&
44cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar        login_status_ != user::LOGGED_IN_LOCKED) {
45cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar      ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
46cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar      views::ImageView* icon =
47cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar          new ash::FixedSizedImageView(0, ash::kTrayPopupItemHeight);
48cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar      icon->SetImage(
49cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar          rb.GetImageNamed(IDR_AURA_UBER_TRAY_SETTINGS).ToImageSkia());
50cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar      icon->set_id(test::kSettingsTrayItemViewId);
51cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar      AddChildView(icon);
52cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar
53cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar      base::string16 text = rb.GetLocalizedString(IDS_ASH_STATUS_TRAY_SETTINGS);
54cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar      label_ = new views::Label(text);
55cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar      AddChildView(label_);
56cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar      SetAccessibleName(text);
57cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar
58cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar      power_view_right_align = true;
59cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar    }
60cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar
61cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar    if (PowerStatus::Get()->IsBatteryPresent()) {
62cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar      power_status_view_ = new ash::PowerStatusView(
63cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar          ash::PowerStatusView::VIEW_DEFAULT, power_view_right_align);
64cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar      AddChildView(power_status_view_);
65cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar      OnPowerStatusChanged();
66cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar    }
67cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar  }
68cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar
69cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar  virtual ~SettingsDefaultView() {
70cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar    PowerStatus::Get()->RemoveObserver(this);
71cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar  }
72cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar
73cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar  // Overridden from ash::ActionableView.
74cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar  virtual bool PerformAction(const ui::Event& event) OVERRIDE {
75cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar    if (login_status_ == user::LOGGED_IN_NONE ||
76cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar        login_status_ == user::LOGGED_IN_LOCKED)
77cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar      return false;
78cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar
79cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar    ash::Shell::GetInstance()->system_tray_delegate()->ShowSettings();
80cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar    return true;
81cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar  }
82cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar
83cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar  // Overridden from views::View.
84cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar  virtual void Layout() OVERRIDE {
85cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar    views::View::Layout();
86cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar
87cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar    if (label_ && power_status_view_) {
88cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar      // Let the box-layout do the layout first. Then move power_status_view_
89cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar      // to right align if it is created.
90cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar      gfx::Size size = power_status_view_->GetPreferredSize();
91cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar      gfx::Rect bounds(size);
92cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar      bounds.set_x(width() - size.width() - ash::kTrayPopupPaddingBetweenItems);
93cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar      bounds.set_y((height() - size.height()) / 2);
94cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar      power_status_view_->SetBoundsRect(bounds);
95cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar    }
96cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar  }
97cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar
98cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar  // Overridden from views::View.
99cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar  virtual void ChildPreferredSizeChanged(views::View* child) OVERRIDE {
100cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar    views::View::ChildPreferredSizeChanged(child);
101cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar    Layout();
102cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar  }
103cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar
104cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar  // Overridden from PowerStatus::Observer.
105cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar  virtual void OnPowerStatusChanged() OVERRIDE {
106cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar    if (!PowerStatus::Get()->IsBatteryPresent())
107cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar      return;
108cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar
109cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar    base::string16 accessible_name = label_ ?
110cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar        label_->text() + base::ASCIIToUTF16(", ") +
111cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar            PowerStatus::Get()->GetAccessibleNameString() :
112cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar        PowerStatus::Get()->GetAccessibleNameString();
113cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar    SetAccessibleName(accessible_name);
114cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar  }
115cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar
116cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar private:
117cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar  user::LoginStatus login_status_;
118cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar  views::Label* label_;
119cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar  ash::PowerStatusView* power_status_view_;
120cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar
121cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar  DISALLOW_COPY_AND_ASSIGN(SettingsDefaultView);
122cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar };
123cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar
124cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar}  // namespace tray
125cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar
126cabc7af293504ad256d2203ae88ee11cbc34c2edErick TryzelaarTraySettings::TraySettings(SystemTray* system_tray)
127cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar    : SystemTrayItem(system_tray),
128cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar      default_view_(NULL) {
129cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar}
130cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar
131cabc7af293504ad256d2203ae88ee11cbc34c2edErick TryzelaarTraySettings::~TraySettings() {
132cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar}
133cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar
134cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaarviews::View* TraySettings::CreateTrayView(user::LoginStatus status) {
135cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar  return NULL;
136cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar}
137cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar
138cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaarviews::View* TraySettings::CreateDefaultView(user::LoginStatus status) {
139cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar  if ((status == user::LOGGED_IN_NONE || status == user::LOGGED_IN_LOCKED) &&
140cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar      !PowerStatus::Get()->IsBatteryPresent())
141cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar    return NULL;
142cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar  if (!ash::Shell::GetInstance()->system_tray_delegate()->ShouldShowSettings())
143cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar    return NULL;
144cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar  CHECK(default_view_ == NULL);
145cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar  default_view_ =  new tray::SettingsDefaultView(status);
146cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar  return default_view_;
147cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar}
148cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar
149cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaarviews::View* TraySettings::CreateDetailedView(user::LoginStatus status) {
150cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar  NOTIMPLEMENTED();
151cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar  return NULL;
152cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar}
153cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar
154cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaarvoid TraySettings::DestroyTrayView() {
155cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar}
156cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar
157cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaarvoid TraySettings::DestroyDefaultView() {
158cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar  default_view_ = NULL;
159cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar}
160cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar
161cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaarvoid TraySettings::DestroyDetailedView() {
162cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar}
163cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar
164cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaarvoid TraySettings::UpdateAfterLoginStatusChange(user::LoginStatus status) {
165cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar}
166cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar
167cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar}  // namespace ash
168cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar