tray_display.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)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/system/chromeos/tray_display.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/display/display_controller.h"
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/display/display_manager.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/shell.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/system/tray/fixed_sized_image_view.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/system/tray/system_tray.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/system/tray/system_tray_delegate.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/system/tray/tray_constants.h"
14868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "ash/system/tray/tray_notification_view.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/chromeos/chromeos_version.h"
16868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/ash_resources.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/ash_strings.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/resource/resource_bundle.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/label.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/layout/box_layout.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ash {
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace internal {
26868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)namespace {
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)TrayDisplayMode GetCurrentTrayDisplayMode() {
29868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  DisplayManager* display_manager = Shell::GetInstance()->display_manager();
30868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (display_manager->GetNumDisplays() > 1)
31868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    return TRAY_DISPLAY_EXTENDED;
32868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
33868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (display_manager->IsMirrored())
34868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    return TRAY_DISPLAY_MIRRORED;
35868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
36868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  int64 first_id = display_manager->first_display_id();
37868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (display_manager->HasInternalDisplay() &&
38868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      !display_manager->IsInternalDisplayId(first_id)) {
39868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    return TRAY_DISPLAY_DOCKED;
40868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
41868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
42868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return TRAY_DISPLAY_SINGLE;
43868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
44868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
45868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Returns the name of the currently connected external display.
46868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)base::string16 GetExternalDisplayName() {
47868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  DisplayManager* display_manager = Shell::GetInstance()->display_manager();
48868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  int64 external_id = display_manager->mirrored_display().id();
49868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
50868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (external_id == gfx::Display::kInvalidDisplayID) {
51868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    int64 internal_display_id = gfx::Display::InternalDisplayId();
52868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    for (size_t i = 0; i < display_manager->GetNumDisplays(); ++i) {
53868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      int64 id = display_manager->GetDisplayAt(i)->id();
54868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      if (id != internal_display_id) {
55868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        external_id = id;
56868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        break;
57868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      }
58868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    }
59868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
60868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (external_id != gfx::Display::kInvalidDisplayID)
61868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    return UTF8ToUTF16(display_manager->GetDisplayNameForId(external_id));
62868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_UNKNOWN_DISPLAY_NAME);
63868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
64868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
65868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)class DisplayViewBase {
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
67868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  DisplayViewBase(user::LoginStatus login_status)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : login_status_(login_status) {
69868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    label_ = new views::Label();
70868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    label_->SetMultiLine(true);
71868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    label_->SetHorizontalAlignment(gfx::ALIGN_LEFT);
72868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
73868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
74868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  virtual ~DisplayViewBase() {
75868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
76868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
77868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) protected:
78868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  void OpenSettings() {
79868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    if (login_status_ == ash::user::LOGGED_IN_USER ||
80868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        login_status_ == ash::user::LOGGED_IN_OWNER ||
81868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        login_status_ == ash::user::LOGGED_IN_GUEST) {
82868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      ash::Shell::GetInstance()->system_tray_delegate()->ShowDisplaySettings();
83868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    }
84868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
85868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
86868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  bool UpdateLabelText() {
87868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    switch (GetCurrentTrayDisplayMode()) {
88868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      case TRAY_DISPLAY_SINGLE:
89868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        // TODO(oshima|mukai): Support single display mode for overscan
90868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        // alignment.
91868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        return false;
92868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      case TRAY_DISPLAY_EXTENDED:
93868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        if (Shell::GetInstance()->display_manager()->HasInternalDisplay()) {
94868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)          label_->SetText(l10n_util::GetStringFUTF16(
95868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)              IDS_ASH_STATUS_TRAY_DISPLAY_EXTENDED, GetExternalDisplayName()));
96868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        } else {
97868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)          label_->SetText(l10n_util::GetStringUTF16(
98868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)              IDS_ASH_STATUS_TRAY_DISPLAY_EXTENDED_NO_INTERNAL));
99868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        }
100868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        break;
101868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      case TRAY_DISPLAY_MIRRORED:
102868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        if (Shell::GetInstance()->display_manager()->HasInternalDisplay()) {
103868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)          label_->SetText(l10n_util::GetStringFUTF16(
104868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)              IDS_ASH_STATUS_TRAY_DISPLAY_MIRRORING, GetExternalDisplayName()));
105868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        } else {
106868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)          label_->SetText(l10n_util::GetStringUTF16(
107868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)              IDS_ASH_STATUS_TRAY_DISPLAY_MIRRORING_NO_INTERNAL));
108868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        }
109868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        break;
110868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      case TRAY_DISPLAY_DOCKED:
111868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        label_->SetText(l10n_util::GetStringUTF16(
112868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)            IDS_ASH_STATUS_TRAY_DISPLAY_DOCKED));
113868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        break;
114868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    }
115868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    return true;
116868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
117868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
118868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  views::Label* label() { return label_; }
119868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
120868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) private:
121868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  user::LoginStatus login_status_;
122868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  views::Label* label_;
123868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
124868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(DisplayViewBase);
125868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)};
126868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
127868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}  // namespace
128868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
129868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)class DisplayView : public DisplayViewBase,
130868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                    public ash::internal::ActionableView {
131868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) public:
132868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  explicit DisplayView(user::LoginStatus login_status)
133868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      : DisplayViewBase(login_status) {
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetLayoutManager(new
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        views::BoxLayout(views::BoxLayout::kHorizontal,
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ash::kTrayPopupPaddingHorizontal, 0,
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ash::kTrayPopupPaddingBetweenItems));
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui::ResourceBundle& bundle = ui::ResourceBundle::GetSharedInstance();
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    image_ =
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        new ash::internal::FixedSizedImageView(0, ash::kTrayPopupItemHeight);
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    image_->SetImage(
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        bundle.GetImageNamed(IDR_AURA_UBER_TRAY_DISPLAY).ToImageSkia());
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    AddChildView(image_);
145868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    AddChildView(label());
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Update();
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~DisplayView() {}
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Update() {
152868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    SetVisible(UpdateLabelText());
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Overridden from ActionableView.
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool PerformAction(const ui::Event& event) OVERRIDE {
158868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    OpenSettings();
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnBoundsChanged(const gfx::Rect& previous_bounds) OVERRIDE {
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int label_max_width = bounds().width() - kTrayPopupPaddingHorizontal * 2 -
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        kTrayPopupPaddingBetweenItems - image_->GetPreferredSize().width();
165868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    label()->SizeToFit(label_max_width);
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PreferredSizeChanged();
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  views::ImageView* image_;
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(DisplayView);
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
174868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)class DisplayNotificationView : public DisplayViewBase,
175868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                public TrayNotificationView {
176868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) public:
177868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  DisplayNotificationView(user::LoginStatus login_status,
178868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                          TrayDisplay* tray_item)
179868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      : DisplayViewBase(login_status),
180868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        TrayNotificationView(tray_item, IDR_AURA_UBER_TRAY_DISPLAY) {
181868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    InitView(label());
182868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    StartAutoCloseTimer(kTrayPopupAutoCloseDelayForTextInSeconds);
183868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    Update();
184868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
185868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
186868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  virtual ~DisplayNotificationView() {}
187868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
188868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  void Update() {
189868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    if (UpdateLabelText())
190868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      RestartAutoCloseTimer();
191868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    else
192868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      owner()->HideNotificationView();
193868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
194868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
195868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Overridden from TrayNotificationView:
196868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  virtual void OnClickAction() OVERRIDE {
197868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    OpenSettings();
198868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
199868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
200868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) private:
201868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(DisplayNotificationView);
202868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)};
203868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TrayDisplay::TrayDisplay(SystemTray* system_tray)
2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : SystemTrayItem(system_tray),
206868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      default_(NULL),
207868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      notification_(NULL),
208868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      current_mode_(GetCurrentTrayDisplayMode()) {
209868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  Shell::GetInstance()->display_controller()->AddObserver(this);
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TrayDisplay::~TrayDisplay() {
213868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  Shell::GetInstance()->display_controller()->RemoveObserver(this);
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)views::View* TrayDisplay::CreateDefaultView(user::LoginStatus status) {
217868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  DCHECK(default_ == NULL);
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  default_ = new DisplayView(status);
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return default_;
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
222868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)views::View* TrayDisplay::CreateNotificationView(user::LoginStatus status) {
223868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  DCHECK(notification_ == NULL);
224868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  notification_ = new DisplayNotificationView(status, this);
225868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return notification_;
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
228868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void TrayDisplay::DestroyDefaultView() {
229868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  default_ = NULL;
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
232868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void TrayDisplay::DestroyNotificationView() {
233868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  notification_ = NULL;
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
236868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)bool TrayDisplay::ShouldShowLauncher() const {
237868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return false;
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
240868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void TrayDisplay::OnDisplayConfigurationChanged() {
241868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  TrayDisplayMode new_mode = GetCurrentTrayDisplayMode();
242868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (current_mode_ != new_mode && new_mode != TRAY_DISPLAY_SINGLE) {
243868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    if (notification_)
244868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      notification_->Update();
245868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    else
246868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      ShowNotificationView();
247868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
248868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  current_mode_ = new_mode;
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace internal
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace ash
253