13c827367444ee418f129b2c238299f49d3264554Jarkko Poyry// Copyright (c) 2012 The Chromium Authors. All rights reserved. 23c827367444ee418f129b2c238299f49d3264554Jarkko Poyry// Use of this source code is governed by a BSD-style license that can be 33c827367444ee418f129b2c238299f49d3264554Jarkko Poyry// found in the LICENSE file. 43c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 53c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "chrome/browser/chromeos/login/screens/network_screen.h" 63c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 73c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "base/location.h" 83c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "base/logging.h" 93c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "base/strings/string16.h" 103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "base/strings/utf_string_conversions.h" 113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "chrome/browser/chromeos/login/help_app_launcher.h" 123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "chrome/browser/chromeos/login/helper.h" 133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "chrome/browser/chromeos/login/login_utils.h" 143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "chrome/browser/chromeos/login/screen_manager.h" 153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "chrome/browser/chromeos/login/screens/screen_observer.h" 163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "chrome/browser/chromeos/login/wizard_controller.h" 173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "chrome/grit/chromium_strings.h" 183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "chrome/grit/generated_resources.h" 193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "chromeos/network/network_handler.h" 203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "chromeos/network/network_state_handler.h" 213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "ui/base/l10n/l10n_util.h" 223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 233c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace { 243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry// Time in seconds for connection timeout. 263c827367444ee418f129b2c238299f49d3264554Jarkko Poyryconst int kConnectionTimeoutSec = 40; 273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // namespace 293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 303c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace chromeos { 313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry/////////////////////////////////////////////////////////////////////////////// 333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry// NetworkScreen, public: 343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry// static 363c827367444ee418f129b2c238299f49d3264554Jarkko PoyryNetworkScreen* NetworkScreen::Get(ScreenManager* manager) { 373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry return static_cast<NetworkScreen*>( 383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry manager->GetScreen(WizardController::kNetworkScreenName)); 393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 413c827367444ee418f129b2c238299f49d3264554Jarkko PoyryNetworkScreen::NetworkScreen(ScreenObserver* screen_observer, 423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry NetworkScreenActor* actor) 433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry : WizardScreen(screen_observer), 443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry is_network_subscribed_(false), 453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry continue_pressed_(false), 463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry actor_(actor), 473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry network_state_helper_(new login::NetworkStateHelper) { 483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry DCHECK(actor_); 493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (actor_) 503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry actor_->SetDelegate(this); 513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 533c827367444ee418f129b2c238299f49d3264554Jarkko PoyryNetworkScreen::~NetworkScreen() { 54 if (actor_) 55 actor_->SetDelegate(NULL); 56 connection_timer_.Stop(); 57 UnsubscribeNetworkNotification(); 58} 59 60//////////////////////////////////////////////////////////////////////////////// 61// NetworkScreen, WizardScreen implementation: 62 63void NetworkScreen::PrepareToShow() { 64 if (actor_) 65 actor_->PrepareToShow(); 66} 67 68void NetworkScreen::Show() { 69 Refresh(); 70 if (actor_) 71 actor_->Show(); 72} 73 74void NetworkScreen::Hide() { 75 if (actor_) 76 actor_->Hide(); 77} 78 79std::string NetworkScreen::GetName() const { 80 return WizardController::kNetworkScreenName; 81} 82 83//////////////////////////////////////////////////////////////////////////////// 84// NetworkScreen, NetworkStateHandlerObserver implementation: 85 86void NetworkScreen::NetworkConnectionStateChanged(const NetworkState* network) { 87 UpdateStatus(); 88} 89 90void NetworkScreen::DefaultNetworkChanged(const NetworkState* network) { 91 UpdateStatus(); 92} 93 94//////////////////////////////////////////////////////////////////////////////// 95// NetworkScreen, public: 96 97void NetworkScreen::Refresh() { 98 SubscribeNetworkNotification(); 99 UpdateStatus(); 100} 101 102/////////////////////////////////////////////////////////////////////////////// 103// NetworkScreen, NetworkScreenActor::Delegate implementation: 104 105void NetworkScreen::OnActorDestroyed(NetworkScreenActor* actor) { 106 if (actor_ == actor) 107 actor_ = NULL; 108} 109 110void NetworkScreen::OnContinuePressed() { 111 if (network_state_helper_->IsConnected()) { 112 NotifyOnConnection(); 113 } else { 114 continue_pressed_ = true; 115 WaitForConnection(network_id_); 116 } 117} 118 119//////////////////////////////////////////////////////////////////////////////// 120// NetworkScreen, private: 121 122void NetworkScreen::SetNetworkStateHelperForTest( 123 login::NetworkStateHelper* helper) { 124 network_state_helper_.reset(helper); 125} 126 127void NetworkScreen::SubscribeNetworkNotification() { 128 if (!is_network_subscribed_) { 129 is_network_subscribed_ = true; 130 NetworkHandler::Get()->network_state_handler()->AddObserver( 131 this, FROM_HERE); 132 } 133} 134 135void NetworkScreen::UnsubscribeNetworkNotification() { 136 if (is_network_subscribed_) { 137 is_network_subscribed_ = false; 138 NetworkHandler::Get()->network_state_handler()->RemoveObserver( 139 this, FROM_HERE); 140 } 141} 142 143void NetworkScreen::NotifyOnConnection() { 144 // TODO(nkostylev): Check network connectivity. 145 UnsubscribeNetworkNotification(); 146 connection_timer_.Stop(); 147 get_screen_observer()->OnExit(ScreenObserver::NETWORK_CONNECTED); 148} 149 150void NetworkScreen::OnConnectionTimeout() { 151 StopWaitingForConnection(network_id_); 152 if (!network_state_helper_->IsConnected() && actor_) { 153 // Show error bubble. 154 actor_->ShowError( 155 l10n_util::GetStringFUTF16( 156 IDS_NETWORK_SELECTION_ERROR, 157 l10n_util::GetStringUTF16(IDS_SHORT_PRODUCT_OS_NAME), 158 network_id_)); 159 } 160} 161 162void NetworkScreen::UpdateStatus() { 163 if (!actor_) 164 return; 165 166 bool is_connected = network_state_helper_->IsConnected(); 167 if (is_connected) 168 actor_->ClearErrors(); 169 170 base::string16 network_name = network_state_helper_->GetCurrentNetworkName(); 171 if (is_connected) { 172 StopWaitingForConnection(network_name); 173 } else if (network_state_helper_->IsConnecting()) { 174 WaitForConnection(network_name); 175 } else { 176 StopWaitingForConnection(network_id_); 177 } 178} 179 180void NetworkScreen::StopWaitingForConnection(const base::string16& network_id) { 181 bool is_connected = network_state_helper_->IsConnected(); 182 if (is_connected && continue_pressed_) { 183 NotifyOnConnection(); 184 return; 185 } 186 187 continue_pressed_ = false; 188 connection_timer_.Stop(); 189 190 network_id_ = network_id; 191 if (actor_) { 192 actor_->ShowConnectingStatus(false, network_id_); 193 actor_->EnableContinue(is_connected); 194 } 195} 196 197void NetworkScreen::WaitForConnection(const base::string16& network_id) { 198 if (network_id_ != network_id || !connection_timer_.IsRunning()) { 199 connection_timer_.Stop(); 200 connection_timer_.Start(FROM_HERE, 201 base::TimeDelta::FromSeconds(kConnectionTimeoutSec), 202 this, 203 &NetworkScreen::OnConnectionTimeout); 204 } 205 206 network_id_ = network_id; 207 if (actor_) { 208 actor_->ShowConnectingStatus(continue_pressed_, network_id_); 209 actor_->EnableContinue(false); 210 } 211} 212 213} // namespace chromeos 214