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