OLD | NEW |
1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "ash/session/session_controller.h" | 5 #include "ash/session/session_controller.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 | 8 |
9 #include "ash/session/session_state_observer.h" | 9 #include "ash/session/session_state_observer.h" |
| 10 #include "ash/shell.h" |
| 11 #include "ash/wm/lock_state_controller.h" |
10 #include "base/bind.h" | 12 #include "base/bind.h" |
11 #include "base/bind_helpers.h" | 13 #include "base/bind_helpers.h" |
12 #include "base/command_line.h" | 14 #include "base/command_line.h" |
13 #include "chromeos/chromeos_switches.h" | 15 #include "chromeos/chromeos_switches.h" |
14 #include "components/signin/core/account_id/account_id.h" | 16 #include "components/signin/core/account_id/account_id.h" |
15 #include "services/service_manager/public/cpp/connector.h" | 17 #include "services/service_manager/public/cpp/connector.h" |
16 | 18 |
| 19 using session_manager::SessionState; |
| 20 |
17 namespace ash { | 21 namespace ash { |
18 | 22 |
19 namespace { | 23 namespace { |
20 | 24 |
21 // Get the default session state. Default session state is ACTIVE when the | 25 // Get the default session state. Default session state is ACTIVE when the |
22 // process starts with a user session, i.e. the process has kLoginUser command | 26 // process starts with a user session, i.e. the process has kLoginUser command |
23 // line switch. This is needed because ash focus rules depends on whether | 27 // line switch. This is needed because ash focus rules depends on whether |
24 // session is blocked to pick an activatable window and chrome needs to create a | 28 // session is blocked to pick an activatable window and chrome needs to create a |
25 // focused browser window when starting with a user session (both in production | 29 // focused browser window when starting with a user session (both in production |
26 // and in tests). Using ACTIVE as default in this situation allows chrome to run | 30 // and in tests). Using ACTIVE as default in this situation allows chrome to run |
27 // without having to wait for session state to reach to ash. For other cases | 31 // without having to wait for session state to reach to ash. For other cases |
28 // (oobe/login), there is only one login window. The login window always gets | 32 // (oobe/login), there is only one login window. The login window always gets |
29 // focus so default session state does not matter. Use UNKNOWN and wait for | 33 // focus so default session state does not matter. Use UNKNOWN and wait for |
30 // chrome to update ash for such cases. | 34 // chrome to update ash for such cases. |
31 session_manager::SessionState GetDefaultSessionState() { | 35 SessionState GetDefaultSessionState() { |
32 const bool start_with_user = | 36 const bool start_with_user = |
33 base::CommandLine::ForCurrentProcess()->HasSwitch( | 37 base::CommandLine::ForCurrentProcess()->HasSwitch( |
34 chromeos::switches::kLoginUser); | 38 chromeos::switches::kLoginUser); |
35 return start_with_user ? session_manager::SessionState::ACTIVE | 39 return start_with_user ? SessionState::ACTIVE : SessionState::UNKNOWN; |
36 : session_manager::SessionState::UNKNOWN; | |
37 } | 40 } |
38 | 41 |
39 } // namespace | 42 } // namespace |
40 | 43 |
41 SessionController::SessionController() : state_(GetDefaultSessionState()) {} | 44 SessionController::SessionController() : state_(GetDefaultSessionState()) {} |
42 | 45 |
43 SessionController::~SessionController() {} | 46 SessionController::~SessionController() {} |
44 | 47 |
45 void SessionController::BindRequest(mojom::SessionControllerRequest request) { | 48 void SessionController::BindRequest(mojom::SessionControllerRequest request) { |
46 bindings_.AddBinding(this, std::move(request)); | 49 bindings_.AddBinding(this, std::move(request)); |
(...skipping 13 matching lines...) Expand all Loading... |
60 | 63 |
61 bool SessionController::IsActiveUserSessionStarted() const { | 64 bool SessionController::IsActiveUserSessionStarted() const { |
62 return !user_sessions_.empty(); | 65 return !user_sessions_.empty(); |
63 } | 66 } |
64 | 67 |
65 bool SessionController::CanLockScreen() const { | 68 bool SessionController::CanLockScreen() const { |
66 return IsActiveUserSessionStarted() && can_lock_; | 69 return IsActiveUserSessionStarted() && can_lock_; |
67 } | 70 } |
68 | 71 |
69 bool SessionController::IsScreenLocked() const { | 72 bool SessionController::IsScreenLocked() const { |
70 return state_ == session_manager::SessionState::LOCKED; | 73 return state_ == SessionState::LOCKED; |
71 } | 74 } |
72 | 75 |
73 bool SessionController::ShouldLockScreenAutomatically() const { | 76 bool SessionController::ShouldLockScreenAutomatically() const { |
74 return should_lock_screen_automatically_; | 77 return should_lock_screen_automatically_; |
75 } | 78 } |
76 | 79 |
77 bool SessionController::IsUserSessionBlocked() const { | 80 bool SessionController::IsUserSessionBlocked() const { |
78 return state_ != session_manager::SessionState::ACTIVE; | 81 // User sessions are blocked when session state is not ACTIVE, except that |
| 82 // LOCKED state with a running unlocking animation. This is made an exception |
| 83 // because the unlocking animation hides lock container at the end. During the |
| 84 // unlock animation, IsUserSessionBlocked needs to return unblocked so that |
| 85 // user windows are deemed activatable and ash correctly restore the active |
| 86 // window before locking. |
| 87 return state_ != SessionState::ACTIVE && |
| 88 !(state_ == SessionState::LOCKED && is_unlocking_); |
79 } | 89 } |
80 | 90 |
81 bool SessionController::IsInSecondaryLoginScreen() const { | 91 bool SessionController::IsInSecondaryLoginScreen() const { |
82 return state_ == session_manager::SessionState::LOGIN_SECONDARY; | 92 return state_ == SessionState::LOGIN_SECONDARY; |
83 } | 93 } |
84 | 94 |
85 session_manager::SessionState SessionController::GetSessionState() const { | 95 SessionState SessionController::GetSessionState() const { |
86 return state_; | 96 return state_; |
87 } | 97 } |
88 | 98 |
89 const std::vector<mojom::UserSessionPtr>& SessionController::GetUserSessions() | 99 const std::vector<mojom::UserSessionPtr>& SessionController::GetUserSessions() |
90 const { | 100 const { |
91 return user_sessions_; | 101 return user_sessions_; |
92 } | 102 } |
93 | 103 |
94 const mojom::UserSession* SessionController::GetUserSession( | 104 const mojom::UserSession* SessionController::GetUserSession( |
95 UserIndex index) const { | 105 UserIndex index) const { |
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
178 if (user_sessions_[0]->session_id != active_session_id_) { | 188 if (user_sessions_[0]->session_id != active_session_id_) { |
179 active_session_id_ = user_sessions_[0]->session_id; | 189 active_session_id_ = user_sessions_[0]->session_id; |
180 | 190 |
181 for (auto& observer : observers_) | 191 for (auto& observer : observers_) |
182 observer.ActiveUserChanged(user_sessions_[0]->account_id); | 192 observer.ActiveUserChanged(user_sessions_[0]->account_id); |
183 | 193 |
184 UpdateLoginStatus(); | 194 UpdateLoginStatus(); |
185 } | 195 } |
186 } | 196 } |
187 | 197 |
| 198 void SessionController::RunUnlockAnimation( |
| 199 const RunUnlockAnimationCallback& callback) { |
| 200 is_unlocking_ = true; |
| 201 |
| 202 // Shell could have no instance in tests. |
| 203 if (Shell::HasInstance()) |
| 204 Shell::Get()->lock_state_controller()->OnLockScreenHide(callback); |
| 205 } |
| 206 |
188 void SessionController::ClearUserSessionsForTest() { | 207 void SessionController::ClearUserSessionsForTest() { |
189 user_sessions_.clear(); | 208 user_sessions_.clear(); |
190 } | 209 } |
191 | 210 |
192 void SessionController::FlushMojoForTest() { | 211 void SessionController::FlushMojoForTest() { |
193 client_.FlushForTesting(); | 212 client_.FlushForTesting(); |
194 } | 213 } |
195 | 214 |
196 void SessionController::LockScreenAndFlushForTest() { | 215 void SessionController::LockScreenAndFlushForTest() { |
197 LockScreen(); | 216 LockScreen(); |
198 FlushMojoForTest(); | 217 FlushMojoForTest(); |
199 } | 218 } |
200 | 219 |
201 void SessionController::SetSessionState(session_manager::SessionState state) { | 220 void SessionController::SetSessionState(SessionState state) { |
202 if (state_ == state) | 221 if (state_ == state) |
203 return; | 222 return; |
204 | 223 |
| 224 const bool was_locked = state_ == SessionState::LOCKED; |
205 state_ = state; | 225 state_ = state; |
206 for (auto& observer : observers_) | 226 for (auto& observer : observers_) |
207 observer.SessionStateChanged(state_); | 227 observer.SessionStateChanged(state_); |
208 | 228 |
209 UpdateLoginStatus(); | 229 UpdateLoginStatus(); |
| 230 |
| 231 const bool locked = state_ == SessionState::LOCKED; |
| 232 if (was_locked != locked) { |
| 233 if (!locked) |
| 234 is_unlocking_ = false; |
| 235 |
| 236 for (auto& observer : observers_) |
| 237 observer.LockStateChanged(locked); |
| 238 } |
210 } | 239 } |
211 | 240 |
212 void SessionController::AddUserSession(mojom::UserSessionPtr user_session) { | 241 void SessionController::AddUserSession(mojom::UserSessionPtr user_session) { |
213 const AccountId account_id(user_session->account_id); | 242 const AccountId account_id(user_session->account_id); |
214 | 243 |
215 user_sessions_.push_back(std::move(user_session)); | 244 user_sessions_.push_back(std::move(user_session)); |
216 | 245 |
217 for (auto& observer : observers_) | 246 for (auto& observer : observers_) |
218 observer.UserAddedToSession(account_id); | 247 observer.UserAddedToSession(account_id); |
219 } | 248 } |
220 | 249 |
221 LoginStatus SessionController::CalculateLoginStatus() const { | 250 LoginStatus SessionController::CalculateLoginStatus() const { |
222 using session_manager::SessionState; | |
223 | |
224 // TODO(jamescook|xiyuan): There is not a 1:1 mapping of SessionState to | 251 // TODO(jamescook|xiyuan): There is not a 1:1 mapping of SessionState to |
225 // LoginStatus. Fix the cases that don't match. http://crbug.com/701193 | 252 // LoginStatus. Fix the cases that don't match. http://crbug.com/701193 |
226 switch (state_) { | 253 switch (state_) { |
227 case SessionState::UNKNOWN: | 254 case SessionState::UNKNOWN: |
228 case SessionState::OOBE: | 255 case SessionState::OOBE: |
229 case SessionState::LOGIN_PRIMARY: | 256 case SessionState::LOGIN_PRIMARY: |
230 case SessionState::LOGGED_IN_NOT_ACTIVE: | 257 case SessionState::LOGGED_IN_NOT_ACTIVE: |
231 return LoginStatus::NOT_LOGGED_IN; | 258 return LoginStatus::NOT_LOGGED_IN; |
232 | 259 |
233 case SessionState::ACTIVE: | 260 case SessionState::ACTIVE: |
234 return CalculateLoginStatusForActiveSession(); | 261 return CalculateLoginStatusForActiveSession(); |
235 | 262 |
236 case SessionState::LOCKED: | 263 case SessionState::LOCKED: |
237 return LoginStatus::LOCKED; | 264 return LoginStatus::LOCKED; |
238 | 265 |
239 case SessionState::LOGIN_SECONDARY: | 266 case SessionState::LOGIN_SECONDARY: |
240 // TODO: There is no LoginStatus for this. | 267 // TODO: There is no LoginStatus for this. |
241 return LoginStatus::USER; | 268 return LoginStatus::USER; |
242 } | 269 } |
243 NOTREACHED(); | 270 NOTREACHED(); |
244 return LoginStatus::NOT_LOGGED_IN; | 271 return LoginStatus::NOT_LOGGED_IN; |
245 } | 272 } |
246 | 273 |
247 LoginStatus SessionController::CalculateLoginStatusForActiveSession() const { | 274 LoginStatus SessionController::CalculateLoginStatusForActiveSession() const { |
248 DCHECK(state_ == session_manager::SessionState::ACTIVE); | 275 DCHECK(state_ == SessionState::ACTIVE); |
249 | 276 |
250 if (user_sessions_.empty()) // Can be empty in tests. | 277 if (user_sessions_.empty()) // Can be empty in tests. |
251 return LoginStatus::USER; | 278 return LoginStatus::USER; |
252 | 279 |
253 switch (user_sessions_[0]->type) { | 280 switch (user_sessions_[0]->type) { |
254 case user_manager::USER_TYPE_REGULAR: | 281 case user_manager::USER_TYPE_REGULAR: |
255 // TODO: This needs to distinguish between owner and non-owner. | 282 // TODO: This needs to distinguish between owner and non-owner. |
256 return LoginStatus::USER; | 283 return LoginStatus::USER; |
257 case user_manager::USER_TYPE_GUEST: | 284 case user_manager::USER_TYPE_GUEST: |
258 return LoginStatus::GUEST; | 285 return LoginStatus::GUEST; |
(...skipping 23 matching lines...) Expand all Loading... |
282 const LoginStatus new_login_status = CalculateLoginStatus(); | 309 const LoginStatus new_login_status = CalculateLoginStatus(); |
283 if (new_login_status == login_status_) | 310 if (new_login_status == login_status_) |
284 return; | 311 return; |
285 | 312 |
286 login_status_ = new_login_status; | 313 login_status_ = new_login_status; |
287 for (auto& observer : observers_) | 314 for (auto& observer : observers_) |
288 observer.LoginStatusChanged(login_status_); | 315 observer.LoginStatusChanged(login_status_); |
289 } | 316 } |
290 | 317 |
291 } // namespace ash | 318 } // namespace ash |
OLD | NEW |