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