Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(35)

Side by Side Diff: ash/wm/session_state_controller_impl2.cc

Issue 11453012: Fix black background when locking with fullscreen window: (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: Add fix for shutdown cut-off timing Created 8 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 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 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/wm/session_state_controller_impl2.h" 5 #include "ash/wm/session_state_controller_impl2.h"
6 6
7 #include "ash/ash_switches.h" 7 #include "ash/ash_switches.h"
8 #include "ash/shell.h" 8 #include "ash/shell.h"
9 #include "ash/shell_delegate.h" 9 #include "ash/shell_delegate.h"
10 #include "ash/shell_window_ids.h" 10 #include "ash/shell_window_ids.h"
11 #include "ash/wm/session_state_animator.h" 11 #include "ash/wm/session_state_animator.h"
12 #include "base/bind_helpers.h" 12 #include "base/bind_helpers.h"
13 #include "base/command_line.h" 13 #include "base/command_line.h"
14 #include "base/timer.h"
14 #include "ui/aura/root_window.h" 15 #include "ui/aura/root_window.h"
16 #include "ui/compositor/scoped_layer_animation_settings.h"
15 #include "ui/views/corewm/compound_event_filter.h" 17 #include "ui/views/corewm/compound_event_filter.h"
16 18
17 #if defined(OS_CHROMEOS) 19 #if defined(OS_CHROMEOS)
18 #include "base/chromeos/chromeos_version.h" 20 #include "base/chromeos/chromeos_version.h"
19 #endif 21 #endif
20 22
21 namespace ash { 23 namespace ash {
22 24
25 namespace {
26
27 aura::Window* GetBackground() {
28 aura::RootWindow* root_window = Shell::GetPrimaryRootWindow();
29 return Shell::GetContainer(root_window,
30 internal::kShellWindowId_DesktopBackgroundContainer);
31 }
32
33 bool IsBackgroundHidden() {
34 return !GetBackground()->IsVisible();
35 }
36
37 void ShowBackground() {
38 ui::ScopedLayerAnimationSettings settings(
39 GetBackground()->layer()->GetAnimator());
40 settings.SetTransitionDuration(base::TimeDelta());
41 GetBackground()->Show();
42 }
43
44 void HideBackground() {
45 ui::ScopedLayerAnimationSettings settings(
46 GetBackground()->layer()->GetAnimator());
47 settings.SetTransitionDuration(base::TimeDelta());
48 GetBackground()->Hide();
49 }
50
51 } // namespace
52
23 SessionStateControllerImpl2::TestApi::TestApi( 53 SessionStateControllerImpl2::TestApi::TestApi(
24 SessionStateControllerImpl2* controller) 54 SessionStateControllerImpl2* controller)
25 : controller_(controller) { 55 : controller_(controller) {
26 } 56 }
27 57
28 SessionStateControllerImpl2::TestApi::~TestApi() { 58 SessionStateControllerImpl2::TestApi::~TestApi() {
29 } 59 }
30 60
31 SessionStateControllerImpl2::SessionStateControllerImpl2() 61 SessionStateControllerImpl2::SessionStateControllerImpl2()
32 : login_status_(user::LOGGED_IN_NONE), 62 : login_status_(user::LOGGED_IN_NONE),
33 system_is_locked_(false), 63 system_is_locked_(false),
34 shutting_down_(false), 64 shutting_down_(false),
35 shutdown_after_lock_(false) { 65 shutdown_after_lock_(false),
66 animating_lock_(false),
67 undoable_lock_animation_(false) {
36 Shell::GetPrimaryRootWindow()->AddRootWindowObserver(this); 68 Shell::GetPrimaryRootWindow()->AddRootWindowObserver(this);
37 } 69 }
38 70
39 SessionStateControllerImpl2::~SessionStateControllerImpl2() { 71 SessionStateControllerImpl2::~SessionStateControllerImpl2() {
40 Shell::GetPrimaryRootWindow()->RemoveRootWindowObserver(this); 72 Shell::GetPrimaryRootWindow()->RemoveRootWindowObserver(this);
41 } 73 }
42 74
43 void SessionStateControllerImpl2::OnLoginStateChanged( 75 void SessionStateControllerImpl2::OnLoginStateChanged(
44 user::LoginStatus status) { 76 user::LoginStatus status) {
45 if (status != user::LOGGED_IN_LOCKED) 77 if (status != user::LOGGED_IN_LOCKED)
46 login_status_ = status; 78 login_status_ = status;
47 system_is_locked_ = (status == user::LOGGED_IN_LOCKED); 79 system_is_locked_ = (status == user::LOGGED_IN_LOCKED);
48 } 80 }
49 81
50 void SessionStateControllerImpl2::OnAppTerminating() { 82 void SessionStateControllerImpl2::OnAppTerminating() {
51 // If we hear that Chrome is exiting but didn't request it ourselves, all we 83 // If we hear that Chrome is exiting but didn't request it ourselves, all we
52 // can really hope for is that we'll have time to clear the screen. 84 // can really hope for is that we'll have time to clear the screen.
85 // This is also a case when user signs off.
53 if (!shutting_down_) { 86 if (!shutting_down_) {
54 shutting_down_ = true; 87 shutting_down_ = true;
55 Shell* shell = ash::Shell::GetInstance(); 88 Shell* shell = ash::Shell::GetInstance();
56 shell->env_filter()->set_cursor_hidden_by_filter(false); 89 shell->env_filter()->set_cursor_hidden_by_filter(false);
57 shell->cursor_manager()->ShowCursor(false); 90 shell->cursor_manager()->ShowCursor(false);
58 animator_->StartAnimation( 91 animator_->StartAnimation(
59 internal::SessionStateAnimator::kAllContainersMask, 92 internal::SessionStateAnimator::kAllContainersMask,
60 internal::SessionStateAnimator::ANIMATION_HIDE_IMMEDIATELY, 93 internal::SessionStateAnimator::ANIMATION_HIDE_IMMEDIATELY,
61 internal::SessionStateAnimator::ANIMATION_SPEED_IMMEDIATE); 94 internal::SessionStateAnimator::ANIMATION_SPEED_IMMEDIATE);
62 } 95 }
63 } 96 }
64 97
65 void SessionStateControllerImpl2::OnLockStateChanged(bool locked) { 98 void SessionStateControllerImpl2::OnLockStateChanged(bool locked) {
66 if (shutting_down_ || (system_is_locked_ == locked)) 99 if (shutting_down_ || (system_is_locked_ == locked))
67 return; 100 return;
68 101
69 system_is_locked_ = locked; 102 system_is_locked_ = locked;
70 103
71 if (locked) { 104 if (locked) {
72 base::Callback<void(void)> callback = 105 StartLockAnimationPhaseTwo();
73 base::Bind(&SessionStateControllerImpl2::OnLockScreenAnimationFinished,
74 base::Unretained(this));
75 animator_->StartAnimationWithCallback(
76 internal::SessionStateAnimator::LOCK_SCREEN_CONTAINERS,
77 internal::SessionStateAnimator::ANIMATION_RAISE_TO_SCREEN,
78 internal::SessionStateAnimator::ANIMATION_SPEED_MOVE_WINDOWS,
79 callback);
80 lock_timer_.Stop();
81 lock_fail_timer_.Stop(); 106 lock_fail_timer_.Stop();
82 } else { 107 } else {
83 animator_->StartAnimation( 108 StartUnlockAnimationPhaseTwo();
84 internal::SessionStateAnimator::NON_LOCK_SCREEN_CONTAINERS |
85 internal::SessionStateAnimator::LAUNCHER,
86 internal::SessionStateAnimator::ANIMATION_DROP,
87 internal::SessionStateAnimator::ANIMATION_SPEED_MOVE_WINDOWS);
88 } 109 }
89 } 110 }
90 111
91 void SessionStateControllerImpl2::SetLockScreenDisplayedCallback( 112 void SessionStateControllerImpl2::SetLockScreenDisplayedCallback(
92 base::Closure& callback) { 113 base::Closure& callback) {
93 lock_screen_displayed_callback_ = callback; 114 lock_screen_displayed_callback_ = callback;
94 } 115 }
95 116
96 void SessionStateControllerImpl2::OnLockScreenAnimationFinished() {
97 FOR_EACH_OBSERVER(SessionStateObserver, observers_,
98 OnSessionStateEvent(
99 SessionStateObserver::EVENT_LOCK_ANIMATION_FINISHED));
100 if (!lock_screen_displayed_callback_.is_null()) {
101 lock_screen_displayed_callback_.Run();
102 lock_screen_displayed_callback_.Reset();
103 }
104 if (shutdown_after_lock_) {
105 shutdown_after_lock_ = false;
106 StartLockToShutdownTimer();
107 }
108 }
109
110 void SessionStateControllerImpl2::OnStartingLock() { 117 void SessionStateControllerImpl2::OnStartingLock() {
111 if (shutting_down_ || system_is_locked_) 118 if (shutting_down_ || system_is_locked_)
112 return; 119 return;
113 120 if (animating_lock_)
114 animator_->StartAnimation( 121 return;
115 internal::SessionStateAnimator::NON_LOCK_SCREEN_CONTAINERS | 122 StartImmediateLockAnimationPhaseOne();
116 internal::SessionStateAnimator::LAUNCHER,
117 internal::SessionStateAnimator::ANIMATION_LIFT,
118 internal::SessionStateAnimator::ANIMATION_SPEED_MOVE_WINDOWS);
119 FOR_EACH_OBSERVER(SessionStateObserver, observers_,
120 OnSessionStateEvent(SessionStateObserver::EVENT_LOCK_ANIMATION_STARTED));
121 // Hide the screen locker containers so we can raise them later.
122 animator_->StartAnimation(
123 internal::SessionStateAnimator::LOCK_SCREEN_CONTAINERS,
124 internal::SessionStateAnimator::ANIMATION_HIDE_IMMEDIATELY,
125 internal::SessionStateAnimator::ANIMATION_SPEED_IMMEDIATE);
126 } 123 }
127 124
128 void SessionStateControllerImpl2::StartLockAnimationAndLockImmediately() { 125 void SessionStateControllerImpl2::StartLockAnimationAndLockImmediately() {
129 animator_->StartAnimation( 126 if (animating_lock_)
130 internal::SessionStateAnimator::NON_LOCK_SCREEN_CONTAINERS | 127 return;
131 internal::SessionStateAnimator::LAUNCHER, 128 StartImmediateLockAnimationPhaseOne();
132 internal::SessionStateAnimator::ANIMATION_LIFT,
133 internal::SessionStateAnimator::ANIMATION_SPEED_MOVE_WINDOWS);
134 FOR_EACH_OBSERVER(SessionStateObserver, observers_,
135 OnSessionStateEvent(SessionStateObserver::EVENT_LOCK_ANIMATION_STARTED));
136 OnLockTimeout();
137 } 129 }
138 130
139 void SessionStateControllerImpl2::StartLockAnimation(bool shutdown_after_lock) { 131 void SessionStateControllerImpl2::StartLockAnimation(bool shutdown_after_lock) {
132 if (animating_lock_)
133 return;
140 shutdown_after_lock_ = shutdown_after_lock; 134 shutdown_after_lock_ = shutdown_after_lock;
135 undoable_lock_animation_ = true;
141 136
142 animator_->StartAnimation( 137 StartUndoableLockAnimationPhaseOne();
143 internal::SessionStateAnimator::NON_LOCK_SCREEN_CONTAINERS |
144 internal::SessionStateAnimator::LAUNCHER,
145 internal::SessionStateAnimator::ANIMATION_LIFT,
146 internal::SessionStateAnimator::ANIMATION_SPEED_UNDOABLE);
147 FOR_EACH_OBSERVER(SessionStateObserver, observers_,
148 OnSessionStateEvent(
149 SessionStateObserver::EVENT_PRELOCK_ANIMATION_STARTED));
150 StartLockTimer();
151 }
152
153 void SessionStateControllerImpl2::StartShutdownAnimation() {
154 animator_->StartGlobalAnimation(
155 internal::SessionStateAnimator::ANIMATION_GRAYSCALE_BRIGHTNESS,
156 internal::SessionStateAnimator::ANIMATION_SPEED_SHUTDOWN);
157 StartPreShutdownAnimationTimer();
158 } 138 }
159 139
160 bool SessionStateControllerImpl2::LockRequested() { 140 bool SessionStateControllerImpl2::LockRequested() {
161 return lock_fail_timer_.IsRunning(); 141 return lock_fail_timer_.IsRunning();
162 } 142 }
163 143
164 bool SessionStateControllerImpl2::ShutdownRequested() { 144 bool SessionStateControllerImpl2::ShutdownRequested() {
165 return shutting_down_; 145 return shutting_down_;
166 } 146 }
167 147
168 bool SessionStateControllerImpl2::CanCancelLockAnimation() { 148 bool SessionStateControllerImpl2::CanCancelLockAnimation() {
169 return lock_timer_.IsRunning(); 149 return undoable_lock_animation_;
170 } 150 }
171 151
172 void SessionStateControllerImpl2::CancelLockAnimation() { 152 void SessionStateControllerImpl2::CancelLockAnimation() {
173 if (!CanCancelLockAnimation()) 153 if (!CanCancelLockAnimation())
174 return; 154 return;
175 shutdown_after_lock_ = false; 155 shutdown_after_lock_ = false;
176 animator_->StartAnimation( 156 animating_lock_ = false;
177 internal::SessionStateAnimator::NON_LOCK_SCREEN_CONTAINERS | 157 UndoLockAnimationPhaseOne();
178 internal::SessionStateAnimator::LAUNCHER,
179 internal::SessionStateAnimator::ANIMATION_DROP,
180 internal::SessionStateAnimator::ANIMATION_SPEED_MOVE_WINDOWS);
181 lock_timer_.Stop();
182 } 158 }
183 159
184 bool SessionStateControllerImpl2::CanCancelShutdownAnimation() { 160 bool SessionStateControllerImpl2::CanCancelShutdownAnimation() {
185 return pre_shutdown_timer_.IsRunning() || 161 return pre_shutdown_timer_.IsRunning() ||
186 shutdown_after_lock_ || 162 shutdown_after_lock_ ||
187 lock_to_shutdown_timer_.IsRunning(); 163 lock_to_shutdown_timer_.IsRunning();
188 } 164 }
189 165
166 void SessionStateControllerImpl2::StartShutdownAnimation() {
167 StartCancellableShutdownAnimation();
168 }
169
190 void SessionStateControllerImpl2::CancelShutdownAnimation() { 170 void SessionStateControllerImpl2::CancelShutdownAnimation() {
191 if (!CanCancelShutdownAnimation()) 171 if (!CanCancelShutdownAnimation())
192 return; 172 return;
193 if (lock_to_shutdown_timer_.IsRunning()) { 173 if (lock_to_shutdown_timer_.IsRunning()) {
194 lock_to_shutdown_timer_.Stop(); 174 lock_to_shutdown_timer_.Stop();
195 return; 175 return;
196 } 176 }
197 if (shutdown_after_lock_) { 177 if (shutdown_after_lock_) {
198 shutdown_after_lock_ = false; 178 shutdown_after_lock_ = false;
199 return; 179 return;
(...skipping 10 matching lines...) Expand all
210 } 190 }
211 191
212 void SessionStateControllerImpl2::RequestShutdownImpl() { 192 void SessionStateControllerImpl2::RequestShutdownImpl() {
213 DCHECK(!shutting_down_); 193 DCHECK(!shutting_down_);
214 shutting_down_ = true; 194 shutting_down_ = true;
215 195
216 Shell* shell = ash::Shell::GetInstance(); 196 Shell* shell = ash::Shell::GetInstance();
217 shell->env_filter()->set_cursor_hidden_by_filter(false); 197 shell->env_filter()->set_cursor_hidden_by_filter(false);
218 shell->cursor_manager()->ShowCursor(false); 198 shell->cursor_manager()->ShowCursor(false);
219 199
220 animator_->StartGlobalAnimation( 200 StartShutdownAnimationImpl();
221 internal::SessionStateAnimator::ANIMATION_GRAYSCALE_BRIGHTNESS,
222 internal::SessionStateAnimator::ANIMATION_SPEED_SHUTDOWN);
223 StartRealShutdownTimer();
224 } 201 }
225 202
226 void SessionStateControllerImpl2::OnRootWindowHostCloseRequested( 203 void SessionStateControllerImpl2::OnRootWindowHostCloseRequested(
227 const aura::RootWindow*) { 204 const aura::RootWindow*) {
228 Shell::GetInstance()->delegate()->Exit(); 205 Shell::GetInstance()->delegate()->Exit();
229 } 206 }
230 207
231 void SessionStateControllerImpl2::StartLockTimer() {
232 lock_timer_.Stop();
233 lock_timer_.Start(
234 FROM_HERE,
235 animator_->GetDuration(
236 internal::SessionStateAnimator::ANIMATION_SPEED_UNDOABLE),
237 this, &SessionStateControllerImpl2::OnLockTimeout);
238 }
239
240 void SessionStateControllerImpl2::OnLockTimeout() {
241 delegate_->RequestLockScreen();
242 lock_fail_timer_.Start(
243 FROM_HERE,
244 base::TimeDelta::FromMilliseconds(kLockFailTimeoutMs),
245 this, &SessionStateControllerImpl2::OnLockFailTimeout);
246 }
247
248 void SessionStateControllerImpl2::OnLockFailTimeout() { 208 void SessionStateControllerImpl2::OnLockFailTimeout() {
249 DCHECK(!system_is_locked_); 209 DCHECK(!system_is_locked_);
250 // Undo lock animation. 210 // Undo lock animation.
251 animator_->StartAnimation( 211 StartUnlockAnimationPhaseTwo();
252 internal::SessionStateAnimator::LAUNCHER |
253 internal::SessionStateAnimator::NON_LOCK_SCREEN_CONTAINERS,
254 internal::SessionStateAnimator::ANIMATION_DROP,
255 internal::SessionStateAnimator::ANIMATION_SPEED_MOVE_WINDOWS);
256 } 212 }
257 213
258 void SessionStateControllerImpl2::StartLockToShutdownTimer() { 214 void SessionStateControllerImpl2::StartLockToShutdownTimer() {
259 shutdown_after_lock_ = false; 215 shutdown_after_lock_ = false;
260 lock_to_shutdown_timer_.Stop(); 216 lock_to_shutdown_timer_.Stop();
261 lock_to_shutdown_timer_.Start( 217 lock_to_shutdown_timer_.Start(
262 FROM_HERE, 218 FROM_HERE,
263 base::TimeDelta::FromMilliseconds(kLockToShutdownTimeoutMs), 219 base::TimeDelta::FromMilliseconds(kLockToShutdownTimeoutMs),
264 this, &SessionStateControllerImpl2::OnLockToShutdownTimeout); 220 this, &SessionStateControllerImpl2::OnLockToShutdownTimeout);
265 } 221 }
266 222
267
268 void SessionStateControllerImpl2::OnLockToShutdownTimeout() { 223 void SessionStateControllerImpl2::OnLockToShutdownTimeout() {
269 DCHECK(system_is_locked_); 224 DCHECK(system_is_locked_);
270 StartShutdownAnimation(); 225 StartCancellableShutdownAnimation();
226 }
227
228 void SessionStateControllerImpl2::StartCancellableShutdownAnimation() {
229 animator_->StartGlobalAnimation(
230 internal::SessionStateAnimator::ANIMATION_GRAYSCALE_BRIGHTNESS,
231 internal::SessionStateAnimator::ANIMATION_SPEED_SHUTDOWN);
232 StartPreShutdownAnimationTimer();
233 }
234
235 void SessionStateControllerImpl2::StartShutdownAnimationImpl() {
236 animator_->StartGlobalAnimation(
237 internal::SessionStateAnimator::ANIMATION_GRAYSCALE_BRIGHTNESS,
238 internal::SessionStateAnimator::ANIMATION_SPEED_SHUTDOWN);
239 StartRealShutdownTimer(true);
271 } 240 }
272 241
273 void SessionStateControllerImpl2::StartPreShutdownAnimationTimer() { 242 void SessionStateControllerImpl2::StartPreShutdownAnimationTimer() {
274 pre_shutdown_timer_.Stop(); 243 pre_shutdown_timer_.Stop();
275 pre_shutdown_timer_.Start( 244 pre_shutdown_timer_.Start(
276 FROM_HERE, 245 FROM_HERE,
277 base::TimeDelta::FromMilliseconds(kShutdownTimeoutMs), 246 animator_->
247 GetDuration(internal::SessionStateAnimator::ANIMATION_SPEED_SHUTDOWN),
278 this, &SessionStateControllerImpl2::OnPreShutdownAnimationTimeout); 248 this, &SessionStateControllerImpl2::OnPreShutdownAnimationTimeout);
279 } 249 }
280 250
281 void SessionStateControllerImpl2::OnPreShutdownAnimationTimeout() { 251 void SessionStateControllerImpl2::OnPreShutdownAnimationTimeout() {
282 if (!shutting_down_) 252 shutting_down_ = true;
283 RequestShutdownImpl(); 253
254 Shell* shell = ash::Shell::GetInstance();
255 shell->env_filter()->set_cursor_hidden_by_filter(false);
256 shell->cursor_manager()->ShowCursor(false);
257
258 StartRealShutdownTimer(false);
284 } 259 }
285 260
286 void SessionStateControllerImpl2::StartRealShutdownTimer() { 261
262 void SessionStateControllerImpl2::StartRealShutdownTimer(bool animation_time) {
287 base::TimeDelta duration = 263 base::TimeDelta duration =
288 base::TimeDelta::FromMilliseconds(kShutdownRequestDelayMs); 264 base::TimeDelta::FromMilliseconds(kShutdownRequestDelayMs);
289 duration += animator_->GetDuration( 265 if (animation_time) {
290 internal::SessionStateAnimator::ANIMATION_SPEED_SHUTDOWN); 266 duration += animator_->GetDuration(
267 internal::SessionStateAnimator::ANIMATION_SPEED_SHUTDOWN);
268 }
291 real_shutdown_timer_.Start( 269 real_shutdown_timer_.Start(
292 FROM_HERE, 270 FROM_HERE,
293 duration, 271 duration,
294 this, &SessionStateControllerImpl2::OnRealShutdownTimeout); 272 this, &SessionStateControllerImpl2::OnRealShutdownTimeout);
295 } 273 }
296 274
297 void SessionStateControllerImpl2::OnRealShutdownTimeout() { 275 void SessionStateControllerImpl2::OnRealShutdownTimeout() {
298 DCHECK(shutting_down_); 276 DCHECK(shutting_down_);
299 #if defined(OS_CHROMEOS) 277 #if defined(OS_CHROMEOS)
300 if (!base::chromeos::IsRunningOnChromeOS()) { 278 if (!base::chromeos::IsRunningOnChromeOS()) {
301 ShellDelegate* delegate = Shell::GetInstance()->delegate(); 279 ShellDelegate* delegate = Shell::GetInstance()->delegate();
302 if (delegate) { 280 if (delegate) {
303 delegate->Exit(); 281 delegate->Exit();
304 return; 282 return;
305 } 283 }
306 } 284 }
307 #endif 285 #endif
308 delegate_->RequestShutdown(); 286 delegate_->RequestShutdown();
309 } 287 }
310 288
311 void SessionStateControllerImpl2::OnLockScreenHide( 289 void SessionStateControllerImpl2::OnLockScreenHide(
312 base::Callback<void(void)>& callback) { 290 base::Callback<void(void)>& callback) {
291 StartUnlockAnimationPhaseOne(callback);
292 }
293
294 void SessionStateControllerImpl2::LockAnimationUndone() {
295 undoable_lock_animation_ = false;
296 RestoreUnlockedProperties();
297 }
298
299 void SessionStateControllerImpl2::LockAnimationPhaseOneCompleted() {
300 undoable_lock_animation_ = false;
301
302 delegate_->RequestLockScreen();
303 lock_fail_timer_.Start(
304 FROM_HERE,
305 base::TimeDelta::FromMilliseconds(kLockFailTimeoutMs),
306 this, &SessionStateControllerImpl2::OnLockFailTimeout);
307 }
308
309 void SessionStateControllerImpl2::LockAnimationPhaseTwoCompleted() {
310 animating_lock_ = false;
311
312 FOR_EACH_OBSERVER(SessionStateObserver, observers_,
313 OnSessionStateEvent(
314 SessionStateObserver::EVENT_LOCK_ANIMATION_FINISHED));
315 if (!lock_screen_displayed_callback_.is_null()) {
316 lock_screen_displayed_callback_.Run();
317 lock_screen_displayed_callback_.Reset();
318 }
319 if (shutdown_after_lock_) {
320 shutdown_after_lock_ = false;
321 StartLockToShutdownTimer();
322 }
323 }
324
325 void SessionStateControllerImpl2::UnlockAnimationPhaseTwoCompleted() {
326 RestoreUnlockedProperties();
327 }
328
329 void SessionStateControllerImpl2::StartImmediateLockAnimationPhaseOne() {
330 animating_lock_ = true;
331
332 StoreUnlockedProperties();
333
334 base::Closure next_animation_starter =
335 base::Bind(&SessionStateControllerImpl2::LockAnimationPhaseOneCompleted,
336 base::Unretained(this));
337 ui::LayerAnimationObserver* observer =
338 new ui::AnimationFinishedObserver(next_animation_starter);
339
340 animator_->StartAnimationWithObserver(
341 internal::SessionStateAnimator::NON_LOCK_SCREEN_CONTAINERS,
342 internal::SessionStateAnimator::ANIMATION_LIFT,
343 internal::SessionStateAnimator::ANIMATION_SPEED_MOVE_WINDOWS,
344 observer);
345
346 animator_->StartAnimationWithObserver(
347 internal::SessionStateAnimator::LAUNCHER,
348 internal::SessionStateAnimator::ANIMATION_FADE_OUT,
349 internal::SessionStateAnimator::ANIMATION_SPEED_MOVE_WINDOWS,
350 observer);
351
352 // Hide the screen locker containers so we can raise them later.
353 animator_->StartAnimation(
354 internal::SessionStateAnimator::LOCK_SCREEN_CONTAINERS,
355 internal::SessionStateAnimator::ANIMATION_HIDE_IMMEDIATELY,
356 internal::SessionStateAnimator::ANIMATION_SPEED_IMMEDIATE);
357
358 AnimateBackgroundAppearanceIfNecessary(
359 internal::SessionStateAnimator::ANIMATION_SPEED_MOVE_WINDOWS,
360 observer);
361
362 FOR_EACH_OBSERVER(SessionStateObserver, observers_,
363 OnSessionStateEvent(SessionStateObserver::EVENT_LOCK_ANIMATION_STARTED));
364 }
365
366 void SessionStateControllerImpl2::StartUndoableLockAnimationPhaseOne() {
367 animating_lock_ = true;
368 StoreUnlockedProperties();
369
370 base::Closure next_animation_starter =
371 base::Bind(&SessionStateControllerImpl2::LockAnimationPhaseOneCompleted,
372 base::Unretained(this));
373 ui::AnimationFinishedObserver* observer =
374 new ui::AnimationFinishedObserver(next_animation_starter);
375
376 observer->Pause();
377
378 animator_->StartAnimationWithObserver(
379 internal::SessionStateAnimator::NON_LOCK_SCREEN_CONTAINERS,
380 internal::SessionStateAnimator::ANIMATION_LIFT,
381 internal::SessionStateAnimator::ANIMATION_SPEED_UNDOABLE,
382 observer);
383
384 animator_->StartAnimationWithObserver(
385 internal::SessionStateAnimator::LAUNCHER,
386 internal::SessionStateAnimator::ANIMATION_FADE_OUT,
387 internal::SessionStateAnimator::ANIMATION_SPEED_UNDOABLE,
388 observer);
389
390 // Hide the screen locker containers so we can raise them later.
391 animator_->StartAnimation(
392 internal::SessionStateAnimator::LOCK_SCREEN_CONTAINERS,
393 internal::SessionStateAnimator::ANIMATION_HIDE_IMMEDIATELY,
394 internal::SessionStateAnimator::ANIMATION_SPEED_IMMEDIATE);
395
396 AnimateBackgroundAppearanceIfNecessary(
397 internal::SessionStateAnimator::ANIMATION_SPEED_UNDOABLE,
398 observer);
399
400 FOR_EACH_OBSERVER(SessionStateObserver, observers_,
401 OnSessionStateEvent(
402 SessionStateObserver::EVENT_PRELOCK_ANIMATION_STARTED));
403 observer->Unpause();
404 }
405
406 void SessionStateControllerImpl2::UndoLockAnimationPhaseOne() {
407 base::Closure next_animation_starter =
408 base::Bind(&SessionStateControllerImpl2::LockAnimationUndone,
409 base::Unretained(this));
410 ui::AnimationFinishedObserver* observer =
411 new ui::AnimationFinishedObserver(next_animation_starter);
412
413 observer->Pause();
414
415 animator_->StartAnimationWithObserver(
416 internal::SessionStateAnimator::NON_LOCK_SCREEN_CONTAINERS,
417 internal::SessionStateAnimator::ANIMATION_UNDO_LIFT,
418 internal::SessionStateAnimator::ANIMATION_SPEED_MOVE_WINDOWS,
419 observer);
420
421 animator_->StartAnimationWithObserver(
422 internal::SessionStateAnimator::LAUNCHER,
423 internal::SessionStateAnimator::ANIMATION_FADE_IN,
424 internal::SessionStateAnimator::ANIMATION_SPEED_MOVE_WINDOWS,
425 observer);
426
427 AnimateBackgroundHidingIfNecessary(
428 internal::SessionStateAnimator::ANIMATION_SPEED_UNDOABLE,
429 observer);
430 observer->Unpause();
431 }
432
433 void SessionStateControllerImpl2::StartLockAnimationPhaseTwo() {
434 base::Closure next_animation_starter =
435 base::Bind(&SessionStateControllerImpl2::LockAnimationPhaseTwoCompleted,
436 base::Unretained(this));
437
438 ui::LayerAnimationObserver* observer =
439 new ui::AnimationFinishedObserver(next_animation_starter);
440
441 animator_->StartAnimationWithObserver(
442 internal::SessionStateAnimator::LOCK_SCREEN_CONTAINERS,
443 internal::SessionStateAnimator::ANIMATION_RAISE_TO_SCREEN,
444 internal::SessionStateAnimator::ANIMATION_SPEED_MOVE_WINDOWS,
445 observer);
446 }
447
448 void SessionStateControllerImpl2::StartUnlockAnimationPhaseOne(
449 base::Closure& callback) {
313 animator_->StartAnimationWithCallback( 450 animator_->StartAnimationWithCallback(
314 internal::SessionStateAnimator::LOCK_SCREEN_CONTAINERS, 451 internal::SessionStateAnimator::LOCK_SCREEN_CONTAINERS,
315 internal::SessionStateAnimator::ANIMATION_LIFT, 452 internal::SessionStateAnimator::ANIMATION_LIFT,
316 internal::SessionStateAnimator::ANIMATION_SPEED_MOVE_WINDOWS, 453 internal::SessionStateAnimator::ANIMATION_SPEED_MOVE_WINDOWS,
317 callback); 454 callback);
318 } 455 }
319 456
457 void SessionStateControllerImpl2::StartUnlockAnimationPhaseTwo() {
458 base::Closure next_animation_starter =
459 base::Bind(&SessionStateControllerImpl2::UnlockAnimationPhaseTwoCompleted,
460 base::Unretained(this));
461
462 ui::LayerAnimationObserver* observer =
463 new ui::AnimationFinishedObserver(next_animation_starter);
464
465 animator_->StartAnimationWithObserver(
466 internal::SessionStateAnimator::NON_LOCK_SCREEN_CONTAINERS,
467 internal::SessionStateAnimator::ANIMATION_DROP,
468 internal::SessionStateAnimator::ANIMATION_SPEED_MOVE_WINDOWS,
469 observer);
470
471 animator_->StartAnimationWithObserver(
472 internal::SessionStateAnimator::LAUNCHER,
473 internal::SessionStateAnimator::ANIMATION_FADE_IN,
474 internal::SessionStateAnimator::ANIMATION_SPEED_MOVE_WINDOWS,
475 observer);
476
477 AnimateBackgroundHidingIfNecessary(
478 internal::SessionStateAnimator::ANIMATION_SPEED_MOVE_WINDOWS,
479 observer);
480 }
481
482 void SessionStateControllerImpl2::StoreUnlockedProperties() {
483 if (!unlocked_properties_.get()) {
484 unlocked_properties_.reset(new UnlockedStateProperties());
485 unlocked_properties_->background_is_hidden = IsBackgroundHidden();
486 }
487 if (unlocked_properties_->background_is_hidden) {
488 // Hide background so that it can be animated later.
489 animator_->StartAnimation(
490 internal::SessionStateAnimator::DESKTOP_BACKGROUND,
491 internal::SessionStateAnimator::ANIMATION_HIDE_IMMEDIATELY,
492 internal::SessionStateAnimator::ANIMATION_SPEED_IMMEDIATE);
493 ShowBackground();
494 }
495 }
496
497 void SessionStateControllerImpl2::RestoreUnlockedProperties() {
498 if (!unlocked_properties_.get())
499 return;
500 if (unlocked_properties_->background_is_hidden) {
501 HideBackground();
502 // Restore background visibility.
503 animator_->StartAnimation(
504 internal::SessionStateAnimator::DESKTOP_BACKGROUND,
505 internal::SessionStateAnimator::ANIMATION_FADE_IN,
506 internal::SessionStateAnimator::ANIMATION_SPEED_IMMEDIATE);
507 }
508 unlocked_properties_.reset();
509 }
510
511 void SessionStateControllerImpl2::AnimateBackgroundAppearanceIfNecessary(
512 internal::SessionStateAnimator::AnimationSpeed speed,
513 ui::LayerAnimationObserver* observer) {
514 if (unlocked_properties_.get() &&
515 unlocked_properties_->background_is_hidden) {
516 animator_->StartAnimationWithObserver(
517 internal::SessionStateAnimator::DESKTOP_BACKGROUND,
518 internal::SessionStateAnimator::ANIMATION_FADE_IN,
519 speed,
520 observer);
521 }
522 }
523
524 void SessionStateControllerImpl2::AnimateBackgroundHidingIfNecessary(
525 internal::SessionStateAnimator::AnimationSpeed speed,
526 ui::LayerAnimationObserver* observer) {
527 if (unlocked_properties_.get() &&
528 unlocked_properties_->background_is_hidden) {
529 animator_->StartAnimationWithObserver(
530 internal::SessionStateAnimator::DESKTOP_BACKGROUND,
531 internal::SessionStateAnimator::ANIMATION_FADE_OUT,
532 speed,
533 observer);
534 }
535 }
536
320 } // namespace ash 537 } // namespace ash
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698