Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(476)

Side by Side Diff: chrome/browser/chromeos/status/network_menu_button.cc

Issue 650074: New network menu button UI for ChromeOS.... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 10 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2009 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/chromeos/status/network_menu_button.h" 5 #include "chrome/browser/chromeos/status/network_menu_button.h"
6 6
7 #include <limits> 7 #include <limits>
8 8
9 #include "app/gfx/canvas.h" 9 #include "app/gfx/canvas.h"
10 #include "app/gfx/skbitmap_operations.h" 10 #include "app/gfx/skbitmap_operations.h"
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
48 } 48 }
49 49
50 menus::MenuModel::ItemType NetworkMenuButton::GetTypeAt(int index) const { 50 menus::MenuModel::ItemType NetworkMenuButton::GetTypeAt(int index) const {
51 return menu_items_[index].type; 51 return menu_items_[index].type;
52 } 52 }
53 53
54 string16 NetworkMenuButton::GetLabelAt(int index) const { 54 string16 NetworkMenuButton::GetLabelAt(int index) const {
55 return menu_items_[index].label; 55 return menu_items_[index].label;
56 } 56 }
57 57
58 const gfx::Font* NetworkMenuButton::GetLabelFontAt(int index) const {
59 return (menu_items_[index].flags & FLAG_BOLD) ?
60 &ResourceBundle::GetSharedInstance().GetFont(ResourceBundle::BoldFont) :
61 NULL;
62 }
63
58 bool NetworkMenuButton::IsItemCheckedAt(int index) const { 64 bool NetworkMenuButton::IsItemCheckedAt(int index) const {
59 // All menus::MenuModel::TYPE_CHECK menu items are checked. 65 // All menus::MenuModel::TYPE_CHECK menu items are checked.
60 return true; 66 return true;
61 } 67 }
62 68
63 bool NetworkMenuButton::GetIconAt(int index, SkBitmap* icon) const { 69 bool NetworkMenuButton::GetIconAt(int index, SkBitmap* icon) const {
64 if (!menu_items_[index].icon.empty()) { 70 if (!menu_items_[index].icon.empty()) {
65 *icon = menu_items_[index].icon; 71 // Make icon smaller (if necessary) to look better in the menu.
72 static const int kMinSize = 8;
73 *icon = SkBitmapOperations::DownsampleByTwoUntilSize(
74 menu_items_[index].icon, kMinSize, kMinSize);
66 return true; 75 return true;
67 } 76 }
68 return false; 77 return false;
69 } 78 }
70 79
71 bool NetworkMenuButton::IsEnabledAt(int index) const { 80 bool NetworkMenuButton::IsEnabledAt(int index) const {
72 return !(menu_items_[index].flags & FLAG_DISABLED); 81 return !(menu_items_[index].flags & FLAG_DISABLED);
73 } 82 }
74 83
75 void NetworkMenuButton::ActivatedAt(int index) { 84 void NetworkMenuButton::ActivatedAt(int index) {
76 // When we are refreshing the menu, ignore menu item activation. 85 // When we are refreshing the menu, ignore menu item activation.
77 if (refreshing_menu_) 86 if (refreshing_menu_)
78 return; 87 return;
79 88
80 NetworkLibrary* cros = NetworkLibrary::Get(); 89 NetworkLibrary* cros = NetworkLibrary::Get();
81 90
82 if (menu_items_[index].flags & FLAG_TOGGLE_ETHERNET) { 91 if (menu_items_[index].flags & FLAG_TOGGLE_ETHERNET) {
83 cros->EnableEthernetNetworkDevice(!cros->ethernet_enabled()); 92 cros->EnableEthernetNetworkDevice(!cros->ethernet_enabled());
84 } else if (menu_items_[index].flags & FLAG_TOGGLE_WIFI) { 93 } else if (menu_items_[index].flags & FLAG_TOGGLE_WIFI) {
85 cros->EnableWifiNetworkDevice(!cros->wifi_enabled()); 94 cros->EnableWifiNetworkDevice(!cros->wifi_enabled());
86 } else if (menu_items_[index].flags & FLAG_TOGGLE_CELLULAR) { 95 } else if (menu_items_[index].flags & FLAG_TOGGLE_CELLULAR) {
87 cros->EnableCellularNetworkDevice(!cros->cellular_enabled()); 96 cros->EnableCellularNetworkDevice(!cros->cellular_enabled());
88 } else if (menu_items_[index].flags & FLAG_TOGGLE_OFFLINE) { 97 } else if (menu_items_[index].flags & FLAG_TOGGLE_OFFLINE) {
89 cros->EnableOfflineMode(!cros->offline_mode()); 98 cros->EnableOfflineMode(!cros->offline_mode());
90 } else if (menu_items_[index].flags & FLAG_ACTIVATE_WIFI) { 99 } else if (menu_items_[index].flags & FLAG_WIFI) {
91 activated_wifi_network_ = menu_items_[index].wifi_network; 100 activated_wifi_network_ = menu_items_[index].wifi_network;
92 101
93 // If clicked on a network that we are already connected to or we are 102 // If clicked on a network that we are already connected to or we are
94 // currently trying to connect to, then do nothing. 103 // currently trying to connect to, then do nothing.
95 if (activated_wifi_network_.ssid == cros->wifi_ssid()) 104 if (activated_wifi_network_.ssid == cros->wifi_ssid())
96 return; 105 return;
97 106
98 // If wifi network is not encrypted, then directly connect. 107 // If wifi network is not encrypted, then directly connect.
99 // Otherwise, we open password dialog window. 108 // Otherwise, we open password dialog window.
100 if (!activated_wifi_network_.encrypted) { 109 if (!activated_wifi_network_.encrypted) {
101 cros->ConnectToWifiNetwork(activated_wifi_network_, string16()); 110 cros->ConnectToWifiNetwork(activated_wifi_network_, string16());
102 } else { 111 } else {
103 PasswordDialogView* dialog = new PasswordDialogView(this, 112 PasswordDialogView* dialog = new PasswordDialogView(this,
104 activated_wifi_network_.ssid); 113 activated_wifi_network_.ssid);
105 views::Window* window = views::Window::CreateChromeWindow(parent_window_, 114 views::Window* window = views::Window::CreateChromeWindow(parent_window_,
106 gfx::Rect(), dialog); 115 gfx::Rect(), dialog);
107 // Draw the password dialog right below this button and right aligned. 116 // Draw the password dialog right below this button and right aligned.
108 gfx::Size size = dialog->GetPreferredSize(); 117 gfx::Size size = dialog->GetPreferredSize();
109 gfx::Rect rect = bounds(); 118 gfx::Rect rect = bounds();
110 gfx::Point point = gfx::Point(rect.width() - size.width(), rect.height()); 119 gfx::Point point = gfx::Point(rect.width() - size.width(), rect.height());
111 ConvertPointToScreen(this, &point); 120 ConvertPointToScreen(this, &point);
112 window->SetBounds(gfx::Rect(point, size), parent_window_); 121 window->SetBounds(gfx::Rect(point, size), parent_window_);
113 window->Show(); 122 window->Show();
114 } 123 }
115 } else if (menu_items_[index].flags & FLAG_ACTIVATE_CELLULAR) { 124 } else if (menu_items_[index].flags & FLAG_CELLULAR) {
125 // If clicked on a network that we are already connected to or we are
126 // currently trying to connect to, then do nothing.
127 if (menu_items_[index].cellular_network.name == cros->cellular_name())
128 return;
129
116 cros->ConnectToCellularNetwork(menu_items_[index].cellular_network); 130 cros->ConnectToCellularNetwork(menu_items_[index].cellular_network);
117 } 131 }
118 } 132 }
119 133
120 //////////////////////////////////////////////////////////////////////////////// 134 ////////////////////////////////////////////////////////////////////////////////
121 // NetworkMenuButton, PasswordDialogDelegate implementation: 135 // NetworkMenuButton, PasswordDialogDelegate implementation:
122 136
123 bool NetworkMenuButton::OnPasswordDialogAccept(const std::string& ssid, 137 bool NetworkMenuButton::OnPasswordDialogAccept(const std::string& ssid,
124 const string16& password) { 138 const string16& password) {
125 NetworkLibrary::Get()->ConnectToWifiNetwork(activated_wifi_network_, 139 NetworkLibrary::Get()->ConnectToWifiNetwork(activated_wifi_network_,
(...skipping 215 matching lines...) Expand 10 before | Expand all | Expand 10 after
341 refreshing_menu_ = false; 355 refreshing_menu_ = false;
342 network_menu_.RunMenuAt(pt, views::Menu2::ALIGN_TOPRIGHT); 356 network_menu_.RunMenuAt(pt, views::Menu2::ALIGN_TOPRIGHT);
343 } 357 }
344 358
345 void NetworkMenuButton::InitMenuItems() { 359 void NetworkMenuButton::InitMenuItems() {
346 menu_items_.clear(); 360 menu_items_.clear();
347 // Populate our MenuItems with the current list of wifi networks. 361 // Populate our MenuItems with the current list of wifi networks.
348 NetworkLibrary* cros = NetworkLibrary::Get(); 362 NetworkLibrary* cros = NetworkLibrary::Get();
349 ResourceBundle& rb = ResourceBundle::GetSharedInstance(); 363 ResourceBundle& rb = ResourceBundle::GetSharedInstance();
350 364
351 bool offline_mode = cros->offline_mode(); 365 // Ethernet
366 string16 label = l10n_util::GetStringUTF16(
367 IDS_STATUSBAR_NETWORK_DEVICE_ETHERNET);
368 SkBitmap icon = cros->ethernet_connecting() || cros->ethernet_connected() ?
369 *rb.GetBitmapNamed(IDR_STATUSBAR_WIRED_BLACK) :
370 *rb.GetBitmapNamed(IDR_STATUSBAR_NETWORK_DISCONNECTED);
371 int flag = (cros->ethernet_connecting() || cros->ethernet_connected()) ?
372 FLAG_ETHERNET & FLAG_BOLD : FLAG_ETHERNET;
373 menu_items_.push_back(MenuItem(menus::MenuModel::TYPE_COMMAND, label,
374 icon, WifiNetwork(), CellularNetwork(), flag));
352 375
353 // Wifi: Status. 376 // Wifi
354 int status = IDS_STATUSBAR_NETWORK_DEVICE_DISABLED; 377 const WifiNetworkVector& wifi_networks = cros->wifi_networks();
355 if (cros->wifi_connecting()) 378 // Wifi networks ssids.
356 status = IDS_STATUSBAR_NETWORK_DEVICE_CONNECTING; 379 for (size_t i = 0; i < wifi_networks.size(); ++i) {
357 else if (cros->wifi_connected()) 380 label = ASCIIToUTF16(wifi_networks[i].ssid);
358 status = IDS_STATUSBAR_NETWORK_DEVICE_CONNECTED; 381 flag = (wifi_networks[i].ssid == cros->wifi_ssid()) ?
359 else if (cros->wifi_enabled()) 382 FLAG_WIFI & FLAG_BOLD : FLAG_WIFI;
360 status = IDS_STATUSBAR_NETWORK_DEVICE_DISCONNECTED; 383 menu_items_.push_back(MenuItem(menus::MenuModel::TYPE_COMMAND, label,
361 string16 label = 384 IconForNetworkStrength(wifi_networks[i].strength, true),
362 l10n_util::GetStringFUTF16(IDS_STATUSBAR_NETWORK_DEVICE_STATUS, 385 wifi_networks[i], CellularNetwork(), flag));
363 l10n_util::GetStringUTF16(IDS_STATUSBAR_NETWORK_DEVICE_WIFI), 386 }
364 l10n_util::GetStringUTF16(status)); 387
365 SkBitmap icon = cros->wifi_connected() ? 388 // Cellular
366 IconForNetworkStrength(cros->wifi_strength(), true) : 389 const CellularNetworkVector& cell_networks = cros->cellular_networks();
367 *rb.GetBitmapNamed(IDR_STATUSBAR_NETWORK_DISCONNECTED); 390 // Cellular networks ssids.
368 menu_items_.push_back(MenuItem(menus::MenuModel::TYPE_COMMAND, label, 391 for (size_t i = 0; i < cell_networks.size(); ++i) {
369 icon, WifiNetwork(), CellularNetwork(), FLAG_DISABLED)); 392 label = ASCIIToUTF16(cell_networks[i].name);
393 flag = (cell_networks[i].name == cros->cellular_name()) ?
394 FLAG_CELLULAR & FLAG_BOLD : FLAG_CELLULAR;
395 menu_items_.push_back(MenuItem(menus::MenuModel::TYPE_COMMAND, label,
396 IconForNetworkStrength(cell_networks[i].strength, true),
397 WifiNetwork(), cell_networks[i], flag));
398 }
399
400 // No networks available message.
401 if (wifi_networks.empty() && cell_networks.empty()) {
402 label = l10n_util::GetStringFUTF16(IDS_STATUSBAR_NETWORK_MENU_ITEM_INDENT,
403 l10n_util::GetStringUTF16(IDS_STATUSBAR_NO_NETWORKS_MESSAGE));
404 menu_items_.push_back(MenuItem(menus::MenuModel::TYPE_COMMAND, label,
405 SkBitmap(), WifiNetwork(), CellularNetwork(), FLAG_DISABLED));
406 }
407
408 // Separator.
409 menu_items_.push_back(MenuItem());
410
411 // TODO(chocobo): Uncomment once we figure out how to do offline mode.
412 // Offline mode.
413 // menu_items_.push_back(MenuItem(cros->offline_mode() ?
414 // menus::MenuModel::TYPE_CHECK : menus::MenuModel::TYPE_COMMAND,
415 // l10n_util::GetStringUTF16(IDS_STATUSBAR_NETWORK_OFFLINE_MODE),
416 // SkBitmap(), WifiNetwork(), CellularNetwork(), FLAG_TOGGLE_OFFLINE));
370 417
371 // Turn Wifi Off. 418 // Turn Wifi Off.
372 if (!offline_mode) { 419 label = cros->wifi_enabled() ?
373 label = cros->wifi_enabled() ? 420 l10n_util::GetStringFUTF16(IDS_STATUSBAR_NETWORK_DEVICE_DISABLE,
374 l10n_util::GetStringFUTF16(IDS_STATUSBAR_NETWORK_DEVICE_DISABLE, 421 l10n_util::GetStringUTF16(IDS_STATUSBAR_NETWORK_DEVICE_WIFI)) :
375 l10n_util::GetStringUTF16(IDS_STATUSBAR_NETWORK_DEVICE_WIFI)) : 422 l10n_util::GetStringFUTF16(IDS_STATUSBAR_NETWORK_DEVICE_ENABLE,
376 l10n_util::GetStringFUTF16(IDS_STATUSBAR_NETWORK_DEVICE_ENABLE, 423 l10n_util::GetStringUTF16(IDS_STATUSBAR_NETWORK_DEVICE_WIFI));
377 l10n_util::GetStringUTF16(IDS_STATUSBAR_NETWORK_DEVICE_WIFI)); 424 menu_items_.push_back(MenuItem(menus::MenuModel::TYPE_COMMAND, label,
378 menu_items_.push_back(MenuItem(menus::MenuModel::TYPE_COMMAND, label, 425 SkBitmap(), WifiNetwork(), CellularNetwork(), FLAG_TOGGLE_WIFI));
379 SkBitmap(), WifiNetwork(), CellularNetwork(), FLAG_TOGGLE_WIFI));
380 426
381 const WifiNetworkVector& networks = cros->wifi_networks(); 427 // Turn Cellular Off.
382 // Wifi networks ssids. 428 label = cros->cellular_enabled() ?
383 if (networks.empty()) { 429 l10n_util::GetStringFUTF16(IDS_STATUSBAR_NETWORK_DEVICE_DISABLE,
384 // No networks available message. 430 l10n_util::GetStringUTF16(IDS_STATUSBAR_NETWORK_DEVICE_CELLULAR)) :
385 label = 431 l10n_util::GetStringFUTF16(IDS_STATUSBAR_NETWORK_DEVICE_ENABLE,
386 l10n_util::GetStringFUTF16(IDS_STATUSBAR_NETWORK_MENU_ITEM_INDENT, 432 l10n_util::GetStringUTF16(IDS_STATUSBAR_NETWORK_DEVICE_CELLULAR));
387 l10n_util::GetStringUTF16(IDS_STATUSBAR_NO_NETWORKS_MESSAGE)); 433 menu_items_.push_back(MenuItem(menus::MenuModel::TYPE_COMMAND, label,
388 menu_items_.push_back(MenuItem(menus::MenuModel::TYPE_COMMAND, label, 434 SkBitmap(), WifiNetwork(), CellularNetwork(), FLAG_TOGGLE_CELLULAR));
389 SkBitmap(), WifiNetwork(), CellularNetwork(), FLAG_DISABLED));
390 } else {
391 for (size_t i = 0; i < networks.size(); ++i) {
392 label =
393 l10n_util::GetStringFUTF16(IDS_STATUSBAR_NETWORK_MENU_ITEM_INDENT,
394 ASCIIToUTF16(networks[i].ssid));
395 if (networks[i].ssid == cros->wifi_ssid()) {
396 menu_items_.push_back(MenuItem(menus::MenuModel::TYPE_CHECK, label,
397 SkBitmap(), networks[i], CellularNetwork(), FLAG_ACTIVATE_WIFI));
398 } else {
399 menu_items_.push_back(MenuItem(menus::MenuModel::TYPE_COMMAND, label,
400 SkBitmap(), networks[i], CellularNetwork(), FLAG_ACTIVATE_WIFI));
401 }
402 }
403 }
404 435
436 // IP address
437 if (cros->Connected()) {
405 // Separator. 438 // Separator.
406 menu_items_.push_back(MenuItem()); 439 menu_items_.push_back(MenuItem());
440
441 menu_items_.push_back(MenuItem(menus::MenuModel::TYPE_COMMAND,
442 ASCIIToUTF16(cros->IPAddress()), SkBitmap(),
443 WifiNetwork(), CellularNetwork(), FLAG_DISABLED));
407 } 444 }
408
409 // Cellular: Status.
410 status = IDS_STATUSBAR_NETWORK_DEVICE_DISABLED;
411 if (cros->cellular_connecting())
412 status = IDS_STATUSBAR_NETWORK_DEVICE_CONNECTING;
413 else if (cros->cellular_connected())
414 status = IDS_STATUSBAR_NETWORK_DEVICE_CONNECTED;
415 else if (cros->cellular_enabled())
416 status = IDS_STATUSBAR_NETWORK_DEVICE_DISCONNECTED;
417 label =
418 l10n_util::GetStringFUTF16(IDS_STATUSBAR_NETWORK_DEVICE_STATUS,
419 l10n_util::GetStringUTF16(IDS_STATUSBAR_NETWORK_DEVICE_CELLULAR),
420 l10n_util::GetStringUTF16(status));
421 icon = cros->cellular_connected() ?
422 IconForNetworkStrength(cros->cellular_strength(), true) :
423 *rb.GetBitmapNamed(IDR_STATUSBAR_NETWORK_DISCONNECTED);
424 menu_items_.push_back(MenuItem(menus::MenuModel::TYPE_COMMAND, label,
425 icon, WifiNetwork(), CellularNetwork(), FLAG_DISABLED));
426
427 // Turn Cellular Off.
428 if (!offline_mode) {
429 label = cros->cellular_enabled() ?
430 l10n_util::GetStringFUTF16(IDS_STATUSBAR_NETWORK_DEVICE_DISABLE,
431 l10n_util::GetStringUTF16(IDS_STATUSBAR_NETWORK_DEVICE_CELLULAR)) :
432 l10n_util::GetStringFUTF16(IDS_STATUSBAR_NETWORK_DEVICE_ENABLE,
433 l10n_util::GetStringUTF16(IDS_STATUSBAR_NETWORK_DEVICE_CELLULAR));
434 menu_items_.push_back(MenuItem(menus::MenuModel::TYPE_COMMAND, label,
435 SkBitmap(), WifiNetwork(), CellularNetwork(), FLAG_TOGGLE_CELLULAR));
436
437 const CellularNetworkVector& networks = cros->cellular_networks();
438 // Cellular networks ssids.
439 if (networks.empty()) {
440 // No networks available message.
441 label =
442 l10n_util::GetStringFUTF16(IDS_STATUSBAR_NETWORK_MENU_ITEM_INDENT,
443 l10n_util::GetStringUTF16(IDS_STATUSBAR_NO_NETWORKS_MESSAGE));
444 menu_items_.push_back(MenuItem(menus::MenuModel::TYPE_COMMAND, label,
445 SkBitmap(), WifiNetwork(), CellularNetwork(), FLAG_DISABLED));
446 } else {
447 for (size_t i = 0; i < networks.size(); ++i) {
448 label =
449 l10n_util::GetStringFUTF16(IDS_STATUSBAR_NETWORK_MENU_ITEM_INDENT,
450 ASCIIToUTF16(networks[i].name));
451 if (networks[i].name == cros->cellular_name()) {
452 menu_items_.push_back(MenuItem(menus::MenuModel::TYPE_CHECK, label,
453 SkBitmap(), WifiNetwork(), networks[i], FLAG_ACTIVATE_CELLULAR));
454 } else {
455 menu_items_.push_back(MenuItem(menus::MenuModel::TYPE_COMMAND, label,
456 SkBitmap(), WifiNetwork(), networks[i], FLAG_ACTIVATE_CELLULAR));
457 }
458 }
459 }
460
461 // Separator.
462 menu_items_.push_back(MenuItem());
463 }
464
465 // Ethernet: Status.
466 status = IDS_STATUSBAR_NETWORK_DEVICE_DISABLED;
467 if (cros->ethernet_connecting())
468 status = IDS_STATUSBAR_NETWORK_DEVICE_CONNECTING;
469 else if (cros->ethernet_connected())
470 status = IDS_STATUSBAR_NETWORK_DEVICE_CONNECTED;
471 else if (cros->ethernet_enabled())
472 status = IDS_STATUSBAR_NETWORK_DEVICE_DISCONNECTED;
473 label = l10n_util::GetStringFUTF16(IDS_STATUSBAR_NETWORK_DEVICE_STATUS,
474 l10n_util::GetStringUTF16(IDS_STATUSBAR_NETWORK_DEVICE_ETHERNET),
475 l10n_util::GetStringUTF16(status));
476 icon = cros->ethernet_connected() ?
477 *rb.GetBitmapNamed(IDR_STATUSBAR_WIRED_BLACK) :
478 *rb.GetBitmapNamed(IDR_STATUSBAR_NETWORK_DISCONNECTED);
479 menu_items_.push_back(MenuItem(menus::MenuModel::TYPE_COMMAND, label,
480 icon, WifiNetwork(), CellularNetwork(), FLAG_DISABLED));
481
482 // Turn Ethernet Off.
483 if (!offline_mode) {
484 label = cros->ethernet_enabled() ?
485 l10n_util::GetStringFUTF16(IDS_STATUSBAR_NETWORK_DEVICE_DISABLE,
486 l10n_util::GetStringUTF16(IDS_STATUSBAR_NETWORK_DEVICE_ETHERNET)) :
487 l10n_util::GetStringFUTF16(IDS_STATUSBAR_NETWORK_DEVICE_ENABLE,
488 l10n_util::GetStringUTF16(IDS_STATUSBAR_NETWORK_DEVICE_ETHERNET));
489 menu_items_.push_back(MenuItem(menus::MenuModel::TYPE_COMMAND, label,
490 SkBitmap(), WifiNetwork(), CellularNetwork(), FLAG_TOGGLE_ETHERNET));
491
492 // Separator.
493 menu_items_.push_back(MenuItem());
494 }
495
496 // Offline mode.
497 menu_items_.push_back(MenuItem(offline_mode ?
498 menus::MenuModel::TYPE_CHECK : menus::MenuModel::TYPE_COMMAND,
499 l10n_util::GetStringUTF16(IDS_STATUSBAR_NETWORK_OFFLINE_MODE),
500 SkBitmap(), WifiNetwork(), CellularNetwork(), FLAG_TOGGLE_OFFLINE));
501 } 445 }
502 446
503 } // namespace chromeos 447 } // namespace chromeos
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698