Home | History | Annotate | Download | only in ui
      1 // Copyright 2014 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_UI_LOGIN_DISPLAY_HOST_IMPL_H_
      6 #define CHROME_BROWSER_CHROMEOS_LOGIN_UI_LOGIN_DISPLAY_HOST_IMPL_H_
      7 
      8 #include <string>
      9 #include <vector>
     10 
     11 #include "ash/shell_delegate.h"
     12 #include "base/compiler_specific.h"
     13 #include "base/memory/scoped_ptr.h"
     14 #include "base/memory/weak_ptr.h"
     15 #include "chrome/browser/chromeos/login/app_launch_controller.h"
     16 #include "chrome/browser/chromeos/login/auth/auth_prewarmer.h"
     17 #include "chrome/browser/chromeos/login/existing_user_controller.h"
     18 #include "chrome/browser/chromeos/login/ui/login_display.h"
     19 #include "chrome/browser/chromeos/login/ui/login_display_host.h"
     20 #include "chrome/browser/chromeos/login/wizard_controller.h"
     21 #include "chrome/browser/chromeos/settings/device_settings_service.h"
     22 #include "chromeos/audio/cras_audio_handler.h"
     23 #include "chromeos/dbus/session_manager_client.h"
     24 #include "content/public/browser/notification_observer.h"
     25 #include "content/public/browser/notification_registrar.h"
     26 #include "content/public/browser/web_contents_observer.h"
     27 #include "ui/gfx/display_observer.h"
     28 #include "ui/gfx/rect.h"
     29 #include "ui/keyboard/keyboard_controller_observer.h"
     30 
     31 class PrefService;
     32 
     33 namespace content {
     34 class RenderFrameHost;
     35 class WebContents;
     36 }
     37 
     38 namespace chromeos {
     39 
     40 class DemoAppLauncher;
     41 class FocusRingController;
     42 class KeyboardDrivenOobeKeyHandler;
     43 class OobeUI;
     44 class WebUILoginDisplay;
     45 class WebUILoginView;
     46 
     47 // An implementation class for OOBE/login WebUI screen host.
     48 // It encapsulates controllers, background integration and flow.
     49 class LoginDisplayHostImpl : public LoginDisplayHost,
     50                              public content::NotificationObserver,
     51                              public content::WebContentsObserver,
     52                              public chromeos::SessionManagerClient::Observer,
     53                              public chromeos::CrasAudioHandler::AudioObserver,
     54                              public ash::VirtualKeyboardStateObserver,
     55                              public keyboard::KeyboardControllerObserver,
     56                              public gfx::DisplayObserver {
     57  public:
     58   explicit LoginDisplayHostImpl(const gfx::Rect& background_bounds);
     59   virtual ~LoginDisplayHostImpl();
     60 
     61   // Returns the default LoginDisplayHost instance if it has been created.
     62   static LoginDisplayHost* default_host() {
     63     return default_host_;
     64   }
     65 
     66   // Gets the Gaia auth iframe within a WebContents.
     67   static content::RenderFrameHost* GetGaiaAuthIframe(
     68       content::WebContents* web_contents);
     69 
     70   // LoginDisplayHost implementation:
     71   virtual LoginDisplay* CreateLoginDisplay(
     72       LoginDisplay::Delegate* delegate) OVERRIDE;
     73   virtual gfx::NativeWindow GetNativeWindow() const OVERRIDE;
     74   virtual WebUILoginView* GetWebUILoginView() const OVERRIDE;
     75   virtual void BeforeSessionStart() OVERRIDE;
     76   virtual void Finalize() OVERRIDE;
     77   virtual void OnCompleteLogin() OVERRIDE;
     78   virtual void OpenProxySettings() OVERRIDE;
     79   virtual void SetStatusAreaVisible(bool visible) OVERRIDE;
     80   virtual AutoEnrollmentController* GetAutoEnrollmentController() OVERRIDE;
     81   virtual void StartWizard(
     82       const std::string& first_screen_name,
     83       scoped_ptr<base::DictionaryValue> screen_parameters) OVERRIDE;
     84   virtual WizardController* GetWizardController() OVERRIDE;
     85   virtual AppLaunchController* GetAppLaunchController() OVERRIDE;
     86   virtual void StartUserAdding(
     87       const base::Closure& completion_callback) OVERRIDE;
     88   virtual void StartSignInScreen(const LoginScreenContext& context) OVERRIDE;
     89   virtual void ResumeSignInScreen() OVERRIDE;
     90   virtual void OnPreferencesChanged() OVERRIDE;
     91   virtual void PrewarmAuthentication() OVERRIDE;
     92   virtual void StartAppLaunch(const std::string& app_id,
     93                               bool diagnostic_mode) OVERRIDE;
     94   virtual void StartDemoAppLaunch() OVERRIDE;
     95 
     96   // Creates WizardController instance.
     97   WizardController* CreateWizardController();
     98 
     99   // Called when the first browser window is created, but before it's shown.
    100   void OnBrowserCreated();
    101 
    102   // Returns instance of the OOBE WebUI.
    103   OobeUI* GetOobeUI() const;
    104 
    105   const gfx::Rect& background_bounds() const { return background_bounds_; }
    106 
    107   // Trace id for ShowLoginWebUI event (since there exists at most one login
    108   // WebUI at a time).
    109   static const int kShowLoginWebUIid;
    110 
    111   views::Widget* login_window_for_test() { return login_window_; }
    112 
    113  protected:
    114   // content::NotificationObserver implementation:
    115   virtual void Observe(int type,
    116                        const content::NotificationSource& source,
    117                        const content::NotificationDetails& details) OVERRIDE;
    118 
    119   // Overridden from content::WebContentsObserver:
    120   virtual void RenderProcessGone(base::TerminationStatus status) OVERRIDE;
    121 
    122   // Overridden from chromeos::SessionManagerClient::Observer:
    123   virtual void EmitLoginPromptVisibleCalled() OVERRIDE;
    124 
    125   // Overridden from chromeos::CrasAudioHandler::AudioObserver:
    126   virtual void OnActiveOutputNodeChanged() OVERRIDE;
    127 
    128   // Overridden from ash::KeyboardStateObserver:
    129   virtual void OnVirtualKeyboardStateChanged(bool activated) OVERRIDE;
    130 
    131   // Overridden from keyboard::KeyboardControllerObserver:
    132   virtual void OnKeyboardBoundsChanging(const gfx::Rect& new_bounds) OVERRIDE;
    133 
    134   // Overridden from gfx::DisplayObserver:
    135   virtual void OnDisplayAdded(const gfx::Display& new_display) OVERRIDE;
    136   virtual void OnDisplayRemoved(const gfx::Display& old_display) OVERRIDE;
    137   virtual void OnDisplayMetricsChanged(const gfx::Display& display,
    138                                        uint32_t changed_metrics) OVERRIDE;
    139 
    140  private:
    141   // Way to restore if renderer have crashed.
    142   enum RestorePath {
    143     RESTORE_UNKNOWN,
    144     RESTORE_WIZARD,
    145     RESTORE_SIGN_IN,
    146     RESTORE_ADD_USER_INTO_SESSION,
    147   };
    148 
    149   // Type of animations to run after the login screen.
    150   enum FinalizeAnimationType {
    151     ANIMATION_NONE,       // No animation.
    152     ANIMATION_WORKSPACE,  // Use initial workspace animation (drop and
    153                           // and fade in workspace). Used for user login.
    154     ANIMATION_FADE_OUT,   // Fade out login screen. Used for app launch.
    155   };
    156 
    157   // Marks display host for deletion.
    158   // If |post_quit_task| is true also posts Quit task to the MessageLoop.
    159   void ShutdownDisplayHost(bool post_quit_task);
    160 
    161   // Schedules workspace transition animation.
    162   void ScheduleWorkspaceAnimation();
    163 
    164   // Schedules fade out animation.
    165   void ScheduleFadeOutAnimation();
    166 
    167   // Progress callback registered with |auto_enrollment_controller_|.
    168   void OnAutoEnrollmentProgress(policy::AutoEnrollmentState state);
    169 
    170   // Loads given URL. Creates WebUILoginView if needed.
    171   void LoadURL(const GURL& url);
    172 
    173   // Shows OOBE/sign in WebUI that was previously initialized in hidden state.
    174   void ShowWebUI();
    175 
    176   // Starts postponed WebUI (OOBE/sign in) if it was waiting for
    177   // wallpaper animation end.
    178   void StartPostponedWebUI();
    179 
    180   // Initializes |login_window_| and |login_view_| fields if needed.
    181   void InitLoginWindowAndView();
    182 
    183   // Closes |login_window_| and resets |login_window_| and |login_view_| fields.
    184   void ResetLoginWindowAndView();
    185 
    186   // Deletes |auth_prewarmer_|.
    187   void OnAuthPrewarmDone();
    188 
    189   // Toggles OOBE progress bar visibility, the bar is hidden by default.
    190   void SetOobeProgressBarVisible(bool visible);
    191 
    192   // Tries to play startup sound. If sound can't be played right now,
    193   // for instance, because cras server is not initialized, playback
    194   // will be delayed.
    195   void TryToPlayStartupSound();
    196 
    197   // Called when login-prompt-visible signal is caught.
    198   void OnLoginPromptVisible();
    199 
    200   // Used to calculate position of the screens and background.
    201   gfx::Rect background_bounds_;
    202 
    203   content::NotificationRegistrar registrar_;
    204 
    205   base::WeakPtrFactory<LoginDisplayHostImpl> pointer_factory_;
    206 
    207   // Default LoginDisplayHost.
    208   static LoginDisplayHost* default_host_;
    209 
    210   // Sign in screen controller.
    211   scoped_ptr<ExistingUserController> sign_in_controller_;
    212 
    213   // OOBE and some screens (camera, recovery) controller.
    214   scoped_ptr<WizardController> wizard_controller_;
    215 
    216   // App launch controller.
    217   scoped_ptr<AppLaunchController> app_launch_controller_;
    218 
    219   // Demo app launcher.
    220   scoped_ptr<DemoAppLauncher> demo_app_launcher_;
    221 
    222   // The controller driving the auto-enrollment check.
    223   scoped_ptr<AutoEnrollmentController> auto_enrollment_controller_;
    224 
    225   // Subscription for progress callbacks from |auto_enrollement_controller_|.
    226   scoped_ptr<AutoEnrollmentController::ProgressCallbackList::Subscription>
    227       auto_enrollment_progress_subscription_;
    228 
    229   // Has ShutdownDisplayHost() already been called?  Used to avoid posting our
    230   // own deletion to the message loop twice if the user logs out while we're
    231   // still in the process of cleaning up after login (http://crbug.com/134463).
    232   bool shutting_down_;
    233 
    234   // Whether progress bar is shown on the OOBE page.
    235   bool oobe_progress_bar_visible_;
    236 
    237   // True if session start is in progress.
    238   bool session_starting_;
    239 
    240   // Container of the screen we are displaying.
    241   views::Widget* login_window_;
    242 
    243   // Container of the view we are displaying.
    244   WebUILoginView* login_view_;
    245 
    246   // Login display we are using.
    247   WebUILoginDisplay* webui_login_display_;
    248 
    249   // True if the login display is the current screen.
    250   bool is_showing_login_;
    251 
    252   // True if NOTIFICATION_WALLPAPER_ANIMATION_FINISHED notification has been
    253   // received.
    254   bool is_wallpaper_loaded_;
    255 
    256   // Stores status area current visibility to be applied once login WebUI
    257   // is shown.
    258   bool status_area_saved_visibility_;
    259 
    260   // If true, WebUI is initialized in a hidden state and shown after the
    261   // wallpaper animation is finished (when it is enabled) or the user pods have
    262   // been loaded (otherwise).
    263   // By default is true. Could be used to tune performance if needed.
    264   bool initialize_webui_hidden_;
    265 
    266   // True if WebUI is initialized in hidden state and we're waiting for
    267   // wallpaper load animation to finish.
    268   bool waiting_for_wallpaper_load_;
    269 
    270   // True if WebUI is initialized in hidden state and we're waiting for user
    271   // pods to load.
    272   bool waiting_for_user_pods_;
    273 
    274   // How many times renderer has crashed.
    275   int crash_count_;
    276 
    277   // Way to restore if renderer have crashed.
    278   RestorePath restore_path_;
    279 
    280   // Stored parameters for StartWizard, required to restore in case of crash.
    281   std::string wizard_first_screen_name_;
    282   scoped_ptr<base::DictionaryValue> wizard_screen_parameters_;
    283 
    284   // Called before host deletion.
    285   base::Closure completion_callback_;
    286 
    287   // Active instance of authentication prewarmer.
    288   scoped_ptr<AuthPrewarmer> auth_prewarmer_;
    289 
    290   // A focus ring controller to draw focus ring around view for keyboard
    291   // driven oobe.
    292   scoped_ptr<FocusRingController> focus_ring_controller_;
    293 
    294   // Handles special keys for keyboard driven oobe.
    295   scoped_ptr<KeyboardDrivenOobeKeyHandler> keyboard_driven_oobe_key_handler_;
    296 
    297   FinalizeAnimationType finalize_animation_type_;
    298 
    299   base::WeakPtrFactory<LoginDisplayHostImpl> animation_weak_ptr_factory_;
    300 
    301   // Time when login prompt visible signal is received. Used for
    302   // calculations of delay before startup sound.
    303   base::TimeTicks login_prompt_visible_time_;
    304 
    305   // True when request to play startup sound was sent to
    306   // SoundsManager.
    307   bool startup_sound_played_;
    308 
    309   // When true, startup sound should be played only when spoken
    310   // feedback is enabled.  Otherwise, startup sound should be played
    311   // in any case.
    312   bool startup_sound_honors_spoken_feedback_;
    313 
    314   // True is subscribed as keyboard controller observer.
    315   bool is_observing_keyboard_;
    316 
    317   // The bounds of the virtual keyboard.
    318   gfx::Rect keyboard_bounds_;
    319 
    320   DISALLOW_COPY_AND_ASSIGN(LoginDisplayHostImpl);
    321 };
    322 
    323 }  // namespace chromeos
    324 
    325 #endif  // CHROME_BROWSER_CHROMEOS_LOGIN_UI_LOGIN_DISPLAY_HOST_IMPL_H_
    326