// Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef CHROME_BROWSER_CHROMEOS_LOGIN_WIZARD_CONTROLLER_H_ #define CHROME_BROWSER_CHROMEOS_LOGIN_WIZARD_CONTROLLER_H_ #include <string> #include "base/compiler_specific.h" #include "base/gtest_prod_util.h" #include "base/memory/scoped_ptr.h" #include "base/memory/weak_ptr.h" #include "base/observer_list.h" #include "base/time/time.h" #include "base/timer/timer.h" #include "chrome/browser/chromeos/login/screens/screen_observer.h" #include "chrome/browser/chromeos/login/screens/wizard_screen.h" #include "ui/gfx/rect.h" #include "url/gurl.h" class PrefRegistrySimple; class PrefService; namespace base { class DictionaryValue; } namespace chromeos { class EnrollmentScreen; class ErrorScreen; class EulaScreen; class KioskAutolaunchScreen; class KioskEnableScreen; class LocallyManagedUserCreationScreen; class LoginDisplayHost; class LoginScreenContext; class NetworkScreen; class OobeDisplay; class ResetScreen; class TermsOfServiceScreen; class UpdateScreen; class UserImageScreen; class WizardScreen; class WrongHWIDScreen; // Class that manages control flow between wizard screens. Wizard controller // interacts with screen controllers to move the user between screens. class WizardController : public ScreenObserver { public: // Observes screen changes. class Observer { public: // Called before a screen change happens. virtual void OnScreenChanged(WizardScreen* next_screen) = 0; // Called after the browser session has started. virtual void OnSessionStart() = 0; }; WizardController(LoginDisplayHost* host, OobeDisplay* oobe_display); virtual ~WizardController(); // Returns the default wizard controller if it has been created. static WizardController* default_controller() { return default_controller_; } // Whether to skip any screens that may normally be shown after login // (registration, Terms of Service, user image selection). static bool skip_post_login_screens() { return skip_post_login_screens_; } // Sets delays to zero. MUST be used only for tests. static void SetZeroDelays(); // If true zero delays have been enabled (for browser tests). static bool IsZeroDelayEnabled(); // Skips any screens that may normally be shown after login (registration, // Terms of Service, user image selection). static void SkipPostLoginScreensForTesting(); // Checks whether OOBE should start enrollment automatically. static bool ShouldAutoStartEnrollment(); // Shows the first screen defined by |first_screen_name| or by default // if the parameter is empty. Takes ownership of |screen_parameters|. void Init(const std::string& first_screen_name, scoped_ptr<base::DictionaryValue> screen_parameters); // Advances to screen defined by |screen_name| and shows it. void AdvanceToScreen(const std::string& screen_name); // Advances to screen defined by |screen_name| and shows it. // Takes ownership of |screen_parameters|. void AdvanceToScreenWithParams(const std::string& first_screen_name, base::DictionaryValue* screen_parameters); // Advances to login screen. Should be used in for testing only. void SkipToLoginForTesting(const LoginScreenContext& context); // Adds and removes an observer. void AddObserver(Observer* observer); void RemoveObserver(Observer* observer); // Called right after the browser session has started. void OnSessionStart(); // Skip update, go straight to enrollment after EULA is accepted. void SkipUpdateEnrollAfterEula(); // TODO(antrim) : temporary hack. Should be removed once screen system is // reworked at hackaton. void EnableUserImageScreenReturnToPreviousHack(); // Lazy initializers and getters for screens. NetworkScreen* GetNetworkScreen(); UpdateScreen* GetUpdateScreen(); UserImageScreen* GetUserImageScreen(); EulaScreen* GetEulaScreen(); EnrollmentScreen* GetEnrollmentScreen(); ResetScreen* GetResetScreen(); KioskAutolaunchScreen* GetKioskAutolaunchScreen(); KioskEnableScreen* GetKioskEnableScreen(); TermsOfServiceScreen* GetTermsOfServiceScreen(); WrongHWIDScreen* GetWrongHWIDScreen(); LocallyManagedUserCreationScreen* GetLocallyManagedUserCreationScreen(); // Returns a pointer to the current screen or NULL if there's no such // screen. WizardScreen* current_screen() const { return current_screen_; } // Returns true if the current wizard instance has reached the login screen. bool login_screen_started() const { return login_screen_started_; } static const char kNetworkScreenName[]; static const char kLoginScreenName[]; static const char kUpdateScreenName[]; static const char kUserImageScreenName[]; static const char kOutOfBoxScreenName[]; static const char kTestNoScreenName[]; static const char kEulaScreenName[]; static const char kEnrollmentScreenName[]; static const char kResetScreenName[]; static const char kKioskEnableScreenName[]; static const char kKioskAutolaunchScreenName[]; static const char kErrorScreenName[]; static const char kTermsOfServiceScreenName[]; static const char kWrongHWIDScreenName[]; static const char kLocallyManagedUserCreationScreenName[]; static const char kAppLaunchSplashScreenName[]; private: // Show specific screen. void ShowNetworkScreen(); void ShowUpdateScreen(); void ShowUserImageScreen(); void ShowEulaScreen(); void ShowEnrollmentScreen(); void ShowResetScreen(); void ShowKioskAutolaunchScreen(); void ShowKioskEnableScreen(); void ShowTermsOfServiceScreen(); void ShowWrongHWIDScreen(); void ShowLocallyManagedUserCreationScreen(); // Shows images login screen. void ShowLoginScreen(const LoginScreenContext& context); // Resumes a pending login screen. void ResumeLoginScreen(); // Exit handlers: void OnNetworkConnected(); void OnNetworkOffline(); void OnConnectionFailed(); void OnUpdateCompleted(); void OnEulaAccepted(); void OnUpdateErrorCheckingForUpdate(); void OnUpdateErrorUpdating(); void OnUserImageSelected(); void OnUserImageSkipped(); void OnEnrollmentDone(); void OnAutoEnrollmentDone(); void OnResetCanceled(); void OnKioskAutolaunchCanceled(); void OnKioskAutolaunchConfirmed(); void OnKioskEnableCompleted(); void OnWrongHWIDWarningSkipped(); void OnOOBECompleted(); void OnTermsOfServiceDeclined(); void OnTermsOfServiceAccepted(); // Loads brand code on I/O enabled thread and stores to Local State. void LoadBrandCodeFromFile(); // Called after all post-EULA blocking tasks have been completed. void OnEulaBlockingTasksDone(); // Shows update screen and starts update process. void InitiateOOBEUpdate(); // Actions that should be done right after EULA is accepted, // before update check. void PerformPostEulaActions(); // Actions that should be done right after update stage is finished. void PerformPostUpdateActions(); // Overridden from ScreenObserver: virtual void OnExit(ExitCodes exit_code) OVERRIDE; virtual void ShowCurrentScreen() OVERRIDE; virtual void OnSetUserNamePassword(const std::string& username, const std::string& password) OVERRIDE; virtual void SetUsageStatisticsReporting(bool val) OVERRIDE; virtual bool GetUsageStatisticsReporting() const OVERRIDE; virtual ErrorScreen* GetErrorScreen() OVERRIDE; virtual void ShowErrorScreen() OVERRIDE; virtual void HideErrorScreen(WizardScreen* parent_screen) OVERRIDE; // Switches from one screen to another. void SetCurrentScreen(WizardScreen* screen); // Switches from one screen to another with delay before showing. Calling // ShowCurrentScreen directly forces screen to be shown immediately. void SetCurrentScreenSmooth(WizardScreen* screen, bool use_smoothing); // Changes status area visibility. void SetStatusAreaVisible(bool visible); // Logs in the specified user via default login screen. void Login(const std::string& username, const std::string& password); // Launched kiosk app configured for auto-launch. void AutoLaunchKioskApp(); // Checks whether the user is allowed to exit enrollment. bool CanExitEnrollment() const; // Called when LocalState is initialized. void OnLocalStateInitialized(bool /* succeeded */); // Returns local state. PrefService* GetLocalState(); static void set_local_state_for_testing(PrefService* local_state) { local_state_for_testing_ = local_state; } // Whether to skip any screens that may normally be shown after login // (registration, Terms of Service, user image selection). static bool skip_post_login_screens_; static bool zero_delay_enabled_; // Screens. scoped_ptr<NetworkScreen> network_screen_; scoped_ptr<UpdateScreen> update_screen_; scoped_ptr<UserImageScreen> user_image_screen_; scoped_ptr<EulaScreen> eula_screen_; scoped_ptr<ResetScreen> reset_screen_; scoped_ptr<KioskAutolaunchScreen> autolaunch_screen_; scoped_ptr<KioskEnableScreen> kiosk_enable_screen_; scoped_ptr<EnrollmentScreen> enrollment_screen_; scoped_ptr<ErrorScreen> error_screen_; scoped_ptr<TermsOfServiceScreen> terms_of_service_screen_; scoped_ptr<WrongHWIDScreen> wrong_hwid_screen_; scoped_ptr<LocallyManagedUserCreationScreen> locally_managed_user_creation_screen_; // Screen that's currently active. WizardScreen* current_screen_; // Screen that was active before, or NULL for login screen. WizardScreen* previous_screen_; std::string username_; std::string password_; // True if running official BUILD. bool is_official_build_; // True if full OOBE flow should be shown. bool is_out_of_box_; // Value of the screen name that WizardController was started with. std::string first_screen_name_; // OOBE/login display host. LoginDisplayHost* host_; // Default WizardController. static WizardController* default_controller_; // Parameters for the first screen. May be NULL. scoped_ptr<base::DictionaryValue> screen_parameters_; base::OneShotTimer<WizardController> smooth_show_timer_; OobeDisplay* oobe_display_; // State of Usage stat/error reporting checkbox on EULA screen // during wizard lifetime. bool usage_statistics_reporting_; // If true then update check is cancelled and enrollment is started after // EULA is accepted. bool skip_update_enroll_after_eula_; // Time when the EULA was accepted. Used to measure the duration from the EULA // acceptance until the Sign-In screen is displayed. base::Time time_eula_accepted_; ObserverList<Observer> observer_list_; bool login_screen_started_; // Indicates that once image selection screen finishes we should return to // a previous screen instead of proceeding with usual flow. bool user_image_screen_return_to_previous_hack_; // Non-owning pointer to local state used for testing. static PrefService* local_state_for_testing_; FRIEND_TEST_ALL_PREFIXES(EnrollmentScreenTest, TestCancel); FRIEND_TEST_ALL_PREFIXES(WizardControllerFlowTest, Accelerators); friend class WizardControllerFlowTest; friend class WizardInProcessBrowserTest; friend class WizardControllerBrokenLocalStateTest; base::WeakPtrFactory<WizardController> weak_factory_; DISALLOW_COPY_AND_ASSIGN(WizardController); }; } // namespace chromeos #endif // CHROME_BROWSER_CHROMEOS_LOGIN_WIZARD_CONTROLLER_H_