OLD | NEW |
---|---|
(Empty) | |
1 // Copyright (c) 2012 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 #include "ash/wm/session_state_controller.h" | |
6 | |
7 #include "ash/ash_switches.h" | |
8 #include "ash/shell.h" | |
9 #include "ash/shell_delegate.h" | |
10 #include "ash/shell_window_ids.h" | |
11 #include "ash/wm/session_state_animator.h" | |
12 #include "base/command_line.h" | |
13 #include "ui/aura/root_window.h" | |
14 #include "ui/aura/shared/compound_event_filter.h" | |
15 | |
16 #if defined(OS_CHROMEOS) | |
17 #include "base/chromeos/chromeos_version.h" | |
18 #endif | |
19 | |
Nikita (slow)
2012/10/16 12:43:45
nit: drop empty line.
Denis Kuznetsov (DE-MUC)
2012/10/16 14:24:53
Done.
| |
20 | |
21 namespace ash { | |
22 | |
23 const int SessionStateController::kLockTimeoutMs = 400; | |
24 const int SessionStateController::kShutdownTimeoutMs = 400; | |
25 const int SessionStateController::kLockFailTimeoutMs = 4000; | |
26 const int SessionStateController::kLockToShutdownTimeoutMs = 150; | |
27 const int SessionStateController::kSlowCloseAnimMs = 400; | |
28 const int SessionStateController::kUndoSlowCloseAnimMs = 100; | |
29 const int SessionStateController::kFastCloseAnimMs = 150; | |
30 const int SessionStateController::kShutdownRequestDelayMs = 50; | |
31 | |
Nikita (slow)
2012/10/16 12:43:45
Please add these:
///////////////////////////////
Daniel Erat
2012/10/16 14:04:16
I'm actually curious: what's the point of putting
| |
32 SessionStateController::TestApi::TestApi(SessionStateController* controller) | |
33 : controller_(controller) { | |
34 } | |
35 | |
36 SessionStateController::TestApi::~TestApi() { | |
37 } | |
38 | |
39 SessionStateController::SessionStateController() | |
40 : login_status_(user::LOGGED_IN_NONE), | |
41 unlocked_login_status_(user::LOGGED_IN_NONE), | |
42 shutting_down_(false), | |
43 shutdown_after_lock_(false), | |
44 animator_(new internal::SessionStateAnimator()) { | |
45 Shell::GetPrimaryRootWindow()->AddRootWindowObserver(this); | |
46 } | |
47 | |
48 SessionStateController::~SessionStateController() { | |
49 Shell::GetPrimaryRootWindow()->RemoveRootWindowObserver(this); | |
50 } | |
51 | |
52 void SessionStateController::OnLoginStateChanged(user::LoginStatus status) { | |
53 login_status_ = status; | |
54 unlocked_login_status_ = user::LOGGED_IN_NONE; | |
55 } | |
56 | |
57 void SessionStateController::OnAppTerminating() { | |
58 // If we hear that Chrome is exiting but didn't request it ourselves, all we | |
59 // can really hope for is that we'll have time to clear the screen. | |
60 if (!shutting_down_) { | |
61 shutting_down_ = true; | |
62 Shell* shell = ash::Shell::GetInstance(); | |
63 shell->env_filter()->set_cursor_hidden_by_filter(false); | |
64 shell->cursor_manager()->ShowCursor(false); | |
65 animator_->ShowBlackLayer(); | |
66 animator_->StartAnimation( | |
67 internal::SessionStateAnimator::kAllContainersMask, | |
68 internal::SessionStateAnimator::ANIMATION_HIDE); | |
69 } | |
70 } | |
71 | |
72 void SessionStateController::OnLockStateChanged(bool locked) { | |
73 if (shutting_down_ || (login_status_ == user::LOGGED_IN_LOCKED) == locked) | |
Daniel Erat
2012/10/15 13:24:47
nit: i think you can change "(login_status_ == use
Denis Kuznetsov (DE-MUC)
2012/10/16 14:24:53
Done.
| |
74 return; | |
75 | |
76 if (!locked && login_status_ == user::LOGGED_IN_LOCKED) { | |
77 login_status_ = unlocked_login_status_; | |
78 unlocked_login_status_ = user::LOGGED_IN_NONE; | |
79 } else { | |
80 unlocked_login_status_ = login_status_; | |
81 login_status_ = user::LOGGED_IN_LOCKED; | |
82 } | |
83 | |
84 if (locked) { | |
85 animator_->StartAnimation( | |
86 internal::SessionStateAnimator::LOCK_SCREEN_CONTAINERS, | |
87 internal::SessionStateAnimator::ANIMATION_FADE_IN); | |
88 lock_timer_.Stop(); | |
89 lock_fail_timer_.Stop(); | |
90 | |
91 if (shutdown_after_lock_) { | |
92 shutdown_after_lock_ = false; | |
93 StartLockToShutdownTimer(); | |
94 } | |
95 } else { | |
96 animator_->StartAnimation( | |
97 internal::SessionStateAnimator::DESKTOP_BACKGROUND | | |
98 internal::SessionStateAnimator::LAUNCHER | | |
99 internal::SessionStateAnimator::NON_LOCK_SCREEN_CONTAINERS, | |
100 internal::SessionStateAnimator::ANIMATION_RESTORE); | |
101 animator_->DropBlackLayer(); | |
102 } | |
103 } | |
104 | |
105 void SessionStateController::OnStartingLock() { | |
106 if (shutting_down_ || login_status_ == user::LOGGED_IN_LOCKED) | |
107 return; | |
108 | |
109 // Ensure that the black layer is visible -- if the screen was locked via | |
110 // the wrench menu, we won't have already shown the black background | |
111 // as part of the slow-close animation. | |
112 animator_->ShowBlackLayer(); | |
113 | |
114 animator_->StartAnimation( | |
115 internal::SessionStateAnimator::LAUNCHER, | |
116 internal::SessionStateAnimator::ANIMATION_HIDE); | |
117 | |
118 animator_->StartAnimation( | |
119 internal::SessionStateAnimator::NON_LOCK_SCREEN_CONTAINERS, | |
120 internal::SessionStateAnimator::ANIMATION_FAST_CLOSE); | |
121 | |
122 // Hide the screen locker containers so we can make them fade in later. | |
123 animator_->StartAnimation( | |
124 internal::SessionStateAnimator::LOCK_SCREEN_CONTAINERS, | |
125 internal::SessionStateAnimator::ANIMATION_HIDE); | |
126 } | |
127 | |
128 void SessionStateController::StartLockAnimationAndLockImmediately() { | |
129 animator_->ShowBlackLayer(); | |
130 animator_->StartAnimation( | |
131 internal::SessionStateAnimator::NON_LOCK_SCREEN_CONTAINERS, | |
132 internal::SessionStateAnimator::ANIMATION_SLOW_CLOSE); | |
133 OnLockTimeout(); | |
134 } | |
135 | |
136 void SessionStateController::StartLockAnimation() { | |
137 shutdown_after_lock_ = true; | |
138 | |
139 animator_->ShowBlackLayer(); | |
140 animator_->StartAnimation( | |
141 internal::SessionStateAnimator::NON_LOCK_SCREEN_CONTAINERS, | |
142 internal::SessionStateAnimator::ANIMATION_SLOW_CLOSE); | |
143 StartLockTimer(); | |
144 } | |
145 | |
146 void SessionStateController::StartShutdownAnimation() { | |
147 animator_->ShowBlackLayer(); | |
148 animator_->StartAnimation( | |
149 internal::SessionStateAnimator::kAllContainersMask, | |
150 internal::SessionStateAnimator::ANIMATION_SLOW_CLOSE); | |
151 | |
152 StartPreShutdownAnimationTimer(); | |
153 } | |
154 | |
155 bool SessionStateController::IsEligibleForLock() { | |
156 return LoggedInAsNonGuest() && !IsLocked(); | |
Daniel Erat
2012/10/15 13:24:47
should this also have && !LockRequested()?
Denis Kuznetsov (DE-MUC)
2012/10/16 14:24:53
It seems logical, I will add this, but I thought a
| |
157 } | |
158 | |
159 bool SessionStateController::IsLocked() { | |
160 return login_status_ == user::LOGGED_IN_LOCKED; | |
161 } | |
162 | |
163 bool SessionStateController::LockRequested() { | |
164 return lock_fail_timer_.IsRunning(); | |
165 } | |
166 | |
167 bool SessionStateController::ShutdownRequested() { | |
168 return shutting_down_; | |
169 } | |
170 | |
171 bool SessionStateController::CanCancelLockAnimation() { | |
172 return lock_timer_.IsRunning(); | |
173 } | |
174 | |
175 void SessionStateController::CancelLockAnimation() { | |
176 if (!CanCancelLockAnimation()) | |
177 return; | |
178 shutdown_after_lock_ = false; | |
179 animator_->StartAnimation( | |
180 internal::SessionStateAnimator::kAllContainersMask, | |
181 internal::SessionStateAnimator::ANIMATION_UNDO_SLOW_CLOSE); | |
182 animator_->ScheduleDropBlackLayer(); | |
183 lock_timer_.Stop(); | |
184 } | |
185 | |
186 void SessionStateController::CancelLockWithOtherAnimation() { | |
187 if (!CanCancelLockAnimation()) | |
188 return; | |
189 shutdown_after_lock_ = false; | |
190 animator_->StartAnimation( | |
191 internal::SessionStateAnimator::NON_LOCK_SCREEN_CONTAINERS, | |
192 internal::SessionStateAnimator::ANIMATION_UNDO_SLOW_CLOSE); | |
193 animator_->ScheduleDropBlackLayer(); | |
194 lock_timer_.Stop(); | |
195 } | |
196 | |
197 bool SessionStateController::CanCancelShutdownAnimation() { | |
198 return pre_shutdown_timer_.IsRunning() || | |
199 lock_to_shutdown_timer_.IsRunning(); | |
200 } | |
201 | |
202 void SessionStateController::CancelShutdownAnimation() { | |
203 if (!CanCancelShutdownAnimation()) | |
204 return; | |
205 if (lock_to_shutdown_timer_.IsRunning()) { | |
206 lock_to_shutdown_timer_.Stop(); | |
207 return; | |
208 } | |
209 | |
210 if (login_status_ == user::LOGGED_IN_LOCKED) { | |
211 // If we've already started shutdown transition at lock screen | |
212 // desktop background needs to be restored immediately. | |
213 animator_->StartAnimation( | |
214 internal::SessionStateAnimator::DESKTOP_BACKGROUND, | |
215 internal::SessionStateAnimator::ANIMATION_RESTORE); | |
216 animator_->StartAnimation( | |
217 internal::SessionStateAnimator::kAllLockScreenContainersMask, | |
218 internal::SessionStateAnimator::ANIMATION_UNDO_SLOW_CLOSE); | |
219 animator_->ScheduleDropBlackLayer(); | |
220 } else { | |
221 animator_->StartAnimation( | |
222 internal::SessionStateAnimator::kAllContainersMask, | |
223 internal::SessionStateAnimator::ANIMATION_UNDO_SLOW_CLOSE); | |
224 animator_->ScheduleDropBlackLayer(); | |
225 } | |
226 pre_shutdown_timer_.Stop(); | |
227 } | |
228 | |
229 void SessionStateController::RequestShutdown() { | |
230 if (!shutting_down_) | |
231 animator_->ShowBlackLayer(); | |
232 RequestShutdownImpl(); | |
233 } | |
234 | |
235 void SessionStateController::RequestShutdownImpl() { | |
236 DCHECK(!shutting_down_); | |
237 shutting_down_ = true; | |
238 | |
239 Shell* shell = ash::Shell::GetInstance(); | |
240 shell->env_filter()->set_cursor_hidden_by_filter(false); | |
241 shell->cursor_manager()->ShowCursor(false); | |
242 | |
243 animator_->ShowBlackLayer(); | |
244 if (login_status_ != user::LOGGED_IN_NONE) { | |
245 // Hide the other containers before starting the animation. | |
246 // ANIMATION_FAST_CLOSE will make the screen locker windows partially | |
247 // transparent, and we don't want the other windows to show through. | |
248 animator_->StartAnimation( | |
249 internal::SessionStateAnimator::NON_LOCK_SCREEN_CONTAINERS | | |
250 internal::SessionStateAnimator::LAUNCHER, | |
251 internal::SessionStateAnimator::ANIMATION_HIDE); | |
252 animator_->StartAnimation( | |
253 internal::SessionStateAnimator::kAllLockScreenContainersMask, | |
254 internal::SessionStateAnimator::ANIMATION_FAST_CLOSE); | |
255 } else { | |
256 animator_->StartAnimation( | |
257 internal::SessionStateAnimator::kAllContainersMask, | |
258 internal::SessionStateAnimator::ANIMATION_FAST_CLOSE); | |
259 } | |
260 StartRealShutdownTimer(); | |
261 } | |
262 | |
263 void SessionStateController::OnRootWindowHostCloseRequested( | |
264 const aura::RootWindow*) { | |
265 if(Shell::GetInstance() && Shell::GetInstance()->delegate()) | |
266 Shell::GetInstance()->delegate()->Exit(); | |
267 } | |
268 | |
269 bool SessionStateController::LoggedInAsNonGuest() const { | |
270 if (login_status_ == user::LOGGED_IN_NONE) | |
Nikita (slow)
2012/10/16 12:43:45
Could just use
return (login_status_ != user::LOG
Denis Kuznetsov (DE-MUC)
2012/10/16 14:24:53
Done.
| |
271 return false; | |
272 if (login_status_ == user::LOGGED_IN_GUEST) | |
273 return false; | |
274 // TODO(mukai): think about kiosk mode. | |
275 return true; | |
276 } | |
277 | |
278 void SessionStateController::StartLockTimer() { | |
279 lock_timer_.Stop(); | |
280 lock_timer_.Start(FROM_HERE, | |
281 base::TimeDelta::FromMilliseconds(kSlowCloseAnimMs), | |
282 this, &SessionStateController::OnLockTimeout); | |
283 } | |
284 | |
285 void SessionStateController::OnLockTimeout() { | |
286 delegate_->RequestLockScreen(); | |
287 lock_fail_timer_.Start( | |
288 FROM_HERE, | |
289 base::TimeDelta::FromMilliseconds(kLockFailTimeoutMs), | |
290 this, &SessionStateController::OnLockFailTimeout); | |
291 } | |
292 | |
293 void SessionStateController::OnLockFailTimeout() { | |
294 DCHECK_NE(login_status_, user::LOGGED_IN_LOCKED); | |
295 // Undo lock animation. | |
296 animator_->StartAnimation( | |
297 internal::SessionStateAnimator::LAUNCHER | | |
298 internal::SessionStateAnimator::NON_LOCK_SCREEN_CONTAINERS, | |
299 internal::SessionStateAnimator::ANIMATION_RESTORE); | |
300 animator_->DropBlackLayer(); | |
301 } | |
302 | |
303 void SessionStateController::StartLockToShutdownTimer() { | |
304 shutdown_after_lock_ = false; | |
305 lock_to_shutdown_timer_.Stop(); | |
306 lock_to_shutdown_timer_.Start( | |
307 FROM_HERE, | |
308 base::TimeDelta::FromMilliseconds(kLockToShutdownTimeoutMs), | |
309 this, &SessionStateController::OnLockToShutdownTimeout); | |
310 } | |
311 | |
312 | |
313 void SessionStateController::OnLockToShutdownTimeout() { | |
314 DCHECK_EQ(login_status_, user::LOGGED_IN_LOCKED); | |
315 StartShutdownAnimation(); | |
316 } | |
317 | |
318 void SessionStateController::StartPreShutdownAnimationTimer() { | |
319 pre_shutdown_timer_.Stop(); | |
320 pre_shutdown_timer_.Start( | |
321 FROM_HERE, | |
322 base::TimeDelta::FromMilliseconds(kShutdownTimeoutMs), | |
323 this, &SessionStateController::OnPreShutdownAnimationTimeout); | |
324 } | |
325 | |
326 void SessionStateController::OnPreShutdownAnimationTimeout() { | |
327 if (!shutting_down_) | |
328 RequestShutdownImpl(); | |
329 } | |
330 | |
331 void SessionStateController::StartRealShutdownTimer() { | |
332 real_shutdown_timer_.Start( | |
333 FROM_HERE, | |
334 base::TimeDelta::FromMilliseconds(kFastCloseAnimMs + | |
335 kShutdownRequestDelayMs), | |
336 this, &SessionStateController::OnRealShutdownTimeout); | |
337 } | |
338 | |
339 void SessionStateController::OnRealShutdownTimeout() { | |
340 DCHECK(shutting_down_); | |
341 #if defined(OS_CHROMEOS) | |
342 if (!base::chromeos::IsRunningOnChromeOS()) { | |
343 ShellDelegate* delegate = Shell::GetInstance()->delegate(); | |
344 if (delegate) | |
345 delegate->Exit(); | |
Daniel Erat
2012/10/15 13:24:47
should there be a return within this "if (delegate
Denis Kuznetsov (DE-MUC)
2012/10/16 14:24:53
Sounds reasonable.
| |
346 } | |
347 #endif | |
348 delegate_->RequestShutdown(); | |
349 } | |
350 | |
351 } // namespace ash | |
OLD | NEW |