network_state_list_detailed_view.cc revision 2a99a7e74a7f215066514fe81d2bfa6639d9eddd
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)
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/root_window_controller.h"
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/shell.h"
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/shell_window_ids.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/system/chromeos/network/network_icon.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/system/chromeos/network/network_icon_animation.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/system/chromeos/network/tray_network_state_observer.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/system/tray/fixed_sized_scroll_view.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/system/tray/hover_highlight_view.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/system/tray/system_tray.h"
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/system/tray/system_tray_delegate.h"
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/system/tray/tray_constants.h"
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/system/tray/tray_details_view.h"
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/command_line.h"
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/utf_string_conversions.h"
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chromeos/chromeos_switches.h"
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chromeos/network/device_state.h"
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chromeos/network/network_configuration_handler.h"
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chromeos/network/network_state.h"
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chromeos/network/network_state_handler.h"
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "grit/ash_resources.h"
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (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/aura/window.h"
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/base/l10n/l10n_util.h"
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/base/resource/resource_bundle.h"
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/bubble/bubble_delegate.h"
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/controls/label.h"
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/layout/box_layout.h"
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/layout/fill_layout.h"
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/widget/widget.h"
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using chromeos::NetworkState;
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using chromeos::NetworkStateHandler;
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace ash {
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace internal {
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace tray {
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace {
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Height of the list of networks in the popup.
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const int kNetworkListHeight = 203;
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Create a label with the font size and color used in the network info bubble.
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)views::Label* CreateInfoBubbleLabel(const string16& text) {
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  views::Label* label = new views::Label(text);
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  label->SetFont(rb.GetFont(ui::ResourceBundle::SmallFont));
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  label->SetEnabledColor(SkColorSetARGB(127, 0, 0, 0));
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return label;
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Create a label formatted for info items in the menu
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)views::Label* CreateMenuInfoLabel(const string16& text) {
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  views::Label* label = new views::Label(text);
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  label->set_border(views::Border::CreateEmptyBorder(
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ash::kTrayPopupPaddingBetweenItems,
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ash::kTrayPopupPaddingHorizontal,
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ash::kTrayPopupPaddingBetweenItems, 0));
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  label->SetHorizontalAlignment(gfx::ALIGN_LEFT);
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  label->SetEnabledColor(SkColorSetARGB(192, 0, 0, 0));
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return label;
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Create a row of labels for the network info bubble.
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)views::View* CreateInfoBubbleLine(const string16& text_label,
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                  const std::string& text_string) {
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  views::View* view = new views::View;
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  view->SetLayoutManager(
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new views::BoxLayout(views::BoxLayout::kHorizontal, 0, 0, 1));
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  view->AddChildView(CreateInfoBubbleLabel(text_label));
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  view->AddChildView(CreateInfoBubbleLabel(UTF8ToUTF16(": ")));
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  view->AddChildView(CreateInfoBubbleLabel(UTF8ToUTF16(text_string)));
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return view;
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// A bubble that cannot be activated.
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class NonActivatableSettingsBubble : public views::BubbleDelegateView {
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NonActivatableSettingsBubble(views::View* anchor, views::View* content)
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : views::BubbleDelegateView(anchor, views::BubbleBorder::TOP_RIGHT) {
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    set_use_focusless(true);
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    set_parent_window(ash::Shell::GetContainer(
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        anchor->GetWidget()->GetNativeWindow()->GetRootWindow(),
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ash::internal::kShellWindowId_SettingBubbleContainer));
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SetLayoutManager(new views::FillLayout());
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    AddChildView(content);
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~NonActivatableSettingsBubble() {}
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual bool CanActivate() const OVERRIDE { return false; }
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(NonActivatableSettingsBubble);
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//------------------------------------------------------------------------------
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)struct NetworkInfo {
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NetworkInfo(const std::string& path)
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : service_path(path),
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        disable(false),
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        highlight(false) {
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string service_path;
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  string16 label;
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::ImageSkia image;
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool disable;
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool highlight;
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//------------------------------------------------------------------------------
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// NetworkStateListDetailedView
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)NetworkStateListDetailedView::NetworkStateListDetailedView(
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SystemTrayItem* owner,
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ListType list_type,
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    user::LoginStatus login)
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : NetworkDetailedView(owner),
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      list_type_(list_type),
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      login_(login),
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      info_icon_(NULL),
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      button_wifi_(NULL),
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      button_mobile_(NULL),
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      view_mobile_account_(NULL),
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      setup_mobile_account_(NULL),
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      other_wifi_(NULL),
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      turn_on_wifi_(NULL),
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      other_mobile_(NULL),
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      other_vpn_(NULL),
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      settings_(NULL),
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      proxy_settings_(NULL),
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      scanning_view_(NULL),
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      no_wifi_networks_view_(NULL),
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      no_cellular_networks_view_(NULL),
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      info_bubble_(NULL) {
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  network_icon::NetworkIconAnimation::GetInstance()->AddObserver(this);
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)NetworkStateListDetailedView::~NetworkStateListDetailedView() {
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (info_bubble_)
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    info_bubble_->GetWidget()->CloseNow();
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  network_icon::NetworkIconAnimation::GetInstance()->RemoveObserver(this);
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void NetworkStateListDetailedView::ManagerChanged() {
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateNetworkList();
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateHeaderButtons();
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateMobileAccount();
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateNetworkExtra();
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Layout();
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void NetworkStateListDetailedView::NetworkListChanged() {
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NetworkStateList network_list;
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NetworkStateHandler::Get()->GetNetworkList(&network_list);
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateNetworks(network_list);
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateNetworkList();
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateHeaderButtons();
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateMobileAccount();
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateNetworkExtra();
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Layout();
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void NetworkStateListDetailedView::NetworkServiceChanged(
1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const NetworkState* network) {
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateNetworkList();
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Layout();
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void NetworkStateListDetailedView::NetworkIconChanged() {
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateNetworkList();
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Layout();
1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Overridden from NetworkDetailedView:
1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void NetworkStateListDetailedView::Init() {
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateScrollableList();
1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateNetworkExtra();
1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateHeaderEntry();
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateHeaderButtons();
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateMobileAccount();
1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NetworkStateHandler* handler = NetworkStateHandler::Get();
1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NetworkStateList network_list;
1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  handler->RequestScan();
1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  handler->GetNetworkList(&network_list);
1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateNetworks(network_list);
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateNetworkList();
2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateHeaderButtons();
2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateMobileAccount();
2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateNetworkExtra();
2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)NetworkDetailedView::DetailedViewType
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)NetworkStateListDetailedView::GetViewType() const {
2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return STATE_LIST_VIEW;
2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Views overrides
2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void NetworkStateListDetailedView::ButtonPressed(views::Button* sender,
2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                 const ui::Event& event) {
2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (sender == info_icon_) {
2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ToggleInfoBubble();
2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // If the info bubble was visible, close it when some other item is clicked.
2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ResetInfoBubble();
2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NetworkStateHandler* handler = NetworkStateHandler::Get();
2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ash::SystemTrayDelegate* delegate =
2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ash::Shell::GetInstance()->system_tray_delegate();
2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (sender == button_wifi_) {
2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool enabled = handler->TechnologyEnabled(flimflam::kTypeWifi);
2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    handler->SetTechnologyEnabled(
2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        flimflam::kTypeWifi, !enabled,
2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        chromeos::network_handler::ErrorCallback());
2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else if (sender == turn_on_wifi_) {
2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    handler->SetTechnologyEnabled(
2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        flimflam::kTypeWifi, true,
2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        chromeos::network_handler::ErrorCallback());
2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else if (sender == button_mobile_) {
2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // TODO: This needs to be fixed to use
2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // NetworkStateHandler::SetTechnologyEnabled instead. Currently
2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // ToggleMobile has code to handle the locked SIM case, which cannot
2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // be moved here yet due to dependencies on src/chrome/* - see,
2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // crbug.com/222540.
2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    delegate->ToggleMobile();
2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else if (sender == settings_) {
2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    delegate->ShowNetworkSettings();
2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else if (sender == proxy_settings_) {
2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    delegate->ChangeProxySettings();
2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else if (sender == other_mobile_) {
2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    delegate->ShowOtherCellular();
2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else if (sender == other_wifi_) {
2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    delegate->ShowOtherWifi();
2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else if (sender == other_vpn_) {
2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    delegate->ShowOtherVPN();
2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else {
2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    NOTREACHED();
2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void NetworkStateListDetailedView::OnViewClicked(views::View* sender) {
2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // If the info bubble was visible, close it when some other item is clicked.
2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ResetInfoBubble();
2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (sender == footer()->content()) {
2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    RootWindowController::ForWindow(GetWidget()->GetNativeView())->
2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        GetSystemTray()->ShowDefaultView(BUBBLE_USE_EXISTING);
2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (login_ == user::LOGGED_IN_LOCKED)
2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ash::SystemTrayDelegate* delegate =
2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ash::Shell::GetInstance()->system_tray_delegate();
2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (sender == view_mobile_account_) {
2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    delegate->ShowCellularURL(topup_url_);
2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else if (sender == setup_mobile_account_) {
2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    delegate->ShowCellularURL(setup_url_);
2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else {
2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    std::map<views::View*, std::string>::iterator found =
2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        network_map_.find(sender);
2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (found != network_map_.end())
2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ConnectToNetwork(found->second);
2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Create UI components.
2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void NetworkStateListDetailedView::CreateHeaderEntry() {
2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateSpecialRow(IDS_ASH_STATUS_TRAY_NETWORK, this);
2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void NetworkStateListDetailedView::CreateHeaderButtons() {
2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (list_type_ == LIST_TYPE_NETWORK) {
2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    button_wifi_ = new TrayPopupHeaderButton(
2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        this,
2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        IDR_AURA_UBER_TRAY_WIFI_ENABLED,
2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        IDR_AURA_UBER_TRAY_WIFI_DISABLED,
2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        IDR_AURA_UBER_TRAY_WIFI_ENABLED_HOVER,
2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        IDR_AURA_UBER_TRAY_WIFI_DISABLED_HOVER,
2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        IDS_ASH_STATUS_TRAY_WIFI);
2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    button_wifi_->SetTooltipText(
3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_DISABLE_WIFI));
3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    button_wifi_->SetToggledTooltipText(
3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_ENABLE_WIFI));
3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    footer()->AddButton(button_wifi_);
3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    button_mobile_ = new TrayPopupHeaderButton(
3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        this,
3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        IDR_AURA_UBER_TRAY_CELLULAR_ENABLED,
3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        IDR_AURA_UBER_TRAY_CELLULAR_DISABLED,
3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        IDR_AURA_UBER_TRAY_CELLULAR_ENABLED_HOVER,
3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        IDR_AURA_UBER_TRAY_CELLULAR_DISABLED_HOVER,
3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        IDS_ASH_STATUS_TRAY_CELLULAR);
3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    button_mobile_->SetTooltipText(
3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_DISABLE_MOBILE));
3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    button_mobile_->SetToggledTooltipText(
3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_ENABLE_MOBILE));
3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    footer()->AddButton(button_mobile_);
3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  info_icon_ = new TrayPopupHeaderButton(
3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      this,
3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      IDR_AURA_UBER_TRAY_NETWORK_INFO,
3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      IDR_AURA_UBER_TRAY_NETWORK_INFO,
3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      IDR_AURA_UBER_TRAY_NETWORK_INFO_HOVER,
3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      IDR_AURA_UBER_TRAY_NETWORK_INFO_HOVER,
3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      IDS_ASH_STATUS_TRAY_NETWORK_INFO);
3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  info_icon_->SetTooltipText(
3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_NETWORK_INFO));
3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  footer()->AddButton(info_icon_);
3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void NetworkStateListDetailedView::CreateMobileAccount() {
3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (list_type_ != LIST_TYPE_NETWORK)
3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  HoverHighlightView* container = new HoverHighlightView(this);
3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  container->AddLabel(
3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::ResourceBundle::GetSharedInstance().
3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GetLocalizedString(IDS_ASH_STATUS_TRAY_MOBILE_VIEW_ACCOUNT),
3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      gfx::Font::NORMAL);
3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AddChildView(container);
3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  view_mobile_account_ = container;
3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  container = new HoverHighlightView(this);
3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  container->AddLabel(ui::ResourceBundle::GetSharedInstance().
3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      GetLocalizedString(IDS_ASH_STATUS_TRAY_SETUP_MOBILE),
3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      gfx::Font::NORMAL);
3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AddChildView(container);
3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  setup_mobile_account_ = container;
3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void NetworkStateListDetailedView::CreateNetworkExtra() {
3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (login_ == user::LOGGED_IN_LOCKED)
3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  views::View* bottom_row = new views::View();
3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  views::BoxLayout* layout = new views::BoxLayout(
3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      views::BoxLayout::kHorizontal,
3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      kTrayMenuBottomRowPadding,
3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      kTrayMenuBottomRowPadding,
3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      kTrayMenuBottomRowPaddingBetweenItems);
3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layout->set_spread_blank_space(true);
3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bottom_row->SetLayoutManager(layout);
3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (list_type_ == LIST_TYPE_NETWORK) {
3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    other_wifi_ = new TrayPopupLabelButton(
3682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        this, rb.GetLocalizedString(IDS_ASH_STATUS_TRAY_OTHER_WIFI));
3692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bottom_row->AddChildView(other_wifi_);
3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    turn_on_wifi_ = new TrayPopupLabelButton(
3722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        this, rb.GetLocalizedString(IDS_ASH_STATUS_TRAY_TURN_ON_WIFI));
3732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bottom_row->AddChildView(turn_on_wifi_);
3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    other_mobile_ = new TrayPopupLabelButton(
3762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        this, rb.GetLocalizedString(IDS_ASH_STATUS_TRAY_OTHER_MOBILE));
3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bottom_row->AddChildView(other_mobile_);
3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else if (list_type_ == LIST_TYPE_VPN) {
3792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    other_vpn_ = new TrayPopupLabelButton(
3802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        this,
3812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ui::ResourceBundle::GetSharedInstance().GetLocalizedString(
3822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            IDS_ASH_STATUS_TRAY_OTHER_VPN));
3832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bottom_row->AddChildView(other_vpn_);
3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateSettingsEntry();
3872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(settings_ || proxy_settings_);
3882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bottom_row->AddChildView(settings_ ? settings_ : proxy_settings_);
3892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AddChildView(bottom_row);
3912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Update UI components.
3942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void NetworkStateListDetailedView::UpdateHeaderButtons() {
3962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NetworkStateHandler* handler = NetworkStateHandler::Get();
3972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (button_wifi_) {
3982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    button_wifi_->SetToggled(
3992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        !handler->TechnologyEnabled(flimflam::kTypeWifi));
4002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (button_mobile_) {
4022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    button_mobile_->SetToggled(!handler->TechnologyEnabled(
4032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        NetworkStateHandler::kMatchTypeMobile));
4042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    button_mobile_->SetVisible(handler->TechnologyAvailable(
4052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        NetworkStateHandler::kMatchTypeMobile));
4062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (proxy_settings_)
4082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    proxy_settings_->SetEnabled(handler->DefaultNetwork() != NULL);
4092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static_cast<views::View*>(footer())->Layout();
4112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void NetworkStateListDetailedView::UpdateNetworks(
4142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const NetworkStateList& networks) {
4152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  network_list_.clear();
4162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (NetworkStateList::const_iterator iter = networks.begin();
4172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       iter != networks.end(); ++iter) {
4182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const NetworkState* network = *iter;
4192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if ((list_type_ == LIST_TYPE_NETWORK &&
4202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        network->type() != flimflam::kTypeVPN) ||
4212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        (list_type_ == LIST_TYPE_VPN &&
4222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)         network->type() == flimflam::kTypeVPN)) {
4232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      NetworkInfo* info = new NetworkInfo(network->path());
4242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      network_list_.push_back(info);
4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
4262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void NetworkStateListDetailedView::UpdateNetworkList() {
4302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NetworkStateHandler* handler = NetworkStateHandler::Get();
4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // First, update state for all networks
4332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (size_t i = 0; i < network_list_.size(); ++i) {
4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    NetworkInfo* info = network_list_[i];
4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const NetworkState* network =
4362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        handler->GetNetworkState(info->service_path);
4372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (!network)
4382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      continue;
4392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    info->image = network_icon::GetImageForNetwork(
4402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        network, network_icon::ICON_TYPE_LIST);
4412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    info->label = network_icon::GetLabelForNetwork(
4422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        network, network_icon::ICON_TYPE_LIST);
4432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    info->highlight =
4442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        network->IsConnectedState() || network->IsConnectingState();
4452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    info->disable =
4462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        network->activation_state() == flimflam::kActivationStateActivating;
4472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Get the updated list entries
4502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  network_map_.clear();
4512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::set<std::string> new_service_paths;
4522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool needs_relayout = UpdateNetworkListEntries(&new_service_paths);
4532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Remove old children
4552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::set<std::string> remove_service_paths;
4562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (ServicePathMap::const_iterator it = service_path_map_.begin();
4572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       it != service_path_map_.end(); ++it) {
4582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (new_service_paths.find(it->first) == new_service_paths.end()) {
4592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      remove_service_paths.insert(it->first);
4602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      network_map_.erase(it->second);
4612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      scroll_content()->RemoveChildView(it->second);
4622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      needs_relayout = true;
4632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
4642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (std::set<std::string>::const_iterator remove_it =
4672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)           remove_service_paths.begin();
4682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       remove_it != remove_service_paths.end(); ++remove_it) {
4692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    service_path_map_.erase(*remove_it);
4702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (needs_relayout) {
4732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    views::View* selected_view = NULL;
4742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    for (ServicePathMap::const_iterator iter = service_path_map_.begin();
4752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)         iter != service_path_map_.end(); ++iter) {
4762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if (iter->second->hover()) {
4772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        selected_view = iter->second;
4782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
4792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      }
4802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
4812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scroll_content()->SizeToPreferredSize();
4822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    static_cast<views::View*>(scroller())->Layout();
4832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (selected_view)
4842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      scroll_content()->ScrollRectToVisible(selected_view->bounds());
4852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool NetworkStateListDetailedView::CreateOrUpdateInfoLabel(
4892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int index, const string16& text, views::Label** label) {
4902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (*label == NULL) {
4912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    *label = CreateMenuInfoLabel(text);
4922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scroll_content()->AddChildViewAt(*label, index);
4932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return true;
4942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else {
4952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    (*label)->SetText(text);
4962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return OrderChild(*label, index);
4972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool NetworkStateListDetailedView::UpdateNetworkChild(
5012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int index, const NetworkInfo* info) {
5022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool needs_relayout = false;
5032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  HoverHighlightView* container = NULL;
5042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ServicePathMap::const_iterator found =
5052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      service_path_map_.find(info->service_path);
5062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Font::FontStyle font =
5072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      info->highlight ? gfx::Font::BOLD : gfx::Font::NORMAL;
5082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (found == service_path_map_.end()) {
5092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    container = new HoverHighlightView(this);
5102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    container->AddIconAndLabel(info->image, info->label, font);
5112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scroll_content()->AddChildViewAt(container, index);
5122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    container->set_border(views::Border::CreateEmptyBorder(
5132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        0, kTrayPopupPaddingHorizontal, 0, 0));
5142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    needs_relayout = true;
5152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else {
5162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    container = found->second;
5172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    container->RemoveAllChildViews(true);
5182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    container->AddIconAndLabel(info->image, info->label, font);
5192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    container->Layout();
5202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    container->SchedulePaint();
5212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    needs_relayout = OrderChild(container, index);
5222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (info->disable)
5242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    container->SetEnabled(false);
5252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  network_map_[container] = info->service_path;
5262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  service_path_map_[info->service_path] = container;
5272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return needs_relayout;
5282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool NetworkStateListDetailedView::OrderChild(views::View* view, int index) {
5312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (scroll_content()->child_at(index) != view) {
5322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scroll_content()->ReorderChildView(view, index);
5332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return true;
5342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return false;
5362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool NetworkStateListDetailedView::UpdateNetworkListEntries(
5392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    std::set<std::string>* new_service_paths) {
5402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool needs_relayout = false;
5412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
5422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NetworkStateHandler* handler = NetworkStateHandler::Get();
5432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Insert child views
5452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int index = 0;
5462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Highlighted networks
5482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (size_t i = 0; i < network_list_.size(); ++i) {
5492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const NetworkInfo* info = network_list_[i];
5502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (info->highlight) {
5512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if (UpdateNetworkChild(index++, info))
5522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        needs_relayout = true;
5532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new_service_paths->insert(info->service_path);
5542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
5552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (list_type_ == LIST_TYPE_NETWORK) {
5582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Cellular initializing
5592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int status_message_id = network_icon::GetCellularUninitializedMsg();
5602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (!status_message_id &&
5612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        handler->TechnologyEnabled(NetworkStateHandler::kMatchTypeMobile) &&
5622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        !handler->FirstNetworkByType(NetworkStateHandler::kMatchTypeMobile)) {
5632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      status_message_id = IDS_ASH_STATUS_TRAY_NO_CELLULAR_NETWORKS;
5642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
5652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (status_message_id) {
5662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      string16 text = rb.GetLocalizedString(status_message_id);
5672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if (CreateOrUpdateInfoLabel(index++, text, &no_cellular_networks_view_))
5682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        needs_relayout = true;
5692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    } else if (no_cellular_networks_view_) {
5702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      scroll_content()->RemoveChildView(no_cellular_networks_view_);
5712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      no_cellular_networks_view_ = NULL;
5722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      needs_relayout = true;
5732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
5742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // "Wifi Enabled / Disabled"
5762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (network_list_.empty()) {
5772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      int message_id = handler->TechnologyEnabled(flimflam::kTypeWifi) ?
5782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          IDS_ASH_STATUS_TRAY_NETWORK_WIFI_ENABLED :
5792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          IDS_ASH_STATUS_TRAY_NETWORK_WIFI_DISABLED;
5802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      string16 text = rb.GetLocalizedString(message_id);
5812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if (CreateOrUpdateInfoLabel(index++, text, &no_wifi_networks_view_))
5822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        needs_relayout = true;
5832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    } else if (no_wifi_networks_view_) {
5842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      scroll_content()->RemoveChildView(no_wifi_networks_view_);
5852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      no_wifi_networks_view_ = NULL;
5862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      needs_relayout = true;
5872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
5882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // "Wifi Scanning"
5902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (handler->GetScanningByType(flimflam::kTypeWifi)) {
5912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      string16 text =
5922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          rb.GetLocalizedString(IDS_ASH_STATUS_TRAY_WIFI_SCANNING_MESSAGE);
5932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if (CreateOrUpdateInfoLabel(index++, text, &scanning_view_))
5942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        needs_relayout = true;
5952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    } else if (scanning_view_ != NULL) {
5962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      scroll_content()->RemoveChildView(scanning_view_);
5972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      scanning_view_ = NULL;
5982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      needs_relayout = true;
5992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
6002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
6012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Un-highlighted networks
6032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (size_t i = 0; i < network_list_.size(); ++i) {
6042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const NetworkInfo* info = network_list_[i];
6052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (!info->highlight) {
6062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if (UpdateNetworkChild(index++, info))
6072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        needs_relayout = true;
6082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new_service_paths->insert(info->service_path);
6092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
6102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
6112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // No networks or other messages (fallback)
6132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (index == 0) {
6142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    string16 text = rb.GetLocalizedString(IDS_ASH_STATUS_TRAY_NO_NETWORKS);
6152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (CreateOrUpdateInfoLabel(index++, text, &scanning_view_))
6162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      needs_relayout = true;
6172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
6182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return needs_relayout;
6202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void NetworkStateListDetailedView::UpdateMobileAccount() {
6232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (list_type_ != LIST_TYPE_NETWORK)
6242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
6252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  view_mobile_account_->SetVisible(false);
6272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  setup_mobile_account_->SetVisible(false);
6282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (login_ == user::LOGGED_IN_NONE)
6302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
6312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // TODO(stevenjb): Migrate this code to src/chromeos.
6332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string carrier_id, topup_url, setup_url;
6342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (Shell::GetInstance()->system_tray_delegate()->
6352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GetCellularCarrierInfo(&carrier_id, &topup_url, &setup_url)) {
6362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (carrier_id != carrier_id_) {
6372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      carrier_id_ = carrier_id;
6382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if (!topup_url.empty())
6392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        topup_url_ = topup_url;
6402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
6412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (!setup_url.empty())
6432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      setup_url_ = setup_url;
6442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (!topup_url_.empty())
6462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      view_mobile_account_->SetVisible(true);
6472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (!setup_url_.empty())
6482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      setup_mobile_account_->SetVisible(true);
6492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
6502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void NetworkStateListDetailedView::UpdateNetworkExtra() {
6532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (login_ == user::LOGGED_IN_LOCKED)
6542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
6552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  View* layout_parent = NULL;  // All these buttons have the same parent.
6572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NetworkStateHandler* handler = NetworkStateHandler::Get();
6582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (other_wifi_) {
6592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DCHECK(turn_on_wifi_);
6602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (!handler->TechnologyAvailable(flimflam::kTypeWifi)) {
6612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      turn_on_wifi_->SetVisible(false);
6622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      other_wifi_->SetVisible(false);
6632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    } else if (!handler->TechnologyEnabled(flimflam::kTypeWifi)) {
6642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      turn_on_wifi_->SetVisible(true);
6652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      other_wifi_->SetVisible(false);
6662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    } else {
6672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      turn_on_wifi_->SetVisible(false);
6682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      other_wifi_->SetVisible(true);
6692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
6702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    layout_parent = other_wifi_->parent();
6712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
6722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (other_mobile_) {
6742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool show_other_mobile = false;
6752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (handler->TechnologyAvailable(NetworkStateHandler::kMatchTypeMobile)) {
6762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const chromeos::DeviceState* device =
6772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          handler->GetDeviceStateByType(NetworkStateHandler::kMatchTypeMobile);
6782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      show_other_mobile = (device && device->support_network_scan());
6792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
6802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (show_other_mobile) {
6812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      other_mobile_->SetVisible(true);
6822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      other_mobile_->SetEnabled(
6832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          handler->TechnologyEnabled(NetworkStateHandler::kMatchTypeMobile));
6842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    } else {
6852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      other_mobile_->SetVisible(false);
6862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
6872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (!layout_parent)
6882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      layout_parent = other_wifi_->parent();
6892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
6902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (layout_parent)
6922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    layout_parent->Layout();
6932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void NetworkStateListDetailedView::CreateSettingsEntry() {
6962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
6972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (login_ != user::LOGGED_IN_NONE) {
6982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Settings, only if logged in.
6992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    settings_ = new TrayPopupLabelButton(
7002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        this, rb.GetLocalizedString(IDS_ASH_STATUS_TRAY_NETWORK_SETTINGS));
7012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else {
7022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    proxy_settings_ = new TrayPopupLabelButton(
7032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        this,
7042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        rb.GetLocalizedString(IDS_ASH_STATUS_TRAY_NETWORK_PROXY_SETTINGS));
7052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
7062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void NetworkStateListDetailedView::ToggleInfoBubble() {
7092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (ResetInfoBubble())
7102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
7112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  info_bubble_ = new NonActivatableSettingsBubble(
7132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      info_icon_, CreateNetworkInfoView());
7142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  views::BubbleDelegateView::CreateBubble(info_bubble_)->Show();
7152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool NetworkStateListDetailedView::ResetInfoBubble() {
7182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!info_bubble_)
7192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
7202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  info_bubble_->GetWidget()->Close();
7212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  info_bubble_ = NULL;
7222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return true;
7232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)views::View* NetworkStateListDetailedView::CreateNetworkInfoView() {
7262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ui::ResourceBundle& bundle = ui::ResourceBundle::GetSharedInstance();
7272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NetworkStateHandler* handler = NetworkStateHandler::Get();
7282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string ip_address("0.0.0.0");
7302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const NetworkState* network = handler->DefaultNetwork();
7312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (network)
7322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ip_address = network->ip_address();
7332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  views::View* container = new views::View;
7352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  container->SetLayoutManager(
7362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new views::BoxLayout(views::BoxLayout::kVertical, 0, 0, 1));
7372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  container->set_border(views::Border::CreateEmptyBorder(0, 5, 0, 5));
7382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string ethernet_address, wifi_address, vpn_address;
7402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (list_type_ == LIST_TYPE_NETWORK) {
7412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ethernet_address =
7422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        handler->FormattedHardwareAddressForType(flimflam::kTypeEthernet);
7432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    wifi_address =
7442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        handler->FormattedHardwareAddressForType(flimflam::kTypeWifi);
7452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else if (list_type_ == LIST_TYPE_VPN) {
7462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    vpn_address =
7472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        handler->FormattedHardwareAddressForType(flimflam::kTypeVPN);
7482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
7492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // GetNetworkAddresses returns empty strings if no information is available.
7512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!ip_address.empty()) {
7522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    container->AddChildView(CreateInfoBubbleLine(bundle.GetLocalizedString(
7532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        IDS_ASH_STATUS_TRAY_IP), ip_address));
7542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
7552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!ethernet_address.empty()) {
7562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    container->AddChildView(CreateInfoBubbleLine(bundle.GetLocalizedString(
7572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        IDS_ASH_STATUS_TRAY_ETHERNET), ethernet_address));
7582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
7592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!wifi_address.empty()) {
7602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    container->AddChildView(CreateInfoBubbleLine(bundle.GetLocalizedString(
7612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        IDS_ASH_STATUS_TRAY_WIFI), wifi_address));
7622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
7632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!vpn_address.empty()) {
7642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    container->AddChildView(CreateInfoBubbleLine(bundle.GetLocalizedString(
7652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        IDS_ASH_STATUS_TRAY_VPN), vpn_address));
7662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
7672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Avoid an empty bubble in the unlikely event that there is no network
7692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // information at all.
7702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!container->has_children()) {
7712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    container->AddChildView(CreateInfoBubbleLabel(bundle.GetLocalizedString(
7722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        IDS_ASH_STATUS_TRAY_NO_NETWORKS)));
7732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
7742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return container;
7762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void NetworkStateListDetailedView::ConnectToNetwork(
7792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const std::string& service_path) {
7802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NetworkStateHandler* handler = NetworkStateHandler::Get();
7812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const NetworkState* network = handler->GetNetworkState(service_path);
7822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!network)
7832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
7842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (CommandLine::ForCurrentProcess()->HasSwitch(
7852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          chromeos::switches::kUseNewNetworkConfigurationHandlers) &&
7862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      !network->IsConnectedState()) {
7872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    handler->set_connecting_network(service_path);
7882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    chromeos::NetworkConfigurationHandler::Get()->Connect(
7892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        service_path,
7902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        base::Bind(&base::DoNothing),
7912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        chromeos::network_handler::ErrorCallback());
7922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else {
7932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // This will show the settings UI for a connected network.
7942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // TODO(stevenjb): Change the API to explicitly show network settings.
7952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    Shell::GetInstance()->system_tray_delegate()->ConnectToNetwork(
7962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        service_path);
7972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
7982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace tray
8022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace internal
8032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace ash
804