12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/system/chromeos/network/network_state_list_detailed_view.h"
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
77dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "ash/ash_switches.h"
8d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)#include "ash/metrics/user_metrics_recorder.h"
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/root_window_controller.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/shell.h"
11d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)#include "ash/shell_delegate.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/shell_window_ids.h"
13868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "ash/system/chromeos/network/network_connect.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/system/chromeos/network/network_icon.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/system/chromeos/network/network_icon_animation.h"
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/system/chromeos/network/tray_network_state_observer.h"
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/system/tray/fixed_sized_scroll_view.h"
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/system/tray/hover_highlight_view.h"
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/system/tray/system_tray.h"
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/system/tray/system_tray_delegate.h"
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/system/tray/tray_constants.h"
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/system/tray/tray_details_view.h"
23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ash/system/tray/tray_popup_header_button.h"
24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ash/system/tray/tray_popup_label_button.h"
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/command_line.h"
267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "base/message_loop/message_loop.h"
27868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
28eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h"
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chromeos/chromeos_switches.h"
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chromeos/network/device_state.h"
317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chromeos/network/favorite_state.h"
327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chromeos/network/network_configuration_handler.h"
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chromeos/network/network_state.h"
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chromeos/network/network_state_handler.h"
3558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chromeos/network/shill_property_util.h"
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "grit/ash_resources.h"
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "grit/ash_strings.h"
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "third_party/cros_system_api/dbus/service_constants.h"
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/aura/window.h"
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/base/l10n/l10n_util.h"
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/base/resource/resource_bundle.h"
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/bubble/bubble_delegate.h"
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/controls/label.h"
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/layout/box_layout.h"
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/layout/fill_layout.h"
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/widget/widget.h"
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)using chromeos::DeviceState;
497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochusing chromeos::FavoriteState;
5090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)using chromeos::NetworkHandler;
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using chromeos::NetworkState;
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using chromeos::NetworkStateHandler;
5358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)using chromeos::NetworkTypePattern;
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace ash {
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace internal {
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace tray {
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace {
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Delay between scan requests.
62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const int kRequestScanDelaySeconds = 10;
63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Create a label with the font size and color used in the network info bubble.
65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)views::Label* CreateInfoBubbleLabel(const base::string16& text) {
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  views::Label* label = new views::Label(text);
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  label->SetFont(rb.GetFont(ui::ResourceBundle::SmallFont));
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  label->SetEnabledColor(SkColorSetARGB(127, 0, 0, 0));
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return label;
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Create a label formatted for info items in the menu
74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)views::Label* CreateMenuInfoLabel(const base::string16& text) {
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  views::Label* label = new views::Label(text);
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  label->set_border(views::Border::CreateEmptyBorder(
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ash::kTrayPopupPaddingBetweenItems,
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ash::kTrayPopupPaddingHorizontal,
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ash::kTrayPopupPaddingBetweenItems, 0));
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  label->SetHorizontalAlignment(gfx::ALIGN_LEFT);
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  label->SetEnabledColor(SkColorSetARGB(192, 0, 0, 0));
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return label;
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Create a row of labels for the network info bubble.
86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)views::View* CreateInfoBubbleLine(const base::string16& text_label,
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                  const std::string& text_string) {
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  views::View* view = new views::View;
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  view->SetLayoutManager(
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new views::BoxLayout(views::BoxLayout::kHorizontal, 0, 0, 1));
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  view->AddChildView(CreateInfoBubbleLabel(text_label));
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  view->AddChildView(CreateInfoBubbleLabel(UTF8ToUTF16(": ")));
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  view->AddChildView(CreateInfoBubbleLabel(UTF8ToUTF16(text_string)));
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return view;
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//------------------------------------------------------------------------------
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)struct NetworkInfo {
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NetworkInfo(const std::string& path)
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : service_path(path),
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        disable(false),
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        highlight(false) {
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string service_path;
110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::string16 label;
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::ImageSkia image;
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool disable;
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool highlight;
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//------------------------------------------------------------------------------
1174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// A bubble which displays network info.
1194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class NetworkStateListDetailedView::InfoBubble
1204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    : public views::BubbleDelegateView {
1214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) public:
1224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  InfoBubble(views::View* anchor,
1234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)             views::View* content,
1244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)             NetworkStateListDetailedView* detailed_view)
1254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      : views::BubbleDelegateView(anchor, views::BubbleBorder::TOP_RIGHT),
1264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        detailed_view_(detailed_view) {
1274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    set_use_focusless(true);
1284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    set_parent_window(ash::Shell::GetContainer(
1294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        anchor->GetWidget()->GetNativeWindow()->GetRootWindow(),
1304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        ash::internal::kShellWindowId_SettingBubbleContainer));
1314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    SetLayoutManager(new views::FillLayout());
1324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    AddChildView(content);
1334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
1344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual ~InfoBubble() {
1364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    detailed_view_->OnInfoBubbleDestroyed();
1374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
1384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual bool CanActivate() const OVERRIDE { return false; }
1404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) private:
1424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Not owned.
1434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  NetworkStateListDetailedView* detailed_view_;
1444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(InfoBubble);
1464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)};
1474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)//------------------------------------------------------------------------------
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// NetworkStateListDetailedView
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)NetworkStateListDetailedView::NetworkStateListDetailedView(
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SystemTrayItem* owner,
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ListType list_type,
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    user::LoginStatus login)
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : NetworkDetailedView(owner),
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      list_type_(list_type),
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      login_(login),
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      info_icon_(NULL),
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      button_wifi_(NULL),
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      button_mobile_(NULL),
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      other_wifi_(NULL),
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      turn_on_wifi_(NULL),
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      other_mobile_(NULL),
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      other_vpn_(NULL),
1657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      toggle_debug_preferred_networks_(NULL),
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      settings_(NULL),
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      proxy_settings_(NULL),
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      scanning_view_(NULL),
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      no_wifi_networks_view_(NULL),
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      no_cellular_networks_view_(NULL),
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      info_bubble_(NULL) {
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)NetworkStateListDetailedView::~NetworkStateListDetailedView() {
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (info_bubble_)
1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    info_bubble_->GetWidget()->CloseNow();
1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  network_icon::NetworkIconAnimation::GetInstance()->RemoveObserver(this);
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void NetworkStateListDetailedView::ManagerChanged() {
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateNetworkList();
1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateHeaderButtons();
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateNetworkExtra();
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Layout();
1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void NetworkStateListDetailedView::NetworkListChanged() {
1887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  NetworkStateHandler* handler = NetworkHandler::Get()->network_state_handler();
1897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (list_type_ == LIST_TYPE_DEBUG_PREFERRED) {
1907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    NetworkStateHandler::FavoriteStateList favorite_list;
1917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    handler->GetFavoriteList(&favorite_list);
1927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    UpdatePreferred(favorite_list);
1937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  } else {
1947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    NetworkStateHandler::NetworkStateList network_list;
1957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    handler->GetNetworkList(&network_list);
1967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    UpdateNetworks(network_list);
1977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateNetworkList();
1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateHeaderButtons();
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateNetworkExtra();
2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Layout();
2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void NetworkStateListDetailedView::NetworkServiceChanged(
2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const NetworkState* network) {
2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateNetworkList();
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Layout();
2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void NetworkStateListDetailedView::NetworkIconChanged() {
2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateNetworkList();
2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Layout();
2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Overridden from NetworkDetailedView:
2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void NetworkStateListDetailedView::Init() {
2187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  Reset();
2197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  network_map_.clear();
2207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  service_path_map_.clear();
2217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  info_icon_ = NULL;
2227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  button_wifi_ = NULL;
2237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  button_mobile_ = NULL;
2247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  other_wifi_ = NULL;
2257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  turn_on_wifi_ = NULL;
2267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  other_mobile_ = NULL;
2277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  other_vpn_ = NULL;
2287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  toggle_debug_preferred_networks_ = NULL;
2297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  settings_ = NULL;
2307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  proxy_settings_ = NULL;
2317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  scanning_view_ = NULL;
2327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  no_wifi_networks_view_ = NULL;
2337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  no_cellular_networks_view_ = NULL;
2347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateScrollableList();
2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateNetworkExtra();
2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateHeaderEntry();
2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateHeaderButtons();
239c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  NetworkListChanged();
2417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
242c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  CallRequestScan();
2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)NetworkDetailedView::DetailedViewType
2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)NetworkStateListDetailedView::GetViewType() const {
2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return STATE_LIST_VIEW;
2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Views overrides
2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void NetworkStateListDetailedView::ButtonPressed(views::Button* sender,
2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                 const ui::Event& event) {
2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (sender == info_icon_) {
2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ToggleInfoBubble();
2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // If the info bubble was visible, close it when some other item is clicked.
2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ResetInfoBubble();
2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
26290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  NetworkStateHandler* handler = NetworkHandler::Get()->network_state_handler();
2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ash::SystemTrayDelegate* delegate =
2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ash::Shell::GetInstance()->system_tray_delegate();
2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (sender == button_wifi_) {
26658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    bool enabled = handler->IsTechnologyEnabled(
26758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        NetworkTypePattern::WiFi());
26858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    handler->SetTechnologyEnabled(NetworkTypePattern::WiFi(),
26958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                  !enabled,
27058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                  chromeos::network_handler::ErrorCallback());
2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else if (sender == turn_on_wifi_) {
27258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    handler->SetTechnologyEnabled(NetworkTypePattern::WiFi(),
27358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                  true,
27458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                  chromeos::network_handler::ErrorCallback());
2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else if (sender == button_mobile_) {
276c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ToggleMobile();
2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else if (sender == settings_) {
278d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)    Shell::GetInstance()->metrics()->RecordUserMetricsAction(
279d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)        list_type_ == LIST_TYPE_VPN ?
280d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)        ash::UMA_STATUS_AREA_VPN_SETTINGS_CLICKED :
281d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)        ash::UMA_STATUS_AREA_NETWORK_SETTINGS_CLICKED);
28290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    delegate->ShowNetworkSettings("");
2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else if (sender == proxy_settings_) {
2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    delegate->ChangeProxySettings();
2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else if (sender == other_mobile_) {
2864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    delegate->ShowOtherNetworkDialog(shill::kTypeCellular);
2877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  } else if (sender == toggle_debug_preferred_networks_) {
2887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    list_type_ = (list_type_ == LIST_TYPE_NETWORK)
2897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        ? LIST_TYPE_DEBUG_PREFERRED : LIST_TYPE_NETWORK;
2907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    // Re-initialize this after processing the event.
2917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    base::MessageLoopForUI::current()->PostTask(
2927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        FROM_HERE,
2937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        base::Bind(&NetworkStateListDetailedView::Init, AsWeakPtr()));
2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else if (sender == other_wifi_) {
295d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)    Shell::GetInstance()->metrics()->RecordUserMetricsAction(
296d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)        ash::UMA_STATUS_AREA_NETWORK_JOIN_OTHER_CLICKED);
2974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    delegate->ShowOtherNetworkDialog(shill::kTypeWifi);
2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else if (sender == other_vpn_) {
299d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)    Shell::GetInstance()->metrics()->RecordUserMetricsAction(
300d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)        ash::UMA_STATUS_AREA_VPN_JOIN_OTHER_CLICKED);
3014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    delegate->ShowOtherNetworkDialog(shill::kTypeVPN);
3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else {
3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    NOTREACHED();
3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void NetworkStateListDetailedView::OnViewClicked(views::View* sender) {
3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // If the info bubble was visible, close it when some other item is clicked.
3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ResetInfoBubble();
3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (sender == footer()->content()) {
312a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    TransitionToDefaultView();
3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (login_ == user::LOGGED_IN_LOCKED)
3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
319c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::map<views::View*, std::string>::iterator found =
320c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      network_map_.find(sender);
3217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (found == network_map_.end())
3227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    return;
3237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
3247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  const std::string& service_path = found->second;
3257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (list_type_ == LIST_TYPE_DEBUG_PREFERRED) {
3267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    NetworkHandler::Get()->network_configuration_handler()->
3277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        RemoveConfiguration(service_path,
3287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                            base::Bind(&base::DoNothing),
3297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                            chromeos::network_handler::ErrorCallback());
3307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    return;
3317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
3327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
3337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  const NetworkState* network = NetworkHandler::Get()->network_state_handler()->
3347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      GetNetworkState(service_path);
3357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (!network || network->IsConnectedState() || network->IsConnectingState()) {
336d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)    Shell::GetInstance()->metrics()->RecordUserMetricsAction(
337d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)        list_type_ == LIST_TYPE_VPN ?
338d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)        ash::UMA_STATUS_AREA_SHOW_NETWORK_CONNECTION_DETAILS :
339d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)        ash::UMA_STATUS_AREA_SHOW_VPN_CONNECTION_DETAILS);
3407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    Shell::GetInstance()->system_tray_delegate()->ShowNetworkSettings(
3417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        service_path);
3427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  } else {
343d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)    Shell::GetInstance()->metrics()->RecordUserMetricsAction(
344d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)        list_type_ == LIST_TYPE_VPN ?
345d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)        ash::UMA_STATUS_AREA_CONNECT_TO_VPN :
346d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)        ash::UMA_STATUS_AREA_CONNECT_TO_CONFIGURED_NETWORK);
347ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    ash::network_connect::ConnectToNetwork(service_path, NULL);
34890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Create UI components.
3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void NetworkStateListDetailedView::CreateHeaderEntry() {
3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateSpecialRow(IDS_ASH_STATUS_TRAY_NETWORK, this);
3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void NetworkStateListDetailedView::CreateHeaderButtons() {
3587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (list_type_ != LIST_TYPE_VPN) {
3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    button_wifi_ = new TrayPopupHeaderButton(
3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        this,
3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        IDR_AURA_UBER_TRAY_WIFI_ENABLED,
3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        IDR_AURA_UBER_TRAY_WIFI_DISABLED,
3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        IDR_AURA_UBER_TRAY_WIFI_ENABLED_HOVER,
3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        IDR_AURA_UBER_TRAY_WIFI_DISABLED_HOVER,
3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        IDS_ASH_STATUS_TRAY_WIFI);
3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    button_wifi_->SetTooltipText(
3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_DISABLE_WIFI));
3682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    button_wifi_->SetToggledTooltipText(
3692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_ENABLE_WIFI));
3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    footer()->AddButton(button_wifi_);
3712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    button_mobile_ = new TrayPopupHeaderButton(
3732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        this,
3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        IDR_AURA_UBER_TRAY_CELLULAR_ENABLED,
3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        IDR_AURA_UBER_TRAY_CELLULAR_DISABLED,
3762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        IDR_AURA_UBER_TRAY_CELLULAR_ENABLED_HOVER,
3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        IDR_AURA_UBER_TRAY_CELLULAR_DISABLED_HOVER,
3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        IDS_ASH_STATUS_TRAY_CELLULAR);
3792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    button_mobile_->SetTooltipText(
3802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_DISABLE_MOBILE));
3812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    button_mobile_->SetToggledTooltipText(
3822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_ENABLE_MOBILE));
3832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    footer()->AddButton(button_mobile_);
3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  info_icon_ = new TrayPopupHeaderButton(
3872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      this,
3882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      IDR_AURA_UBER_TRAY_NETWORK_INFO,
3892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      IDR_AURA_UBER_TRAY_NETWORK_INFO,
3902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      IDR_AURA_UBER_TRAY_NETWORK_INFO_HOVER,
3912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      IDR_AURA_UBER_TRAY_NETWORK_INFO_HOVER,
3922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      IDS_ASH_STATUS_TRAY_NETWORK_INFO);
3932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  info_icon_->SetTooltipText(
3942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_NETWORK_INFO));
3952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  footer()->AddButton(info_icon_);
3962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void NetworkStateListDetailedView::CreateNetworkExtra() {
3992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (login_ == user::LOGGED_IN_LOCKED)
4002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
4012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
4032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  views::View* bottom_row = new views::View();
4052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  views::BoxLayout* layout = new views::BoxLayout(
4062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      views::BoxLayout::kHorizontal,
4072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      kTrayMenuBottomRowPadding,
4082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      kTrayMenuBottomRowPadding,
4092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      kTrayMenuBottomRowPaddingBetweenItems);
4102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layout->set_spread_blank_space(true);
4112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bottom_row->SetLayoutManager(layout);
4122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (list_type_ != LIST_TYPE_VPN) {
4142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    other_wifi_ = new TrayPopupLabelButton(
4152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        this, rb.GetLocalizedString(IDS_ASH_STATUS_TRAY_OTHER_WIFI));
4162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bottom_row->AddChildView(other_wifi_);
4172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    turn_on_wifi_ = new TrayPopupLabelButton(
4192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        this, rb.GetLocalizedString(IDS_ASH_STATUS_TRAY_TURN_ON_WIFI));
4202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bottom_row->AddChildView(turn_on_wifi_);
4212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    other_mobile_ = new TrayPopupLabelButton(
4232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        this, rb.GetLocalizedString(IDS_ASH_STATUS_TRAY_OTHER_MOBILE));
4242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bottom_row->AddChildView(other_mobile_);
4257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
4267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    if (CommandLine::ForCurrentProcess()->HasSwitch(
4277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch            ash::switches::kAshDebugShowPreferredNetworks)) {
4287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      // Debugging UI to view and remove favorites from the status area.
4297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      std::string toggle_debug_preferred_label =
4307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch          (list_type_ == LIST_TYPE_DEBUG_PREFERRED) ? "Visible" : "Preferred";
4317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      toggle_debug_preferred_networks_ = new TrayPopupLabelButton(
4327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch          this, UTF8ToUTF16(toggle_debug_preferred_label));
4337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      bottom_row->AddChildView(toggle_debug_preferred_networks_);
4347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    }
4357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  } else {
4362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    other_vpn_ = new TrayPopupLabelButton(
4372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        this,
4382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ui::ResourceBundle::GetSharedInstance().GetLocalizedString(
4392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            IDS_ASH_STATUS_TRAY_OTHER_VPN));
4402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bottom_row->AddChildView(other_vpn_);
4412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateSettingsEntry();
4442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(settings_ || proxy_settings_);
4452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bottom_row->AddChildView(settings_ ? settings_ : proxy_settings_);
4462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AddChildView(bottom_row);
4482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Update UI components.
4512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void NetworkStateListDetailedView::UpdateHeaderButtons() {
45390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  NetworkStateHandler* handler = NetworkHandler::Get()->network_state_handler();
454c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (button_wifi_)
45558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    UpdateTechnologyButton(button_wifi_, NetworkTypePattern::WiFi());
4562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (button_mobile_) {
45758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    UpdateTechnologyButton(button_mobile_, NetworkTypePattern::Mobile());
4582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (proxy_settings_)
4602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    proxy_settings_->SetEnabled(handler->DefaultNetwork() != NULL);
4612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static_cast<views::View*>(footer())->Layout();
4632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
465c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void NetworkStateListDetailedView::UpdateTechnologyButton(
466c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    TrayPopupHeaderButton* button,
46758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    const NetworkTypePattern& technology) {
468c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  NetworkStateHandler::TechnologyState state =
46958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      NetworkHandler::Get()->network_state_handler()->GetTechnologyState(
47058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)          technology);
471c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (state == NetworkStateHandler::TECHNOLOGY_UNAVAILABLE) {
472c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    button->SetVisible(false);
473c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return;
474c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
475c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  button->SetVisible(true);
476c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (state == NetworkStateHandler::TECHNOLOGY_AVAILABLE) {
477c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    button->SetEnabled(true);
478c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    button->SetToggled(true);
479c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  } else if (state == NetworkStateHandler::TECHNOLOGY_ENABLED) {
480c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    button->SetEnabled(true);
481c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    button->SetToggled(false);
482c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  } else if (state == NetworkStateHandler::TECHNOLOGY_ENABLING) {
483c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    button->SetEnabled(false);
484c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    button->SetToggled(false);
485c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  } else {  // Initializing
486c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    button->SetEnabled(false);
487c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    button->SetToggled(true);
488c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
489c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
490c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
4912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void NetworkStateListDetailedView::UpdateNetworks(
4927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    const NetworkStateHandler::NetworkStateList& networks) {
493558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  DCHECK(list_type_ != LIST_TYPE_DEBUG_PREFERRED);
4942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  network_list_.clear();
4957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  for (NetworkStateHandler::NetworkStateList::const_iterator iter =
4967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)           networks.begin(); iter != networks.end(); ++iter) {
4972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const NetworkState* network = *iter;
4982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if ((list_type_ == LIST_TYPE_NETWORK &&
49968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)         network->type() != shill::kTypeVPN) ||
5002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        (list_type_ == LIST_TYPE_VPN &&
50168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)         network->type() == shill::kTypeVPN)) {
5022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      NetworkInfo* info = new NetworkInfo(network->path());
5032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      network_list_.push_back(info);
5042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
5052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid NetworkStateListDetailedView::UpdatePreferred(
5097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    const NetworkStateHandler::FavoriteStateList& favorites) {
5107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  DCHECK(list_type_ == LIST_TYPE_DEBUG_PREFERRED);
5117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  network_list_.clear();
5127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  for (NetworkStateHandler::FavoriteStateList::const_iterator iter =
5137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch           favorites.begin(); iter != favorites.end(); ++iter) {
5147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    const FavoriteState* favorite = *iter;
5157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    NetworkInfo* info = new NetworkInfo(favorite->path());
5167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    network_list_.push_back(info);
5177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
5187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
5197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
5202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void NetworkStateListDetailedView::UpdateNetworkList() {
52190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  NetworkStateHandler* handler = NetworkHandler::Get()->network_state_handler();
5222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // First, update state for all networks
524c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool animating = false;
5252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (size_t i = 0; i < network_list_.size(); ++i) {
5262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    NetworkInfo* info = network_list_[i];
5272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const NetworkState* network =
5282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        handler->GetNetworkState(info->service_path);
5297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    if (network) {
5307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      info->image = network_icon::GetImageForNetwork(
5317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch          network, network_icon::ICON_TYPE_LIST);
5327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      info->label = network_icon::GetLabelForNetwork(
5337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch          network, network_icon::ICON_TYPE_LIST);
5347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      info->highlight =
5357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch          network->IsConnectedState() || network->IsConnectingState();
5367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      info->disable =
53768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)          network->activation_state() == shill::kActivationStateActivating;
5387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      if (!animating && network->IsConnectingState())
5397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        animating = true;
5407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    } else if (list_type_ == LIST_TYPE_DEBUG_PREFERRED) {
5417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      // Favorites that are visible will use the same display info as the
5427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      // visible network. Non visible favorites will show the disconnected
5437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      // icon and the name of the network.
5447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      const FavoriteState* favorite =
5457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch          handler->GetFavoriteState(info->service_path);
5467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      if (favorite) {
5477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        info->image = network_icon::GetImageForDisconnectedNetwork(
5487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch            network_icon::ICON_TYPE_LIST, favorite->type());
5497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        info->label = UTF8ToUTF16(favorite->name());
5507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      }
5517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    }
5522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
553c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (animating)
554c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    network_icon::NetworkIconAnimation::GetInstance()->AddObserver(this);
555c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  else
556c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    network_icon::NetworkIconAnimation::GetInstance()->RemoveObserver(this);
5572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Get the updated list entries
5592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  network_map_.clear();
5602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::set<std::string> new_service_paths;
5612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool needs_relayout = UpdateNetworkListEntries(&new_service_paths);
5622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Remove old children
5642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::set<std::string> remove_service_paths;
5652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (ServicePathMap::const_iterator it = service_path_map_.begin();
5662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       it != service_path_map_.end(); ++it) {
5672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (new_service_paths.find(it->first) == new_service_paths.end()) {
5682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      remove_service_paths.insert(it->first);
5692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      network_map_.erase(it->second);
5702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      scroll_content()->RemoveChildView(it->second);
5712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      needs_relayout = true;
5722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
5732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (std::set<std::string>::const_iterator remove_it =
5762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)           remove_service_paths.begin();
5772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       remove_it != remove_service_paths.end(); ++remove_it) {
5782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    service_path_map_.erase(*remove_it);
5792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (needs_relayout) {
5822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    views::View* selected_view = NULL;
5832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    for (ServicePathMap::const_iterator iter = service_path_map_.begin();
5842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)         iter != service_path_map_.end(); ++iter) {
5852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if (iter->second->hover()) {
5862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        selected_view = iter->second;
5872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
5882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      }
5892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
5902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scroll_content()->SizeToPreferredSize();
5912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    static_cast<views::View*>(scroller())->Layout();
5922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (selected_view)
5932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      scroll_content()->ScrollRectToVisible(selected_view->bounds());
5942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool NetworkStateListDetailedView::CreateOrUpdateInfoLabel(
598c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    int index, const base::string16& text, views::Label** label) {
5992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (*label == NULL) {
6002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    *label = CreateMenuInfoLabel(text);
6012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scroll_content()->AddChildViewAt(*label, index);
6022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return true;
6032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else {
6042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    (*label)->SetText(text);
6052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return OrderChild(*label, index);
6062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
6072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochbool NetworkStateListDetailedView::UpdateNetworkChild(int index,
6107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                                      const NetworkInfo* info) {
6112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool needs_relayout = false;
6122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  HoverHighlightView* container = NULL;
6132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ServicePathMap::const_iterator found =
6142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      service_path_map_.find(info->service_path);
6152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Font::FontStyle font =
6162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      info->highlight ? gfx::Font::BOLD : gfx::Font::NORMAL;
6172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (found == service_path_map_.end()) {
6182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    container = new HoverHighlightView(this);
6192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    container->AddIconAndLabel(info->image, info->label, font);
6202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scroll_content()->AddChildViewAt(container, index);
6212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    container->set_border(views::Border::CreateEmptyBorder(
6222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        0, kTrayPopupPaddingHorizontal, 0, 0));
6232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    needs_relayout = true;
6242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else {
6252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    container = found->second;
6262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    container->RemoveAllChildViews(true);
6272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    container->AddIconAndLabel(info->image, info->label, font);
6282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    container->Layout();
6292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    container->SchedulePaint();
6302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    needs_relayout = OrderChild(container, index);
6312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
6322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (info->disable)
6332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    container->SetEnabled(false);
6342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  network_map_[container] = info->service_path;
6352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  service_path_map_[info->service_path] = container;
6362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return needs_relayout;
6372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool NetworkStateListDetailedView::OrderChild(views::View* view, int index) {
6402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (scroll_content()->child_at(index) != view) {
6412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scroll_content()->ReorderChildView(view, index);
6422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return true;
6432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
6442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return false;
6452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool NetworkStateListDetailedView::UpdateNetworkListEntries(
6482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    std::set<std::string>* new_service_paths) {
6492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool needs_relayout = false;
6502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
65190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  NetworkStateHandler* handler = NetworkHandler::Get()->network_state_handler();
6522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Insert child views
6542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int index = 0;
6552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Highlighted networks
6572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (size_t i = 0; i < network_list_.size(); ++i) {
6582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const NetworkInfo* info = network_list_[i];
6592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (info->highlight) {
6602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if (UpdateNetworkChild(index++, info))
6612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        needs_relayout = true;
6622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new_service_paths->insert(info->service_path);
6632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
6642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
6652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (list_type_ == LIST_TYPE_NETWORK) {
6672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Cellular initializing
6682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int status_message_id = network_icon::GetCellularUninitializedMsg();
6692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (!status_message_id &&
67058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        handler->IsTechnologyEnabled(NetworkTypePattern::Mobile()) &&
67158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        !handler->FirstNetworkByType(NetworkTypePattern::Mobile())) {
6722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      status_message_id = IDS_ASH_STATUS_TRAY_NO_CELLULAR_NETWORKS;
6732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
6742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (status_message_id) {
675c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::string16 text = rb.GetLocalizedString(status_message_id);
6762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if (CreateOrUpdateInfoLabel(index++, text, &no_cellular_networks_view_))
6772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        needs_relayout = true;
6782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    } else if (no_cellular_networks_view_) {
6792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      scroll_content()->RemoveChildView(no_cellular_networks_view_);
6802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      no_cellular_networks_view_ = NULL;
6812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      needs_relayout = true;
6822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
6832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // "Wifi Enabled / Disabled"
6852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (network_list_.empty()) {
68658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      int message_id = handler->IsTechnologyEnabled(NetworkTypePattern::WiFi())
68758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                           ? IDS_ASH_STATUS_TRAY_NETWORK_WIFI_ENABLED
68858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                           : IDS_ASH_STATUS_TRAY_NETWORK_WIFI_DISABLED;
689c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::string16 text = rb.GetLocalizedString(message_id);
6902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if (CreateOrUpdateInfoLabel(index++, text, &no_wifi_networks_view_))
6912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        needs_relayout = true;
6922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    } else if (no_wifi_networks_view_) {
6932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      scroll_content()->RemoveChildView(no_wifi_networks_view_);
6942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      no_wifi_networks_view_ = NULL;
6952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      needs_relayout = true;
6962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
6972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // "Wifi Scanning"
69958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    if (handler->GetScanningByType(NetworkTypePattern::WiFi())) {
700c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::string16 text =
7012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          rb.GetLocalizedString(IDS_ASH_STATUS_TRAY_WIFI_SCANNING_MESSAGE);
7022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if (CreateOrUpdateInfoLabel(index++, text, &scanning_view_))
7032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        needs_relayout = true;
7042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    } else if (scanning_view_ != NULL) {
7052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      scroll_content()->RemoveChildView(scanning_view_);
7062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      scanning_view_ = NULL;
7072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      needs_relayout = true;
7082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
7092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
7102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Un-highlighted networks
7122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (size_t i = 0; i < network_list_.size(); ++i) {
7132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const NetworkInfo* info = network_list_[i];
7142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (!info->highlight) {
7152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if (UpdateNetworkChild(index++, info))
7162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        needs_relayout = true;
7172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new_service_paths->insert(info->service_path);
7182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
7192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
7202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // No networks or other messages (fallback)
7222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (index == 0) {
723c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    base::string16 text;
724c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (list_type_ == LIST_TYPE_VPN)
725c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      text = rb.GetLocalizedString(IDS_ASH_STATUS_TRAY_NETWORK_NO_VPN);
726c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    else
727c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      text = rb.GetLocalizedString(IDS_ASH_STATUS_TRAY_NO_NETWORKS);
7282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (CreateOrUpdateInfoLabel(index++, text, &scanning_view_))
7292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      needs_relayout = true;
7302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
7312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return needs_relayout;
7332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void NetworkStateListDetailedView::UpdateNetworkExtra() {
7362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (login_ == user::LOGGED_IN_LOCKED)
7372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
7382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  View* layout_parent = NULL;  // All these buttons have the same parent.
74090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  NetworkStateHandler* handler = NetworkHandler::Get()->network_state_handler();
7412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (other_wifi_) {
7422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DCHECK(turn_on_wifi_);
743c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    NetworkStateHandler::TechnologyState state =
74458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        handler->GetTechnologyState(NetworkTypePattern::WiFi());
745c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (state == NetworkStateHandler::TECHNOLOGY_UNAVAILABLE) {
7462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      turn_on_wifi_->SetVisible(false);
7472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      other_wifi_->SetVisible(false);
7482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    } else {
749c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      if (state == NetworkStateHandler::TECHNOLOGY_AVAILABLE) {
750c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        turn_on_wifi_->SetVisible(true);
751c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        turn_on_wifi_->SetEnabled(true);
752c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        other_wifi_->SetVisible(false);
753c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      } else if (state == NetworkStateHandler::TECHNOLOGY_ENABLED) {
754c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        turn_on_wifi_->SetVisible(false);
755c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        other_wifi_->SetVisible(true);
756c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      } else {
757c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // Initializing or Enabling
758c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        turn_on_wifi_->SetVisible(true);
759c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        turn_on_wifi_->SetEnabled(false);
760c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        other_wifi_->SetVisible(false);
761c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      }
7622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
7632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    layout_parent = other_wifi_->parent();
7642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
7652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (other_mobile_) {
7672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool show_other_mobile = false;
768c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    NetworkStateHandler::TechnologyState state =
76958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        handler->GetTechnologyState(NetworkTypePattern::Mobile());
770c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (state != NetworkStateHandler::TECHNOLOGY_UNAVAILABLE) {
7712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const chromeos::DeviceState* device =
77258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)          handler->GetDeviceStateByType(NetworkTypePattern::Mobile());
7732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      show_other_mobile = (device && device->support_network_scan());
7742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
7752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (show_other_mobile) {
7762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      other_mobile_->SetVisible(true);
7772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      other_mobile_->SetEnabled(
778c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          state == NetworkStateHandler::TECHNOLOGY_ENABLED);
7792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    } else {
7802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      other_mobile_->SetVisible(false);
7812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
7822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (!layout_parent)
7832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      layout_parent = other_wifi_->parent();
7842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
7852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (layout_parent)
7872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    layout_parent->Layout();
7882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void NetworkStateListDetailedView::CreateSettingsEntry() {
7912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
7922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (login_ != user::LOGGED_IN_NONE) {
7932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Settings, only if logged in.
7942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    settings_ = new TrayPopupLabelButton(
7952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        this, rb.GetLocalizedString(IDS_ASH_STATUS_TRAY_NETWORK_SETTINGS));
7962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else {
7972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    proxy_settings_ = new TrayPopupLabelButton(
7982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        this,
7992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        rb.GetLocalizedString(IDS_ASH_STATUS_TRAY_NETWORK_PROXY_SETTINGS));
8002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
8012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
8022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void NetworkStateListDetailedView::ToggleInfoBubble() {
8042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (ResetInfoBubble())
8052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
8062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  info_bubble_ = new InfoBubble(
8084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      info_icon_, CreateNetworkInfoView(), this);
8092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  views::BubbleDelegateView::CreateBubble(info_bubble_)->Show();
8102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
8112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool NetworkStateListDetailedView::ResetInfoBubble() {
8132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!info_bubble_)
8142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
8152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  info_bubble_->GetWidget()->Close();
8162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  info_bubble_ = NULL;
8172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return true;
8182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
8192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void NetworkStateListDetailedView::OnInfoBubbleDestroyed() {
8214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  info_bubble_ = NULL;
8224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
8234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
8242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)views::View* NetworkStateListDetailedView::CreateNetworkInfoView() {
8252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ui::ResourceBundle& bundle = ui::ResourceBundle::GetSharedInstance();
82690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  NetworkStateHandler* handler = NetworkHandler::Get()->network_state_handler();
8272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string ip_address("0.0.0.0");
8292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const NetworkState* network = handler->DefaultNetwork();
8302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (network)
8312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ip_address = network->ip_address();
8322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  views::View* container = new views::View;
8342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  container->SetLayoutManager(
8352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new views::BoxLayout(views::BoxLayout::kVertical, 0, 0, 1));
8362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  container->set_border(views::Border::CreateEmptyBorder(0, 5, 0, 5));
8372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string ethernet_address, wifi_address, vpn_address;
8397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (list_type_ != LIST_TYPE_VPN) {
84058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    ethernet_address = handler->FormattedHardwareAddressForType(
84158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        NetworkTypePattern::Ethernet());
8422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    wifi_address =
84358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        handler->FormattedHardwareAddressForType(NetworkTypePattern::WiFi());
8447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  } else {
8452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    vpn_address =
84658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        handler->FormattedHardwareAddressForType(NetworkTypePattern::VPN());
8472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
8482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!ip_address.empty()) {
8502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    container->AddChildView(CreateInfoBubbleLine(bundle.GetLocalizedString(
8512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        IDS_ASH_STATUS_TRAY_IP), ip_address));
8522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
8532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!ethernet_address.empty()) {
8542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    container->AddChildView(CreateInfoBubbleLine(bundle.GetLocalizedString(
8552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        IDS_ASH_STATUS_TRAY_ETHERNET), ethernet_address));
8562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
8572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!wifi_address.empty()) {
8582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    container->AddChildView(CreateInfoBubbleLine(bundle.GetLocalizedString(
8592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        IDS_ASH_STATUS_TRAY_WIFI), wifi_address));
8602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
8612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!vpn_address.empty()) {
8622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    container->AddChildView(CreateInfoBubbleLine(bundle.GetLocalizedString(
8632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        IDS_ASH_STATUS_TRAY_VPN), vpn_address));
8642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
8652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Avoid an empty bubble in the unlikely event that there is no network
8672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // information at all.
8682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!container->has_children()) {
8692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    container->AddChildView(CreateInfoBubbleLabel(bundle.GetLocalizedString(
8702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        IDS_ASH_STATUS_TRAY_NO_NETWORKS)));
8712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
8722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return container;
8742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
8752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
876c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void NetworkStateListDetailedView::CallRequestScan() {
877c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  VLOG(1) << "Requesting Network Scan.";
87890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  NetworkHandler::Get()->network_state_handler()->RequestScan();
879c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Periodically request a scan while this UI is open.
880c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::MessageLoopForUI::current()->PostDelayedTask(
881c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      FROM_HERE,
882c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::Bind(&NetworkStateListDetailedView::CallRequestScan, AsWeakPtr()),
883c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::TimeDelta::FromSeconds(kRequestScanDelaySeconds));
884c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
885c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
886c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void NetworkStateListDetailedView::ToggleMobile() {
88790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  NetworkStateHandler* handler = NetworkHandler::Get()->network_state_handler();
888c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool enabled =
88958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      handler->IsTechnologyEnabled(NetworkTypePattern::Mobile());
89058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ash::network_connect::SetTechnologyEnabled(NetworkTypePattern::Mobile(),
89158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                             !enabled);
892c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
8932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace tray
8952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace internal
8962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace ash
897