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