blob: e4ebe740322e003c0900ea4a2956e32f5f342c5b [file] [log] [blame]
// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/chromeos/status/network_menu.h"
#include <algorithm>
#include "ash/shell.h"
#include "ash/shell_delegate.h"
#include "ash/system/chromeos/network/network_connect.h"
#include "ash/system/chromeos/network/network_icon.h"
#include "base/bind.h"
#include "base/logging.h"
#include "base/strings/stringprintf.h"
#include "base/strings/utf_string_conversions.h"
#include "chrome/browser/chromeos/choose_mobile_network_dialog.h"
#include "chrome/browser/chromeos/login/user_manager.h"
#include "chrome/browser/chromeos/mobile_config.h"
#include "chrome/browser/chromeos/options/network_config_view.h"
#include "chrome/browser/chromeos/sim_dialog_delegate.h"
#include "chrome/browser/defaults.h"
#include "chrome/browser/profiles/profile_manager.h"
#include "chrome/common/url_constants.h"
#include "chromeos/network/device_state.h"
#include "chromeos/network/network_state.h"
#include "chromeos/network/network_state_handler.h"
#include "grit/ash_resources.h"
#include "grit/ash_strings.h"
#include "grit/generated_resources.h"
#include "third_party/cros_system_api/dbus/service_constants.h"
#include "ui/base/l10n/l10n_util.h"
#include "ui/base/models/menu_model.h"
#include "ui/base/resource/resource_bundle.h"
#include "ui/gfx/image/image_skia.h"
namespace chromeos {
namespace {
// Offsets for views menu ids (main menu and submenu ids use the same
// namespace).
const int kMainIndexMask = 0x1000;
const int kMoreIndexMask = 0x4000;
// Replace '&' in a string with "&&" to allow it to be a menu item label.
std::string EscapeAmpersands(const std::string& input) {
std::string str = input;
size_t found = str.find('&');
while (found != std::string::npos) {
str.replace(found, 1, "&&");
found = str.find('&', found + 2);
}
return str;
}
// Highlight any connected or connecting networks in the UI.
bool ShouldHighlightNetwork(const NetworkState* network) {
return network->IsConnectedState() || network->IsConnectingState();
}
void ToggleTechnology(const std::string& technology) {
NetworkStateHandler* handler = NetworkHandler::Get()->network_state_handler();
bool is_enabled = handler->IsTechnologyEnabled(technology);
ash::network_connect::SetTechnologyEnabled(technology, !is_enabled);
}
} // namespace
class NetworkMenuModel : public ui::MenuModel {
public:
struct MenuItem {
MenuItem()
: type(ui::MenuModel::TYPE_SEPARATOR),
sub_menu_model(NULL),
flags(0) {
}
MenuItem(ui::MenuModel::ItemType type, string16 label, gfx::ImageSkia icon,
const std::string& service_path, int flags)
: type(type),
label(label),
icon(icon),
service_path(service_path),
sub_menu_model(NULL),
flags(flags) {
}
MenuItem(ui::MenuModel::ItemType type, string16 label, gfx::ImageSkia icon,
NetworkMenuModel* sub_menu_model, int flags)
: type(type),
label(label),
icon(icon),
sub_menu_model(sub_menu_model),
flags(flags) {
}
ui::MenuModel::ItemType type;
string16 label;
gfx::ImageSkia icon;
std::string service_path;
NetworkMenuModel* sub_menu_model; // Weak ptr.
int flags;
};
typedef std::vector<MenuItem> MenuItemVector;
explicit NetworkMenuModel(const base::WeakPtr<NetworkMenu>& owner)
: owner_(owner) {}
virtual ~NetworkMenuModel() {}
// Connect or reconnect to the network at |index|.
void ConnectToNetworkAt(int index);
// Called by NetworkMenu::UpdateMenu to initialize menu items.
virtual void InitMenuItems(bool should_open_button_options) = 0;
// Menu item field accessors.
const MenuItemVector& menu_items() const { return menu_items_; }
// ui::MenuModel implementation
// GetCommandIdAt() must be implemented by subclasses.
virtual bool HasIcons() const OVERRIDE;
virtual int GetItemCount() const OVERRIDE;
virtual ui::MenuModel::ItemType GetTypeAt(int index) const OVERRIDE;
virtual ui::MenuSeparatorType GetSeparatorTypeAt(int index) const OVERRIDE;
virtual string16 GetLabelAt(int index) const OVERRIDE;
virtual bool IsItemDynamicAt(int index) const OVERRIDE;
virtual const gfx::Font* GetLabelFontAt(int index) const OVERRIDE;
virtual bool GetAcceleratorAt(int index,
ui::Accelerator* accelerator) const OVERRIDE;
virtual bool IsItemCheckedAt(int index) const OVERRIDE;
virtual int GetGroupIdAt(int index) const OVERRIDE;
virtual bool GetIconAt(int index, gfx::Image* icon) OVERRIDE;
virtual ui::ButtonMenuItemModel* GetButtonMenuItemAt(
int index) const OVERRIDE;
virtual bool IsEnabledAt(int index) const OVERRIDE;
virtual bool IsVisibleAt(int index) const OVERRIDE;
virtual ui::MenuModel* GetSubmenuModelAt(int index) const OVERRIDE;
virtual void HighlightChangedTo(int index) OVERRIDE;
virtual void ActivatedAt(int index) OVERRIDE;
virtual void SetMenuModelDelegate(ui::MenuModelDelegate* delegate) OVERRIDE;
virtual ui::MenuModelDelegate* GetMenuModelDelegate() const OVERRIDE;
protected:
enum MenuItemFlags {
FLAG_NONE = 0,
FLAG_DISABLED = 1 << 0,
FLAG_TOGGLE_WIFI = 1 << 2,
FLAG_TOGGLE_MOBILE = 1 << 3,
FLAG_ASSOCIATED = 1 << 5,
FLAG_ETHERNET = 1 << 6,
FLAG_WIFI = 1 << 7,
FLAG_WIMAX = 1 << 8,
FLAG_CELLULAR = 1 << 9,
FLAG_OPTIONS = 1 << 10,
FLAG_ADD_WIFI = 1 << 11,
FLAG_ADD_CELLULAR = 1 << 12,
};
// Our menu items.
MenuItemVector menu_items_;
// Weak pointer to NetworkMenu that owns this MenuModel.
base::WeakPtr<NetworkMenu> owner_;
private:
// Open a dialog to set up and connect to a network.
void ShowOther(const std::string& type) const;
DISALLOW_COPY_AND_ASSIGN(NetworkMenuModel);
};
class MoreMenuModel : public NetworkMenuModel {
public:
explicit MoreMenuModel(const base::WeakPtr<NetworkMenu> owner)
: NetworkMenuModel(owner) {}
virtual ~MoreMenuModel() {}
// NetworkMenuModel implementation.
virtual void InitMenuItems(bool should_open_button_options) OVERRIDE;
// ui::MenuModel implementation
virtual int GetCommandIdAt(int index) const OVERRIDE;
private:
DISALLOW_COPY_AND_ASSIGN(MoreMenuModel);
};
class MainMenuModel : public NetworkMenuModel {
public:
explicit MainMenuModel(const base::WeakPtr<NetworkMenu>& owner)
: NetworkMenuModel(owner),
more_menu_model_(new MoreMenuModel(owner)) {
}
virtual ~MainMenuModel() {}
// NetworkMenuModel implementation.
virtual void InitMenuItems(bool should_open_button_options) OVERRIDE;
// ui::MenuModel implementation
virtual int GetCommandIdAt(int index) const OVERRIDE;
private:
void AddWirelessNetworkMenuItem(const NetworkState* wifi_network, int flag);
void AddMessageItem(const string16& msg);
scoped_ptr<MoreMenuModel> more_menu_model_;
DISALLOW_COPY_AND_ASSIGN(MainMenuModel);
};
////////////////////////////////////////////////////////////////////////////////
// NetworkMenuModel, public methods:
void NetworkMenuModel::ConnectToNetworkAt(int index) {
const std::string& service_path = menu_items_[index].service_path;
gfx::NativeWindow native_window = owner_->delegate()->GetNativeWindow();
ash::network_connect::ConnectToNetwork(service_path, native_window);
owner_->delegate()->OnConnectToNetworkRequested(service_path);
}
////////////////////////////////////////////////////////////////////////////////
// NetworkMenuModel, ui::MenuModel implementation:
bool NetworkMenuModel::HasIcons() const {
return true;
}
int NetworkMenuModel::GetItemCount() const {
return static_cast<int>(menu_items_.size());
}
ui::MenuModel::ItemType NetworkMenuModel::GetTypeAt(int index) const {
return menu_items_[index].type;
}
ui::MenuSeparatorType NetworkMenuModel::GetSeparatorTypeAt(int index) const {
return ui::NORMAL_SEPARATOR;
}
string16 NetworkMenuModel::GetLabelAt(int index) const {
return menu_items_[index].label;
}
bool NetworkMenuModel::IsItemDynamicAt(int index) const {
return false;
}
const gfx::Font* NetworkMenuModel::GetLabelFontAt(int index) const {
const gfx::Font* font = NULL;
if (menu_items_[index].flags & FLAG_ASSOCIATED) {
ResourceBundle& resource_bundle = ResourceBundle::GetSharedInstance();
font = &resource_bundle.GetFont(
browser_defaults::kAssociatedNetworkFontStyle);
}
return font;
}
bool NetworkMenuModel::GetAcceleratorAt(int index,
ui::Accelerator* accelerator) const {
return false;
}
bool NetworkMenuModel::IsItemCheckedAt(int index) const {
// All ui::MenuModel::TYPE_CHECK menu items are checked.
return true;
}
int NetworkMenuModel::GetGroupIdAt(int index) const {
return 0;
}
bool NetworkMenuModel::GetIconAt(int index, gfx::Image* icon) {
if (!menu_items_[index].icon.isNull()) {
*icon = gfx::Image(menu_items_[index].icon);
return true;
}
return false;
}
ui::ButtonMenuItemModel* NetworkMenuModel::GetButtonMenuItemAt(
int index) const {
return NULL;
}
bool NetworkMenuModel::IsEnabledAt(int index) const {
return !(menu_items_[index].flags & FLAG_DISABLED);
}
bool NetworkMenuModel::IsVisibleAt(int index) const {
return true;
}
ui::MenuModel* NetworkMenuModel::GetSubmenuModelAt(int index) const {
return menu_items_[index].sub_menu_model;
}
void NetworkMenuModel::HighlightChangedTo(int index) {
}
void NetworkMenuModel::ActivatedAt(int index) {
// When we are refreshing the menu, ignore menu item activation.
if (owner_->refreshing_menu_)
return;
int flags = menu_items_[index].flags;
if (flags & FLAG_OPTIONS) {
owner_->delegate()->OpenButtonOptions();
} else if (flags & FLAG_TOGGLE_WIFI) {
ToggleTechnology(flimflam::kTypeWifi);
} else if (flags & FLAG_TOGGLE_MOBILE) {
ToggleTechnology(NetworkStateHandler::kMatchTypeMobile);
} else if (flags & FLAG_ETHERNET) {
// Do nothing (used in login screen only)
} else if (flags & (FLAG_WIFI | FLAG_WIMAX | FLAG_CELLULAR)) {
ConnectToNetworkAt(index);
} else if (flags & FLAG_ADD_WIFI) {
ShowOther(flimflam::kTypeWifi);
} else if (flags & FLAG_ADD_CELLULAR) {
ShowOther(flimflam::kTypeCellular);
}
}
void NetworkMenuModel::SetMenuModelDelegate(ui::MenuModelDelegate* delegate) {
}
ui::MenuModelDelegate* NetworkMenuModel::GetMenuModelDelegate() const {
return NULL;
}
////////////////////////////////////////////////////////////////////////////////
// NetworkMenuModel, private methods:
void NetworkMenuModel::ShowOther(const std::string& type) const {
gfx::NativeWindow native_window = owner_->delegate()->GetNativeWindow();
if (type == flimflam::kTypeCellular)
ChooseMobileNetworkDialog::ShowDialog(native_window);
else
NetworkConfigView::ShowForType(flimflam::kTypeWifi, native_window);
}
////////////////////////////////////////////////////////////////////////////////
// MainMenuModel
void MainMenuModel::AddWirelessNetworkMenuItem(const NetworkState* network,
int flag) {
string16 label;
// Ampersand is a valid character in an SSID, but menu2 uses it to mark
// "mnemonics" for keyboard shortcuts.
std::string wifi_name = EscapeAmpersands(network->name());
if (network->IsConnectingState()) {
label = l10n_util::GetStringFUTF16(
IDS_STATUSBAR_NETWORK_DEVICE_STATUS,
UTF8ToUTF16(wifi_name),
l10n_util::GetStringUTF16(IDS_STATUSBAR_NETWORK_DEVICE_CONNECTING));
} else {
label = UTF8ToUTF16(wifi_name);
}
// We do not have convenient access to whether or not it might be possible
// to connect to a wireless network (e.g. whether certs are required), so all
// entries are enabled.
if (ShouldHighlightNetwork(network))
flag |= FLAG_ASSOCIATED;
const gfx::ImageSkia icon = ash::network_icon::GetImageForNetwork(
network, ash::network_icon::ICON_TYPE_LIST);
menu_items_.push_back(
MenuItem(ui::MenuModel::TYPE_COMMAND,
label, icon, network->path(), flag));
}
void MainMenuModel::AddMessageItem(const string16& msg) {
menu_items_.push_back(MenuItem(
ui::MenuModel::TYPE_COMMAND, msg,
gfx::ImageSkia(), std::string(), FLAG_DISABLED));
}
void MainMenuModel::InitMenuItems(bool should_open_button_options) {
menu_items_.clear();
NetworkStateHandler* handler = NetworkHandler::Get()->network_state_handler();
// Populate our MenuItems with the current list of networks.
string16 label;
// Ethernet
// Only display an ethernet icon if enabled, and an ethernet network exists.
bool ethernet_enabled = handler->IsTechnologyEnabled(flimflam::kTypeEthernet);
const NetworkState* ethernet_network =
handler->FirstNetworkByType(flimflam::kTypeEthernet);
if (ethernet_enabled && ethernet_network) {
bool ethernet_connecting = ethernet_network->IsConnectingState();
if (ethernet_connecting) {
label = l10n_util::GetStringFUTF16(
IDS_STATUSBAR_NETWORK_DEVICE_STATUS,
l10n_util::GetStringUTF16(IDS_STATUSBAR_NETWORK_DEVICE_ETHERNET),
l10n_util::GetStringUTF16(IDS_STATUSBAR_NETWORK_DEVICE_CONNECTING));
} else {
label = l10n_util::GetStringUTF16(IDS_STATUSBAR_NETWORK_DEVICE_ETHERNET);
}
int flag = FLAG_ETHERNET;
if (ShouldHighlightNetwork(ethernet_network))
flag |= FLAG_ASSOCIATED;
const gfx::ImageSkia icon = ash::network_icon::GetImageForNetwork(
ethernet_network, ash::network_icon::ICON_TYPE_LIST);
menu_items_.push_back(MenuItem(ui::MenuModel::TYPE_COMMAND,
label, icon, std::string(), flag));
}
// Get the list of all networks.
NetworkStateHandler::NetworkStateList network_list;
handler->GetNetworkList(&network_list);
// Cellular Networks
if (handler->IsTechnologyEnabled(flimflam::kTypeCellular)) {
// List Cellular networks.
for (NetworkStateHandler::NetworkStateList::const_iterator iter =
network_list.begin(); iter != network_list.end(); ++iter) {
const NetworkState* network = *iter;
if (network->type() != flimflam::kTypeCellular)
continue;
std::string activation_state = network->activation_state();
// This is only used in the login screen; do not show unactivated
// networks.
if (activation_state != flimflam::kActivationStateActivated)
continue;
// Ampersand is a valid character in a network name, but menu2 uses it
// to mark "mnemonics" for keyboard shortcuts. http://crosbug.com/14697
std::string network_name = EscapeAmpersands(network->name());
if (network->IsConnectingState()) {
label = l10n_util::GetStringFUTF16(
IDS_STATUSBAR_NETWORK_DEVICE_STATUS,
UTF8ToUTF16(network_name),
l10n_util::GetStringUTF16(IDS_STATUSBAR_NETWORK_DEVICE_CONNECTING));
} else {
label = UTF8ToUTF16(network_name);
}
int flag = FLAG_CELLULAR;
bool isActive = ShouldHighlightNetwork(network);
if (isActive)
flag |= FLAG_ASSOCIATED;
const gfx::ImageSkia icon = ash::network_icon::GetImageForNetwork(
network, ash::network_icon::ICON_TYPE_LIST);
menu_items_.push_back(
MenuItem(ui::MenuModel::TYPE_COMMAND,
label, icon, network->path(), flag));
}
// For GSM add cellular network scan.
const DeviceState* cellular_device =
handler->GetDeviceStateByType(flimflam::kTypeCellular);
if (cellular_device && cellular_device->support_network_scan()) {
const gfx::ImageSkia icon =
ash::network_icon::GetImageForDisconnectedNetwork(
ash::network_icon::ICON_TYPE_LIST, flimflam::kTypeCellular);
menu_items_.push_back(MenuItem(
ui::MenuModel::TYPE_COMMAND,
l10n_util::GetStringUTF16(
IDS_OPTIONS_SETTINGS_OTHER_CELLULAR_NETWORKS),
icon, std::string(), FLAG_ADD_CELLULAR));
}
} else {
int initializing_message_id =
ash::network_icon::GetCellularUninitializedMsg();
if (initializing_message_id) {
// Initializing cellular modem...
AddMessageItem(l10n_util::GetStringUTF16(initializing_message_id));
}
}
// Wimax Networks
if (handler->IsTechnologyEnabled(flimflam::kTypeWimax)) {
// List Wimax networks.
for (NetworkStateHandler::NetworkStateList::const_iterator iter =
network_list.begin(); iter != network_list.end(); ++iter) {
const NetworkState* network = *iter;
if (network->type() != flimflam::kTypeWimax)
continue;
AddWirelessNetworkMenuItem(network, FLAG_WIMAX);
}
}
// Wifi Networks
if (handler->IsTechnologyEnabled(flimflam::kTypeWifi)) {
// List Wifi networks.
int scanning_msg = handler->GetScanningByType(flimflam::kTypeWifi) ?
IDS_ASH_STATUS_TRAY_WIFI_SCANNING_MESSAGE : 0;
for (NetworkStateHandler::NetworkStateList::const_iterator iter =
network_list.begin(); iter != network_list.end(); ++iter) {
const NetworkState* network = *iter;
if (network->type() != flimflam::kTypeWifi)
continue;
// Add 'Searching for Wi-Fi networks...' after connected networks.
if (scanning_msg && !network->IsConnectedState()) {
AddMessageItem(l10n_util::GetStringUTF16(scanning_msg));
scanning_msg = 0;
}
AddWirelessNetworkMenuItem(network, FLAG_WIFI);
}
if (scanning_msg)
AddMessageItem(l10n_util::GetStringUTF16(scanning_msg));
const gfx::ImageSkia icon =
ash::network_icon::GetImageForConnectedNetwork(
ash::network_icon::ICON_TYPE_LIST, flimflam::kTypeWifi);
menu_items_.push_back(MenuItem(
ui::MenuModel::TYPE_COMMAND,
l10n_util::GetStringUTF16(IDS_OPTIONS_SETTINGS_OTHER_WIFI_NETWORKS),
icon, std::string(), FLAG_ADD_WIFI));
}
if (menu_items_.empty()) {
// No networks available (and not initializing cellular or wifi scanning)
AddMessageItem(l10n_util::GetStringFUTF16(
IDS_STATUSBAR_NETWORK_MENU_ITEM_INDENT,
l10n_util::GetStringUTF16(IDS_STATUSBAR_NO_NETWORKS_MESSAGE)));
}
// Enable / Disable Technology
NetworkStateHandler::TechnologyState wifi_state =
handler->GetTechnologyState(flimflam::kTypeWifi);
bool wifi_available =
wifi_state != NetworkStateHandler::TECHNOLOGY_UNAVAILABLE;
bool wifi_enabled = wifi_state == NetworkStateHandler::TECHNOLOGY_ENABLED;
NetworkStateHandler::TechnologyState mobile_state =
handler->GetTechnologyState(NetworkStateHandler::kMatchTypeMobile);
bool mobile_available =
mobile_state != NetworkStateHandler::TECHNOLOGY_UNAVAILABLE;
bool mobile_enabled = mobile_state == NetworkStateHandler::TECHNOLOGY_ENABLED;
// Do not show disable wifi or cellular during oobe.
bool show_toggle_wifi = wifi_available &&
(should_open_button_options || !wifi_enabled);
bool show_toggle_mobile = mobile_available &&
(should_open_button_options || !mobile_enabled);
if (show_toggle_wifi || show_toggle_mobile) {
menu_items_.push_back(MenuItem()); // Separator
if (show_toggle_wifi) {
int id = wifi_enabled ? IDS_STATUSBAR_NETWORK_DEVICE_DISABLE :
IDS_STATUSBAR_NETWORK_DEVICE_ENABLE;
label = l10n_util::GetStringFUTF16(id,
l10n_util::GetStringUTF16(IDS_STATUSBAR_NETWORK_DEVICE_WIFI));
int flag = FLAG_TOGGLE_WIFI;
if (wifi_state == NetworkStateHandler::TECHNOLOGY_ENABLING)
flag |= FLAG_DISABLED;
menu_items_.push_back(MenuItem(ui::MenuModel::TYPE_COMMAND, label,
gfx::ImageSkia(), std::string(), flag));
}
if (show_toggle_mobile) {
const DeviceState* mobile_device =
handler->GetDeviceStateByType(NetworkStateHandler::kMatchTypeMobile);
bool is_locked = mobile_device && !mobile_device->sim_lock_type().empty();
int id = (mobile_enabled && !is_locked)
? IDS_STATUSBAR_NETWORK_DEVICE_DISABLE
: IDS_STATUSBAR_NETWORK_DEVICE_ENABLE;
label = l10n_util::GetStringFUTF16(id,
l10n_util::GetStringUTF16(IDS_STATUSBAR_NETWORK_DEVICE_CELLULAR));
gfx::ImageSkia icon;
int flag = FLAG_TOGGLE_MOBILE;
if (mobile_state == NetworkStateHandler::TECHNOLOGY_ENABLING)
flag |= FLAG_DISABLED;
menu_items_.push_back(MenuItem(ui::MenuModel::TYPE_COMMAND, label,
icon, std::string(), flag));
}
}
// Additional links like:
// * IP Address on active interface;
// * Hardware addresses for wifi and ethernet.
more_menu_model_->InitMenuItems(should_open_button_options);
if (!more_menu_model_->menu_items().empty()) {
menu_items_.push_back(MenuItem()); // Separator
menu_items_.push_back(MenuItem(
ui::MenuModel::TYPE_SUBMENU,
l10n_util::GetStringUTF16(IDS_STATUSBAR_NETWORK_MORE),
gfx::ImageSkia(), more_menu_model_.get(), FLAG_NONE));
}
}
int MainMenuModel::GetCommandIdAt(int index) const {
return index + kMainIndexMask;
}
////////////////////////////////////////////////////////////////////////////////
// MoreMenuModel
void MoreMenuModel::InitMenuItems(bool should_open_button_options) {
menu_items_.clear();
MenuItemVector link_items;
MenuItemVector address_items;
NetworkStateHandler* handler = NetworkHandler::Get()->network_state_handler();
const NetworkState* default_network = handler->DefaultNetwork();
int message_id = -1;
if (default_network)
message_id = IDS_STATUSBAR_NETWORK_OPEN_PROXY_SETTINGS_DIALOG;
if (message_id != -1) {
link_items.push_back(MenuItem(ui::MenuModel::TYPE_COMMAND,
l10n_util::GetStringUTF16(message_id),
gfx::ImageSkia(),
std::string(),
FLAG_OPTIONS));
}
if (default_network) {
std::string ip_address = default_network->ip_address();
if (!ip_address.empty()) {
address_items.push_back(MenuItem(ui::MenuModel::TYPE_COMMAND,
ASCIIToUTF16(ip_address), gfx::ImageSkia(), std::string(),
FLAG_DISABLED));
}
}
std::string ethernet_address =
handler->FormattedHardwareAddressForType(flimflam::kTypeEthernet);
if (!ethernet_address.empty()) {
std::string label = l10n_util::GetStringUTF8(
IDS_STATUSBAR_NETWORK_DEVICE_ETHERNET) + " " + ethernet_address;
address_items.push_back(MenuItem(
ui::MenuModel::TYPE_COMMAND,
UTF8ToUTF16(label), gfx::ImageSkia(), std::string(), FLAG_DISABLED));
}
std::string wifi_address =
handler->FormattedHardwareAddressForType(flimflam::kTypeWifi);
if (!wifi_address.empty()) {
std::string label = l10n_util::GetStringUTF8(
IDS_STATUSBAR_NETWORK_DEVICE_WIFI) + " " + wifi_address;
address_items.push_back(MenuItem(
ui::MenuModel::TYPE_COMMAND,
UTF8ToUTF16(label), gfx::ImageSkia(), std::string(), FLAG_DISABLED));
}
menu_items_ = link_items;
if (!menu_items_.empty() && address_items.size() > 1)
menu_items_.push_back(MenuItem()); // Separator
menu_items_.insert(menu_items_.end(),
address_items.begin(), address_items.end());
}
int MoreMenuModel::GetCommandIdAt(int index) const {
return index + kMoreIndexMask;
}
////////////////////////////////////////////////////////////////////////////////
// NetworkMenu
NetworkMenu::Delegate::~Delegate() {
}
NetworkMenu::NetworkMenu(Delegate* delegate)
: delegate_(delegate),
refreshing_menu_(false),
weak_pointer_factory_(this) {
main_menu_model_.reset(new MainMenuModel(weak_pointer_factory_.GetWeakPtr()));
}
NetworkMenu::~NetworkMenu() {
}
ui::MenuModel* NetworkMenu::GetMenuModel() {
return main_menu_model_.get();
}
void NetworkMenu::UpdateMenu() {
refreshing_menu_ = true;
main_menu_model_->InitMenuItems(delegate_->ShouldOpenButtonOptions());
refreshing_menu_ = false;
}
} // namespace chromeos