tray_network.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/network/tray_network.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/ash_switches.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/shell.h" 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/system/chromeos/network/network_icon_animation.h" 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/system/chromeos/network/network_state_list_detailed_view.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/system/chromeos/network/network_tray_delegate.h" 12868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "ash/system/chromeos/network/tray_network_state_observer.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/system/tray/system_tray.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/system/tray/system_tray_delegate.h" 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/system/tray/system_tray_notifier.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/system/tray/tray_constants.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/system/tray/tray_item_more.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/system/tray/tray_item_view.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/system/tray/tray_notification_view.h" 20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ash/system/tray/tray_utils.h" 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/command_line.h" 22868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chromeos/network/network_state.h" 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chromeos/network/network_state_handler.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/ash_resources.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/ash_strings.h" 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "third_party/cros_system_api/dbus/service_constants.h" 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/base/accessibility/accessible_view_state.h" 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h" 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/resource/resource_bundle.h" 31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ui/views/controls/image_view.h" 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/link.h" 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/link_listener.h" 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/layout/box_layout.h" 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/widget/widget.h" 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)using chromeos::NetworkHandler; 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using chromeos::NetworkState; 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using chromeos::NetworkStateHandler; 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 41868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)namespace ash { 42868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)namespace internal { 43868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace { 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int GetMessageIcon(NetworkObserver::MessageType message_type, 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NetworkObserver::NetworkType network_type) { 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch(message_type) { 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case NetworkObserver::ERROR_CONNECT_FAILED: 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (NetworkObserver::NETWORK_CELLULAR == network_type) 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return IDR_AURA_UBER_TRAY_CELLULAR_NETWORK_FAILED; 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return IDR_AURA_UBER_TRAY_NETWORK_FAILED; 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case NetworkObserver::ERROR_OUT_OF_CREDITS: 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case NetworkObserver::MESSAGE_DATA_PROMO: 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (network_type == TrayNetwork::NETWORK_CELLULAR_LTE) 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return IDR_AURA_UBER_TRAY_NOTIFICATION_LTE; 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return IDR_AURA_UBER_TRAY_NOTIFICATION_3G; 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace tray { 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class NetworkMessages { 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct Message { 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Message() : delegate(NULL) {} 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Message(NetworkTrayDelegate* in_delegate, 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NetworkObserver::NetworkType network_type, 75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const base::string16& in_title, 76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const base::string16& in_message, 77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const std::vector<base::string16>& in_links) : 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate(in_delegate), 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) network_type_(network_type), 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) title(in_title), 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message(in_message), 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) links(in_links) {} 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NetworkTrayDelegate* delegate; 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NetworkObserver::NetworkType network_type_; 85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::string16 title; 86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::string16 message; 87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::vector<base::string16> links; 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) typedef std::map<NetworkObserver::MessageType, Message> MessageMap; 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MessageMap& messages() { return messages_; } 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const MessageMap& messages() const { return messages_; } 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MessageMap messages_; 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class NetworkTrayView : public TrayItemView, 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public network_icon::AnimationObserver { 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) explicit NetworkTrayView(TrayNetwork* network_tray) 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : TrayItemView(network_tray), 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) network_tray_(network_tray) { 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetLayoutManager( 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new views::BoxLayout(views::BoxLayout::kHorizontal, 0, 0, 0)); 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) image_view_ = new views::ImageView; 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddChildView(image_view_); 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) UpdateNetworkStateHandlerIcon(); 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~NetworkTrayView() { 11490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) network_icon::NetworkIconAnimation::GetInstance()->RemoveObserver(this); 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 117b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) virtual const char* GetClassName() const OVERRIDE { 118b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) return "NetworkTrayView"; 119b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } 120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void UpdateNetworkStateHandlerIcon() { 12290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NetworkStateHandler* handler = 12390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NetworkHandler::Get()->network_state_handler(); 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::ImageSkia image; 125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::string16 name; 126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool animating = false; 127868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) network_icon::GetDefaultNetworkImageAndLabel( 128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) network_icon::ICON_TYPE_TRAY, &image, &name, &animating); 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool show_in_tray = !image.isNull(); 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UpdateIcon(show_in_tray, image); 131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (animating) 132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) network_icon::NetworkIconAnimation::GetInstance()->AddObserver(this); 133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) else 134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) network_icon::NetworkIconAnimation::GetInstance()->RemoveObserver(this); 135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Update accessibility. 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const NetworkState* connected_network = handler->ConnectedNetworkByType( 1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NetworkStateHandler::kMatchTypeNonVirtual); 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (connected_network) 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UpdateConnectionStatus(UTF8ToUTF16(connected_network->name()), true); 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else 141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) UpdateConnectionStatus(base::string16(), false); 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // views::View override. 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void GetAccessibleState(ui::AccessibleViewState* state) OVERRIDE { 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) state->name = connection_status_string_; 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) state->role = ui::AccessibilityTypes::ROLE_PUSHBUTTON; 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // network_icon::AnimationObserver 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void NetworkIconChanged() OVERRIDE { 15290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) UpdateNetworkStateHandlerIcon(); 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Updates connection status and notifies accessibility event when necessary. 157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void UpdateConnectionStatus(const base::string16& network_name, 158c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool connected) { 159c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::string16 new_connection_status_string; 1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (connected) { 1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new_connection_status_string = l10n_util::GetStringFUTF16( 1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IDS_ASH_STATUS_TRAY_NETWORK_CONNECTED, network_name); 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (new_connection_status_string != connection_status_string_) { 1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) connection_status_string_ = new_connection_status_string; 166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if(!connection_status_string_.empty()) 167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NotifyAccessibilityEvent(ui::AccessibilityTypes::EVENT_ALERT, true); 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void UpdateIcon(bool tray_icon_visible, const gfx::ImageSkia& image) { 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) image_view_->SetImage(image); 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetVisible(tray_icon_visible); 1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SchedulePaint(); 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TrayNetwork* network_tray_; 1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) views::ImageView* image_view_; 179c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::string16 connection_status_string_; 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(NetworkTrayView); 1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class NetworkDefaultView : public TrayItemMore, 1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public network_icon::AnimationObserver { 1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NetworkDefaultView(TrayNetwork* network_tray, bool show_more) 1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : TrayItemMore(network_tray, show_more), 1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) network_tray_(network_tray) { 1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Update(); 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~NetworkDefaultView() { 19490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) network_icon::NetworkIconAnimation::GetInstance()->RemoveObserver(this); 1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void Update() { 19890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) gfx::ImageSkia image; 19990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::string16 label; 20090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) bool animating = false; 201868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) network_icon::GetDefaultNetworkImageAndLabel( 20290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) network_icon::ICON_TYPE_DEFAULT_VIEW, &image, &label, &animating); 20390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (animating) 20490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) network_icon::NetworkIconAnimation::GetInstance()->AddObserver(this); 20590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) else 20690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) network_icon::NetworkIconAnimation::GetInstance()->RemoveObserver(this); 20790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) SetImage(&image); 20890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) SetLabel(label); 20990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) SetAccessibleName(label); 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // network_icon::AnimationObserver 2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void NetworkIconChanged() OVERRIDE { 2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Update(); 2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TrayNetwork* network_tray_; 2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(NetworkDefaultView); 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class NetworkWifiDetailedView : public NetworkDetailedView { 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 22590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) explicit NetworkWifiDetailedView(SystemTrayItem* owner) 2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : NetworkDetailedView(owner) { 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetLayoutManager(new views::BoxLayout(views::BoxLayout::kHorizontal, 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kTrayPopupPaddingHorizontal, 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10, 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kTrayPopupPaddingBetweenItems)); 23190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) image_view_ = new views::ImageView; 23290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) AddChildView(image_view_); 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) label_view_ = new views::Label(); 23590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) label_view_->SetMultiLine(true); 23690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) label_view_->SetHorizontalAlignment(gfx::ALIGN_LEFT); 23790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) AddChildView(label_view_); 23890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 23990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) Update(); 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual ~NetworkWifiDetailedView() { 24390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Overridden from NetworkDetailedView: 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Init() OVERRIDE { 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual NetworkDetailedView::DetailedViewType GetViewType() const OVERRIDE { 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NetworkDetailedView::WIFI_VIEW; 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void ManagerChanged() OVERRIDE { 25590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) Update(); 2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void NetworkListChanged() OVERRIDE { 25990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) Update(); 2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void NetworkServiceChanged( 2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const chromeos::NetworkState* network) OVERRIDE { 2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 267c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch virtual void Layout() OVERRIDE { 268c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch // Center both views vertically. 269c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch views::View::Layout(); 270c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch image_view_->SetY( 271c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch (height() - image_view_->GetPreferredSize().height()) / 2); 272c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch label_view_->SetY( 273c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch (height() - label_view_->GetPreferredSize().height()) / 2); 274c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch } 275c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch 27690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) void Update() { 27790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) bool wifi_enabled = NetworkHandler::Get()->network_state_handler()-> 27890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) IsTechnologyEnabled(flimflam::kTypeWifi); 27990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const int image_id = wifi_enabled ? 28090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) IDR_AURA_UBER_TRAY_WIFI_ENABLED : IDR_AURA_UBER_TRAY_WIFI_DISABLED; 28190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ui::ResourceBundle& bundle = ui::ResourceBundle::GetSharedInstance(); 28290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) image_view_->SetImage(bundle.GetImageNamed(image_id).ToImageSkia()); 28390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 28490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const int string_id = wifi_enabled ? 28590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) IDS_ASH_STATUS_TRAY_NETWORK_WIFI_ENABLED : 28690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) IDS_ASH_STATUS_TRAY_NETWORK_WIFI_DISABLED; 28790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) label_view_->SetText(bundle.GetLocalizedString(string_id)); 288c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch label_view_->SizeToFit(kTrayPopupMinWidth - 289c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch kTrayPopupPaddingHorizontal * 2 - kTrayPopupPaddingBetweenItems - 290c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch kTrayPopupDetailsIconWidth); 29190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 29290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 29390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) views::ImageView* image_view_; 29490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) views::Label* label_view_; 29590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(NetworkWifiDetailedView); 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class NetworkMessageView : public views::View, 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public views::LinkListener { 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NetworkMessageView(TrayNetwork* tray_network, 3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NetworkObserver::MessageType message_type, 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const NetworkMessages::Message& network_msg) 3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : tray_network_(tray_network), 3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) message_type_(message_type), 3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) network_type_(network_msg.network_type_) { 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetLayoutManager( 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new views::BoxLayout(views::BoxLayout::kVertical, 0, 0, 1)); 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!network_msg.title.empty()) { 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::Label* title = new views::Label(network_msg.title); 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) title->SetHorizontalAlignment(gfx::ALIGN_LEFT); 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) title->SetFont(title->font().DeriveFont(0, gfx::Font::BOLD)); 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddChildView(title); 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!network_msg.message.empty()) { 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::Label* message = new views::Label(network_msg.message); 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message->SetHorizontalAlignment(gfx::ALIGN_LEFT); 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message->SetMultiLine(true); 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message->SizeToFit(kTrayNotificationContentsWidth); 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddChildView(message); 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!network_msg.links.empty()) { 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < network_msg.links.size(); ++i) { 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::Link* link = new views::Link(network_msg.links[i]); 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) link->set_id(i); 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) link->set_listener(this); 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) link->SetHorizontalAlignment(gfx::ALIGN_LEFT); 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) link->SetMultiLine(true); 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) link->SizeToFit(kTrayNotificationContentsWidth); 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddChildView(link); 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~NetworkMessageView() { 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Overridden from views::LinkListener. 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void LinkClicked(views::Link* source, int event_flags) OVERRIDE { 3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) tray_network_->LinkClicked(message_type_, source->id()); 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NetworkObserver::MessageType message_type() const { return message_type_; } 3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NetworkObserver::NetworkType network_type() const { return network_type_; } 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TrayNetwork* tray_network_; 3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NetworkObserver::MessageType message_type_; 3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NetworkObserver::NetworkType network_type_; 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(NetworkMessageView); 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class NetworkNotificationView : public TrayNotificationView { 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) explicit NetworkNotificationView(TrayNetwork* tray_network) 3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : TrayNotificationView(tray_network, 0), 3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) tray_network_(tray_network) { 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateMessageView(); 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitView(network_message_view_); 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetIconImage(*ResourceBundle::GetSharedInstance().GetImageSkiaNamed( 3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetMessageIcon(network_message_view_->message_type(), 3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) network_message_view_->network_type()))); 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Overridden from TrayNotificationView. 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnClose() OVERRIDE { 3722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) tray_network_->ClearNetworkMessage(network_message_view_->message_type()); 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnClickAction() OVERRIDE { 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (network_message_view_->message_type() != 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TrayNetwork::MESSAGE_DATA_PROMO) 3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) tray_network_->PopupDetailedView(0, true); 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Update() { 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateMessageView(); 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateViewAndImage(network_message_view_, 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *ResourceBundle::GetSharedInstance().GetImageSkiaNamed( 3852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetMessageIcon(network_message_view_->message_type(), 3862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) network_message_view_->network_type()))); 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void CreateMessageView() { 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Display the first (highest priority) message. 3922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CHECK(!tray_network_->messages()->messages().empty()); 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NetworkMessages::MessageMap::const_iterator iter = 3942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) tray_network_->messages()->messages().begin(); 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) network_message_view_ = 3962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new NetworkMessageView(tray_network_, iter->first, iter->second); 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TrayNetwork* tray_network_; 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tray::NetworkMessageView* network_message_view_; 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(NetworkNotificationView); 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace tray 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TrayNetwork::TrayNetwork(SystemTray* system_tray) 4082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : SystemTrayItem(system_tray), 4092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) tray_(NULL), 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_(NULL), 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) detailed_(NULL), 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) notification_(NULL), 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) messages_(new tray::NetworkMessages()), 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) request_wifi_view_(false) { 41590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) network_state_observer_.reset(new TrayNetworkStateObserver(this)); 4162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Shell::GetInstance()->system_tray_notifier()->AddNetworkObserver(this); 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TrayNetwork::~TrayNetwork() { 4202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Shell::GetInstance()->system_tray_notifier()->RemoveNetworkObserver(this); 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)views::View* TrayNetwork::CreateTrayView(user::LoginStatus status) { 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(tray_ == NULL); 42590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (!chromeos::NetworkHandler::IsInitialized()) 42690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return NULL; 4272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) tray_ = new tray::NetworkTrayView(this); 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return tray_; 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)views::View* TrayNetwork::CreateDefaultView(user::LoginStatus status) { 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(default_ == NULL); 43390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (!chromeos::NetworkHandler::IsInitialized()) 43490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return NULL; 4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CHECK(tray_ != NULL); 4362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) default_ = new tray::NetworkDefaultView( 4372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) this, status != user::LOGGED_IN_LOCKED); 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return default_; 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)views::View* TrayNetwork::CreateDetailedView(user::LoginStatus status) { 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(detailed_ == NULL); 44390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (!chromeos::NetworkHandler::IsInitialized()) 44490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return NULL; 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Clear any notifications when showing the detailed view. 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) messages_->messages().clear(); 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HideNotificationView(); 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (request_wifi_view_) { 44990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) detailed_ = new tray::NetworkWifiDetailedView(this); 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) request_wifi_view_ = false; 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 45290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) detailed_ = new tray::NetworkStateListDetailedView( 45390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) this, tray::NetworkStateListDetailedView::LIST_TYPE_NETWORK, status); 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) detailed_->Init(); 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return detailed_; 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)views::View* TrayNetwork::CreateNotificationView(user::LoginStatus status) { 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(notification_ == NULL); 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (messages_->messages().empty()) 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; // Message has already been cleared. 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) notification_ = new tray::NetworkNotificationView(this); 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return notification_; 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TrayNetwork::DestroyTrayView() { 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tray_ = NULL; 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TrayNetwork::DestroyDefaultView() { 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_ = NULL; 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TrayNetwork::DestroyDetailedView() { 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) detailed_ = NULL; 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TrayNetwork::DestroyNotificationView() { 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) notification_ = NULL; 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TrayNetwork::UpdateAfterLoginStatusChange(user::LoginStatus status) { 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TrayNetwork::UpdateAfterShelfAlignmentChange(ShelfAlignment alignment) { 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (tray_) 48890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) SetTrayImageItemBorder(tray_, alignment); 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TrayNetwork::SetNetworkMessage(NetworkTrayDelegate* delegate, 4922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MessageType message_type, 4932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NetworkType network_type, 494c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const base::string16& title, 495c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const base::string16& message, 496c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const std::vector<base::string16>& links) { 4972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) messages_->messages()[message_type] = tray::NetworkMessages::Message( 4982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegate, network_type, title, message, links); 4992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!Shell::GetInstance()->system_tray_delegate()->IsOobeCompleted()) 5002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (notification_) 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) notification_->Update(); 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ShowNotificationView(); 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TrayNetwork::ClearNetworkMessage(MessageType message_type) { 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) messages_->messages().erase(message_type); 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (messages_->messages().empty()) { 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HideNotificationView(); 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (notification_) 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) notification_->Update(); 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ShowNotificationView(); 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 51990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void TrayNetwork::RequestToggleWifi() { 52090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // This will always be triggered by a user action (e.g. keyboard shortcut) 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!detailed_ || 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) detailed_->GetViewType() == tray::NetworkDetailedView::WIFI_VIEW) { 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) request_wifi_view_ = true; 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PopupDetailedView(kTrayPopupAutoCloseDelayForTextInSeconds, false); 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 52690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NetworkStateHandler* handler = NetworkHandler::Get()->network_state_handler(); 52790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) bool enabled = handler->IsTechnologyEnabled(flimflam::kTypeWifi); 52890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) handler->SetTechnologyEnabled( 52990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) flimflam::kTypeWifi, !enabled, 53090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) chromeos::network_handler::ErrorCallback()); 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void TrayNetwork::NetworkStateChanged(bool list_changed) { 53490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (tray_) 5352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) tray_->UpdateNetworkStateHandlerIcon(); 5362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (default_) 5372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) default_->Update(); 5382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (detailed_) { 5392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (list_changed) 5402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) detailed_->NetworkListChanged(); 5412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else 5422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) detailed_->ManagerChanged(); 5432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void TrayNetwork::NetworkServiceChanged(const chromeos::NetworkState* network) { 5472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (detailed_) 5482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) detailed_->NetworkServiceChanged(network); 5492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TrayNetwork::LinkClicked(MessageType message_type, int link_id) { 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tray::NetworkMessages::MessageMap::const_iterator iter = 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) messages()->messages().find(message_type); 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (iter != messages()->messages().end() && iter->second.delegate) 5552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) iter->second.delegate->NotificationLinkClicked(message_type, link_id); 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace internal 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace ash 560