tray_network.cc revision 2a99a7e74a7f215066514fe81d2bfa6639d9eddd
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_list_detailed_view.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/system/chromeos/network/network_list_detailed_view_base.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/system/chromeos/network/network_state_list_detailed_view.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/system/chromeos/network/network_state_notifier.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/system/chromeos/network/network_tray_delegate.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/system/tray/system_tray.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/system/tray/system_tray_delegate.h"
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/system/tray/system_tray_notifier.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/system/tray/tray_constants.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/system/tray/tray_item_more.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/system/tray/tray_item_view.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/system/tray/tray_notification_view.h"
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/command_line.h"
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/utf_string_conversions.h"
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chromeos/network/network_state.h"
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chromeos/network/network_state_handler.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/ash_resources.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/ash_strings.h"
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "third_party/cros_system_api/dbus/service_constants.h"
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/base/accessibility/accessible_view_state.h"
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h"
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/resource/resource_bundle.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)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ash::internal::TrayNetwork;
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using ash::NetworkObserver;
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using chromeos::NetworkState;
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using chromeos::NetworkStateHandler;
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace {
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int GetMessageIcon(NetworkObserver::MessageType message_type,
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   NetworkObserver::NetworkType network_type) {
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch(message_type) {
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case NetworkObserver::ERROR_CONNECT_FAILED:
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if (NetworkObserver::NETWORK_CELLULAR == network_type)
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        return IDR_AURA_UBER_TRAY_CELLULAR_NETWORK_FAILED;
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      else
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        return IDR_AURA_UBER_TRAY_NETWORK_FAILED;
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case NetworkObserver::ERROR_OUT_OF_CREDITS:
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case NetworkObserver::MESSAGE_DATA_PROMO:
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if (network_type == TrayNetwork::NETWORK_CELLULAR_LTE)
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        return IDR_AURA_UBER_TRAY_NOTIFICATION_LTE;
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      else
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        return IDR_AURA_UBER_TRAY_NOTIFICATION_3G;
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NOTREACHED();
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return 0;
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool UseNewNetworkHandlers() {
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return !CommandLine::ForCurrentProcess()->HasSwitch(
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ash::switches::kAshDisableNewNetworkStatusArea) &&
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      NetworkStateHandler::IsInitialized();
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ash {
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace internal {
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace tray {
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class NetworkMessages {
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct Message {
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Message() : delegate(NULL) {}
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Message(NetworkTrayDelegate* in_delegate,
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            NetworkObserver::NetworkType network_type,
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            const string16& in_title,
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            const string16& in_message,
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            const std::vector<string16>& in_links) :
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        delegate(in_delegate),
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        network_type_(network_type),
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        title(in_title),
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        message(in_message),
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        links(in_links) {}
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NetworkTrayDelegate* delegate;
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    NetworkObserver::NetworkType network_type_;
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    string16 title;
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    string16 message;
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::vector<string16> links;
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  typedef std::map<NetworkObserver::MessageType, Message> MessageMap;
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MessageMap& messages() { return messages_; }
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const MessageMap& messages() const { return messages_; }
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MessageMap messages_;
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class NetworkTrayView : public TrayItemView,
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        public network_icon::AnimationObserver {
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  explicit NetworkTrayView(TrayNetwork* network_tray)
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : TrayItemView(network_tray),
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        network_tray_(network_tray) {
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetLayoutManager(
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        new views::BoxLayout(views::BoxLayout::kHorizontal, 0, 0, 0));
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    image_view_ = new views::ImageView;
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AddChildView(image_view_);
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NetworkIconInfo info;
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (UseNewNetworkHandlers()) {
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      UpdateNetworkStateHandlerIcon();
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      network_icon::NetworkIconAnimation::GetInstance()->AddObserver(this);
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    } else {
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      Shell::GetInstance()->system_tray_delegate()->
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          GetMostRelevantNetworkIcon(&info, false);
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      UpdateIcon(info.tray_icon_visible, info.image);
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~NetworkTrayView() {
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (UseNewNetworkHandlers())
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      network_icon::NetworkIconAnimation::GetInstance()->RemoveObserver(this);
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Update(const NetworkIconInfo& info) {
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (UseNewNetworkHandlers())
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return;
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    UpdateIcon(info.tray_icon_visible, info.image);
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    UpdateConnectionStatus(info.name, info.connected);
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void UpdateNetworkStateHandlerIcon() {
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DCHECK(UseNewNetworkHandlers());
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    NetworkStateHandler* handler = NetworkStateHandler::Get();
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    gfx::ImageSkia image;
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    string16 name;
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    network_tray_->GetNetworkStateHandlerImageAndLabel(
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        network_icon::ICON_TYPE_TRAY, &image, &name);
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool show_in_tray = !image.isNull();
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    UpdateIcon(show_in_tray, image);
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const NetworkState* connected_network = handler->ConnectedNetworkByType(
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        NetworkStateHandler::kMatchTypeNonVirtual);
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (connected_network)
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      UpdateConnectionStatus(UTF8ToUTF16(connected_network->name()), true);
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    else
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      UpdateConnectionStatus(string16(), false);
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // views::View override.
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void GetAccessibleState(ui::AccessibleViewState* state) OVERRIDE {
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    state->name = connection_status_string_;
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    state->role = ui::AccessibilityTypes::ROLE_PUSHBUTTON;
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // network_icon::AnimationObserver
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void NetworkIconChanged() OVERRIDE {
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (UseNewNetworkHandlers())
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      UpdateNetworkStateHandlerIcon();
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Updates connection status and notifies accessibility event when necessary.
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void UpdateConnectionStatus(const string16& network_name, bool connected) {
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    string16 new_connection_status_string;
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (connected) {
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new_connection_status_string = l10n_util::GetStringFUTF16(
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          IDS_ASH_STATUS_TRAY_NETWORK_CONNECTED, network_name);
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (new_connection_status_string != connection_status_string_) {
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      connection_status_string_ = new_connection_status_string;
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if(!connection_status_string_.empty()) {
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        GetWidget()->NotifyAccessibilityEvent(
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            this, ui::AccessibilityTypes::EVENT_ALERT, true);
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void UpdateIcon(bool tray_icon_visible, const gfx::ImageSkia& image) {
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    image_view_->SetImage(image);
1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SetVisible(tray_icon_visible);
1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SchedulePaint();
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TrayNetwork* network_tray_;
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  views::ImageView* image_view_;
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  string16 connection_status_string_;
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(NetworkTrayView);
1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class NetworkDefaultView : public TrayItemMore,
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                           public network_icon::AnimationObserver {
2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NetworkDefaultView(TrayNetwork* network_tray, bool show_more)
2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : TrayItemMore(network_tray, show_more),
2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        network_tray_(network_tray) {
2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    Update();
2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (UseNewNetworkHandlers())
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      network_icon::NetworkIconAnimation::GetInstance()->AddObserver(this);
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~NetworkDefaultView() {
2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (UseNewNetworkHandlers())
2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      network_icon::NetworkIconAnimation::GetInstance()->RemoveObserver(this);
2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void Update() {
2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (UseNewNetworkHandlers()) {
2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      gfx::ImageSkia image;
2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      string16 label;
2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      network_tray_->GetNetworkStateHandlerImageAndLabel(
2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          network_icon::ICON_TYPE_DEFAULT_VIEW, &image, &label);
2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      SetImage(&image);
2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      SetLabel(label);
2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      SetAccessibleName(label);
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      NetworkIconInfo info;
2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      Shell::GetInstance()->system_tray_delegate()->
2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          GetMostRelevantNetworkIcon(&info, true);
2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      SetImage(&info.image);
2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      SetLabel(info.description);
2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      SetAccessibleName(info.description);
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // network_icon::AnimationObserver
2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void NetworkIconChanged() OVERRIDE {
2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    Update();
2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TrayNetwork* network_tray_;
2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(NetworkDefaultView);
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class NetworkWifiDetailedView : public NetworkDetailedView {
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NetworkWifiDetailedView(SystemTrayItem* owner, bool wifi_enabled)
2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : NetworkDetailedView(owner) {
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetLayoutManager(new views::BoxLayout(views::BoxLayout::kHorizontal,
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                          kTrayPopupPaddingHorizontal,
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                          10,
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                          kTrayPopupPaddingBetweenItems));
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui::ResourceBundle& bundle = ui::ResourceBundle::GetSharedInstance();
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::ImageView* image = new views::ImageView;
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const int image_id = wifi_enabled ?
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        IDR_AURA_UBER_TRAY_WIFI_ENABLED : IDR_AURA_UBER_TRAY_WIFI_DISABLED;
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    image->SetImage(bundle.GetImageNamed(image_id).ToImageSkia());
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AddChildView(image);
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const int string_id = wifi_enabled ?
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        IDS_ASH_STATUS_TRAY_NETWORK_WIFI_ENABLED:
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        IDS_ASH_STATUS_TRAY_NETWORK_WIFI_DISABLED;
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::Label* label =
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        new views::Label(bundle.GetLocalizedString(string_id));
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    label->SetMultiLine(true);
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    label->SetHorizontalAlignment(gfx::ALIGN_LEFT);
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AddChildView(label);
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~NetworkWifiDetailedView() {}
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Overridden from NetworkDetailedView:
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Init() OVERRIDE {
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual NetworkDetailedView::DetailedViewType GetViewType() const OVERRIDE {
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NetworkDetailedView::WIFI_VIEW;
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void ManagerChanged() OVERRIDE {
2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void NetworkListChanged() OVERRIDE {
2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void NetworkServiceChanged(
2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const chromeos::NetworkState* network) OVERRIDE {
2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(NetworkWifiDetailedView);
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class NetworkMessageView : public views::View,
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           public views::LinkListener {
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NetworkMessageView(TrayNetwork* tray_network,
2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                     NetworkObserver::MessageType message_type,
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     const NetworkMessages::Message& network_msg)
3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : tray_network_(tray_network),
3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        message_type_(message_type),
3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        network_type_(network_msg.network_type_) {
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetLayoutManager(
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        new views::BoxLayout(views::BoxLayout::kVertical, 0, 0, 1));
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!network_msg.title.empty()) {
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      views::Label* title = new views::Label(network_msg.title);
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      title->SetHorizontalAlignment(gfx::ALIGN_LEFT);
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      title->SetFont(title->font().DeriveFont(0, gfx::Font::BOLD));
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      AddChildView(title);
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!network_msg.message.empty()) {
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      views::Label* message = new views::Label(network_msg.message);
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      message->SetHorizontalAlignment(gfx::ALIGN_LEFT);
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      message->SetMultiLine(true);
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      message->SizeToFit(kTrayNotificationContentsWidth);
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      AddChildView(message);
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!network_msg.links.empty()) {
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for (size_t i = 0; i < network_msg.links.size(); ++i) {
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        views::Link* link = new views::Link(network_msg.links[i]);
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        link->set_id(i);
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        link->set_listener(this);
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        link->SetHorizontalAlignment(gfx::ALIGN_LEFT);
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        link->SetMultiLine(true);
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        link->SizeToFit(kTrayNotificationContentsWidth);
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        AddChildView(link);
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~NetworkMessageView() {
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Overridden from views::LinkListener.
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void LinkClicked(views::Link* source, int event_flags) OVERRIDE {
3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    tray_network_->LinkClicked(message_type_, source->id());
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NetworkObserver::MessageType message_type() const { return message_type_; }
3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NetworkObserver::NetworkType network_type() const { return network_type_; }
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TrayNetwork* tray_network_;
3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NetworkObserver::MessageType message_type_;
3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NetworkObserver::NetworkType network_type_;
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(NetworkMessageView);
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class NetworkNotificationView : public TrayNotificationView {
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  explicit NetworkNotificationView(TrayNetwork* tray_network)
3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : TrayNotificationView(tray_network, 0),
3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        tray_network_(tray_network) {
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CreateMessageView();
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    InitView(network_message_view_);
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetIconImage(*ResourceBundle::GetSharedInstance().GetImageSkiaNamed(
3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        GetMessageIcon(network_message_view_->message_type(),
3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            network_message_view_->network_type())));
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Overridden from TrayNotificationView.
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnClose() OVERRIDE {
3682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    tray_network_->ClearNetworkMessage(network_message_view_->message_type());
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnClickAction() OVERRIDE {
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (network_message_view_->message_type() !=
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        TrayNetwork::MESSAGE_DATA_PROMO)
3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      tray_network_->PopupDetailedView(0, true);
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Update() {
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CreateMessageView();
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UpdateViewAndImage(network_message_view_,
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        *ResourceBundle::GetSharedInstance().GetImageSkiaNamed(
3812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            GetMessageIcon(network_message_view_->message_type(),
3822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                network_message_view_->network_type())));
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void CreateMessageView() {
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Display the first (highest priority) message.
3882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CHECK(!tray_network_->messages()->messages().empty());
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NetworkMessages::MessageMap::const_iterator iter =
3902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        tray_network_->messages()->messages().begin();
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    network_message_view_ =
3922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        new NetworkMessageView(tray_network_, iter->first, iter->second);
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TrayNetwork* tray_network_;
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  tray::NetworkMessageView* network_message_view_;
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(NetworkNotificationView);
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace tray
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TrayNetwork::TrayNetwork(SystemTray* system_tray)
4042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : SystemTrayItem(system_tray),
4052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      tray_(NULL),
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      default_(NULL),
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      detailed_(NULL),
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      notification_(NULL),
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      messages_(new tray::NetworkMessages()),
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      request_wifi_view_(false) {
4112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (UseNewNetworkHandlers())
4122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    network_state_observer_.reset(new TrayNetworkStateObserver(this));
4132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (NetworkStateHandler::IsInitialized())
4142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    network_state_notifier_.reset(new NetworkStateNotifier());
4152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Shell::GetInstance()->system_tray_notifier()->AddNetworkObserver(this);
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TrayNetwork::~TrayNetwork() {
4192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  network_state_notifier_.reset();
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);
4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  tray_ = new tray::NetworkTrayView(this);
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return tray_;
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)views::View* TrayNetwork::CreateDefaultView(user::LoginStatus status) {
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK(default_ == NULL);
4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CHECK(tray_ != NULL);
4322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  default_ = new tray::NetworkDefaultView(
4332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      this, status != user::LOGGED_IN_LOCKED);
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return default_;
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)views::View* TrayNetwork::CreateDetailedView(user::LoginStatus status) {
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK(detailed_ == NULL);
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Clear any notifications when showing the detailed view.
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  messages_->messages().clear();
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HideNotificationView();
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (request_wifi_view_) {
4432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SystemTrayDelegate* delegate = Shell::GetInstance()->system_tray_delegate();
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The Wi-Fi state is not toggled yet at this point.
4452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    detailed_ = new tray::NetworkWifiDetailedView(this,
4462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                  !delegate->GetWifiEnabled());
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    request_wifi_view_ = false;
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
4492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (UseNewNetworkHandlers()) {
4502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      detailed_ = new tray::NetworkStateListDetailedView(
4512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          this, tray::NetworkStateListDetailedView::LIST_TYPE_NETWORK, status);
4522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    } else {
4532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      detailed_ = new tray::NetworkListDetailedView(
4542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          this, status, IDS_ASH_STATUS_TRAY_NETWORK);
4552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    detailed_->Init();
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return detailed_;
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)views::View* TrayNetwork::CreateNotificationView(user::LoginStatus status) {
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK(notification_ == NULL);
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (messages_->messages().empty())
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NULL;  // Message has already been cleared.
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  notification_ = new tray::NetworkNotificationView(this);
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return notification_;
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TrayNetwork::DestroyTrayView() {
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  tray_ = NULL;
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TrayNetwork::DestroyDefaultView() {
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  default_ = NULL;
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TrayNetwork::DestroyDetailedView() {
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  detailed_ = NULL;
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TrayNetwork::DestroyNotificationView() {
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  notification_ = NULL;
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TrayNetwork::UpdateAfterLoginStatusChange(user::LoginStatus status) {
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TrayNetwork::UpdateAfterShelfAlignmentChange(ShelfAlignment alignment) {
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetTrayImageItemBorder(tray_, alignment);
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TrayNetwork::OnNetworkRefresh(const NetworkIconInfo& info) {
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (tray_)
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tray_->Update(info);
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (default_)
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default_->Update();
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (detailed_)
4982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    detailed_->ManagerChanged();
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TrayNetwork::SetNetworkMessage(NetworkTrayDelegate* delegate,
5022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                    MessageType message_type,
5032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                    NetworkType network_type,
5042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                    const string16& title,
5052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                    const string16& message,
5062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                    const std::vector<string16>& links) {
5072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  messages_->messages()[message_type] = tray::NetworkMessages::Message(
5082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      delegate, network_type, title, message, links);
5092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!Shell::GetInstance()->system_tray_delegate()->IsOobeCompleted())
5102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (notification_)
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    notification_->Update();
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ShowNotificationView();
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TrayNetwork::ClearNetworkMessage(MessageType message_type) {
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  messages_->messages().erase(message_type);
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (messages_->messages().empty()) {
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    HideNotificationView();
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (notification_)
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    notification_->Update();
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ShowNotificationView();
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TrayNetwork::OnWillToggleWifi() {
5302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Triggered by a user action (e.g. keyboard shortcut)
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!detailed_ ||
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      detailed_->GetViewType() == tray::NetworkDetailedView::WIFI_VIEW) {
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    request_wifi_view_ = true;
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PopupDetailedView(kTrayPopupAutoCloseDelayForTextInSeconds, false);
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void TrayNetwork::NetworkStateChanged(bool list_changed) {
5392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (tray_  && UseNewNetworkHandlers())
5402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    tray_->UpdateNetworkStateHandlerIcon();
5412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (default_)
5422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    default_->Update();
5432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (detailed_) {
5442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (list_changed)
5452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      detailed_->NetworkListChanged();
5462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    else
5472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      detailed_->ManagerChanged();
5482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void TrayNetwork::NetworkServiceChanged(const chromeos::NetworkState* network) {
5522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (detailed_)
5532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    detailed_->NetworkServiceChanged(network);
5542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void TrayNetwork::GetNetworkStateHandlerImageAndLabel(
5572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    network_icon::IconType icon_type,
5582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    gfx::ImageSkia* image,
5592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    string16* label) {
5602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NetworkStateHandler* handler = NetworkStateHandler::Get();
5612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const NetworkState* connected_network = handler->ConnectedNetworkByType(
5622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      NetworkStateHandler::kMatchTypeNonVirtual);
5632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const NetworkState* connecting_network = handler->ConnectingNetworkByType(
5642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      NetworkStateHandler::kMatchTypeWireless);
5652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!connecting_network && icon_type == network_icon::ICON_TYPE_TRAY)
5662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    connecting_network = handler->ConnectingNetworkByType(flimflam::kTypeVPN);
5672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const NetworkState* network;
5692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // If we are connecting to a network, and there is either no connected
5702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // network, or the connection was user requested, use the connecting
5712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // network.
5722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (connecting_network &&
5732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      (!connected_network ||
5742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       handler->connecting_network() == connecting_network->path())) {
5752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    network = connecting_network;
5762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else {
5772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    network = connected_network;
5782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Don't show ethernet in the tray
5812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (icon_type == network_icon::ICON_TYPE_TRAY &&
5822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      network && network->type() == flimflam::kTypeEthernet) {
5832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    *image = gfx::ImageSkia();
5842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
5852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!network) {
5882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // If no connecting network, check if we are activating a network.
5892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const NetworkState* mobile_network = handler->FirstNetworkByType(
5902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        NetworkStateHandler::kMatchTypeMobile);
5912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (mobile_network && (mobile_network->activation_state() ==
5922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                           flimflam::kActivationStateActivating)) {
5932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      network = mobile_network;
5942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
5952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!network) {
5972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // If no connecting network, check for cellular initializing.
5982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int uninitialized_msg = network_icon::GetCellularUninitializedMsg();
5992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (uninitialized_msg != 0) {
6002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      *image = network_icon::GetImageForConnectingNetwork(
6012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          icon_type, flimflam::kTypeCellular);
6022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if (label)
6032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        *label = l10n_util::GetStringUTF16(uninitialized_msg);
6042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    } else {
6052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // Otherwise show the disconnected wifi icon.
6062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      *image = network_icon::GetImageForDisconnectedNetwork(
6072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          icon_type, flimflam::kTypeWifi);
6082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if (label) {
6092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        *label = l10n_util::GetStringUTF16(
6102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            IDS_ASH_STATUS_TRAY_NETWORK_NOT_CONNECTED);
6112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      }
6122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
6132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
6142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
6152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Get icon and label for connected or connecting network.
6162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  *image = network_icon::GetImageForNetwork(network, icon_type);
6172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (label)
6182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    *label = network_icon::GetLabelForNetwork(network, icon_type);
6192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TrayNetwork::LinkClicked(MessageType message_type, int link_id) {
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  tray::NetworkMessages::MessageMap::const_iterator iter =
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      messages()->messages().find(message_type);
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (iter != messages()->messages().end() && iter->second.delegate)
6252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    iter->second.delegate->NotificationLinkClicked(message_type, link_id);
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace internal
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace ash
630