tray_display.cc revision 8bcbed890bc3ce4d7a057a8f32cab53fa534672e
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"
10424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "ash/system/system_notifier.h"
11eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ash/system/tray/actionable_view.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/system/tray/fixed_sized_image_view.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/system/tray/system_tray.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/system/tray/system_tray_delegate.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/system/tray/tray_constants.h"
16868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "ash/system/tray/tray_notification_view.h"
17a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "base/bind.h"
18eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/strings/string_util.h"
19868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/ash_resources.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/ash_strings.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/resource/resource_bundle.h"
24eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ui/message_center/message_center.h"
25eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ui/message_center/notification.h"
26eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ui/message_center/notification_delegate.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 MurdochDisplayManager* GetDisplayManager() {
38eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return Shell::GetInstance()->display_manager();
39eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
40868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
41eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbase::string16 GetDisplayName(int64 display_id) {
42eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return UTF8ToUTF16(GetDisplayManager()->GetDisplayNameForId(display_id));
43eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
44eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochbase::string16 GetDisplaySize(int64 display_id) {
467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  DisplayManager* display_manager = GetDisplayManager();
477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  const gfx::Display* display = &display_manager->GetDisplayForId(display_id);
497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (display_manager->IsMirrored() &&
507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      display_manager->mirrored_display().id() == display_id) {
517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    display = &display_manager->mirrored_display();
527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  DCHECK(display->is_valid());
557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  return UTF8ToUTF16(display->size().ToString());
567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
58eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Returns 1-line information for the specified display, like
59eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// "InternalDisplay: 1280x750"
60eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbase::string16 GetDisplayInfoLine(int64 display_id) {
61eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  const DisplayInfo& display_info =
62eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      GetDisplayManager()->GetDisplayInfo(display_id);
63eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  base::string16 size_text = GetDisplaySize(display_id);
65eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  base::string16 display_data;
66eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (display_info.has_overscan()) {
67eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    display_data = l10n_util::GetStringFUTF16(
68eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        IDS_ASH_STATUS_TRAY_DISPLAY_ANNOTATION,
69eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        size_text,
70eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        l10n_util::GetStringUTF16(
71eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch            IDS_ASH_STATUS_TRAY_DISPLAY_ANNOTATION_OVERSCAN));
72eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  } else {
73eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    display_data = size_text;
74eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
75eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
76eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return l10n_util::GetStringFUTF16(
77eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      IDS_ASH_STATUS_TRAY_DISPLAY_SINGLE_DISPLAY,
78eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      GetDisplayName(display_id),
79eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      display_data);
80eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
81eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
82eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbase::string16 GetAllDisplayInfo() {
83eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  DisplayManager* display_manager = GetDisplayManager();
84eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  std::vector<base::string16> lines;
85eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  int64 internal_id = gfx::Display::kInvalidDisplayID;
86eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Make sure to show the internal display first.
87868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (display_manager->HasInternalDisplay() &&
88eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      display_manager->IsInternalDisplayId(
89eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch          display_manager->first_display_id())) {
90eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    internal_id = display_manager->first_display_id();
91eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    lines.push_back(GetDisplayInfoLine(internal_id));
92eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
93eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
94eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  for (size_t i = 0; i < display_manager->GetNumDisplays(); ++i) {
95ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    int64 id = display_manager->GetDisplayAt(i).id();
96eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    if (id == internal_id)
97eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      continue;
98eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    lines.push_back(GetDisplayInfoLine(id));
99eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
100eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
101eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return JoinString(lines, '\n');
102868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
103868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
104868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Returns the name of the currently connected external display.
105868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)base::string16 GetExternalDisplayName() {
106eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  DisplayManager* display_manager = GetDisplayManager();
107868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  int64 external_id = display_manager->mirrored_display().id();
108868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
109868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (external_id == gfx::Display::kInvalidDisplayID) {
110868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    int64 internal_display_id = gfx::Display::InternalDisplayId();
111868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    for (size_t i = 0; i < display_manager->GetNumDisplays(); ++i) {
112ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      int64 id = display_manager->GetDisplayAt(i).id();
113868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      if (id != internal_display_id) {
114868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        external_id = id;
115868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        break;
116868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      }
117868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    }
118868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
119868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
120eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (external_id == gfx::Display::kInvalidDisplayID)
121eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_UNKNOWN_DISPLAY_NAME);
122eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
123eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // The external display name may have an annotation of "(width x height)" in
124eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // case that the display is rotated or its resolution is changed.
125eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  base::string16 name = GetDisplayName(external_id);
126eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  const DisplayInfo& display_info =
127eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      display_manager->GetDisplayInfo(external_id);
128eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (display_info.rotation() != gfx::Display::ROTATE_0 ||
129eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      display_info.ui_scale() != 1.0f ||
130eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      !display_info.overscan_insets_in_dip().empty()) {
131ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    name = l10n_util::GetStringFUTF16(
132ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch        IDS_ASH_STATUS_TRAY_DISPLAY_ANNOTATED_NAME,
133ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch        name, GetDisplaySize(external_id));
134eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  } else if (display_info.overscan_insets_in_dip().empty() &&
135eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch             display_info.has_overscan()) {
136ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    name = l10n_util::GetStringFUTF16(
137ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch        IDS_ASH_STATUS_TRAY_DISPLAY_ANNOTATED_NAME,
138ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch        name, l10n_util::GetStringUTF16(
139ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch            IDS_ASH_STATUS_TRAY_DISPLAY_ANNOTATION_OVERSCAN));
140868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
141868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
142eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return name;
143eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
144868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)base::string16 GetTrayDisplayMessage(base::string16* additional_message_out) {
146eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  DisplayManager* display_manager = GetDisplayManager();
147eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (display_manager->GetNumDisplays() > 1) {
148eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    if (GetDisplayManager()->HasInternalDisplay()) {
149eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      return l10n_util::GetStringFUTF16(
150eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch          IDS_ASH_STATUS_TRAY_DISPLAY_EXTENDED, GetExternalDisplayName());
151868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    }
152eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return l10n_util::GetStringUTF16(
153eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        IDS_ASH_STATUS_TRAY_DISPLAY_EXTENDED_NO_INTERNAL);
154868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
155868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
156eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (display_manager->IsMirrored()) {
157eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    if (GetDisplayManager()->HasInternalDisplay()) {
158eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      return l10n_util::GetStringFUTF16(
159eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch          IDS_ASH_STATUS_TRAY_DISPLAY_MIRRORING, GetExternalDisplayName());
160868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    }
161eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return l10n_util::GetStringUTF16(
162eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        IDS_ASH_STATUS_TRAY_DISPLAY_MIRRORING_NO_INTERNAL);
163868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
164868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1658bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  int64 primary_id = Shell::GetScreen()->GetPrimaryDisplay().id();
166eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (display_manager->HasInternalDisplay() &&
1678bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      !display_manager->IsInternalDisplayId(primary_id)) {
1683551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    if (additional_message_out) {
1693551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      *additional_message_out = l10n_util::GetStringUTF16(
1703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          IDS_ASH_STATUS_TRAY_DISPLAY_DOCKED_DESCRIPTION);
1713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    }
172eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_DISPLAY_DOCKED);
173eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
174eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
175eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return base::string16();
176eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
177eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
178424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)void OpenSettings() {
179424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  user::LoginStatus login_status =
180424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      Shell::GetInstance()->system_tray_delegate()->GetUserLoginStatus();
1818bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  if (login_status == user::LOGGED_IN_USER ||
1828bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      login_status == user::LOGGED_IN_OWNER ||
1838bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      login_status == user::LOGGED_IN_GUEST) {
1848bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    Shell::GetInstance()->system_tray_delegate()->ShowDisplaySettings();
185eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
186eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
187eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
188868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}  // namespace
189868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1903551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)const char TrayDisplay::kNotificationId[] = "chrome://settings/display";
1913551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1928bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)class DisplayView : public internal::ActionableView {
193868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) public:
194424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  explicit DisplayView() {
195eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    SetLayoutManager(new views::BoxLayout(
196eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        views::BoxLayout::kHorizontal,
1978bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)        kTrayPopupPaddingHorizontal, 0,
1988bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)        kTrayPopupPaddingBetweenItems));
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui::ResourceBundle& bundle = ui::ResourceBundle::GetSharedInstance();
2018bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    image_ = new internal::FixedSizedImageView(0, kTrayPopupItemHeight);
2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    image_->SetImage(
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        bundle.GetImageNamed(IDR_AURA_UBER_TRAY_DISPLAY).ToImageSkia());
2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    AddChildView(image_);
205eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
206eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    label_ = new views::Label();
207eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    label_->SetMultiLine(true);
208eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    label_->SetHorizontalAlignment(gfx::ALIGN_LEFT);
209eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    AddChildView(label_);
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Update();
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~DisplayView() {}
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Update() {
2163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    base::string16 message = GetTrayDisplayMessage(NULL);
217eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    if (message.empty() && ShouldShowFirstDisplayInfo())
218eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      message = GetDisplayInfoLine(GetDisplayManager()->first_display_id());
219eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    SetVisible(!message.empty());
220eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    label_->SetText(message);
221d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    Layout();
222eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
223eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
2243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  const views::Label* label() const { return label_; }
225eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
226eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Overridden from views::View.
227eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual bool GetTooltipText(const gfx::Point& p,
228eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                              base::string16* tooltip) const OVERRIDE {
2293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    base::string16 tray_message = GetTrayDisplayMessage(NULL);
230eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    base::string16 display_message = GetAllDisplayInfo();
231eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    if (tray_message.empty() && display_message.empty())
232eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      return false;
233eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
234eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    *tooltip = tray_message + ASCIIToUTF16("\n") + display_message;
235eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return true;
2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
239eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  bool ShouldShowFirstDisplayInfo() const {
240eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    const DisplayInfo& display_info = GetDisplayManager()->GetDisplayInfo(
241eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        GetDisplayManager()->first_display_id());
242eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return display_info.rotation() != gfx::Display::ROTATE_0 ||
243eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        display_info.ui_scale() != 1.0f ||
244eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        !display_info.overscan_insets_in_dip().empty() ||
245eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        display_info.has_overscan();
246eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
247eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Overridden from ActionableView.
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool PerformAction(const ui::Event& event) OVERRIDE {
250424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    OpenSettings();
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnBoundsChanged(const gfx::Rect& previous_bounds) OVERRIDE {
2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int label_max_width = bounds().width() - kTrayPopupPaddingHorizontal * 2 -
2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        kTrayPopupPaddingBetweenItems - image_->GetPreferredSize().width();
257eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    label_->SizeToFit(label_max_width);
2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PreferredSizeChanged();
2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  views::ImageView* image_;
262eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  views::Label* label_;
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(DisplayView);
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TrayDisplay::TrayDisplay(SystemTray* system_tray)
2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : SystemTrayItem(system_tray),
269eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      default_(NULL) {
270868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  Shell::GetInstance()->display_controller()->AddObserver(this);
271c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  UpdateDisplayInfo(NULL);
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TrayDisplay::~TrayDisplay() {
275868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  Shell::GetInstance()->display_controller()->RemoveObserver(this);
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
278c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdochvoid TrayDisplay::UpdateDisplayInfo(TrayDisplay::DisplayInfoMap* old_info) {
279c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  if (old_info)
280c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    old_info->swap(display_info_);
281c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  display_info_.clear();
282c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch
283eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  DisplayManager* display_manager = GetDisplayManager();
284eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  for (size_t i = 0; i < display_manager->GetNumDisplays(); ++i) {
285ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    int64 id = display_manager->GetDisplayAt(i).id();
286eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    display_info_[id] = display_manager->GetDisplayInfo(id);
287eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
288c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch}
289eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
290c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdochbool TrayDisplay::GetDisplayMessageForNotification(
2913551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    const TrayDisplay::DisplayInfoMap& old_info,
2923551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    base::string16* message_out,
2933551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    base::string16* additional_message_out) {
294eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Display is added or removed. Use the same message as the one in
295eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // the system tray.
296ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  if (display_info_.size() != old_info.size()) {
2973551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    *message_out = GetTrayDisplayMessage(additional_message_out);
298ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    return true;
299ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  }
300eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
301eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  for (DisplayInfoMap::const_iterator iter = display_info_.begin();
302eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch       iter != display_info_.end(); ++iter) {
303eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    DisplayInfoMap::const_iterator old_iter = old_info.find(iter->first);
304ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    // The display's number is same but different displays. This happens
305ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    // for the transition between docked mode and mirrored display. Falls back
306ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    // to GetTrayDisplayMessage().
307ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    if (old_iter == old_info.end()) {
3083551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      *message_out = GetTrayDisplayMessage(additional_message_out);
309ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      return true;
310ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    }
311eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
312eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    if (iter->second.ui_scale() != old_iter->second.ui_scale()) {
3133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      *message_out = l10n_util::GetStringFUTF16(
314eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch          IDS_ASH_STATUS_TRAY_DISPLAY_RESOLUTION_CHANGED,
315eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch          GetDisplayName(iter->first),
3167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch          GetDisplaySize(iter->first));
317ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      return true;
318eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    }
319eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    if (iter->second.rotation() != old_iter->second.rotation()) {
320ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      int rotation_text_id = 0;
321ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      switch (iter->second.rotation()) {
322ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        case gfx::Display::ROTATE_0:
323ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch          rotation_text_id = IDS_ASH_STATUS_TRAY_DISPLAY_STANDARD_ORIENTATION;
324ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch          break;
325ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        case gfx::Display::ROTATE_90:
326ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch          rotation_text_id = IDS_ASH_STATUS_TRAY_DISPLAY_ORIENTATION_90;
327ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch          break;
328ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        case gfx::Display::ROTATE_180:
329ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch          rotation_text_id = IDS_ASH_STATUS_TRAY_DISPLAY_ORIENTATION_180;
330ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch          break;
331ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        case gfx::Display::ROTATE_270:
332ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch          rotation_text_id = IDS_ASH_STATUS_TRAY_DISPLAY_ORIENTATION_270;
333ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch          break;
334ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      }
3353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      *message_out = l10n_util::GetStringFUTF16(
336ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch          IDS_ASH_STATUS_TRAY_DISPLAY_ROTATED,
337ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch          GetDisplayName(iter->first),
338ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch          l10n_util::GetStringUTF16(rotation_text_id));
339ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      return true;
340eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    }
341eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
342eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
343eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Found nothing special
344ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  return false;
345eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
346eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
3473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)void TrayDisplay::CreateOrUpdateNotification(
3483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    const base::string16& message,
3493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    const base::string16& additional_message) {
3503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Always remove the notification to make sure the notification appears
3513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // as a popup in any situation.
3523551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  message_center::MessageCenter::Get()->RemoveNotification(
3533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      kNotificationId, false /* by_user */);
3543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
3553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  if (message.empty())
3563551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    return;
3573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
3583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  ui::ResourceBundle& bundle = ui::ResourceBundle::GetSharedInstance();
3593551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  scoped_ptr<Notification> notification(new Notification(
3603551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      message_center::NOTIFICATION_TYPE_SIMPLE,
3613551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      kNotificationId,
3623551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      message,
3633551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      additional_message,
3643551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      bundle.GetImageNamed(IDR_AURA_UBER_TRAY_DISPLAY),
3653551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      base::string16(),  // display_source
36658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      message_center::NotifierId(system_notifier::NOTIFIER_DISPLAY),
3673551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      message_center::RichNotificationData(),
3683551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      new message_center::HandleNotificationClickedDelegate(
369424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)          base::Bind(&OpenSettings))));
3703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  message_center::MessageCenter::Get()->AddNotification(notification.Pass());
3713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
3723551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)views::View* TrayDisplay::CreateDefaultView(user::LoginStatus status) {
374868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  DCHECK(default_ == NULL);
375424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  default_ = new DisplayView();
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return default_;
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
379868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void TrayDisplay::DestroyDefaultView() {
380868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  default_ = NULL;
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
383eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid TrayDisplay::OnDisplayConfigurationChanged() {
384c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  DisplayInfoMap old_info;
385c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  UpdateDisplayInfo(&old_info);
386c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch
387d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  if (default_)
388d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    default_->Update();
389d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
390eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (!Shell::GetInstance()->system_tray_delegate()->
391eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch          ShouldShowDisplayNotification()) {
392eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return;
393eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
394eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
395ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  base::string16 message;
3963551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  base::string16 additional_message;
3973551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  if (GetDisplayMessageForNotification(old_info, &message, &additional_message))
3983551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    CreateOrUpdateNotification(message, additional_message);
399eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
400eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
4013551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)base::string16 TrayDisplay::GetDefaultViewMessage() const {
402eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (!default_ || !default_->visible())
403eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return base::string16();
404eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
405eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return static_cast<DisplayView*>(default_)->label()->text();
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace internal
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace ash
410