wizard_controller.h revision 0529e5d033099cbfc42635f6f6183833b09dff6e
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CHROME_BROWSER_CHROMEOS_LOGIN_WIZARD_CONTROLLER_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_BROWSER_CHROMEOS_LOGIN_WIZARD_CONTROLLER_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/gtest_prod_util.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
1358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "base/memory/weak_ptr.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/observer_list.h"
15eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h"
16eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/timer/timer.h"
17a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/browser/chromeos/accessibility/accessibility_manager.h"
18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/login/screens/screen_observer.h"
19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/login/screens/wizard_screen.h"
20a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/browser/chromeos/policy/auto_enrollment_client.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/rect.h"
227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "url/gurl.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class PrefRegistrySimple;
2558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)class PrefService;
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace base {
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DictionaryValue;
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace chromeos {
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
33effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochclass AutoEnrollmentCheckStep;
34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class EnrollmentScreen;
35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class ErrorScreen;
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class EulaScreen;
37a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochclass HIDDetectionScreen;
380529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochstruct Geoposition;
39868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)class KioskAutolaunchScreen;
407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)class KioskEnableScreen;
41868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)class LocallyManagedUserCreationScreen;
42effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochclass LoginDisplayHost;
43f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class LoginScreenContext;
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class NetworkScreen;
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class OobeDisplay;
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ResetScreen;
470529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochclass SimpleGeolocationProvider;
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class TermsOfServiceScreen;
49effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochclass TimeZoneProvider;
50effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochstruct TimeZoneResponseData;
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class UpdateScreen;
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class UserImageScreen;
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WizardScreen;
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class WrongHWIDScreen;
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Class that manages control flow between wizard screens. Wizard controller
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// interacts with screen controllers to move the user between screens.
58a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class WizardController : public ScreenObserver {
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Observes screen changes.
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  class Observer {
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   public:
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Called before a screen change happens.
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual void OnScreenChanged(WizardScreen* next_screen) = 0;
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Called after the browser session has started.
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual void OnSessionStart() = 0;
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WizardController(LoginDisplayHost* host, OobeDisplay* oobe_display);
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~WizardController();
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the default wizard controller if it has been created.
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static WizardController* default_controller() {
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return default_controller_;
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Whether to skip any screens that may normally be shown after login
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // (registration, Terms of Service, user image selection).
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static bool skip_post_login_screens() {
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return skip_post_login_screens_;
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sets delays to zero. MUST be used only for tests.
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void SetZeroDelays();
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If true zero delays have been enabled (for browser tests).
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static bool IsZeroDelayEnabled();
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Skips any screens that may normally be shown after login (registration,
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Terms of Service, user image selection).
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static void SkipPostLoginScreensForTesting();
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
94a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Checks whether OOBE should start enrollment automatically.
95a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  static bool ShouldAutoStartEnrollment();
96a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Shows the first screen defined by |first_screen_name| or by default
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // if the parameter is empty. Takes ownership of |screen_parameters|.
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Init(const std::string& first_screen_name,
100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            scoped_ptr<base::DictionaryValue> screen_parameters);
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Advances to screen defined by |screen_name| and shows it.
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void AdvanceToScreen(const std::string& screen_name);
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Advances to login screen. Should be used in for testing only.
106f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  void SkipToLoginForTesting(const LoginScreenContext& context);
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Adds and removes an observer.
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void AddObserver(Observer* observer);
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void RemoveObserver(Observer* observer);
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Called right after the browser session has started.
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnSessionStart();
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Skip update, go straight to enrollment after EULA is accepted.
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SkipUpdateEnrollAfterEula();
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // TODO(antrim) : temporary hack. Should be removed once screen system is
119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // reworked at hackaton.
120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void EnableUserImageScreenReturnToPreviousHack();
121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Lazy initializers and getters for screens.
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NetworkScreen* GetNetworkScreen();
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateScreen* GetUpdateScreen();
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UserImageScreen* GetUserImageScreen();
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EulaScreen* GetEulaScreen();
127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EnrollmentScreen* GetEnrollmentScreen();
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ResetScreen* GetResetScreen();
129868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  KioskAutolaunchScreen* GetKioskAutolaunchScreen();
1307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  KioskEnableScreen* GetKioskEnableScreen();
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TermsOfServiceScreen* GetTermsOfServiceScreen();
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WrongHWIDScreen* GetWrongHWIDScreen();
133a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  HIDDetectionScreen* GetHIDDetectionScreen();
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LocallyManagedUserCreationScreen* GetLocallyManagedUserCreationScreen();
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns a pointer to the current screen or NULL if there's no such
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // screen.
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WizardScreen* current_screen() const { return current_screen_; }
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true if the current wizard instance has reached the login screen.
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool login_screen_started() const { return login_screen_started_; }
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const char kNetworkScreenName[];
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const char kLoginScreenName[];
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const char kUpdateScreenName[];
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const char kUserImageScreenName[];
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const char kOutOfBoxScreenName[];
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const char kTestNoScreenName[];
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const char kEulaScreenName[];
150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  static const char kEnrollmentScreenName[];
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const char kResetScreenName[];
1527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  static const char kKioskEnableScreenName[];
153868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  static const char kKioskAutolaunchScreenName[];
154c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  static const char kErrorScreenName[];
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static const char kTermsOfServiceScreenName[];
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static const char kWrongHWIDScreenName[];
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static const char kLocallyManagedUserCreationScreenName[];
1583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  static const char kAppLaunchSplashScreenName[];
159a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  static const char kHIDDetectionScreenName [];
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Volume percent at which spoken feedback is still audible.
1625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  static const int kMinAudibleOutputVolumePercent;
1635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Show specific screen.
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ShowNetworkScreen();
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ShowUpdateScreen();
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ShowUserImageScreen();
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ShowEulaScreen();
170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void ShowEnrollmentScreen();
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ShowResetScreen();
172868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  void ShowKioskAutolaunchScreen();
1737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  void ShowKioskEnableScreen();
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void ShowTermsOfServiceScreen();
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void ShowWrongHWIDScreen();
1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void ShowLocallyManagedUserCreationScreen();
177a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  void ShowHIDDetectionScreen();
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Shows images login screen.
180f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  void ShowLoginScreen(const LoginScreenContext& context);
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Resumes a pending login screen.
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ResumeLoginScreen();
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Exit handlers:
186a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  void OnHIDDetectionCompleted();
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnNetworkConnected();
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnNetworkOffline();
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnConnectionFailed();
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnUpdateCompleted();
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnEulaAccepted();
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnUpdateErrorCheckingForUpdate();
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnUpdateErrorUpdating();
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnUserImageSelected();
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnUserImageSkipped();
196c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void OnEnrollmentDone();
197c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void OnAutoEnrollmentDone();
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnResetCanceled();
199868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  void OnKioskAutolaunchCanceled();
200868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  void OnKioskAutolaunchConfirmed();
2017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  void OnKioskEnableCompleted();
2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void OnWrongHWIDWarningSkipped();
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnOOBECompleted();
2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void OnTermsOfServiceDeclined();
2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void OnTermsOfServiceAccepted();
2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Loads brand code on I/O enabled thread and stores to Local State.
2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void LoadBrandCodeFromFile();
2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Called after all post-EULA blocking tasks have been completed.
2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void OnEulaBlockingTasksDone();
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Shows update screen and starts update process.
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void InitiateOOBEUpdate();
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Actions that should be done right after EULA is accepted,
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // before update check.
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void PerformPostEulaActions();
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Actions that should be done right after update stage is finished.
221effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  void PerformOOBECompletedActions();
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Overridden from ScreenObserver:
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnExit(ExitCodes exit_code) OVERRIDE;
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void ShowCurrentScreen() OVERRIDE;
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnSetUserNamePassword(const std::string& username,
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     const std::string& password) OVERRIDE;
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUsageStatisticsReporting(bool val) OVERRIDE;
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool GetUsageStatisticsReporting() const OVERRIDE;
230c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual ErrorScreen* GetErrorScreen() OVERRIDE;
231c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void ShowErrorScreen() OVERRIDE;
232c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void HideErrorScreen(WizardScreen* parent_screen) OVERRIDE;
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
234a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Notification of a change in the state of an accessibility setting.
235a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void OnAccessibilityStatusChanged(
236a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      const AccessibilityStatusEventDetails& details);
2375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Switches from one screen to another.
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetCurrentScreen(WizardScreen* screen);
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Switches from one screen to another with delay before showing. Calling
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ShowCurrentScreen directly forces screen to be shown immediately.
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetCurrentScreenSmooth(WizardScreen* screen, bool use_smoothing);
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Changes status area visibility.
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetStatusAreaVisible(bool visible);
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Logs in the specified user via default login screen.
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Login(const std::string& username, const std::string& password);
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
251868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Launched kiosk app configured for auto-launch.
252868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  void AutoLaunchKioskApp();
253868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
254868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Checks whether the user is allowed to exit enrollment.
255effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  static bool CanExitEnrollment();
256effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
257effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Gets the management domain.
258effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  static std::string GetForcedEnrollmentDomain();
259868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
26058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Called when LocalState is initialized.
26158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  void OnLocalStateInitialized(bool /* succeeded */);
26258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
263effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Kicks off the auto-enrollment check step. Once it finishes, it'll call
264effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // back via ScreenObserver::OnExit().
265effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  void StartAutoEnrollmentCheck();
266a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
26758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Returns local state.
26858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  PrefService* GetLocalState();
26958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
27058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  static void set_local_state_for_testing(PrefService* local_state) {
27158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    local_state_for_testing_ = local_state;
27258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
27358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
274effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Called when network is UP.
2750529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  void StartTimezoneResolve();
276effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
277effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Creates provider on demand.
278effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  TimeZoneProvider* GetTimezoneProvider();
279effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
280effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // TimeZoneRequest::TimeZoneResponseCallback implementation.
281effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  void OnTimezoneResolved(scoped_ptr<TimeZoneResponseData> timezone,
282effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                          bool server_error);
283effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
2840529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // Called from SimpleGeolocationProvider when location is resolved.
2850529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  void OnLocationResolved(const Geoposition& position,
2860529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                          bool server_error,
2870529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                          const base::TimeDelta elapsed);
2880529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Whether to skip any screens that may normally be shown after login
2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // (registration, Terms of Service, user image selection).
2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static bool skip_post_login_screens_;
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static bool zero_delay_enabled_;
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Screens.
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<NetworkScreen> network_screen_;
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<UpdateScreen> update_screen_;
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<UserImageScreen> user_image_screen_;
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<EulaScreen> eula_screen_;
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<ResetScreen> reset_screen_;
301868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  scoped_ptr<KioskAutolaunchScreen> autolaunch_screen_;
3027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  scoped_ptr<KioskEnableScreen> kiosk_enable_screen_;
303c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<EnrollmentScreen> enrollment_screen_;
304c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<ErrorScreen> error_screen_;
3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<TermsOfServiceScreen> terms_of_service_screen_;
3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<WrongHWIDScreen> wrong_hwid_screen_;
3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<LocallyManagedUserCreationScreen>
3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      locally_managed_user_creation_screen_;
309a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  scoped_ptr<HIDDetectionScreen> hid_detection_screen_;
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Screen that's currently active.
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WizardScreen* current_screen_;
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Screen that was active before, or NULL for login screen.
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WizardScreen* previous_screen_;
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string username_;
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string password_;
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // True if running official BUILD.
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool is_official_build_;
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // True if full OOBE flow should be shown.
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool is_out_of_box_;
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Value of the screen name that WizardController was started with.
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string first_screen_name_;
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // OOBE/login display host.
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoginDisplayHost* host_;
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Default WizardController.
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static WizardController* default_controller_;
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // The auto-enrollment check step, currently active.
336effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  scoped_ptr<AutoEnrollmentCheckStep> auto_enrollment_check_step_;
337effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Parameters for the first screen. May be NULL.
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<base::DictionaryValue> screen_parameters_;
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::OneShotTimer<WizardController> smooth_show_timer_;
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  OobeDisplay* oobe_display_;
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // State of Usage stat/error reporting checkbox on EULA screen
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // during wizard lifetime.
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool usage_statistics_reporting_;
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If true then update check is cancelled and enrollment is started after
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // EULA is accepted.
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool skip_update_enroll_after_eula_;
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Time when the EULA was accepted. Used to measure the duration from the EULA
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // acceptance until the Sign-In screen is displayed.
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Time time_eula_accepted_;
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ObserverList<Observer> observer_list_;
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool login_screen_started_;
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
361c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Indicates that once image selection screen finishes we should return to
362c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // a previous screen instead of proceeding with usual flow.
363c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool user_image_screen_return_to_previous_hack_;
364c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
36558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Non-owning pointer to local state used for testing.
36658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  static PrefService* local_state_for_testing_;
36758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
368c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(EnrollmentScreenTest, TestCancel);
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(WizardControllerFlowTest, Accelerators);
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class WizardControllerFlowTest;
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class WizardInProcessBrowserTest;
37258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  friend class WizardControllerBrokenLocalStateTest;
37358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
374a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  scoped_ptr<AccessibilityStatusSubscription> accessibility_subscription_;
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
376a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  base::WeakPtrFactory<WizardController> weak_factory_;
3775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3780529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  scoped_ptr<SimpleGeolocationProvider> geolocation_provider_;
379effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  scoped_ptr<TimeZoneProvider> timezone_provider_;
380effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(WizardController);
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace chromeos
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CHROME_BROWSER_CHROMEOS_LOGIN_WIZARD_CONTROLLER_H_
387