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