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.
5 #ifndef CHROME_BROWSER_CHROMEOS_LOGIN_LOCK_WEBUI_SCREEN_LOCKER_H_
6 #define CHROME_BROWSER_CHROMEOS_LOGIN_LOCK_WEBUI_SCREEN_LOCKER_H_
10 #include "ash/shell_delegate.h"
11 #include "ash/wm/lock_state_observer.h"
12 #include "base/compiler_specific.h"
13 #include "base/memory/scoped_ptr.h"
14 #include "base/memory/weak_ptr.h"
15 #include "base/time/time.h"
16 #include "chrome/browser/chromeos/login/lock/screen_locker_delegate.h"
17 #include "chrome/browser/chromeos/login/signin_specifics.h"
18 #include "chrome/browser/chromeos/login/ui/lock_window.h"
19 #include "chrome/browser/chromeos/login/ui/login_display.h"
20 #include "chrome/browser/chromeos/login/ui/webui_login_view.h"
21 #include "chromeos/dbus/power_manager_client.h"
22 #include "content/public/browser/notification_observer.h"
23 #include "content/public/browser/notification_registrar.h"
24 #include "ui/keyboard/keyboard_controller_observer.h"
25 #include "ui/views/widget/widget.h"
26 #include "ui/views/widget/widget_observer.h"
36 class WebUILoginDisplay;
39 class NetworkStateHelper;
43 class WebUIScreenLockerTester;
46 // This version of ScreenLockerDelegate displays a WebUI lock screen based on
47 // the Oobe account picker screen.
48 class WebUIScreenLocker : public WebUILoginView,
49 public LoginDisplay::Delegate,
50 public ScreenLockerDelegate,
51 public LockWindow::Observer,
52 #if !defined(USE_ATHENA)
53 public ash::LockStateObserver,
55 public views::WidgetObserver,
56 public PowerManagerClient::Observer,
57 #if !defined(USE_ATHENA)
58 public ash::VirtualKeyboardStateObserver,
60 public keyboard::KeyboardControllerObserver {
62 explicit WebUIScreenLocker(ScreenLocker* screen_locker);
64 // ScreenLockerDelegate implementation.
65 virtual void LockScreen() override;
66 virtual void ScreenLockReady() override;
67 virtual void OnAuthenticate() override;
68 virtual void SetInputEnabled(bool enabled) override;
69 virtual void ShowErrorMessage(
71 HelpAppLauncher::HelpTopic help_topic_id) override;
72 virtual void ClearErrors() override;
73 virtual void AnimateAuthenticationSuccess() override;
74 virtual gfx::NativeWindow GetNativeWindow() const override;
75 virtual content::WebUI* GetAssociatedWebUI() override;
76 virtual void OnLockWebUIReady() override;
77 virtual void OnLockBackgroundDisplayed() override;
79 // LoginDisplay::Delegate: implementation
80 virtual void CancelPasswordChangedFlow() override;
81 virtual void CreateAccount() override;
82 virtual void CompleteLogin(const UserContext& user_context) override;
83 virtual base::string16 GetConnectedNetworkName() override;
84 virtual bool IsSigninInProgress() const override;
85 virtual void Login(const UserContext& user_context,
86 const SigninSpecifics& specifics) override;
87 virtual void MigrateUserData(const std::string& old_password) override;
88 virtual void OnSigninScreenReady() override;
89 virtual void OnStartEnterpriseEnrollment() override;
90 virtual void OnStartKioskEnableScreen() override;
91 virtual void OnStartKioskAutolaunchScreen() override;
92 virtual void ShowWrongHWIDScreen() override;
93 virtual void ResetPublicSessionAutoLoginTimer() override;
94 virtual void ResyncUserData() override;
95 virtual void SetDisplayEmail(const std::string& email) override;
96 virtual void Signout() override;
98 // content::NotificationObserver (via WebUILoginView) implementation.
99 virtual void Observe(int type,
100 const content::NotificationSource& source,
101 const content::NotificationDetails& details) override;
103 // LockWindow::Observer implementation.
104 virtual void OnLockWindowReady() override;
106 #if !defined(USE_ATHENA)
107 // LockStateObserver override.
108 virtual void OnLockStateEvent(
109 ash::LockStateObserver::EventType event) override;
112 // WidgetObserver override.
113 virtual void OnWidgetDestroying(views::Widget* widget) override;
115 // PowerManagerClient::Observer overrides:
116 virtual void SuspendDone(const base::TimeDelta& sleep_duration) override;
117 virtual void LidEventReceived(bool open,
118 const base::TimeTicks& time) override;
120 // Overridden from content::WebContentsObserver:
121 virtual void RenderProcessGone(base::TerminationStatus status) override;
123 #if !defined(USE_ATHENA)
124 // Overridden from ash::KeyboardStateObserver:
125 virtual void OnVirtualKeyboardStateChanged(bool activated) override;
128 // Overridden from keyboard::KeyboardControllerObserver:
129 virtual void OnKeyboardBoundsChanging(const gfx::Rect& new_bounds) override;
131 // Returns instance of the OOBE WebUI.
135 friend class test::WebUIScreenLockerTester;
137 virtual ~WebUIScreenLocker();
139 // Ensures that user pod is focused.
142 // The screen locker window.
143 views::Widget* lock_window_;
145 // Login UI implementation instance.
146 scoped_ptr<WebUILoginDisplay> login_display_;
148 // Used for user image changed notifications.
149 content::NotificationRegistrar registrar_;
151 // Tracks when the lock window is displayed and ready.
154 // Tracks when the WebUI finishes loading.
157 // Time when lock was initiated, required for metrics.
158 base::TimeTicks lock_time_;
160 scoped_ptr<login::NetworkStateHelper> network_state_helper_;
162 // True is subscribed as keyboard controller observer.
163 bool is_observing_keyboard_;
165 // The bounds of the virtual keyboard.
166 gfx::Rect keyboard_bounds_;
168 base::WeakPtrFactory<WebUIScreenLocker> weak_factory_;
170 DISALLOW_COPY_AND_ASSIGN(WebUIScreenLocker);
173 } // namespace chromeos
175 #endif // CHROME_BROWSER_CHROMEOS_LOGIN_LOCK_WEBUI_SCREEN_LOCKER_H_