1 // Copyright 2017 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_LOCK_VIEWS_SCREEN_LOCKER_H_
6 #define CHROME_BROWSER_CHROMEOS_LOGIN_LOCK_VIEWS_SCREEN_LOCKER_H_
7 
8 #include "base/callback_forward.h"
9 #include "base/memory/weak_ptr.h"
10 #include "base/timer/timer.h"
11 #include "chrome/browser/chromeos/lock_screen_apps/focus_cycler_delegate.h"
12 #include "chrome/browser/chromeos/login/lock/screen_locker.h"
13 #include "chrome/browser/chromeos/settings/cros_settings.h"
14 #include "chrome/browser/ui/ash/login_screen_client.h"
15 #include "chromeos/dbus/power/power_manager_client.h"
16 
17 namespace chromeos {
18 
19 class UserBoardViewMojo;
20 class UserSelectionScreen;
21 class MojoSystemInfoDispatcher;
22 
23 // ViewsScreenLocker acts like LoginScreenClient::Delegate which handles method
24 // calls coming from ash into chrome.
25 // It is also a ScreenLocker::Delegate which handles calls from chrome into
26 // ash (views-based lockscreen).
27 class ViewsScreenLocker : public LoginScreenClient::Delegate,
28                           public ScreenLocker::Delegate,
29                           public PowerManagerClient::Observer,
30                           public lock_screen_apps::FocusCyclerDelegate {
31  public:
32   explicit ViewsScreenLocker(ScreenLocker* screen_locker);
33   ~ViewsScreenLocker() override;
34 
35   void Init();
36 
37   // ScreenLocker::Delegate:
38   void ShowErrorMessage(int error_msg_id,
39                         HelpAppLauncher::HelpTopic help_topic_id) override;
40   void ClearErrors() override;
41   void OnAshLockAnimationFinished() override;
42 
43   // LoginScreenClient::Delegate
44   void HandleAuthenticateUserWithPasswordOrPin(
45       const AccountId& account_id,
46       const std::string& password,
47       bool authenticated_by_pin,
48       base::OnceCallback<void(bool)> callback) override;
49   void HandleAuthenticateUserWithEasyUnlock(
50       const AccountId& account_id) override;
51   void HandleAuthenticateUserWithChallengeResponse(
52       const AccountId& account_id,
53       base::OnceCallback<void(bool)> callback) override;
54   void HandleHardlockPod(const AccountId& account_id) override;
55   void HandleOnFocusPod(const AccountId& account_id) override;
56   void HandleOnNoPodFocused() override;
57   bool HandleFocusLockScreenApps(bool reverse) override;
58   void HandleFocusOobeDialog() override;
59   void HandleLaunchPublicSession(const AccountId& account_id,
60                                  const std::string& locale,
61                                  const std::string& input_method) override;
62 
63   // PowerManagerClient::Observer:
64   void SuspendDone(const base::TimeDelta& sleep_duration) override;
65 
66   // lock_screen_apps::FocusCyclerDelegate:
67   void RegisterLockScreenAppFocusHandler(
68       const LockScreenAppFocusCallback& focus_handler) override;
69   void UnregisterLockScreenAppFocusHandler() override;
70   void HandleLockScreenAppFocusOut(bool reverse) override;
71 
72  private:
73   void UpdatePinKeyboardState(const AccountId& account_id);
74   void UpdateChallengeResponseAuthAvailability(const AccountId& account_id);
75   void OnPinCanAuthenticate(const AccountId& account_id, bool can_authenticate);
76 
77   std::unique_ptr<UserBoardViewMojo> user_board_view_mojo_;
78   std::unique_ptr<UserSelectionScreen> user_selection_screen_;
79 
80   // The ScreenLocker that owns this instance.
81   ScreenLocker* const screen_locker_ = nullptr;
82 
83   // Time when lock was initiated, required for metrics.
84   base::TimeTicks lock_time_;
85 
86   // Callback registered as a lock screen apps focus handler - it should be
87   // called to hand focus over to lock screen apps.
88   LockScreenAppFocusCallback lock_screen_app_focus_handler_;
89 
90   // Fetches system information and sends it to the UI over mojo.
91   std::unique_ptr<MojoSystemInfoDispatcher> system_info_updater_;
92 
93   base::WeakPtrFactory<ViewsScreenLocker> weak_factory_{this};
94 
95   DISALLOW_COPY_AND_ASSIGN(ViewsScreenLocker);
96 };
97 
98 }  // namespace chromeos
99 
100 #endif  // CHROME_BROWSER_CHROMEOS_LOGIN_LOCK_VIEWS_SCREEN_LOCKER_H_
101