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"
85d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (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"
115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (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/tray_network_state_observer.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/system/tray/fixed_sized_scroll_view.h"
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/system/tray/hover_highlight_view.h"
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/system/tray/system_tray.h"
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/system/tray/system_tray_delegate.h"
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/system/tray/tray_constants.h"
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/system/tray/tray_details_view.h"
21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ash/system/tray/tray_popup_header_button.h"
22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ash/system/tray/tray_popup_label_button.h"
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/command_line.h"
247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "base/message_loop/message_loop.h"
25868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
26eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h"
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chromeos/chromeos_switches.h"
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chromeos/network/device_state.h"
297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chromeos/network/network_configuration_handler.h"
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chromeos/network/network_state.h"
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chromeos/network/network_state_handler.h"
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "grit/ash_resources.h"
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "grit/ash_strings.h"
34116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "grit/ui_chromeos_strings.h"
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "third_party/cros_system_api/dbus/service_constants.h"
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/aura/window.h"
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/base/l10n/l10n_util.h"
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/base/resource/resource_bundle.h"
39116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "ui/chromeos/network/network_icon.h"
40116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "ui/chromeos/network/network_icon_animation.h"
415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "ui/chromeos/network/network_info.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;
4990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)using chromeos::NetworkHandler;
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using chromeos::NetworkState;
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using chromeos::NetworkStateHandler;
5258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)using chromeos::NetworkTypePattern;
535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)using ui::NetworkInfo;
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace ash {
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace tray {
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace {
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Delay between scan requests.
60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const int kRequestScanDelaySeconds = 10;
61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Create a label with the font size and color used in the network info bubble.
63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)views::Label* CreateInfoBubbleLabel(const base::string16& text) {
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  views::Label* label = new views::Label(text);
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  label->SetFontList(rb.GetFontList(ui::ResourceBundle::SmallFont));
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  label->SetEnabledColor(SkColorSetARGB(127, 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.
72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)views::View* CreateInfoBubbleLine(const base::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));
785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  view->AddChildView(CreateInfoBubbleLabel(base::UTF8ToUTF16(": ")));
795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  view->AddChildView(CreateInfoBubbleLabel(base::UTF8ToUTF16(text_string)));
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return view;
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//------------------------------------------------------------------------------
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// A bubble which displays network info.
894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class NetworkStateListDetailedView::InfoBubble
904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    : public views::BubbleDelegateView {
914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) public:
924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  InfoBubble(views::View* anchor,
934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)             views::View* content,
944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)             NetworkStateListDetailedView* detailed_view)
954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      : views::BubbleDelegateView(anchor, views::BubbleBorder::TOP_RIGHT),
964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        detailed_view_(detailed_view) {
975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    set_can_activate(false);
984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    set_parent_window(ash::Shell::GetContainer(
994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        anchor->GetWidget()->GetNativeWindow()->GetRootWindow(),
100c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        ash::kShellWindowId_SettingBubbleContainer));
1014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    SetLayoutManager(new views::FillLayout());
1024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    AddChildView(content);
1034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
1044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual ~InfoBubble() {
1064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    detailed_view_->OnInfoBubbleDestroyed();
1074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
1084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) private:
1104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Not owned.
1114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  NetworkStateListDetailedView* detailed_view_;
1124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(InfoBubble);
1144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)};
1154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)//------------------------------------------------------------------------------
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// NetworkStateListDetailedView
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)NetworkStateListDetailedView::NetworkStateListDetailedView(
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SystemTrayItem* owner,
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ListType list_type,
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    user::LoginStatus login)
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : NetworkDetailedView(owner),
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      list_type_(list_type),
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      login_(login),
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      info_icon_(NULL),
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      button_wifi_(NULL),
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      button_mobile_(NULL),
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      other_wifi_(NULL),
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      turn_on_wifi_(NULL),
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      other_mobile_(NULL),
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      other_vpn_(NULL),
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      settings_(NULL),
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      proxy_settings_(NULL),
1355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      info_bubble_(NULL),
1365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      network_list_view_(this) {
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)NetworkStateListDetailedView::~NetworkStateListDetailedView() {
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (info_bubble_)
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    info_bubble_->GetWidget()->CloseNow();
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void NetworkStateListDetailedView::ManagerChanged() {
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateNetworkList();
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateHeaderButtons();
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateNetworkExtra();
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Layout();
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void NetworkStateListDetailedView::NetworkListChanged() {
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateNetworkList();
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateHeaderButtons();
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateNetworkExtra();
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Layout();
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void NetworkStateListDetailedView::NetworkServiceChanged(
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const NetworkState* network) {
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateNetworkList();
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Layout();
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Overridden from NetworkDetailedView:
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void NetworkStateListDetailedView::Init() {
1677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  Reset();
1687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  info_icon_ = NULL;
1697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  button_wifi_ = NULL;
1707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  button_mobile_ = NULL;
1717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  other_wifi_ = NULL;
1727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  turn_on_wifi_ = NULL;
1737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  other_mobile_ = NULL;
1747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  other_vpn_ = NULL;
1757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  settings_ = NULL;
1767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  proxy_settings_ = NULL;
1777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateScrollableList();
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateNetworkExtra();
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateHeaderEntry();
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateHeaderButtons();
182c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  network_list_view_.set_content_view(scroll_content());
1847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  NetworkListChanged();
1857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
186c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  CallRequestScan();
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)NetworkDetailedView::DetailedViewType
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)NetworkStateListDetailedView::GetViewType() const {
1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return STATE_LIST_VIEW;
1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Views overrides
1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void NetworkStateListDetailedView::ButtonPressed(views::Button* sender,
1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                 const ui::Event& event) {
1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (sender == info_icon_) {
1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ToggleInfoBubble();
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // If the info bubble was visible, close it when some other item is clicked.
2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ResetInfoBubble();
2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
20690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  NetworkStateHandler* handler = NetworkHandler::Get()->network_state_handler();
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ash::SystemTrayDelegate* delegate =
2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ash::Shell::GetInstance()->system_tray_delegate();
2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (sender == button_wifi_) {
21058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    bool enabled = handler->IsTechnologyEnabled(
21158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        NetworkTypePattern::WiFi());
21258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    handler->SetTechnologyEnabled(NetworkTypePattern::WiFi(),
21358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                  !enabled,
21458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                  chromeos::network_handler::ErrorCallback());
2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else if (sender == turn_on_wifi_) {
21658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    handler->SetTechnologyEnabled(NetworkTypePattern::WiFi(),
21758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                  true,
21858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                  chromeos::network_handler::ErrorCallback());
2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else if (sender == button_mobile_) {
220c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ToggleMobile();
2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else if (sender == settings_) {
2225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    Shell::GetInstance()->metrics()->RecordUserMetricsAction(
2235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        list_type_ == LIST_TYPE_VPN ?
2245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        ash::UMA_STATUS_AREA_VPN_SETTINGS_CLICKED :
2255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        ash::UMA_STATUS_AREA_NETWORK_SETTINGS_CLICKED);
22690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    delegate->ShowNetworkSettings("");
2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else if (sender == proxy_settings_) {
2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    delegate->ChangeProxySettings();
2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else if (sender == other_mobile_) {
2304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    delegate->ShowOtherNetworkDialog(shill::kTypeCellular);
2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else if (sender == other_wifi_) {
2325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    Shell::GetInstance()->metrics()->RecordUserMetricsAction(
2335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        ash::UMA_STATUS_AREA_NETWORK_JOIN_OTHER_CLICKED);
2344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    delegate->ShowOtherNetworkDialog(shill::kTypeWifi);
2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else if (sender == other_vpn_) {
2365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    Shell::GetInstance()->metrics()->RecordUserMetricsAction(
2375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        ash::UMA_STATUS_AREA_VPN_JOIN_OTHER_CLICKED);
2384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    delegate->ShowOtherNetworkDialog(shill::kTypeVPN);
2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else {
2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    NOTREACHED();
2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void NetworkStateListDetailedView::OnViewClicked(views::View* sender) {
2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // If the info bubble was visible, close it when some other item is clicked.
2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ResetInfoBubble();
2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (sender == footer()->content()) {
249a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    TransitionToDefaultView();
2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (login_ == user::LOGGED_IN_LOCKED)
2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  std::string service_path;
2575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (!network_list_view_.IsViewInList(sender, &service_path))
2587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    return;
2597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
2607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  const NetworkState* network = NetworkHandler::Get()->network_state_handler()->
2617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      GetNetworkState(service_path);
2627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (!network || network->IsConnectedState() || network->IsConnectingState()) {
2635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    Shell::GetInstance()->metrics()->RecordUserMetricsAction(
2645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        list_type_ == LIST_TYPE_VPN ?
2655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        ash::UMA_STATUS_AREA_SHOW_NETWORK_CONNECTION_DETAILS :
2665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        ash::UMA_STATUS_AREA_SHOW_VPN_CONNECTION_DETAILS);
2677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    Shell::GetInstance()->system_tray_delegate()->ShowNetworkSettings(
2687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        service_path);
2697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  } else {
2705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    Shell::GetInstance()->metrics()->RecordUserMetricsAction(
2715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        list_type_ == LIST_TYPE_VPN ?
2725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        ash::UMA_STATUS_AREA_CONNECT_TO_VPN :
2735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        ash::UMA_STATUS_AREA_CONNECT_TO_CONFIGURED_NETWORK);
2741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ash::network_connect::ConnectToNetwork(service_path);
27590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Create UI components.
2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void NetworkStateListDetailedView::CreateHeaderEntry() {
2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateSpecialRow(IDS_ASH_STATUS_TRAY_NETWORK, this);
2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void NetworkStateListDetailedView::CreateHeaderButtons() {
2857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (list_type_ != LIST_TYPE_VPN) {
2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    button_wifi_ = new TrayPopupHeaderButton(
2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        this,
2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        IDR_AURA_UBER_TRAY_WIFI_ENABLED,
2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        IDR_AURA_UBER_TRAY_WIFI_DISABLED,
2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        IDR_AURA_UBER_TRAY_WIFI_ENABLED_HOVER,
2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        IDR_AURA_UBER_TRAY_WIFI_DISABLED_HOVER,
2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        IDS_ASH_STATUS_TRAY_WIFI);
2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    button_wifi_->SetTooltipText(
2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_DISABLE_WIFI));
2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    button_wifi_->SetToggledTooltipText(
2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_ENABLE_WIFI));
2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    footer()->AddButton(button_wifi_);
2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    button_mobile_ = new TrayPopupHeaderButton(
3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        this,
3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        IDR_AURA_UBER_TRAY_CELLULAR_ENABLED,
3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        IDR_AURA_UBER_TRAY_CELLULAR_DISABLED,
3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        IDR_AURA_UBER_TRAY_CELLULAR_ENABLED_HOVER,
3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        IDR_AURA_UBER_TRAY_CELLULAR_DISABLED_HOVER,
3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        IDS_ASH_STATUS_TRAY_CELLULAR);
3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    button_mobile_->SetTooltipText(
3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_DISABLE_MOBILE));
3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    button_mobile_->SetToggledTooltipText(
3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_ENABLE_MOBILE));
3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    footer()->AddButton(button_mobile_);
3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  info_icon_ = new TrayPopupHeaderButton(
3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      this,
3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      IDR_AURA_UBER_TRAY_NETWORK_INFO,
3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      IDR_AURA_UBER_TRAY_NETWORK_INFO,
3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      IDR_AURA_UBER_TRAY_NETWORK_INFO_HOVER,
3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      IDR_AURA_UBER_TRAY_NETWORK_INFO_HOVER,
3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      IDS_ASH_STATUS_TRAY_NETWORK_INFO);
3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  info_icon_->SetTooltipText(
3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_NETWORK_INFO));
3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  footer()->AddButton(info_icon_);
3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void NetworkStateListDetailedView::CreateNetworkExtra() {
3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (login_ == user::LOGGED_IN_LOCKED)
3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  views::View* bottom_row = new views::View();
3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  views::BoxLayout* layout = new views::BoxLayout(
3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      views::BoxLayout::kHorizontal,
3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      kTrayMenuBottomRowPadding,
3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      kTrayMenuBottomRowPadding,
3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      kTrayMenuBottomRowPaddingBetweenItems);
3375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  layout->SetDefaultFlex(1);
3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bottom_row->SetLayoutManager(layout);
3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (list_type_ != LIST_TYPE_VPN) {
3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    other_wifi_ = new TrayPopupLabelButton(
3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        this, rb.GetLocalizedString(IDS_ASH_STATUS_TRAY_OTHER_WIFI));
3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bottom_row->AddChildView(other_wifi_);
3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    turn_on_wifi_ = new TrayPopupLabelButton(
3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        this, rb.GetLocalizedString(IDS_ASH_STATUS_TRAY_TURN_ON_WIFI));
3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bottom_row->AddChildView(turn_on_wifi_);
3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    other_mobile_ = new TrayPopupLabelButton(
3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        this, rb.GetLocalizedString(IDS_ASH_STATUS_TRAY_OTHER_MOBILE));
3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bottom_row->AddChildView(other_mobile_);
3527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  } else {
3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    other_vpn_ = new TrayPopupLabelButton(
3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        this,
3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ui::ResourceBundle::GetSharedInstance().GetLocalizedString(
3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            IDS_ASH_STATUS_TRAY_OTHER_VPN));
3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bottom_row->AddChildView(other_vpn_);
3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateSettingsEntry();
361c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
362c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // Both settings_ and proxy_settings_ can be NULL. This happens when
363c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // we're logged in but showing settings page is not enabled.
364c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // Example: supervised user creation flow where user session is active
365c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // but all action happens on the login window.
366c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // Allowing opening proxy settigns dialog will break assumption in
367c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  //  SystemTrayDelegateChromeOS::ChangeProxySettings(), see CHECK.
368c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  if (settings_ || proxy_settings_)
369c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    bottom_row->AddChildView(settings_ ? settings_ : proxy_settings_);
3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AddChildView(bottom_row);
3722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Update UI components.
3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void NetworkStateListDetailedView::UpdateHeaderButtons() {
37790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  NetworkStateHandler* handler = NetworkHandler::Get()->network_state_handler();
378c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (button_wifi_)
37958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    UpdateTechnologyButton(button_wifi_, NetworkTypePattern::WiFi());
3802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (button_mobile_) {
38158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    UpdateTechnologyButton(button_mobile_, NetworkTypePattern::Mobile());
3822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (proxy_settings_)
3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    proxy_settings_->SetEnabled(handler->DefaultNetwork() != NULL);
3852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static_cast<views::View*>(footer())->Layout();
3872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
389c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void NetworkStateListDetailedView::UpdateTechnologyButton(
390c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    TrayPopupHeaderButton* button,
39158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    const NetworkTypePattern& technology) {
392c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  NetworkStateHandler::TechnologyState state =
39358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      NetworkHandler::Get()->network_state_handler()->GetTechnologyState(
39458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)          technology);
395c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (state == NetworkStateHandler::TECHNOLOGY_UNAVAILABLE) {
396c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    button->SetVisible(false);
397c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return;
398c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
399c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  button->SetVisible(true);
400c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (state == NetworkStateHandler::TECHNOLOGY_AVAILABLE) {
401c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    button->SetEnabled(true);
402c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    button->SetToggled(true);
403c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  } else if (state == NetworkStateHandler::TECHNOLOGY_ENABLED) {
404c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    button->SetEnabled(true);
405c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    button->SetToggled(false);
406c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  } else if (state == NetworkStateHandler::TECHNOLOGY_ENABLING) {
407c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    button->SetEnabled(false);
408c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    button->SetToggled(false);
409c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  } else {  // Initializing
410c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    button->SetEnabled(false);
411c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    button->SetToggled(true);
412c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
413c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
414c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
4152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void NetworkStateListDetailedView::UpdateNetworkList() {
4165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  network_list_view_.UpdateNetworkList();
4172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool NetworkStateListDetailedView::OrderChild(views::View* view, int index) {
4202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (scroll_content()->child_at(index) != view) {
4212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scroll_content()->ReorderChildView(view, index);
4222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return true;
4232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return false;
4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void NetworkStateListDetailedView::UpdateNetworkExtra() {
4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (login_ == user::LOGGED_IN_LOCKED)
4292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
4302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  View* layout_parent = NULL;  // All these buttons have the same parent.
43290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  NetworkStateHandler* handler = NetworkHandler::Get()->network_state_handler();
4332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (other_wifi_) {
4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DCHECK(turn_on_wifi_);
435c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    NetworkStateHandler::TechnologyState state =
43658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        handler->GetTechnologyState(NetworkTypePattern::WiFi());
437c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (state == NetworkStateHandler::TECHNOLOGY_UNAVAILABLE) {
4382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      turn_on_wifi_->SetVisible(false);
4392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      other_wifi_->SetVisible(false);
4402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    } else {
441c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      if (state == NetworkStateHandler::TECHNOLOGY_AVAILABLE) {
442c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        turn_on_wifi_->SetVisible(true);
443c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        turn_on_wifi_->SetEnabled(true);
444c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        other_wifi_->SetVisible(false);
445c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      } else if (state == NetworkStateHandler::TECHNOLOGY_ENABLED) {
446c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        turn_on_wifi_->SetVisible(false);
447c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        other_wifi_->SetVisible(true);
448c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      } else {
449c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // Initializing or Enabling
450c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        turn_on_wifi_->SetVisible(true);
451c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        turn_on_wifi_->SetEnabled(false);
452c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        other_wifi_->SetVisible(false);
453c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      }
4542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
4552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    layout_parent = other_wifi_->parent();
4562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (other_mobile_) {
4592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool show_other_mobile = false;
460c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    NetworkStateHandler::TechnologyState state =
46158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        handler->GetTechnologyState(NetworkTypePattern::Mobile());
462c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (state != NetworkStateHandler::TECHNOLOGY_UNAVAILABLE) {
4632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const chromeos::DeviceState* device =
46458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)          handler->GetDeviceStateByType(NetworkTypePattern::Mobile());
4652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      show_other_mobile = (device && device->support_network_scan());
4662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
4672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (show_other_mobile) {
4682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      other_mobile_->SetVisible(true);
4692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      other_mobile_->SetEnabled(
470c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          state == NetworkStateHandler::TECHNOLOGY_ENABLED);
4712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    } else {
4722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      other_mobile_->SetVisible(false);
4732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
4742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (!layout_parent)
4752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      layout_parent = other_wifi_->parent();
4762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (layout_parent)
4792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    layout_parent->Layout();
4802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void NetworkStateListDetailedView::CreateSettingsEntry() {
4832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
484c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  bool show_settings = ash::Shell::GetInstance()->
485c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      system_tray_delegate()->ShouldShowSettings();
4862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (login_ != user::LOGGED_IN_NONE) {
487c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    // Allow user access settings only if user is logged in
488c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    // and showing settings is allowed. There're situations (supervised user
489c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    // creation flow) when session is started but UI flow continues within
490c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    // login UI i.e. no browser window is yet avaialable.
491c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    if (show_settings) {
492c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      settings_ = new TrayPopupLabelButton(
493c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch          this, rb.GetLocalizedString(IDS_ASH_STATUS_TRAY_NETWORK_SETTINGS));
494c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    }
495c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  } else  {
496c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    // Allow users to change proxy settings only when not logged in.
4972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    proxy_settings_ = new TrayPopupLabelButton(
4982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        this,
4992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        rb.GetLocalizedString(IDS_ASH_STATUS_TRAY_NETWORK_PROXY_SETTINGS));
5002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void NetworkStateListDetailedView::ToggleInfoBubble() {
5042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (ResetInfoBubble())
5052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
5062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  info_bubble_ = new InfoBubble(
5084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      info_icon_, CreateNetworkInfoView(), this);
5092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  views::BubbleDelegateView::CreateBubble(info_bubble_)->Show();
5102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool NetworkStateListDetailedView::ResetInfoBubble() {
5132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!info_bubble_)
5142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
5152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  info_bubble_->GetWidget()->Close();
5162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  info_bubble_ = NULL;
5172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return true;
5182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void NetworkStateListDetailedView::OnInfoBubbleDestroyed() {
5214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  info_bubble_ = NULL;
5224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
5234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
5242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)views::View* NetworkStateListDetailedView::CreateNetworkInfoView() {
5252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ui::ResourceBundle& bundle = ui::ResourceBundle::GetSharedInstance();
52690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  NetworkStateHandler* handler = NetworkHandler::Get()->network_state_handler();
5272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string ip_address("0.0.0.0");
5292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const NetworkState* network = handler->DefaultNetwork();
5302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (network)
5312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ip_address = network->ip_address();
5322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  views::View* container = new views::View;
5342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  container->SetLayoutManager(
5352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new views::BoxLayout(views::BoxLayout::kVertical, 0, 0, 1));
5365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  container->SetBorder(views::Border::CreateEmptyBorder(0, 5, 0, 5));
5372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string ethernet_address, wifi_address, vpn_address;
5397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (list_type_ != LIST_TYPE_VPN) {
54058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    ethernet_address = handler->FormattedHardwareAddressForType(
54158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        NetworkTypePattern::Ethernet());
5422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    wifi_address =
54358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        handler->FormattedHardwareAddressForType(NetworkTypePattern::WiFi());
5447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  } else {
5452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    vpn_address =
54658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        handler->FormattedHardwareAddressForType(NetworkTypePattern::VPN());
5472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!ip_address.empty()) {
5502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    container->AddChildView(CreateInfoBubbleLine(bundle.GetLocalizedString(
5512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        IDS_ASH_STATUS_TRAY_IP), ip_address));
5522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!ethernet_address.empty()) {
5542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    container->AddChildView(CreateInfoBubbleLine(bundle.GetLocalizedString(
5552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        IDS_ASH_STATUS_TRAY_ETHERNET), ethernet_address));
5562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!wifi_address.empty()) {
5582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    container->AddChildView(CreateInfoBubbleLine(bundle.GetLocalizedString(
5592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        IDS_ASH_STATUS_TRAY_WIFI), wifi_address));
5602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!vpn_address.empty()) {
5622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    container->AddChildView(CreateInfoBubbleLine(bundle.GetLocalizedString(
5632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        IDS_ASH_STATUS_TRAY_VPN), vpn_address));
5642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Avoid an empty bubble in the unlikely event that there is no network
5672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // information at all.
5682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!container->has_children()) {
5692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    container->AddChildView(CreateInfoBubbleLabel(bundle.GetLocalizedString(
5702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        IDS_ASH_STATUS_TRAY_NO_NETWORKS)));
5712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return container;
5742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
576c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void NetworkStateListDetailedView::CallRequestScan() {
577c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  VLOG(1) << "Requesting Network Scan.";
57890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  NetworkHandler::Get()->network_state_handler()->RequestScan();
579c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Periodically request a scan while this UI is open.
580c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::MessageLoopForUI::current()->PostDelayedTask(
581c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      FROM_HERE,
582c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::Bind(&NetworkStateListDetailedView::CallRequestScan, AsWeakPtr()),
583c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::TimeDelta::FromSeconds(kRequestScanDelaySeconds));
584c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
585c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
586c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void NetworkStateListDetailedView::ToggleMobile() {
58790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  NetworkStateHandler* handler = NetworkHandler::Get()->network_state_handler();
588c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool enabled =
58958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      handler->IsTechnologyEnabled(NetworkTypePattern::Mobile());
59058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ash::network_connect::SetTechnologyEnabled(NetworkTypePattern::Mobile(),
59158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                             !enabled);
592c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
5932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)views::View* NetworkStateListDetailedView::CreateViewForNetwork(
5955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    const ui::NetworkInfo& info) {
5965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  gfx::Font::FontStyle font =
5975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      info.highlight ? gfx::Font::BOLD : gfx::Font::NORMAL;
5985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  HoverHighlightView* view = new HoverHighlightView(this);
5995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  view->AddIconAndLabel(info.image, info.label, font);
6005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  view->SetBorder(
6015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      views::Border::CreateEmptyBorder(0, kTrayPopupPaddingHorizontal, 0, 0));
6025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  return view;
6035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
6045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
6055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)bool NetworkStateListDetailedView::IsViewHovered(views::View* view) {
6065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  return static_cast<HoverHighlightView*>(view)->hover();
6075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
6085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
6095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)NetworkTypePattern NetworkStateListDetailedView::GetNetworkTypePattern() const {
6105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  return list_type_ == LIST_TYPE_VPN ? NetworkTypePattern::VPN()
6115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                     : NetworkTypePattern::NonVirtual();
6125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
6135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
6145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void NetworkStateListDetailedView::UpdateViewForNetwork(
6155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    views::View* view,
6165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    const NetworkInfo& info) {
6175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  gfx::Font::FontStyle font =
6185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      info.highlight ? gfx::Font::BOLD : gfx::Font::NORMAL;
6195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  HoverHighlightView* highlight = static_cast<HoverHighlightView*>(view);
6205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  highlight->AddIconAndLabel(info.image, info.label, font);
6215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
6225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
6235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)views::Label* NetworkStateListDetailedView::CreateInfoLabel() {
6245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  views::Label* label = new views::Label();
6255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  label->SetBorder(
6265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      views::Border::CreateEmptyBorder(ash::kTrayPopupPaddingBetweenItems,
6275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                       ash::kTrayPopupPaddingHorizontal,
6285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                       ash::kTrayPopupPaddingBetweenItems,
6295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                       0));
6305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  label->SetHorizontalAlignment(gfx::ALIGN_LEFT);
6315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  label->SetEnabledColor(SkColorSetARGB(192, 0, 0, 0));
6325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  return label;
6335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
6345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
6355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void NetworkStateListDetailedView::RelayoutScrollList() {
6365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  scroller()->Layout();
6375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
6385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
6392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace tray
6402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace ash
641