// Copyright (c) 2011 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_ #pragma once #include #include "base/gtest_prod_util.h" #include "base/memory/scoped_ptr.h" #include "base/timer.h" #include "chrome/browser/chromeos/login/screen_observer.h" #include "chrome/browser/chromeos/login/wizard_screen.h" #include "googleurl/src/gurl.h" #include "testing/gtest/include/gtest/gtest_prod.h" #include "ui/gfx/rect.h" class PrefService; class WizardContentsView; class WizardScreen; namespace chromeos { class AccountScreen; class EnterpriseEnrollmentScreen; class EulaScreen; class ExistingUserController; class HTMLPageScreen; class LoginDisplayHost; class NetworkScreen; class RegistrationScreen; class UpdateScreen; class UserImageScreen; class WizardInProcessBrowserTest; } namespace gfx { class Rect; } namespace views { class Views; class Widget; class WidgetGtk; } // Class that manages control flow between wizard screens. Wizard controller // interacts with screen controllers to move the user between screens. class WizardController : public chromeos::ScreenObserver, public WizardScreenDelegate { public: explicit WizardController(chromeos::LoginDisplayHost* host, const gfx::Rect& screen_bounds); ~WizardController(); // Returns the default wizard controller if it has been created. static WizardController* default_controller() { return default_controller_; } // Returns true if EULA has been accepted. static bool IsEulaAccepted(); // Returns OOBE completion status. static bool IsOobeCompleted(); // Marks EULA status as accepted. static void MarkEulaAccepted(); // Marks OOBE process as completed. static void MarkOobeCompleted(); // Returns device registration completion status, i.e. second part of OOBE. static bool IsDeviceRegistered(); // Returns true if valid registration URL is defined. static bool IsRegisterScreenDefined(); // Marks device registered. i.e. second part of OOBE is completed. static void MarkDeviceRegistered(); // Returns initial locale from local settings. static std::string GetInitialLocale(); // Sets initial locale in local settings. static void SetInitialLocale(const std::string& locale); // Shows the first screen defined by |first_screen_name| or by default // if the parameter is empty. |screen_bounds| are used to calculate position // of the wizard screen. void Init(const std::string& first_screen_name); // Returns the view that contains all the other views. views::View* contents() { return contents_; } // Skips OOBE update screen if it's currently shown. void CancelOOBEUpdate(); // Lazy initializers and getters for screens. chromeos::NetworkScreen* GetNetworkScreen(); chromeos::AccountScreen* GetAccountScreen(); chromeos::UpdateScreen* GetUpdateScreen(); chromeos::UserImageScreen* GetUserImageScreen(); chromeos::EulaScreen* GetEulaScreen(); chromeos::RegistrationScreen* GetRegistrationScreen(); chromeos::HTMLPageScreen* GetHTMLPageScreen(); chromeos::EnterpriseEnrollmentScreen* GetEnterpriseEnrollmentScreen(); // Show specific screen. void ShowNetworkScreen(); void ShowAccountScreen(); void ShowUpdateScreen(); void ShowUserImageScreen(); void ShowEulaScreen(); void ShowRegistrationScreen(); void ShowHTMLPageScreen(); void ShowEnterpriseEnrollmentScreen(); // Shows images login screen. void ShowLoginScreen(); // Returns a pointer to the current screen or NULL if there's no such // screen. WizardScreen* current_screen() const { return current_screen_; } // Overrides observer for testing. void set_observer(ScreenObserver* observer) { observer_ = observer; } // Set URL to open on browser launch. void set_start_url(const GURL& start_url) { start_url_ = start_url; } // If being at register screen proceeds to the next one. void SkipRegistration(); // Registers OOBE preferences. static void RegisterPrefs(PrefService* local_state); static const char kNetworkScreenName[]; static const char kLoginScreenName[]; static const char kAccountScreenName[]; static const char kUpdateScreenName[]; static const char kUserImageScreenName[]; static const char kRegistrationScreenName[]; static const char kOutOfBoxScreenName[]; static const char kTestNoScreenName[]; static const char kEulaScreenName[]; static const char kHTMLPageScreenName[]; static const char kEnterpriseEnrollmentScreenName[]; private: // Exit handlers: void OnNetworkConnected(); void OnNetworkOffline(); void OnAccountCreateBack(); void OnAccountCreated(); void OnConnectionFailed(); void OnUpdateCompleted(); void OnEulaAccepted(); void OnUpdateErrorCheckingForUpdate(); void OnUpdateErrorUpdating(); void OnUserImageSelected(); void OnUserImageSkipped(); void OnRegistrationSuccess(); void OnRegistrationSkipped(); void OnEnterpriseEnrollmentDone(); void OnOOBECompleted(); // Shows update screen and starts update process. void InitiateOOBEUpdate(); // Overridden from chromeos::ScreenObserver: virtual void OnExit(ExitCodes exit_code); virtual void OnSetUserNamePassword(const std::string& username, const std::string& password); virtual void set_usage_statistics_reporting(bool val) { usage_statistics_reporting_ = val; } virtual bool usage_statistics_reporting() const { return usage_statistics_reporting_; } // Creates wizard screen window with the specified |bounds|. // If |initial_show| initial animation (window & background) is shown. // Otherwise only window is animated. views::Widget* CreateScreenWindow(const gfx::Rect& bounds, bool initial_show); // Returns bounds for the wizard screen host window in screen coordinates. // Calculates bounds using screen_bounds_. gfx::Rect GetWizardScreenBounds(int screen_width, int screen_height) const; // 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); // Overridden from WizardScreenDelegate: virtual views::View* GetWizardView(); virtual chromeos::ScreenObserver* GetObserver(WizardScreen* screen); virtual void ShowCurrentScreen(); // Determines which screen to show first by the parameter, shows it and // sets it as the current one. void ShowFirstScreen(const std::string& first_screen_name); // Logs in the specified user via default login screen. void Login(const std::string& username, const std::string& password); // Sets delays to zero. MUST be used only for browser tests. static void SetZeroDelays(); // Widget we're showing in. views::Widget* widget_; // Contents view. views::View* contents_; // Used to calculate position of the wizard screen. gfx::Rect screen_bounds_; // Screens. scoped_ptr network_screen_; scoped_ptr account_screen_; scoped_ptr update_screen_; scoped_ptr user_image_screen_; scoped_ptr eula_screen_; scoped_ptr registration_screen_; scoped_ptr html_page_screen_; scoped_ptr enterprise_enrollment_screen_; // Screen that's currently active. WizardScreen* current_screen_; // Holds whether this is initial show. bool initial_show_; std::string username_; std::string password_; // True if controller is active and should proceed things like Timer. bool is_active_; // 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. chromeos::LoginDisplayHost* host_; // NULL by default - controller itself is observer. Mock could be assigned. ScreenObserver* observer_; // Default WizardController. static WizardController* default_controller_; // URL to open on browser launch. GURL start_url_; base::OneShotTimer smooth_show_timer_; // State of Usage stat/error reporting checkbox on EULA screen // during wizard lifetime. bool usage_statistics_reporting_; FRIEND_TEST_ALL_PREFIXES(WizardControllerTest, SwitchLanguage); friend class WizardControllerFlowTest; friend class chromeos::WizardInProcessBrowserTest; DISALLOW_COPY_AND_ASSIGN(WizardController); }; #endif // CHROME_BROWSER_CHROMEOS_LOGIN_WIZARD_CONTROLLER_H_