• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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_WIZARD_CONTROLLER_H_
6 #define CHROME_BROWSER_CHROMEOS_LOGIN_WIZARD_CONTROLLER_H_
7 #pragma once
8 
9 #include <string>
10 
11 #include "base/gtest_prod_util.h"
12 #include "base/memory/scoped_ptr.h"
13 #include "base/timer.h"
14 #include "chrome/browser/chromeos/login/screen_observer.h"
15 #include "chrome/browser/chromeos/login/wizard_screen.h"
16 #include "googleurl/src/gurl.h"
17 #include "testing/gtest/include/gtest/gtest_prod.h"
18 #include "ui/gfx/rect.h"
19 
20 class PrefService;
21 class WizardContentsView;
22 class WizardScreen;
23 
24 namespace chromeos {
25 class AccountScreen;
26 class EnterpriseEnrollmentScreen;
27 class EulaScreen;
28 class ExistingUserController;
29 class HTMLPageScreen;
30 class LoginDisplayHost;
31 class NetworkScreen;
32 class RegistrationScreen;
33 class UpdateScreen;
34 class UserImageScreen;
35 class WizardInProcessBrowserTest;
36 }
37 
38 namespace gfx {
39 class Rect;
40 }
41 
42 namespace views {
43 class Views;
44 class Widget;
45 class WidgetGtk;
46 }
47 
48 // Class that manages control flow between wizard screens. Wizard controller
49 // interacts with screen controllers to move the user between screens.
50 class WizardController : public chromeos::ScreenObserver,
51                          public WizardScreenDelegate {
52  public:
53   explicit WizardController(chromeos::LoginDisplayHost* host,
54                             const gfx::Rect& screen_bounds);
55   ~WizardController();
56 
57   // Returns the default wizard controller if it has been created.
default_controller()58   static WizardController* default_controller() {
59     return default_controller_;
60   }
61 
62   // Returns true if EULA has been accepted.
63   static bool IsEulaAccepted();
64 
65   // Returns OOBE completion status.
66   static bool IsOobeCompleted();
67 
68   // Marks EULA status as accepted.
69   static void MarkEulaAccepted();
70 
71   // Marks OOBE process as completed.
72   static void MarkOobeCompleted();
73 
74   // Returns device registration completion status, i.e. second part of OOBE.
75   static bool IsDeviceRegistered();
76 
77   // Returns true if valid registration URL is defined.
78   static bool IsRegisterScreenDefined();
79 
80   // Marks device registered. i.e. second part of OOBE is completed.
81   static void MarkDeviceRegistered();
82 
83   // Returns initial locale from local settings.
84   static std::string GetInitialLocale();
85 
86   // Sets initial locale in local settings.
87   static void SetInitialLocale(const std::string& locale);
88 
89   // Shows the first screen defined by |first_screen_name| or by default
90   // if the parameter is empty. |screen_bounds| are used to calculate position
91   // of the wizard screen.
92   void Init(const std::string& first_screen_name);
93 
94   // Returns the view that contains all the other views.
contents()95   views::View* contents() { return contents_; }
96 
97   // Skips OOBE update screen if it's currently shown.
98   void CancelOOBEUpdate();
99 
100   // Lazy initializers and getters for screens.
101   chromeos::NetworkScreen* GetNetworkScreen();
102   chromeos::AccountScreen* GetAccountScreen();
103   chromeos::UpdateScreen* GetUpdateScreen();
104   chromeos::UserImageScreen* GetUserImageScreen();
105   chromeos::EulaScreen* GetEulaScreen();
106   chromeos::RegistrationScreen* GetRegistrationScreen();
107   chromeos::HTMLPageScreen* GetHTMLPageScreen();
108   chromeos::EnterpriseEnrollmentScreen* GetEnterpriseEnrollmentScreen();
109 
110   // Show specific screen.
111   void ShowNetworkScreen();
112   void ShowAccountScreen();
113   void ShowUpdateScreen();
114   void ShowUserImageScreen();
115   void ShowEulaScreen();
116   void ShowRegistrationScreen();
117   void ShowHTMLPageScreen();
118   void ShowEnterpriseEnrollmentScreen();
119 
120   // Shows images login screen.
121   void ShowLoginScreen();
122 
123   // Returns a pointer to the current screen or NULL if there's no such
124   // screen.
current_screen()125   WizardScreen* current_screen() const { return current_screen_; }
126 
127   // Overrides observer for testing.
set_observer(ScreenObserver * observer)128   void set_observer(ScreenObserver* observer) { observer_ = observer; }
129 
130   // Set URL to open on browser launch.
set_start_url(const GURL & start_url)131   void set_start_url(const GURL& start_url) { start_url_ = start_url; }
132 
133   // If being at register screen proceeds to the next one.
134   void SkipRegistration();
135 
136   // Registers OOBE preferences.
137   static void RegisterPrefs(PrefService* local_state);
138 
139   static const char kNetworkScreenName[];
140   static const char kLoginScreenName[];
141   static const char kAccountScreenName[];
142   static const char kUpdateScreenName[];
143   static const char kUserImageScreenName[];
144   static const char kRegistrationScreenName[];
145   static const char kOutOfBoxScreenName[];
146   static const char kTestNoScreenName[];
147   static const char kEulaScreenName[];
148   static const char kHTMLPageScreenName[];
149   static const char kEnterpriseEnrollmentScreenName[];
150 
151  private:
152   // Exit handlers:
153   void OnNetworkConnected();
154   void OnNetworkOffline();
155   void OnAccountCreateBack();
156   void OnAccountCreated();
157   void OnConnectionFailed();
158   void OnUpdateCompleted();
159   void OnEulaAccepted();
160   void OnUpdateErrorCheckingForUpdate();
161   void OnUpdateErrorUpdating();
162   void OnUserImageSelected();
163   void OnUserImageSkipped();
164   void OnRegistrationSuccess();
165   void OnRegistrationSkipped();
166   void OnEnterpriseEnrollmentDone();
167   void OnOOBECompleted();
168 
169   // Shows update screen and starts update process.
170   void InitiateOOBEUpdate();
171 
172   // Overridden from chromeos::ScreenObserver:
173   virtual void OnExit(ExitCodes exit_code);
174   virtual void OnSetUserNamePassword(const std::string& username,
175                                      const std::string& password);
set_usage_statistics_reporting(bool val)176   virtual void set_usage_statistics_reporting(bool val) {
177     usage_statistics_reporting_ = val;
178   }
usage_statistics_reporting()179   virtual bool usage_statistics_reporting() const {
180     return usage_statistics_reporting_;
181   }
182 
183   // Creates wizard screen window with the specified |bounds|.
184   // If |initial_show| initial animation (window & background) is shown.
185   // Otherwise only window is animated.
186   views::Widget* CreateScreenWindow(const gfx::Rect& bounds,
187                                     bool initial_show);
188 
189   // Returns bounds for the wizard screen host window in screen coordinates.
190   // Calculates bounds using screen_bounds_.
191   gfx::Rect GetWizardScreenBounds(int screen_width, int screen_height) const;
192 
193   // Switches from one screen to another.
194   void SetCurrentScreen(WizardScreen* screen);
195 
196   // Switches from one screen to another with delay before showing. Calling
197   // ShowCurrentScreen directly forces screen to be shown immediately.
198   void SetCurrentScreenSmooth(WizardScreen* screen, bool use_smoothing);
199 
200   // Changes status area visibility.
201   void SetStatusAreaVisible(bool visible);
202 
203   // Overridden from WizardScreenDelegate:
204   virtual views::View* GetWizardView();
205   virtual chromeos::ScreenObserver* GetObserver(WizardScreen* screen);
206   virtual void ShowCurrentScreen();
207 
208   // Determines which screen to show first by the parameter, shows it and
209   // sets it as the current one.
210   void ShowFirstScreen(const std::string& first_screen_name);
211 
212   // Logs in the specified user via default login screen.
213   void Login(const std::string& username, const std::string& password);
214 
215   // Sets delays to zero. MUST be used only for browser tests.
216   static void SetZeroDelays();
217 
218   // Widget we're showing in.
219   views::Widget* widget_;
220 
221   // Contents view.
222   views::View* contents_;
223 
224   // Used to calculate position of the wizard screen.
225   gfx::Rect screen_bounds_;
226 
227   // Screens.
228   scoped_ptr<chromeos::NetworkScreen> network_screen_;
229   scoped_ptr<chromeos::AccountScreen> account_screen_;
230   scoped_ptr<chromeos::UpdateScreen> update_screen_;
231   scoped_ptr<chromeos::UserImageScreen> user_image_screen_;
232   scoped_ptr<chromeos::EulaScreen> eula_screen_;
233   scoped_ptr<chromeos::RegistrationScreen> registration_screen_;
234   scoped_ptr<chromeos::HTMLPageScreen> html_page_screen_;
235   scoped_ptr<chromeos::EnterpriseEnrollmentScreen>
236       enterprise_enrollment_screen_;
237 
238   // Screen that's currently active.
239   WizardScreen* current_screen_;
240 
241   // Holds whether this is initial show.
242   bool initial_show_;
243 
244   std::string username_;
245   std::string password_;
246 
247   // True if controller is active and should proceed things like Timer.
248   bool is_active_;
249 
250   // True if running official BUILD.
251   bool is_official_build_;
252 
253   // True if full OOBE flow should be shown.
254   bool is_out_of_box_;
255 
256   // Value of the screen name that WizardController was started with.
257   std::string first_screen_name_;
258 
259   // OOBE/login display host.
260   chromeos::LoginDisplayHost* host_;
261 
262   // NULL by default - controller itself is observer. Mock could be assigned.
263   ScreenObserver* observer_;
264 
265   // Default WizardController.
266   static WizardController* default_controller_;
267 
268   // URL to open on browser launch.
269   GURL start_url_;
270 
271   base::OneShotTimer<WizardController> smooth_show_timer_;
272 
273   // State of Usage stat/error reporting checkbox on EULA screen
274   // during wizard lifetime.
275   bool usage_statistics_reporting_;
276 
277   FRIEND_TEST_ALL_PREFIXES(WizardControllerTest, SwitchLanguage);
278   friend class WizardControllerFlowTest;
279   friend class chromeos::WizardInProcessBrowserTest;
280 
281   DISALLOW_COPY_AND_ASSIGN(WizardController);
282 };
283 
284 #endif  // CHROME_BROWSER_CHROMEOS_LOGIN_WIZARD_CONTROLLER_H_
285