1// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef CHROME_BROWSER_CHROMEOS_LOGIN_NETWORK_SCREEN_H_
6#define CHROME_BROWSER_CHROMEOS_LOGIN_NETWORK_SCREEN_H_
7#pragma once
8
9#include "base/memory/ref_counted.h"
10#include "base/string16.h"
11#include "base/task.h"
12#include "base/timer.h"
13#include "chrome/browser/chromeos/cros/network_library.h"
14#include "chrome/browser/chromeos/login/keyboard_switch_menu.h"
15#include "chrome/browser/chromeos/login/language_switch_menu.h"
16#include "chrome/browser/chromeos/login/message_bubble.h"
17#include "chrome/browser/chromeos/login/network_screen_delegate.h"
18#include "chrome/browser/chromeos/login/view_screen.h"
19#include "chrome/browser/chromeos/options/network_config_view.h"
20
21class WizardScreenDelegate;
22
23namespace chromeos {
24
25class HelpAppLauncher;
26class NetworkSelectionView;
27
28class NetworkScreen : public ViewScreen<NetworkSelectionView>,
29                      public MessageBubbleDelegate,
30                      public NetworkScreenDelegate {
31 public:
32  explicit NetworkScreen(WizardScreenDelegate* delegate);
33  virtual ~NetworkScreen();
34
35  // NetworkScreenDelegate implementation:
36  virtual void ClearErrors();
37  virtual bool is_error_shown() { return bubble_ != NULL; }
38  virtual LanguageSwitchMenu* language_switch_menu() {
39    return &language_switch_menu_;
40  }
41  virtual KeyboardSwitchMenu* keyboard_switch_menu() {
42    return &keyboard_switch_menu_;
43  }
44  virtual gfx::Size size() const { return GetScreenSize(); }
45
46  // views::ButtonListener implementation:
47  virtual void ButtonPressed(views::Button* sender, const views::Event& event);
48
49  // NetworkLibrary::NetworkManagerObserver implementation:
50  virtual void OnNetworkManagerChanged(NetworkLibrary* network_lib);
51
52 protected:
53  // Subscribes NetworkScreen to the network change notification,
54  // forces refresh of current network state.
55  void Refresh();
56
57 private:
58  FRIEND_TEST(NetworkScreenTest, Timeout);
59
60  // ViewScreen implementation:
61  virtual void CreateView();
62  virtual NetworkSelectionView* AllocateView();
63
64  // Overridden from views::BubbleDelegate.
65  virtual void BubbleClosing(Bubble* bubble, bool closed_by_escape) {
66    bubble_ = NULL;
67  }
68  virtual bool CloseOnEscape() { return true; }
69  virtual bool FadeInOnShow() { return false; }
70  virtual void OnHelpLinkActivated();
71
72  // Subscribes to network change notifications.
73  void SubscribeNetworkNotification();
74
75  // Unsubscribes from network change notifications.
76  void UnsubscribeNetworkNotification();
77
78  // Notifies wizard on successful connection.
79  void NotifyOnConnection();
80
81  // Called by |connection_timer_| when connection to the network timed out.
82  void OnConnectionTimeout();
83
84  // Update UI based on current network status.
85  void UpdateStatus(NetworkLibrary* network);
86
87  // Stops waiting for network to connect.
88  void StopWaitingForConnection(const string16& network_id);
89
90  // Starts waiting for network connection. Shows spinner.
91  void WaitForConnection(const string16& network_id);
92
93  // True if subscribed to network change notification.
94  bool is_network_subscribed_;
95
96  // ID of the the network that we are waiting for.
97  string16 network_id_;
98
99  // True if user pressed continue button so we should proceed with OOBE
100  // as soon as we are connected.
101  bool continue_pressed_;
102
103  // Timer for connection timeout.
104  base::OneShotTimer<NetworkScreen> connection_timer_;
105
106  LanguageSwitchMenu language_switch_menu_;
107  KeyboardSwitchMenu keyboard_switch_menu_;
108
109  // Pointer to shown message bubble. We don't need to delete it because
110  // it will be deleted on bubble closing.
111  MessageBubble* bubble_;
112
113  // Help application used for help dialogs.
114  scoped_refptr<HelpAppLauncher> help_app_;
115
116  DISALLOW_COPY_AND_ASSIGN(NetworkScreen);
117};
118
119}  // namespace chromeos
120
121#endif  // CHROME_BROWSER_CHROMEOS_LOGIN_NETWORK_SCREEN_H_
122