OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/system/ash_system_tray_delegate.h" | 5 #include "chrome/browser/chromeos/system/ash_system_tray_delegate.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <set> | 8 #include <set> |
9 #include <string> | 9 #include <string> |
10 #include <vector> | 10 #include <vector> |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
59 #include "chrome/browser/chromeos/login/login_wizard.h" | 59 #include "chrome/browser/chromeos/login/login_wizard.h" |
60 #include "chrome/browser/chromeos/login/startup_utils.h" | 60 #include "chrome/browser/chromeos/login/startup_utils.h" |
61 #include "chrome/browser/chromeos/login/user.h" | 61 #include "chrome/browser/chromeos/login/user.h" |
62 #include "chrome/browser/chromeos/login/user_manager.h" | 62 #include "chrome/browser/chromeos/login/user_manager.h" |
63 #include "chrome/browser/chromeos/mobile_config.h" | 63 #include "chrome/browser/chromeos/mobile_config.h" |
64 #include "chrome/browser/chromeos/options/network_config_view.h" | 64 #include "chrome/browser/chromeos/options/network_config_view.h" |
65 #include "chrome/browser/chromeos/policy/device_cloud_policy_manager_chromeos.h" | 65 #include "chrome/browser/chromeos/policy/device_cloud_policy_manager_chromeos.h" |
66 #include "chrome/browser/chromeos/sim_dialog_delegate.h" | 66 #include "chrome/browser/chromeos/sim_dialog_delegate.h" |
67 #include "chrome/browser/chromeos/status/data_promo_notification.h" | 67 #include "chrome/browser/chromeos/status/data_promo_notification.h" |
68 #include "chrome/browser/chromeos/status/network_menu.h" | 68 #include "chrome/browser/chromeos/status/network_menu.h" |
69 #include "chrome/browser/chromeos/status/network_menu_icon.h" | |
70 #include "chrome/browser/chromeos/system/timezone_settings.h" | 69 #include "chrome/browser/chromeos/system/timezone_settings.h" |
71 #include "chrome/browser/chromeos/system_key_event_listener.h" | 70 #include "chrome/browser/chromeos/system_key_event_listener.h" |
72 #include "chrome/browser/google/google_util.h" | 71 #include "chrome/browser/google/google_util.h" |
73 #include "chrome/browser/google_apis/drive_service_interface.h" | 72 #include "chrome/browser/google_apis/drive_service_interface.h" |
74 #include "chrome/browser/lifetime/application_lifetime.h" | 73 #include "chrome/browser/lifetime/application_lifetime.h" |
75 #include "chrome/browser/policy/browser_policy_connector.h" | 74 #include "chrome/browser/policy/browser_policy_connector.h" |
76 #include "chrome/browser/policy/cloud/cloud_policy_store.h" | 75 #include "chrome/browser/policy/cloud/cloud_policy_store.h" |
77 #include "chrome/browser/profiles/profile_manager.h" | 76 #include "chrome/browser/profiles/profile_manager.h" |
78 #include "chrome/browser/ui/ash/volume_controller_chromeos.h" | 77 #include "chrome/browser/ui/ash/volume_controller_chromeos.h" |
79 #include "chrome/browser/ui/browser.h" | 78 #include "chrome/browser/ui/browser.h" |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
117 namespace chromeos { | 116 namespace chromeos { |
118 | 117 |
119 namespace { | 118 namespace { |
120 | 119 |
121 // The minimum session length limit that can be set. | 120 // The minimum session length limit that can be set. |
122 const int kSessionLengthLimitMinMs = 30 * 1000; // 30 seconds. | 121 const int kSessionLengthLimitMinMs = 30 * 1000; // 30 seconds. |
123 | 122 |
124 // The maximum session length limit that can be set. | 123 // The maximum session length limit that can be set. |
125 const int kSessionLengthLimitMaxMs = 24 * 60 * 60 * 1000; // 24 hours. | 124 const int kSessionLengthLimitMaxMs = 24 * 60 * 60 * 1000; // 24 hours. |
126 | 125 |
127 ash::NetworkIconInfo CreateNetworkIconInfo(const Network* network) { | |
128 ash::NetworkIconInfo info; | |
129 info.name = network->type() == TYPE_ETHERNET ? | |
130 l10n_util::GetStringUTF16(IDS_STATUSBAR_NETWORK_DEVICE_ETHERNET) : | |
131 UTF8ToUTF16(network->name()); | |
132 info.image = NetworkMenuIcon::GetImage(network, NetworkMenuIcon::COLOR_DARK); | |
133 info.service_path = network->service_path(); | |
134 info.connecting = network->connecting(); | |
135 info.connected = network->connected(); | |
136 info.is_cellular = network->type() == TYPE_CELLULAR; | |
137 return info; | |
138 } | |
139 | |
140 void ExtractIMEInfo(const input_method::InputMethodDescriptor& ime, | 126 void ExtractIMEInfo(const input_method::InputMethodDescriptor& ime, |
141 const input_method::InputMethodUtil& util, | 127 const input_method::InputMethodUtil& util, |
142 ash::IMEInfo* info) { | 128 ash::IMEInfo* info) { |
143 info->id = ime.id(); | 129 info->id = ime.id(); |
144 info->name = util.GetInputMethodLongName(ime); | 130 info->name = util.GetInputMethodLongName(ime); |
145 info->medium_name = util.GetInputMethodMediumName(ime); | 131 info->medium_name = util.GetInputMethodMediumName(ime); |
146 info->short_name = util.GetInputMethodShortName(ime); | 132 info->short_name = util.GetInputMethodShortName(ime); |
147 info->third_party = extension_ime_util::IsExtensionIME(ime.id()); | 133 info->third_party = extension_ime_util::IsExtensionIME(ime.id()); |
148 } | 134 } |
149 | 135 |
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
232 if (cellular->network_technology() == NETWORK_TECHNOLOGY_LTE || | 218 if (cellular->network_technology() == NETWORK_TECHNOLOGY_LTE || |
233 cellular->network_technology() == NETWORK_TECHNOLOGY_LTE_ADVANCED) | 219 cellular->network_technology() == NETWORK_TECHNOLOGY_LTE_ADVANCED) |
234 return ash::NetworkObserver::NETWORK_CELLULAR_LTE; | 220 return ash::NetworkObserver::NETWORK_CELLULAR_LTE; |
235 return ash::NetworkObserver::NETWORK_CELLULAR; | 221 return ash::NetworkObserver::NETWORK_CELLULAR; |
236 } | 222 } |
237 | 223 |
238 class SystemTrayDelegate : public ash::SystemTrayDelegate, | 224 class SystemTrayDelegate : public ash::SystemTrayDelegate, |
239 public AudioHandler::VolumeObserver, | 225 public AudioHandler::VolumeObserver, |
240 public PowerManagerClient::Observer, | 226 public PowerManagerClient::Observer, |
241 public SessionManagerClient::Observer, | 227 public SessionManagerClient::Observer, |
242 public NetworkMenuIcon::Delegate, | |
243 public NetworkMenu::Delegate, | 228 public NetworkMenu::Delegate, |
244 public NetworkLibrary::NetworkManagerObserver, | 229 public NetworkLibrary::NetworkManagerObserver, |
245 public NetworkLibrary::NetworkObserver, | |
246 public drive::JobListObserver, | 230 public drive::JobListObserver, |
247 public content::NotificationObserver, | 231 public content::NotificationObserver, |
248 public input_method::InputMethodManager::Observer, | 232 public input_method::InputMethodManager::Observer, |
249 public system::TimezoneSettings::Observer, | 233 public system::TimezoneSettings::Observer, |
250 public chromeos::SystemClockClient::Observer, | 234 public chromeos::SystemClockClient::Observer, |
251 public device::BluetoothAdapter::Observer, | 235 public device::BluetoothAdapter::Observer, |
252 public SystemKeyEventListener::CapsLockObserver, | 236 public SystemKeyEventListener::CapsLockObserver, |
253 public ash::NetworkTrayDelegate, | 237 public ash::NetworkTrayDelegate, |
254 public policy::CloudPolicyStore::Observer { | 238 public policy::CloudPolicyStore::Observer { |
255 public: | 239 public: |
256 SystemTrayDelegate() | 240 SystemTrayDelegate() |
257 : ui_weak_ptr_factory_( | 241 : ui_weak_ptr_factory_( |
258 new base::WeakPtrFactory<SystemTrayDelegate>(this)), | 242 new base::WeakPtrFactory<SystemTrayDelegate>(this)), |
259 network_icon_(new NetworkMenuIcon(this, NetworkMenuIcon::MENU_MODE)), | |
260 network_icon_dark_( | |
261 new NetworkMenuIcon(this, NetworkMenuIcon::MENU_MODE)), | |
262 network_icon_vpn_( | |
263 new NetworkMenuIcon(this, NetworkMenuIcon::MENU_MODE)), | |
264 network_menu_(new NetworkMenu(this)), | |
265 clock_type_(base::k24HourClock), | 243 clock_type_(base::k24HourClock), |
266 search_key_mapped_to_(input_method::kSearchKey), | 244 search_key_mapped_to_(input_method::kSearchKey), |
267 screen_locked_(false), | 245 screen_locked_(false), |
268 have_session_start_time_(false), | 246 have_session_start_time_(false), |
269 have_session_length_limit_(false), | 247 have_session_length_limit_(false), |
270 data_promo_notification_(new DataPromoNotification()), | 248 data_promo_notification_(new DataPromoNotification()), |
271 cellular_activating_(false), | 249 cellular_activating_(false), |
272 cellular_out_of_credits_(false), | 250 cellular_out_of_credits_(false), |
273 volume_control_delegate_(new VolumeController()) { | 251 volume_control_delegate_(new VolumeController()) { |
| 252 if (!CommandLine::ForCurrentProcess()->HasSwitch( |
| 253 chromeos::switches::kUseNewNetworkConfigurationHandlers)) { |
| 254 network_menu_.reset(new NetworkMenu(this)); |
| 255 } |
| 256 |
274 // Register notifications on construction so that events such as | 257 // Register notifications on construction so that events such as |
275 // PROFILE_CREATED do not get missed if they happen before Initialize(). | 258 // PROFILE_CREATED do not get missed if they happen before Initialize(). |
276 registrar_.Add(this, | 259 registrar_.Add(this, |
277 chrome::NOTIFICATION_UPGRADE_RECOMMENDED, | 260 chrome::NOTIFICATION_UPGRADE_RECOMMENDED, |
278 content::NotificationService::AllSources()); | 261 content::NotificationService::AllSources()); |
279 registrar_.Add(this, | 262 registrar_.Add(this, |
280 chrome::NOTIFICATION_LOGIN_USER_IMAGE_CHANGED, | 263 chrome::NOTIFICATION_LOGIN_USER_IMAGE_CHANGED, |
281 content::NotificationService::AllSources()); | 264 content::NotificationService::AllSources()); |
282 if (GetUserLoginStatus() == ash::user::LOGGED_IN_NONE) { | 265 if (GetUserLoginStatus() == ash::user::LOGGED_IN_NONE) { |
283 registrar_.Add(this, | 266 registrar_.Add(this, |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
316 OnNetworkManagerChanged(crosnet); | 299 OnNetworkManagerChanged(crosnet); |
317 | 300 |
318 input_method::InputMethodManager::Get()->AddObserver(this); | 301 input_method::InputMethodManager::Get()->AddObserver(this); |
319 | 302 |
320 system::TimezoneSettings::GetInstance()->AddObserver(this); | 303 system::TimezoneSettings::GetInstance()->AddObserver(this); |
321 DBusThreadManager::Get()->GetSystemClockClient()->AddObserver(this); | 304 DBusThreadManager::Get()->GetSystemClockClient()->AddObserver(this); |
322 | 305 |
323 if (SystemKeyEventListener::GetInstance()) | 306 if (SystemKeyEventListener::GetInstance()) |
324 SystemKeyEventListener::GetInstance()->AddCapsLockObserver(this); | 307 SystemKeyEventListener::GetInstance()->AddCapsLockObserver(this); |
325 | 308 |
326 network_icon_->SetResourceColorTheme(NetworkMenuIcon::COLOR_LIGHT); | |
327 network_icon_dark_->SetResourceColorTheme(NetworkMenuIcon::COLOR_DARK); | |
328 network_icon_vpn_->SetResourceColorTheme(NetworkMenuIcon::COLOR_DARK); | |
329 | |
330 device::BluetoothAdapterFactory::GetAdapter( | 309 device::BluetoothAdapterFactory::GetAdapter( |
331 base::Bind(&SystemTrayDelegate::InitializeOnAdapterReady, | 310 base::Bind(&SystemTrayDelegate::InitializeOnAdapterReady, |
332 ui_weak_ptr_factory_->GetWeakPtr())); | 311 ui_weak_ptr_factory_->GetWeakPtr())); |
333 } | 312 } |
334 | 313 |
335 virtual void Shutdown() OVERRIDE { | 314 virtual void Shutdown() OVERRIDE { |
336 data_promo_notification_.reset(); | 315 data_promo_notification_.reset(); |
337 } | 316 } |
338 | 317 |
339 void InitializeOnAdapterReady( | 318 void InitializeOnAdapterReady( |
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
440 case LoginState::LOGGED_IN_USER_LOCALLY_MANAGED: | 419 case LoginState::LOGGED_IN_USER_LOCALLY_MANAGED: |
441 return ash::user::LOGGED_IN_LOCALLY_MANAGED; | 420 return ash::user::LOGGED_IN_LOCALLY_MANAGED; |
442 case LoginState::LOGGED_IN_USER_KIOSK_APP: | 421 case LoginState::LOGGED_IN_USER_KIOSK_APP: |
443 return ash::user::LOGGED_IN_KIOSK_APP; | 422 return ash::user::LOGGED_IN_KIOSK_APP; |
444 } | 423 } |
445 NOTREACHED(); | 424 NOTREACHED(); |
446 return ash::user::LOGGED_IN_NONE; | 425 return ash::user::LOGGED_IN_NONE; |
447 } | 426 } |
448 | 427 |
449 virtual bool IsOobeCompleted() const OVERRIDE { | 428 virtual bool IsOobeCompleted() const OVERRIDE { |
| 429 if (!base::chromeos::IsRunningOnChromeOS() && |
| 430 LoginState::Get()->GetLoggedInState() == LoginState::LOGGED_IN_ACTIVE) |
| 431 return true; |
450 return StartupUtils::IsOobeCompleted(); | 432 return StartupUtils::IsOobeCompleted(); |
451 } | 433 } |
452 | 434 |
453 virtual void GetLoggedInUsers(ash::UserEmailList* users) OVERRIDE { | 435 virtual void GetLoggedInUsers(ash::UserEmailList* users) OVERRIDE { |
454 const UserList& logged_in_users = UserManager::Get()->GetLoggedInUsers(); | 436 const UserList& logged_in_users = UserManager::Get()->GetLoggedInUsers(); |
455 for (UserList::const_iterator it = logged_in_users.begin(); | 437 for (UserList::const_iterator it = logged_in_users.begin(); |
456 it != logged_in_users.end(); ++it) { | 438 it != logged_in_users.end(); ++it) { |
457 const User* user = (*it); | 439 const User* user = (*it); |
458 users->push_back(user->email()); | 440 users->push_back(user->email()); |
459 } | 441 } |
(...skipping 311 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
771 virtual void GetDriveOperationStatusList( | 753 virtual void GetDriveOperationStatusList( |
772 ash::DriveOperationStatusList* list) OVERRIDE { | 754 ash::DriveOperationStatusList* list) OVERRIDE { |
773 DriveSystemService* system_service = FindDriveSystemService(); | 755 DriveSystemService* system_service = FindDriveSystemService(); |
774 if (!system_service) | 756 if (!system_service) |
775 return; | 757 return; |
776 | 758 |
777 *list = ConvertToDriveStatusList( | 759 *list = ConvertToDriveStatusList( |
778 system_service->job_list()->GetJobInfoList()); | 760 system_service->job_list()->GetJobInfoList()); |
779 } | 761 } |
780 | 762 |
781 | |
782 virtual void GetMostRelevantNetworkIcon(ash::NetworkIconInfo* info, | |
783 bool dark) OVERRIDE { | |
784 NetworkMenuIcon* icon = | |
785 dark ? network_icon_dark_.get() : network_icon_.get(); | |
786 info->image = icon->GetIconAndText(&info->description); | |
787 info->tray_icon_visible = icon->ShouldShowIconInTray(); | |
788 } | |
789 | |
790 virtual void GetVirtualNetworkIcon(ash::NetworkIconInfo* info) OVERRIDE { | |
791 NetworkLibrary* crosnet = CrosLibrary::Get()->GetNetworkLibrary(); | |
792 if (crosnet->virtual_network_connected()) { | |
793 NetworkMenuIcon* icon = network_icon_vpn_.get(); | |
794 info->image = icon->GetVpnIconAndText(&info->description); | |
795 info->tray_icon_visible = false; | |
796 } else { | |
797 gfx::ImageSkia* image = NetworkMenuIcon::GetVirtualNetworkImage(); | |
798 info->image = *image; | |
799 info->description = l10n_util::GetStringUTF16( | |
800 IDS_ASH_STATUS_TRAY_VPN_DISCONNECTED); | |
801 } | |
802 } | |
803 | |
804 virtual void GetAvailableNetworks( | |
805 std::vector<ash::NetworkIconInfo>* list) OVERRIDE { | |
806 NetworkLibrary* crosnet = CrosLibrary::Get()->GetNetworkLibrary(); | |
807 | |
808 std::set<const Network*> added; | |
809 | |
810 // Add the active network first. | |
811 if (crosnet->active_nonvirtual_network()) | |
812 AddNetworkToList(list, &added, crosnet->active_nonvirtual_network()); | |
813 | |
814 if (crosnet->ethernet_network() && | |
815 crosnet->ethernet_network()->connecting_or_connected()) { | |
816 AddNetworkToList(list, &added, crosnet->ethernet_network()); | |
817 } | |
818 if (crosnet->cellular_network() | |
819 && crosnet->cellular_network()->connecting_or_connected()) { | |
820 AddNetworkToList(list, &added, crosnet->cellular_network()); | |
821 } | |
822 if (crosnet->wimax_network() | |
823 && crosnet->wimax_network()->connecting_or_connected()) { | |
824 AddNetworkToList(list, &added, crosnet->wimax_network()); | |
825 } | |
826 if (crosnet->wifi_network() | |
827 && crosnet->wifi_network()->connecting_or_connected()) { | |
828 AddNetworkToList(list, &added, crosnet->wifi_network()); | |
829 } | |
830 | |
831 // Add remaining networks by type. | |
832 | |
833 // Ethernet. | |
834 if (crosnet->ethernet_available() && crosnet->ethernet_enabled()) { | |
835 const EthernetNetwork* ethernet_network = crosnet->ethernet_network(); | |
836 if (ethernet_network) | |
837 AddNetworkToList(list, &added, ethernet_network); | |
838 } | |
839 | |
840 // Cellular. | |
841 if (crosnet->cellular_available() && crosnet->cellular_enabled()) { | |
842 const CellularNetworkVector& cell = crosnet->cellular_networks(); | |
843 for (size_t i = 0; i < cell.size(); ++i) | |
844 AddNetworkToList(list, &added, cell[i]); | |
845 } | |
846 | |
847 // Wimax. | |
848 if (crosnet->wimax_available() && crosnet->wimax_enabled()) { | |
849 const WimaxNetworkVector& wimax = crosnet->wimax_networks(); | |
850 for (size_t i = 0; i < wimax.size(); ++i) | |
851 AddNetworkToList(list, &added, wimax[i]); | |
852 } | |
853 | |
854 // Wifi. | |
855 if (crosnet->wifi_available() && crosnet->wifi_enabled()) { | |
856 const WifiNetworkVector& wifi = crosnet->wifi_networks(); | |
857 for (size_t i = 0; i < wifi.size(); ++i) | |
858 AddNetworkToList(list, &added, wifi[i]); | |
859 } | |
860 } | |
861 | |
862 virtual void GetVirtualNetworks( | |
863 std::vector<ash::NetworkIconInfo>* list) OVERRIDE { | |
864 NetworkLibrary* crosnet = CrosLibrary::Get()->GetNetworkLibrary(); | |
865 std::set<const Network*> added; | |
866 | |
867 // Add connected/connecting vpn first. | |
868 if (crosnet->virtual_network() | |
869 && crosnet->virtual_network()->connecting_or_connected()) { | |
870 AddNetworkToList(list, &added, crosnet->virtual_network()); | |
871 } | |
872 | |
873 // VPN (only if logged in). | |
874 if (GetUserLoginStatus() != ash::user::LOGGED_IN_NONE && | |
875 (crosnet->connected_network() || | |
876 crosnet->virtual_network_connected())) { | |
877 const VirtualNetworkVector& vpns = crosnet->virtual_networks(); | |
878 for (size_t i = 0; i < vpns.size(); ++i) | |
879 AddNetworkToList(list, &added, vpns[i]); | |
880 } | |
881 } | |
882 | |
883 virtual void GetNetworkAddresses(std::string* ip_address, | |
884 std::string* ethernet_mac_address, | |
885 std::string* wifi_mac_address) OVERRIDE { | |
886 NetworkLibrary* crosnet = CrosLibrary::Get()->GetNetworkLibrary(); | |
887 if (crosnet->Connected()) | |
888 *ip_address = crosnet->IPAddress(); | |
889 else | |
890 *ip_address = std::string(); | |
891 | |
892 *ethernet_mac_address = std::string(); | |
893 const NetworkDevice* ether = crosnet->FindEthernetDevice(); | |
894 if (ether) | |
895 crosnet->GetIPConfigsAndBlock(ether->device_path(), ethernet_mac_address, | |
896 NetworkLibrary::FORMAT_COLON_SEPARATED_HEX); | |
897 | |
898 *wifi_mac_address = std::string(); | |
899 const NetworkDevice* wifi = crosnet->wifi_enabled() ? | |
900 crosnet->FindWifiDevice() : NULL; | |
901 if (wifi) | |
902 crosnet->GetIPConfigsAndBlock(wifi->device_path(), wifi_mac_address, | |
903 NetworkLibrary::FORMAT_COLON_SEPARATED_HEX); | |
904 } | |
905 | |
906 virtual void ConfigureNetwork(const std::string& network_id) OVERRIDE { | 763 virtual void ConfigureNetwork(const std::string& network_id) OVERRIDE { |
907 const chromeos::NetworkState* network = network_id.empty() ? NULL : | 764 const chromeos::NetworkState* network = network_id.empty() ? NULL : |
908 chromeos::NetworkStateHandler::Get()->GetNetworkState(network_id); | 765 chromeos::NetworkStateHandler::Get()->GetNetworkState(network_id); |
909 if (!network) { | 766 if (!network) { |
910 LOG(ERROR) << "ConfigureNetwork: Network not found: " << network_id; | 767 LOG(ERROR) << "ConfigureNetwork: Network not found: " << network_id; |
911 return; | 768 return; |
912 } | 769 } |
913 if (network->type() == flimflam::kTypeWifi || | 770 if (network->type() == flimflam::kTypeWifi || |
914 network->type() == flimflam::kTypeWimax || | 771 network->type() == flimflam::kTypeWimax || |
915 network->type() == flimflam::kTypeVPN) { | 772 network->type() == flimflam::kTypeVPN) { |
(...skipping 17 matching lines...) Expand all Loading... |
933 DCHECK(!CommandLine::ForCurrentProcess()->HasSwitch( | 790 DCHECK(!CommandLine::ForCurrentProcess()->HasSwitch( |
934 chromeos::switches::kUseNewNetworkConfigurationHandlers)); | 791 chromeos::switches::kUseNewNetworkConfigurationHandlers)); |
935 NetworkLibrary* crosnet = CrosLibrary::Get()->GetNetworkLibrary(); | 792 NetworkLibrary* crosnet = CrosLibrary::Get()->GetNetworkLibrary(); |
936 Network* network = crosnet->FindNetworkByPath(network_id); | 793 Network* network = crosnet->FindNetworkByPath(network_id); |
937 if (network) | 794 if (network) |
938 network_menu_->ConnectToNetwork(network); // Shows settings if connected | 795 network_menu_->ConnectToNetwork(network); // Shows settings if connected |
939 else | 796 else |
940 ShowNetworkSettings(""); | 797 ShowNetworkSettings(""); |
941 } | 798 } |
942 | 799 |
943 virtual void RequestNetworkScan() OVERRIDE { | |
944 NetworkLibrary* crosnet = CrosLibrary::Get()->GetNetworkLibrary(); | |
945 crosnet->RequestNetworkScan(); | |
946 } | |
947 | |
948 virtual void AddBluetoothDevice() OVERRIDE { | 800 virtual void AddBluetoothDevice() OVERRIDE { |
949 // Open the Bluetooth device dialog, which automatically starts the | 801 // Open the Bluetooth device dialog, which automatically starts the |
950 // discovery process. | 802 // discovery process. |
951 content::RecordAction( | 803 content::RecordAction( |
952 content::UserMetricsAction("OpenAddBluetoothDeviceDialog")); | 804 content::UserMetricsAction("OpenAddBluetoothDeviceDialog")); |
953 chrome::ShowSettingsSubPage(GetAppropriateBrowser(), | 805 chrome::ShowSettingsSubPage(GetAppropriateBrowser(), |
954 chrome::kBluetoothAddDeviceSubPage); | 806 chrome::kBluetoothAddDeviceSubPage); |
955 } | 807 } |
956 | 808 |
957 virtual void ToggleAirplaneMode() OVERRIDE { | |
958 NetworkLibrary* crosnet = CrosLibrary::Get()->GetNetworkLibrary(); | |
959 crosnet->EnableOfflineMode(!crosnet->offline_mode()); | |
960 } | |
961 | |
962 virtual void ToggleWifi() OVERRIDE { | |
963 GetSystemTrayNotifier()->NotifyWillToggleWifi(); | |
964 network_menu_->ToggleWifi(); | |
965 } | |
966 | |
967 virtual void ToggleMobile() OVERRIDE { | |
968 network_menu_->ToggleMobile(); | |
969 } | |
970 | |
971 virtual void ToggleBluetooth() OVERRIDE { | 809 virtual void ToggleBluetooth() OVERRIDE { |
972 bluetooth_adapter_->SetPowered(!bluetooth_adapter_->IsPowered(), | 810 bluetooth_adapter_->SetPowered(!bluetooth_adapter_->IsPowered(), |
973 base::Bind(&base::DoNothing), | 811 base::Bind(&base::DoNothing), |
974 base::Bind(&BluetoothPowerFailure)); | 812 base::Bind(&BluetoothPowerFailure)); |
975 } | 813 } |
976 | 814 |
977 virtual void ShowMobileSimDialog() OVERRIDE { | 815 virtual void ShowMobileSimDialog() OVERRIDE { |
978 SimDialogDelegate::ShowDialog(GetNativeWindow(), | 816 SimDialogDelegate::ShowDialog(GetNativeWindow(), |
979 SimDialogDelegate::SIM_DIALOG_UNLOCK); | 817 SimDialogDelegate::SIM_DIALOG_UNLOCK); |
980 } | 818 } |
981 | 819 |
982 virtual void ShowOtherWifi() OVERRIDE { | 820 virtual void ShowOtherWifi() OVERRIDE { |
983 network_menu_->ShowOtherWifi(); | 821 NetworkConfigView::ShowForType(chromeos::TYPE_WIFI, GetNativeWindow()); |
984 } | 822 } |
985 | 823 |
986 virtual void ShowOtherVPN() OVERRIDE { | 824 virtual void ShowOtherVPN() OVERRIDE { |
987 network_menu_->ShowOtherVPN(); | 825 NetworkConfigView::ShowForType(chromeos::TYPE_VPN, GetNativeWindow()); |
988 } | 826 } |
989 | 827 |
990 virtual void ShowOtherCellular() OVERRIDE { | 828 virtual void ShowOtherCellular() OVERRIDE { |
991 network_menu_->ShowOtherCellular(); | 829 ChooseMobileNetworkDialog::ShowDialog(GetNativeWindow()); |
992 } | |
993 | |
994 virtual bool IsNetworkConnected() OVERRIDE { | |
995 return CrosLibrary::Get()->GetNetworkLibrary()->Connected(); | |
996 } | |
997 | |
998 virtual bool GetWifiAvailable() OVERRIDE { | |
999 return CrosLibrary::Get()->GetNetworkLibrary()->wifi_available(); | |
1000 } | |
1001 | |
1002 virtual bool GetMobileAvailable() OVERRIDE { | |
1003 return CrosLibrary::Get()->GetNetworkLibrary()->mobile_available(); | |
1004 } | 830 } |
1005 | 831 |
1006 virtual bool GetBluetoothAvailable() OVERRIDE { | 832 virtual bool GetBluetoothAvailable() OVERRIDE { |
1007 return bluetooth_adapter_->IsPresent(); | 833 return bluetooth_adapter_->IsPresent(); |
1008 } | 834 } |
1009 | 835 |
1010 virtual bool GetWifiEnabled() OVERRIDE { | |
1011 return CrosLibrary::Get()->GetNetworkLibrary()->wifi_enabled(); | |
1012 } | |
1013 | |
1014 virtual bool GetMobileEnabled() OVERRIDE { | |
1015 return CrosLibrary::Get()->GetNetworkLibrary()->mobile_enabled(); | |
1016 } | |
1017 | |
1018 virtual bool GetBluetoothEnabled() OVERRIDE { | 836 virtual bool GetBluetoothEnabled() OVERRIDE { |
1019 return bluetooth_adapter_->IsPowered(); | 837 return bluetooth_adapter_->IsPowered(); |
1020 } | 838 } |
1021 | 839 |
1022 virtual bool GetMobileScanSupported() OVERRIDE { | |
1023 NetworkLibrary* crosnet = CrosLibrary::Get()->GetNetworkLibrary(); | |
1024 const NetworkDevice* mobile = crosnet->FindMobileDevice(); | |
1025 return mobile ? mobile->support_network_scan() : false; | |
1026 } | |
1027 | |
1028 virtual bool GetCellularCarrierInfo(std::string* carrier_id, | 840 virtual bool GetCellularCarrierInfo(std::string* carrier_id, |
1029 std::string* topup_url, | 841 std::string* topup_url, |
1030 std::string* setup_url) OVERRIDE { | 842 std::string* setup_url) OVERRIDE { |
1031 bool result = false; | 843 bool result = false; |
1032 NetworkLibrary* crosnet = CrosLibrary::Get()->GetNetworkLibrary(); | 844 NetworkLibrary* crosnet = CrosLibrary::Get()->GetNetworkLibrary(); |
1033 const NetworkDevice* cellular = crosnet->FindCellularDevice(); | 845 const NetworkDevice* cellular = crosnet->FindCellularDevice(); |
1034 if (!cellular) | 846 if (!cellular) |
1035 return false; | 847 return false; |
1036 | 848 |
1037 MobileConfig* config = MobileConfig::GetInstance(); | 849 MobileConfig* config = MobileConfig::GetInstance(); |
(...skipping 10 matching lines...) Expand all Loading... |
1048 // Only link to setup URL if SIM card is not inserted. | 860 // Only link to setup URL if SIM card is not inserted. |
1049 if (cellular->is_sim_absent()) { | 861 if (cellular->is_sim_absent()) { |
1050 *setup_url = locale_config->setup_url(); | 862 *setup_url = locale_config->setup_url(); |
1051 result = true; | 863 result = true; |
1052 } | 864 } |
1053 } | 865 } |
1054 } | 866 } |
1055 return result; | 867 return result; |
1056 } | 868 } |
1057 | 869 |
1058 virtual bool GetWifiScanning() OVERRIDE { | |
1059 return CrosLibrary::Get()->GetNetworkLibrary()->wifi_scanning(); | |
1060 } | |
1061 | |
1062 virtual bool GetCellularInitializing() OVERRIDE { | |
1063 return CrosLibrary::Get()->GetNetworkLibrary()->cellular_initializing(); | |
1064 } | |
1065 | |
1066 virtual void ShowCellularURL(const std::string& url) OVERRIDE { | 870 virtual void ShowCellularURL(const std::string& url) OVERRIDE { |
1067 chrome::ShowSingletonTab(GetAppropriateBrowser(), GURL(url)); | 871 chrome::ShowSingletonTab(GetAppropriateBrowser(), GURL(url)); |
1068 } | 872 } |
1069 | 873 |
1070 virtual void ChangeProxySettings() OVERRIDE { | 874 virtual void ChangeProxySettings() OVERRIDE { |
1071 CHECK(GetUserLoginStatus() == ash::user::LOGGED_IN_NONE); | 875 CHECK(GetUserLoginStatus() == ash::user::LOGGED_IN_NONE); |
1072 LoginDisplayHostImpl::default_host()->OpenProxySettings(); | 876 LoginDisplayHostImpl::default_host()->OpenProxySettings(); |
1073 } | 877 } |
1074 | 878 |
1075 virtual ash::VolumeControlDelegate* | 879 virtual ash::VolumeControlDelegate* |
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1193 std::min(std::max(local_state->GetInteger(prefs::kSessionLengthLimit), | 997 std::min(std::max(local_state->GetInteger(prefs::kSessionLengthLimit), |
1194 kSessionLengthLimitMinMs), | 998 kSessionLengthLimitMinMs), |
1195 kSessionLengthLimitMaxMs)); | 999 kSessionLengthLimitMaxMs)); |
1196 } else { | 1000 } else { |
1197 have_session_length_limit_ = false; | 1001 have_session_length_limit_ = false; |
1198 session_length_limit_ = base::TimeDelta(); | 1002 session_length_limit_ = base::TimeDelta(); |
1199 } | 1003 } |
1200 GetSystemTrayNotifier()->NotifySessionLengthLimitChanged(); | 1004 GetSystemTrayNotifier()->NotifySessionLengthLimitChanged(); |
1201 } | 1005 } |
1202 | 1006 |
1203 void NotifyRefreshNetwork() { | |
1204 chromeos::NetworkLibrary* crosnet = | |
1205 chromeos::CrosLibrary::Get()->GetNetworkLibrary(); | |
1206 const Network* network = crosnet->connected_network(); | |
1207 ash::NetworkIconInfo info; | |
1208 if (network) | |
1209 info = CreateNetworkIconInfo(network); | |
1210 info.image = network_icon_->GetIconAndText(&info.description); | |
1211 info.tray_icon_visible = network_icon_->ShouldShowIconInTray(); | |
1212 GetSystemTrayNotifier()->NotifyRefreshNetwork(info); | |
1213 GetSystemTrayNotifier()->NotifyVpnRefreshNetwork(info); | |
1214 } | |
1215 | |
1216 void RefreshNetworkObserver(NetworkLibrary* crosnet) { | |
1217 const Network* network = crosnet->active_nonvirtual_network(); | |
1218 std::string new_path = network ? network->service_path() : std::string(); | |
1219 if (active_network_path_ != new_path) { | |
1220 if (!active_network_path_.empty()) | |
1221 crosnet->RemoveNetworkObserver(active_network_path_, this); | |
1222 if (!new_path.empty()) | |
1223 crosnet->AddNetworkObserver(new_path, this); | |
1224 active_network_path_ = new_path; | |
1225 } | |
1226 } | |
1227 | |
1228 void AddNetworkToList(std::vector<ash::NetworkIconInfo>* list, | |
1229 std::set<const Network*>* added, | |
1230 const Network* network) { | |
1231 // Only add networks to the list once. | |
1232 if (added->find(network) != added->end()) | |
1233 return; | |
1234 | |
1235 ash::NetworkIconInfo info = CreateNetworkIconInfo(network); | |
1236 switch (network->type()) { | |
1237 case TYPE_ETHERNET: | |
1238 if (info.name.empty()) { | |
1239 info.name = | |
1240 l10n_util::GetStringUTF16(IDS_STATUSBAR_NETWORK_DEVICE_ETHERNET); | |
1241 } | |
1242 break; | |
1243 case TYPE_CELLULAR: { | |
1244 const CellularNetwork* cellular = | |
1245 static_cast<const CellularNetwork*>(network); | |
1246 ActivationState state = cellular->activation_state(); | |
1247 if (state == ACTIVATION_STATE_NOT_ACTIVATED || | |
1248 state == ACTIVATION_STATE_PARTIALLY_ACTIVATED) { | |
1249 // If a cellular network needs to be activated, | |
1250 // then do not show it in the lock screen. | |
1251 if (GetUserLoginStatus() == ash::user::LOGGED_IN_LOCKED) | |
1252 return; | |
1253 | |
1254 info.description = l10n_util::GetStringFUTF16( | |
1255 IDS_ASH_STATUS_TRAY_NETWORK_LIST_ACTIVATE, info.name); | |
1256 } else if (state == ACTIVATION_STATE_ACTIVATING) { | |
1257 info.description = l10n_util::GetStringFUTF16( | |
1258 IDS_ASH_STATUS_TRAY_NETWORK_LIST_ACTIVATING, info.name); | |
1259 } else if (network->connecting()) { | |
1260 info.description = l10n_util::GetStringFUTF16( | |
1261 IDS_STATUSBAR_NETWORK_DEVICE_STATUS, | |
1262 info.name, l10n_util::GetStringUTF16( | |
1263 IDS_STATUSBAR_NETWORK_DEVICE_CONNECTING)); | |
1264 } | |
1265 break; | |
1266 } | |
1267 case TYPE_VPN: | |
1268 case TYPE_WIFI: | |
1269 case TYPE_WIMAX: | |
1270 case TYPE_BLUETOOTH: | |
1271 case TYPE_UNKNOWN: | |
1272 break; | |
1273 } | |
1274 if (network->connecting()) { | |
1275 info.description = l10n_util::GetStringFUTF16( | |
1276 IDS_STATUSBAR_NETWORK_DEVICE_STATUS, | |
1277 info.name, | |
1278 l10n_util::GetStringUTF16( | |
1279 IDS_STATUSBAR_NETWORK_DEVICE_CONNECTING)); | |
1280 } | |
1281 added->insert(network); | |
1282 list->push_back(info); | |
1283 } | |
1284 | |
1285 // Overridden from AudioHandler::VolumeObserver. | 1007 // Overridden from AudioHandler::VolumeObserver. |
1286 virtual void OnVolumeChanged() OVERRIDE { | 1008 virtual void OnVolumeChanged() OVERRIDE { |
1287 float level = AudioHandler::GetInstance()->GetVolumePercent() / 100.f; | 1009 float level = AudioHandler::GetInstance()->GetVolumePercent() / 100.f; |
1288 GetSystemTrayNotifier()->NotifyVolumeChanged(level); | 1010 GetSystemTrayNotifier()->NotifyVolumeChanged(level); |
1289 } | 1011 } |
1290 | 1012 |
1291 // Overridden from AudioHandler::VolumeObserver. | 1013 // Overridden from AudioHandler::VolumeObserver. |
1292 virtual void OnMuteToggled() OVERRIDE { | 1014 virtual void OnMuteToggled() OVERRIDE { |
1293 GetSystemTrayNotifier()->NotifyMuteToggled(); | 1015 GetSystemTrayNotifier()->NotifyMuteToggled(); |
1294 } | 1016 } |
(...skipping 17 matching lines...) Expand all Loading... |
1312 } | 1034 } |
1313 | 1035 |
1314 virtual void UnlockScreen() OVERRIDE { | 1036 virtual void UnlockScreen() OVERRIDE { |
1315 screen_locked_ = false; | 1037 screen_locked_ = false; |
1316 ash::Shell::GetInstance()->UpdateAfterLoginStatusChange( | 1038 ash::Shell::GetInstance()->UpdateAfterLoginStatusChange( |
1317 GetUserLoginStatus()); | 1039 GetUserLoginStatus()); |
1318 } | 1040 } |
1319 | 1041 |
1320 // TODO(sad): Override more from PowerManagerClient::Observer here. | 1042 // TODO(sad): Override more from PowerManagerClient::Observer here. |
1321 | 1043 |
1322 // Overridden from NetworkMenuIcon::Delegate. | |
1323 virtual void NetworkMenuIconChanged() OVERRIDE { | |
1324 NotifyRefreshNetwork(); | |
1325 } | |
1326 | |
1327 // Overridden from NetworkMenu::Delegate. | 1044 // Overridden from NetworkMenu::Delegate. |
1328 virtual gfx::NativeWindow GetNativeWindow() const OVERRIDE { | 1045 virtual gfx::NativeWindow GetNativeWindow() const OVERRIDE { |
1329 return GetNativeWindowByStatus(GetUserLoginStatus()); | 1046 return GetNativeWindowByStatus(GetUserLoginStatus()); |
1330 } | 1047 } |
1331 | 1048 |
1332 virtual void OpenButtonOptions() OVERRIDE { | 1049 virtual void OpenButtonOptions() OVERRIDE { |
1333 } | 1050 } |
1334 | 1051 |
1335 virtual bool ShouldOpenButtonOptions() const OVERRIDE { | 1052 virtual bool ShouldOpenButtonOptions() const OVERRIDE { |
1336 return false; | 1053 return false; |
1337 } | 1054 } |
1338 | 1055 |
1339 // Overridden from NetworkLibrary::NetworkManagerObserver. | 1056 // Overridden from NetworkLibrary::NetworkManagerObserver. |
1340 virtual void OnNetworkManagerChanged(NetworkLibrary* crosnet) OVERRIDE { | 1057 virtual void OnNetworkManagerChanged(NetworkLibrary* crosnet) OVERRIDE { |
1341 RefreshNetworkObserver(crosnet); | 1058 // TODO(stevenjb): Migrate to NetworkStateHandler. |
1342 data_promo_notification_->ShowOptionalMobileDataPromoNotification( | 1059 data_promo_notification_->ShowOptionalMobileDataPromoNotification( |
1343 crosnet, GetPrimarySystemTray(), this); | 1060 crosnet, GetPrimarySystemTray(), this); |
1344 UpdateCellular(); | 1061 UpdateCellular(); |
1345 | |
1346 NotifyRefreshNetwork(); | |
1347 } | |
1348 | |
1349 // Overridden from NetworkLibrary::NetworkObserver. | |
1350 virtual void OnNetworkChanged(NetworkLibrary* crosnet, | |
1351 const Network* network) OVERRIDE { | |
1352 NotifyRefreshNetwork(); | |
1353 } | 1062 } |
1354 | 1063 |
1355 // content::NotificationObserver implementation. | 1064 // content::NotificationObserver implementation. |
1356 virtual void Observe(int type, | 1065 virtual void Observe(int type, |
1357 const content::NotificationSource& source, | 1066 const content::NotificationSource& source, |
1358 const content::NotificationDetails& details) OVERRIDE { | 1067 const content::NotificationDetails& details) OVERRIDE { |
1359 switch (type) { | 1068 switch (type) { |
1360 case chrome::NOTIFICATION_UPGRADE_RECOMMENDED: { | 1069 case chrome::NOTIFICATION_UPGRADE_RECOMMENDED: { |
1361 UpgradeDetector* detector = | 1070 UpgradeDetector* detector = |
1362 content::Source<UpgradeDetector>(source).ptr(); | 1071 content::Source<UpgradeDetector>(source).ptr(); |
(...skipping 231 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1594 if (cellular->activation_state() == ACTIVATION_STATE_ACTIVATING) { | 1303 if (cellular->activation_state() == ACTIVATION_STATE_ACTIVATING) { |
1595 cellular_activating_ = true; | 1304 cellular_activating_ = true; |
1596 } else if (cellular->activated() && cellular_activating_) { | 1305 } else if (cellular->activated() && cellular_activating_) { |
1597 cellular_activating_ = false; | 1306 cellular_activating_ = false; |
1598 ash::NetworkObserver::NetworkType type = NetworkTypeForCellular(cellular); | 1307 ash::NetworkObserver::NetworkType type = NetworkTypeForCellular(cellular); |
1599 ash::Shell::GetInstance()->system_tray_notifier()-> | 1308 ash::Shell::GetInstance()->system_tray_notifier()-> |
1600 NotifySetNetworkMessage( | 1309 NotifySetNetworkMessage( |
1601 NULL, | 1310 NULL, |
1602 ash::NetworkObserver::MESSAGE_DATA_PROMO, | 1311 ash::NetworkObserver::MESSAGE_DATA_PROMO, |
1603 type, | 1312 type, |
1604 l10n_util::GetStringUTF16( | 1313 l10n_util::GetStringUTF16(IDS_NETWORK_CELLULAR_ACTIVATED_TITLE), |
1605 IDS_NETWORK_CELLULAR_ACTIVATED_TITLE), | 1314 l10n_util::GetStringFUTF16(IDS_NETWORK_CELLULAR_ACTIVATED, |
1606 l10n_util::GetStringFUTF16( | 1315 UTF8ToUTF16((cellular->name()))), |
1607 IDS_NETWORK_CELLULAR_ACTIVATED, | 1316 std::vector<string16>()); |
1608 UTF8ToUTF16((cellular->name()))), | |
1609 std::vector<string16>()); | |
1610 } | |
1611 if (!CommandLine::ForCurrentProcess()->HasSwitch( | |
1612 ash::switches::kAshDisableNewNetworkStatusArea)) { | |
1613 return; | |
1614 } | |
1615 // Trigger "Out of credits" notification (for NetworkLibrary impl) | |
1616 if (cellular->out_of_credits() && !cellular_out_of_credits_) { | |
1617 cellular_out_of_credits_ = true; | |
1618 ash::NetworkObserver::NetworkType type = NetworkTypeForCellular(cellular); | |
1619 std::vector<string16> links; | |
1620 links.push_back( | |
1621 l10n_util::GetStringFUTF16(IDS_NETWORK_OUT_OF_CREDITS_LINK, | |
1622 UTF8ToUTF16(cellular->name()))); | |
1623 ash::Shell::GetInstance()->system_tray_notifier()-> | |
1624 NotifySetNetworkMessage( | |
1625 this, ash::NetworkObserver::ERROR_OUT_OF_CREDITS, type, | |
1626 l10n_util::GetStringUTF16(IDS_NETWORK_OUT_OF_CREDITS_TITLE), | |
1627 l10n_util::GetStringUTF16(IDS_NETWORK_OUT_OF_CREDITS_BODY), | |
1628 links); | |
1629 } else if (!cellular->out_of_credits() && cellular_out_of_credits_) { | |
1630 cellular_out_of_credits_ = false; | |
1631 } | 1317 } |
1632 } | 1318 } |
1633 | 1319 |
1634 scoped_ptr<base::WeakPtrFactory<SystemTrayDelegate> > ui_weak_ptr_factory_; | 1320 scoped_ptr<base::WeakPtrFactory<SystemTrayDelegate> > ui_weak_ptr_factory_; |
1635 scoped_ptr<NetworkMenuIcon> network_icon_; | |
1636 scoped_ptr<NetworkMenuIcon> network_icon_dark_; | |
1637 scoped_ptr<NetworkMenuIcon> network_icon_vpn_; | |
1638 scoped_ptr<NetworkMenu> network_menu_; | 1321 scoped_ptr<NetworkMenu> network_menu_; |
1639 content::NotificationRegistrar registrar_; | 1322 content::NotificationRegistrar registrar_; |
1640 PrefChangeRegistrar local_state_registrar_; | 1323 PrefChangeRegistrar local_state_registrar_; |
1641 scoped_ptr<PrefChangeRegistrar> user_pref_registrar_; | 1324 scoped_ptr<PrefChangeRegistrar> user_pref_registrar_; |
1642 std::string active_network_path_; | 1325 std::string active_network_path_; |
1643 base::HourClockType clock_type_; | 1326 base::HourClockType clock_type_; |
1644 int search_key_mapped_to_; | 1327 int search_key_mapped_to_; |
1645 bool screen_locked_; | 1328 bool screen_locked_; |
1646 bool have_session_start_time_; | 1329 bool have_session_start_time_; |
1647 base::TimeTicks session_start_time_; | 1330 base::TimeTicks session_start_time_; |
(...skipping 12 matching lines...) Expand all Loading... |
1660 DISALLOW_COPY_AND_ASSIGN(SystemTrayDelegate); | 1343 DISALLOW_COPY_AND_ASSIGN(SystemTrayDelegate); |
1661 }; | 1344 }; |
1662 | 1345 |
1663 } // namespace | 1346 } // namespace |
1664 | 1347 |
1665 ash::SystemTrayDelegate* CreateSystemTrayDelegate() { | 1348 ash::SystemTrayDelegate* CreateSystemTrayDelegate() { |
1666 return new chromeos::SystemTrayDelegate(); | 1349 return new chromeos::SystemTrayDelegate(); |
1667 } | 1350 } |
1668 | 1351 |
1669 } // namespace chromeos | 1352 } // namespace chromeos |
OLD | NEW |