tray_display.cc revision c2db58bd994c04d98e4ee2cd7565b71548655fe3
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"
10eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ash/system/tray/actionable_view.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/system/tray/fixed_sized_image_view.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/system/tray/system_tray.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/system/tray/system_tray_delegate.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/system/tray/tray_constants.h"
15868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "ash/system/tray/tray_notification_view.h"
16a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "base/bind.h"
17eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/strings/string_util.h"
18868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/ash_resources.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/ash_strings.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/resource/resource_bundle.h"
23eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ui/message_center/message_center.h"
24eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ui/message_center/notification.h"
25eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ui/message_center/notification_delegate.h"
26eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ui/message_center/notification_list.h"
27eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ui/views/controls/image_view.h"
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/label.h"
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/layout/box_layout.h"
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochusing message_center::Notification;
32eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ash {
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace internal {
35868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)namespace {
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochstatic const char kDisplayNotificationId[] = "chrome://settings/display";
38868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
39eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochDisplayManager* GetDisplayManager() {
40eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return Shell::GetInstance()->display_manager();
41eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
42868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
43eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbase::string16 GetDisplayName(int64 display_id) {
44eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return UTF8ToUTF16(GetDisplayManager()->GetDisplayNameForId(display_id));
45eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
46eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochbase::string16 GetDisplaySize(int64 display_id) {
487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  DisplayManager* display_manager = GetDisplayManager();
497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  const gfx::Display* display = &display_manager->GetDisplayForId(display_id);
517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (display_manager->IsMirrored() &&
527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      display_manager->mirrored_display().id() == display_id) {
537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    display = &display_manager->mirrored_display();
547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  DCHECK(display->is_valid());
577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  return UTF8ToUTF16(display->size().ToString());
587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
60eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Returns 1-line information for the specified display, like
61eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// "InternalDisplay: 1280x750"
62eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbase::string16 GetDisplayInfoLine(int64 display_id) {
63eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  const DisplayInfo& display_info =
64eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      GetDisplayManager()->GetDisplayInfo(display_id);
65eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  base::string16 size_text = GetDisplaySize(display_id);
67eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  base::string16 display_data;
68eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (display_info.has_overscan()) {
69eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    display_data = l10n_util::GetStringFUTF16(
70eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        IDS_ASH_STATUS_TRAY_DISPLAY_ANNOTATION,
71eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        size_text,
72eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        l10n_util::GetStringUTF16(
73eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch            IDS_ASH_STATUS_TRAY_DISPLAY_ANNOTATION_OVERSCAN));
74eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  } else {
75eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    display_data = size_text;
76eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
77eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
78eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return l10n_util::GetStringFUTF16(
79eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      IDS_ASH_STATUS_TRAY_DISPLAY_SINGLE_DISPLAY,
80eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      GetDisplayName(display_id),
81eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      display_data);
82eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
83eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
84eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbase::string16 GetAllDisplayInfo() {
85eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  DisplayManager* display_manager = GetDisplayManager();
86eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  std::vector<base::string16> lines;
87eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  int64 internal_id = gfx::Display::kInvalidDisplayID;
88eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Make sure to show the internal display first.
89868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (display_manager->HasInternalDisplay() &&
90eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      display_manager->IsInternalDisplayId(
91eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch          display_manager->first_display_id())) {
92eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    internal_id = display_manager->first_display_id();
93eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    lines.push_back(GetDisplayInfoLine(internal_id));
94eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
95eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
96eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  for (size_t i = 0; i < display_manager->GetNumDisplays(); ++i) {
97ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    int64 id = display_manager->GetDisplayAt(i).id();
98eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    if (id == internal_id)
99eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      continue;
100eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    lines.push_back(GetDisplayInfoLine(id));
101eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
102eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
103eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return JoinString(lines, '\n');
104868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
105868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
106868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Returns the name of the currently connected external display.
107868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)base::string16 GetExternalDisplayName() {
108eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  DisplayManager* display_manager = GetDisplayManager();
109868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  int64 external_id = display_manager->mirrored_display().id();
110868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
111868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (external_id == gfx::Display::kInvalidDisplayID) {
112868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    int64 internal_display_id = gfx::Display::InternalDisplayId();
113868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    for (size_t i = 0; i < display_manager->GetNumDisplays(); ++i) {
114ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      int64 id = display_manager->GetDisplayAt(i).id();
115868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      if (id != internal_display_id) {
116868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        external_id = id;
117868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        break;
118868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      }
119868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    }
120868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
121868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
122eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (external_id == gfx::Display::kInvalidDisplayID)
123eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_UNKNOWN_DISPLAY_NAME);
124eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
125eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // The external display name may have an annotation of "(width x height)" in
126eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // case that the display is rotated or its resolution is changed.
127eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  base::string16 name = GetDisplayName(external_id);
128eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  const DisplayInfo& display_info =
129eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      display_manager->GetDisplayInfo(external_id);
130eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (display_info.rotation() != gfx::Display::ROTATE_0 ||
131eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      display_info.ui_scale() != 1.0f ||
132eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      !display_info.overscan_insets_in_dip().empty()) {
133ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    name = l10n_util::GetStringFUTF16(
134ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch        IDS_ASH_STATUS_TRAY_DISPLAY_ANNOTATED_NAME,
135ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch        name, GetDisplaySize(external_id));
136eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  } else if (display_info.overscan_insets_in_dip().empty() &&
137eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch             display_info.has_overscan()) {
138ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    name = l10n_util::GetStringFUTF16(
139ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch        IDS_ASH_STATUS_TRAY_DISPLAY_ANNOTATED_NAME,
140ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch        name, l10n_util::GetStringUTF16(
141ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch            IDS_ASH_STATUS_TRAY_DISPLAY_ANNOTATION_OVERSCAN));
142868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
143868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
144eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return name;
145eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
146868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
147eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbase::string16 GetTrayDisplayMessage() {
148eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  DisplayManager* display_manager = GetDisplayManager();
149eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (display_manager->GetNumDisplays() > 1) {
150eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    if (GetDisplayManager()->HasInternalDisplay()) {
151eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      return l10n_util::GetStringFUTF16(
152eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch          IDS_ASH_STATUS_TRAY_DISPLAY_EXTENDED, GetExternalDisplayName());
153868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    }
154eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return l10n_util::GetStringUTF16(
155eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        IDS_ASH_STATUS_TRAY_DISPLAY_EXTENDED_NO_INTERNAL);
156868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
157868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
158eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (display_manager->IsMirrored()) {
159eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    if (GetDisplayManager()->HasInternalDisplay()) {
160eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      return l10n_util::GetStringFUTF16(
161eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch          IDS_ASH_STATUS_TRAY_DISPLAY_MIRRORING, GetExternalDisplayName());
162868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    }
163eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return l10n_util::GetStringUTF16(
164eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        IDS_ASH_STATUS_TRAY_DISPLAY_MIRRORING_NO_INTERNAL);
165868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
166868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
167eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  int64 first_id = display_manager->first_display_id();
168eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (display_manager->HasInternalDisplay() &&
169eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      !display_manager->IsInternalDisplayId(first_id)) {
170eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_DISPLAY_DOCKED);
171eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
172eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
173eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return base::string16();
174eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
175eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
176eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid OpenSettings(user::LoginStatus login_status) {
177eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (login_status == ash::user::LOGGED_IN_USER ||
178eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      login_status == ash::user::LOGGED_IN_OWNER ||
179eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      login_status == ash::user::LOGGED_IN_GUEST) {
180eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    ash::Shell::GetInstance()->system_tray_delegate()->ShowDisplaySettings();
181eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
182eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
183eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
184eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid UpdateDisplayNotification(const base::string16& message) {
185eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Always remove the notification to make sure the notification appears
186eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // as a popup in any situation.
187eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  message_center::MessageCenter::Get()->RemoveNotification(
188eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      kDisplayNotificationId, false /* by_user */);
189eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
190eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (message.empty())
191eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return;
192eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
193eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ui::ResourceBundle& bundle = ui::ResourceBundle::GetSharedInstance();
194eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  scoped_ptr<Notification> notification(new Notification(
195eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      message_center::NOTIFICATION_TYPE_SIMPLE,
196eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      kDisplayNotificationId,
197eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      message,
198ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      base::string16(),  // body is intentionally empty, see crbug.com/265915
199eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      bundle.GetImageNamed(IDR_AURA_UBER_TRAY_DISPLAY),
200eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      base::string16(),  // display_source
201eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      "",  // extension_id
202eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      message_center::RichNotificationData(),
203a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      new message_center::HandleNotificationClickedDelegate(
204a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)          base::Bind(&OpenSettings,
205a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                     Shell::GetInstance()->system_tray_delegate()->
206a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                     GetUserLoginStatus()))));
207eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  message_center::MessageCenter::Get()->AddNotification(notification.Pass());
208eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
209eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
210868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}  // namespace
211868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
212eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochclass DisplayView : public ash::internal::ActionableView {
213868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) public:
214868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  explicit DisplayView(user::LoginStatus login_status)
215eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      : login_status_(login_status) {
216eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    SetLayoutManager(new views::BoxLayout(
217eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        views::BoxLayout::kHorizontal,
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ash::kTrayPopupPaddingHorizontal, 0,
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ash::kTrayPopupPaddingBetweenItems));
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui::ResourceBundle& bundle = ui::ResourceBundle::GetSharedInstance();
2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    image_ =
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        new ash::internal::FixedSizedImageView(0, ash::kTrayPopupItemHeight);
2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    image_->SetImage(
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        bundle.GetImageNamed(IDR_AURA_UBER_TRAY_DISPLAY).ToImageSkia());
2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    AddChildView(image_);
227eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
228eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    label_ = new views::Label();
229eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    label_->SetMultiLine(true);
230eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    label_->SetHorizontalAlignment(gfx::ALIGN_LEFT);
231eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    AddChildView(label_);
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Update();
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~DisplayView() {}
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Update() {
238eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    base::string16 message = GetTrayDisplayMessage();
239eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    if (message.empty() && ShouldShowFirstDisplayInfo())
240eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      message = GetDisplayInfoLine(GetDisplayManager()->first_display_id());
241eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    SetVisible(!message.empty());
242eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    label_->SetText(message);
243eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
244eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
245eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  views::Label* label() { return label_; }
246eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
247eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Overridden from views::View.
248eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual bool GetTooltipText(const gfx::Point& p,
249eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                              base::string16* tooltip) const OVERRIDE {
250eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    base::string16 tray_message = GetTrayDisplayMessage();
251eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    base::string16 display_message = GetAllDisplayInfo();
252eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    if (tray_message.empty() && display_message.empty())
253eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      return false;
254eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
255eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    *tooltip = tray_message + ASCIIToUTF16("\n") + display_message;
256eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return true;
2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
260eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  bool ShouldShowFirstDisplayInfo() const {
261eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    const DisplayInfo& display_info = GetDisplayManager()->GetDisplayInfo(
262eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        GetDisplayManager()->first_display_id());
263eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return display_info.rotation() != gfx::Display::ROTATE_0 ||
264eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        display_info.ui_scale() != 1.0f ||
265eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        !display_info.overscan_insets_in_dip().empty() ||
266eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        display_info.has_overscan();
267eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
268eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Overridden from ActionableView.
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool PerformAction(const ui::Event& event) OVERRIDE {
271eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    OpenSettings(login_status_);
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnBoundsChanged(const gfx::Rect& previous_bounds) OVERRIDE {
2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int label_max_width = bounds().width() - kTrayPopupPaddingHorizontal * 2 -
2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        kTrayPopupPaddingBetweenItems - image_->GetPreferredSize().width();
278eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    label_->SizeToFit(label_max_width);
2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PreferredSizeChanged();
2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
282eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  user::LoginStatus login_status_;
2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  views::ImageView* image_;
284eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  views::Label* label_;
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(DisplayView);
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
289eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochclass DisplayNotificationView : public TrayNotificationView {
290868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) public:
291868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  DisplayNotificationView(user::LoginStatus login_status,
292eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                          TrayDisplay* tray_item,
293eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                          const base::string16& message)
294eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      : TrayNotificationView(tray_item, IDR_AURA_UBER_TRAY_DISPLAY),
295eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        login_status_(login_status) {
296868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    StartAutoCloseTimer(kTrayPopupAutoCloseDelayForTextInSeconds);
297eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    Update(message);
298868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
299868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
300868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  virtual ~DisplayNotificationView() {}
301868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
302eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  void Update(const base::string16& message) {
303eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    if (message.empty()) {
304868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      owner()->HideNotificationView();
305eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    } else {
306eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      views::Label* label = new views::Label(message);
307eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      label->SetMultiLine(true);
308eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      label->SetHorizontalAlignment(gfx::ALIGN_LEFT);
309eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      UpdateView(label);
310eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      RestartAutoCloseTimer();
311eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    }
312868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
313868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
314868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Overridden from TrayNotificationView:
315868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  virtual void OnClickAction() OVERRIDE {
316eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    OpenSettings(login_status_);
317868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
318868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
319868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) private:
320eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  user::LoginStatus login_status_;
321eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
322868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(DisplayNotificationView);
323868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)};
324868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TrayDisplay::TrayDisplay(SystemTray* system_tray)
3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : SystemTrayItem(system_tray),
327eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      default_(NULL) {
328868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  Shell::GetInstance()->display_controller()->AddObserver(this);
329c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  UpdateDisplayInfo(NULL);
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TrayDisplay::~TrayDisplay() {
333868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  Shell::GetInstance()->display_controller()->RemoveObserver(this);
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
336c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdochvoid TrayDisplay::UpdateDisplayInfo(TrayDisplay::DisplayInfoMap* old_info) {
337c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  if (old_info)
338c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    old_info->swap(display_info_);
339c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  display_info_.clear();
340c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch
341eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  DisplayManager* display_manager = GetDisplayManager();
342eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  for (size_t i = 0; i < display_manager->GetNumDisplays(); ++i) {
343ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    int64 id = display_manager->GetDisplayAt(i).id();
344eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    display_info_[id] = display_manager->GetDisplayInfo(id);
345eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
346c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch}
347eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
348c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdochbool TrayDisplay::GetDisplayMessageForNotification(
349c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    base::string16* message,
350c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    const TrayDisplay::DisplayInfoMap& old_info) {
351eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Display is added or removed. Use the same message as the one in
352eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // the system tray.
353ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  if (display_info_.size() != old_info.size()) {
354ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    *message = GetTrayDisplayMessage();
355ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    return true;
356ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  }
357eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
358eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  for (DisplayInfoMap::const_iterator iter = display_info_.begin();
359eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch       iter != display_info_.end(); ++iter) {
360eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    DisplayInfoMap::const_iterator old_iter = old_info.find(iter->first);
361ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    // The display's number is same but different displays. This happens
362ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    // for the transition between docked mode and mirrored display. Falls back
363ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    // to GetTrayDisplayMessage().
364ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    if (old_iter == old_info.end()) {
365ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      *message = GetTrayDisplayMessage();
366ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      return true;
367ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    }
368eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
369eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    if (iter->second.ui_scale() != old_iter->second.ui_scale()) {
370ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      *message = l10n_util::GetStringFUTF16(
371eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch          IDS_ASH_STATUS_TRAY_DISPLAY_RESOLUTION_CHANGED,
372eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch          GetDisplayName(iter->first),
3737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch          GetDisplaySize(iter->first));
374ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      return true;
375eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    }
376eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    if (iter->second.rotation() != old_iter->second.rotation()) {
377ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      int rotation_text_id = 0;
378ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      switch (iter->second.rotation()) {
379ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        case gfx::Display::ROTATE_0:
380ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch          rotation_text_id = IDS_ASH_STATUS_TRAY_DISPLAY_STANDARD_ORIENTATION;
381ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch          break;
382ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        case gfx::Display::ROTATE_90:
383ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch          rotation_text_id = IDS_ASH_STATUS_TRAY_DISPLAY_ORIENTATION_90;
384ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch          break;
385ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        case gfx::Display::ROTATE_180:
386ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch          rotation_text_id = IDS_ASH_STATUS_TRAY_DISPLAY_ORIENTATION_180;
387ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch          break;
388ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        case gfx::Display::ROTATE_270:
389ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch          rotation_text_id = IDS_ASH_STATUS_TRAY_DISPLAY_ORIENTATION_270;
390ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch          break;
391ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      }
392ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      *message = l10n_util::GetStringFUTF16(
393ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch          IDS_ASH_STATUS_TRAY_DISPLAY_ROTATED,
394ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch          GetDisplayName(iter->first),
395ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch          l10n_util::GetStringUTF16(rotation_text_id));
396ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      return true;
397eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    }
398eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
399eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
400eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Found nothing special
401ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  return false;
402eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
403eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)views::View* TrayDisplay::CreateDefaultView(user::LoginStatus status) {
405868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  DCHECK(default_ == NULL);
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  default_ = new DisplayView(status);
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return default_;
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
410868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void TrayDisplay::DestroyDefaultView() {
411868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  default_ = NULL;
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
414eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid TrayDisplay::OnDisplayConfigurationChanged() {
415c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  DisplayInfoMap old_info;
416c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  UpdateDisplayInfo(&old_info);
417c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch
418eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (!Shell::GetInstance()->system_tray_delegate()->
419eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch          ShouldShowDisplayNotification()) {
420eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return;
421eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
422eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
423ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  base::string16 message;
424c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  if (GetDisplayMessageForNotification(&message, old_info))
425ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    UpdateDisplayNotification(message);
426eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
427eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
428eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbase::string16 TrayDisplay::GetDefaultViewMessage() {
429eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (!default_ || !default_->visible())
430eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return base::string16();
431eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
432eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return static_cast<DisplayView*>(default_)->label()->text();
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbase::string16 TrayDisplay::GetNotificationMessage() {
436eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  message_center::NotificationList::Notifications notifications =
437eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      message_center::MessageCenter::Get()->GetNotifications();
438eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  for (message_center::NotificationList::Notifications::const_iterator iter =
439eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch           notifications.begin(); iter != notifications.end(); ++iter) {
440eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    if ((*iter)->id() == kDisplayNotificationId)
441eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      return (*iter)->title();
442eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
443eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
444eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return base::string16();
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
447eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid TrayDisplay::CloseNotificationForTest() {
448eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  message_center::MessageCenter::Get()->RemoveNotification(
449eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      kDisplayNotificationId, false);
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace internal
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace ash
454