15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/wm/session_state_animator.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/shell.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/shell_window_ids.h"
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/wm/window_animations.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/client/aura_constants.h"
11a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/aura/window_event_dispatcher.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/compositor/layer_animation_observer.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/compositor/layer_animation_sequence.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/compositor/scoped_layer_animation_settings.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/widget.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ash {
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Slightly-smaller size that we scale the screen down to for the pre-lock and
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// pre-shutdown states.
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const float kSlowCloseSizeRatio = 0.95f;
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Maximum opacity of white layer when animating pre-shutdown state.
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const float kPartialFadeRatio = 0.3f;
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Minimum size. Not zero as it causes numeric issues.
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const float kMinimumScale = 1e-4f;
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns the transform that should be applied to containers for the slow-close
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// animation.
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Transform GetSlowCloseTransform() {
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Size root_size = Shell::GetPrimaryRootWindow()->bounds().size();
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Transform transform;
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  transform.Translate(
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      floor(0.5 * (1.0 - kSlowCloseSizeRatio) * root_size.width() + 0.5),
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      floor(0.5 * (1.0 - kSlowCloseSizeRatio) * root_size.height() + 0.5));
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  transform.Scale(kSlowCloseSizeRatio, kSlowCloseSizeRatio);
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return transform;
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns the transform that should be applied to containers for the fast-close
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// animation.
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Transform GetFastCloseTransform() {
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Size root_size = Shell::GetPrimaryRootWindow()->bounds().size();
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Transform transform;
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  transform.Translate(floor(0.5 * root_size.width() + 0.5),
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      floor(0.5 * root_size.height() + 0.5));
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  transform.Scale(kMinimumScale, kMinimumScale);
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return transform;
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Slowly shrinks |window| to a slightly-smaller size.
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void StartSlowCloseAnimationForWindow(aura::Window* window,
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      base::TimeDelta duration,
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::LayerAnimationObserver* observer) {
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui::LayerAnimator* animator = window->layer()->GetAnimator();
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  animator->set_preemption_strategy(
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET);
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui::LayerAnimationSequence* sequence = new ui::LayerAnimationSequence(
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ui::LayerAnimationElement::CreateTransformElement(
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          GetSlowCloseTransform(),
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          duration));
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (observer)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sequence->AddObserver(observer);
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  animator->StartAnimation(sequence);
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Quickly undoes the effects of the slow-close animation on |window|.
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void StartUndoSlowCloseAnimationForWindow(
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    aura::Window* window,
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::TimeDelta duration,
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui::LayerAnimationObserver* observer) {
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui::LayerAnimator* animator = window->layer()->GetAnimator();
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  animator->set_preemption_strategy(
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET);
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui::LayerAnimationSequence* sequence = new ui::LayerAnimationSequence(
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ui::LayerAnimationElement::CreateTransformElement(
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          gfx::Transform(),
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          duration));
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (observer)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sequence->AddObserver(observer);
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  animator->StartAnimation(sequence);
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Quickly shrinks |window| down to a point in the center of the screen and
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// fades it out to 0 opacity.
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void StartFastCloseAnimationForWindow(aura::Window* window,
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      base::TimeDelta duration,
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::LayerAnimationObserver* observer) {
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui::LayerAnimator* animator = window->layer()->GetAnimator();
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  animator->set_preemption_strategy(
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET);
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  animator->StartAnimation(
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new ui::LayerAnimationSequence(
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          ui::LayerAnimationElement::CreateTransformElement(
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              GetFastCloseTransform(), duration)));
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui::LayerAnimationSequence* sequence = new ui::LayerAnimationSequence(
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::LayerAnimationElement::CreateOpacityElement(0.0, duration));
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (observer)
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sequence->AddObserver(observer);
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  animator->StartAnimation(sequence);
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Fades |window| to |target_opacity| over |duration|.
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void StartPartialFadeAnimation(aura::Window* window,
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               float target_opacity,
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                               base::TimeDelta duration,
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               ui::LayerAnimationObserver* observer) {
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui::LayerAnimator* animator = window->layer()->GetAnimator();
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  animator->set_preemption_strategy(
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET);
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui::LayerAnimationSequence* sequence = new ui::LayerAnimationSequence(
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ui::LayerAnimationElement::CreateOpacityElement(
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          target_opacity, duration));
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (observer)
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sequence->AddObserver(observer);
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  animator->StartAnimation(sequence);
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Fades |window| to |opacity| over |duration|.
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void StartOpacityAnimationForWindow(aura::Window* window,
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                    float opacity,
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                    base::TimeDelta duration,
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                    ui::LayerAnimationObserver* observer) {
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui::LayerAnimator* animator = window->layer()->GetAnimator();
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  animator->set_preemption_strategy(
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET);
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui::LayerAnimationSequence* sequence = new ui::LayerAnimationSequence(
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::LayerAnimationElement::CreateOpacityElement(opacity, duration));
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (observer)
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sequence->AddObserver(observer);
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  animator->StartAnimation(sequence);
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Makes |window| fully transparent instantaneously.
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HideWindowImmediately(aura::Window* window,
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           ui::LayerAnimationObserver* observer) {
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window->layer()->SetOpacity(0.0);
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (observer)
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    observer->OnLayerAnimationEnded(NULL);
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Restores |window| to its original position and scale and full opacity
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// instantaneously.
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RestoreWindow(aura::Window* window, ui::LayerAnimationObserver* observer) {
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window->layer()->SetTransform(gfx::Transform());
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window->layer()->SetOpacity(1.0);
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (observer)
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    observer->OnLayerAnimationEnded(NULL);
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HideWindow(aura::Window* window,
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                base::TimeDelta duration,
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                bool above,
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                ui::LayerAnimationObserver* observer) {
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ui::Layer* layer = window->layer();
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ui::ScopedLayerAnimationSettings settings(layer->GetAnimator());
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  settings.SetPreemptionStrategy(
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET);
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  settings.SetTransitionDuration(duration);
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
164d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  settings.SetTweenType(gfx::Tween::EASE_OUT);
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetTransformForScaleAnimation(layer,
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      above ? LAYER_SCALE_ANIMATION_ABOVE : LAYER_SCALE_ANIMATION_BELOW);
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
168d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  settings.SetTweenType(gfx::Tween::EASE_IN_OUT);
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer->SetOpacity(0.0f);
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // After the animation completes snap the transform back to the identity,
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // otherwise any one that asks for screen bounds gets a slightly scaled
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // version.
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  settings.SetPreemptionStrategy(ui::LayerAnimator::ENQUEUE_NEW_ANIMATION);
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  settings.SetTransitionDuration(base::TimeDelta());
1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer->SetTransform(gfx::Transform());
1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A bit of a dirty trick: we need to catch the end of the animation we don't
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // control. So we use two facts we know: which animator will be used and the
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // target opacity to add "Do nothing" animation sequence.
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Unfortunately, we can not just use empty LayerAnimationSequence, because
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // it does not call NotifyEnded().
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (observer) {
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ui::LayerAnimationSequence* sequence = new ui::LayerAnimationSequence(
1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ui::LayerAnimationElement::CreateOpacityElement(
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            0.0, base::TimeDelta()));
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      sequence->AddObserver(observer);
1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    layer->GetAnimator()->ScheduleAnimation(sequence);
1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Animates |window| to identity transform and full opacity over |duration|.
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void TransformWindowToBaseState(aura::Window* window,
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                base::TimeDelta duration,
1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                ui::LayerAnimationObserver* observer) {
1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ui::Layer* layer = window->layer();
1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ui::ScopedLayerAnimationSettings settings(layer->GetAnimator());
1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Animate to target values.
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  settings.SetPreemptionStrategy(
2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET);
2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  settings.SetTransitionDuration(duration);
2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
204d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  settings.SetTweenType(gfx::Tween::EASE_OUT);
2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer->SetTransform(gfx::Transform());
2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
207d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  settings.SetTweenType(gfx::Tween::EASE_IN_OUT);
2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer->SetOpacity(1.0f);
2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A bit of a dirty trick: we need to catch the end of the animation we don't
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // control. So we use two facts we know: which animator will be used and the
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // target opacity to add "Do nothing" animation sequence.
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Unfortunately, we can not just use empty LayerAnimationSequence, because
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // it does not call NotifyEnded().
2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (observer) {
2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ui::LayerAnimationSequence* sequence = new ui::LayerAnimationSequence(
2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ui::LayerAnimationElement::CreateOpacityElement(
2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            1.0, base::TimeDelta()));
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sequence->AddObserver(observer);
2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    layer->GetAnimator()->ScheduleAnimation(sequence);
2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ShowWindow(aura::Window* window,
2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                base::TimeDelta duration,
2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                bool above,
2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                ui::LayerAnimationObserver* observer) {
2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ui::Layer* layer = window->layer();
2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ui::ScopedLayerAnimationSettings settings(layer->GetAnimator());
2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Set initial state of animation
2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  settings.SetPreemptionStrategy(
2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET);
2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  settings.SetTransitionDuration(base::TimeDelta());
2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetTransformForScaleAnimation(layer,
2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      above ? LAYER_SCALE_ANIMATION_ABOVE : LAYER_SCALE_ANIMATION_BELOW);
2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TransformWindowToBaseState(window, duration, observer);
2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Starts grayscale/brightness animation for |window| over |duration|. Target
2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// value for both grayscale and brightness are specified by |target|.
2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void StartGrayscaleBrightnessAnimationForWindow(
2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    aura::Window* window,
2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    float target,
2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::TimeDelta duration,
247d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    gfx::Tween::Type tween_type,
2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ui::LayerAnimationObserver* observer) {
2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ui::LayerAnimator* animator = window->layer()->GetAnimator();
2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<ui::LayerAnimationSequence> brightness_sequence(
2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new ui::LayerAnimationSequence());
2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<ui::LayerAnimationSequence> grayscale_sequence(
2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new ui::LayerAnimationSequence());
2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<ui::LayerAnimationElement> brightness_element(
2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::LayerAnimationElement::CreateBrightnessElement(
2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          target, duration));
2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  brightness_element->set_tween_type(tween_type);
2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  brightness_sequence->AddElement(brightness_element.release());
2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<ui::LayerAnimationElement> grayscale_element(
2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::LayerAnimationElement::CreateGrayscaleElement(
2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          target, duration));
2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  grayscale_element->set_tween_type(tween_type);
2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  grayscale_sequence->AddElement(grayscale_element.release());
2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::vector<ui::LayerAnimationSequence*> animations;
2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  animations.push_back(brightness_sequence.release());
2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  animations.push_back(grayscale_sequence.release());
2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (observer)
2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    animations[0]->AddObserver(observer);
2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  animator->set_preemption_strategy(
2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET);
2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  animator->StartTogether(animations);
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Animation observer that will drop animated foreground once animation is
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// finished. It is used in when undoing shutdown animation.
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class CallbackAnimationObserver : public ui::LayerAnimationObserver {
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit CallbackAnimationObserver(base::Callback<void(void)> &callback)
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : callback_(callback) {
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~CallbackAnimationObserver() {
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Overridden from ui::LayerAnimationObserver:
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnLayerAnimationEnded(ui::LayerAnimationSequence* seq)
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      OVERRIDE {
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Drop foreground once animation is over.
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    callback_.Run();
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delete this;
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnLayerAnimationAborted(ui::LayerAnimationSequence* seq)
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      OVERRIDE {
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Drop foreground once animation is over.
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    callback_.Run();
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delete this;
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnLayerAnimationScheduled(ui::LayerAnimationSequence* seq)
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      OVERRIDE {}
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Callback<void(void)> callback_;
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(CallbackAnimationObserver);
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool IsLayerAnimated(ui::Layer* layer,
3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                     SessionStateAnimator::AnimationType type) {
3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  switch (type) {
3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case SessionStateAnimator::ANIMATION_PARTIAL_CLOSE:
3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if (layer->GetTargetTransform() != GetSlowCloseTransform())
3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        return false;
3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      break;
3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case SessionStateAnimator::ANIMATION_UNDO_PARTIAL_CLOSE:
3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if (layer->GetTargetTransform() != gfx::Transform())
3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        return false;
3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      break;
3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case SessionStateAnimator::ANIMATION_FULL_CLOSE:
3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if (layer->GetTargetTransform() != GetFastCloseTransform() ||
3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          layer->GetTargetOpacity() > 0.0001)
3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        return false;
3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      break;
3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case SessionStateAnimator::ANIMATION_FADE_IN:
3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if (layer->GetTargetOpacity() < 0.9999)
3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        return false;
3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      break;
3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case SessionStateAnimator::ANIMATION_FADE_OUT:
3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if (layer->GetTargetOpacity() > 0.0001)
3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        return false;
3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      break;
3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case SessionStateAnimator::ANIMATION_HIDE_IMMEDIATELY:
3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if (layer->GetTargetOpacity() > 0.0001)
3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        return false;
3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      break;
3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case SessionStateAnimator::ANIMATION_RESTORE:
3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if (layer->opacity() < 0.9999 || layer->transform() != gfx::Transform())
3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        return false;
3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      break;
3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case SessionStateAnimator::ANIMATION_GRAYSCALE_BRIGHTNESS:
3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if ((layer->GetTargetBrightness() < 0.9999) ||
3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          (layer->GetTargetGrayscale() < 0.9999))
3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        return false;
3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      break;
3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case SessionStateAnimator::ANIMATION_UNDO_GRAYSCALE_BRIGHTNESS:
3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if ((layer->GetTargetBrightness() > 0.0001) ||
3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          (layer->GetTargetGrayscale() > 0.0001))
3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        return false;
3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      break;
3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case SessionStateAnimator::ANIMATION_DROP:
3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case SessionStateAnimator::ANIMATION_UNDO_LIFT:
3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      //ToDo(antim) : check other effects
3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if (layer->GetTargetOpacity() < 0.9999)
3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        return false;
3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      break;
3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      //ToDo(antim) : check other effects
3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case SessionStateAnimator::ANIMATION_LIFT:
3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if (layer->GetTargetOpacity() > 0.0001)
3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        return false;
3682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      break;
3692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case SessionStateAnimator::ANIMATION_RAISE_TO_SCREEN:
3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      //ToDo(antim) : check other effects
3712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if (layer->GetTargetOpacity() < 0.9999)
3722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        return false;
3732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      break;
3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      //ToDo(antim) : check other effects
3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case SessionStateAnimator::ANIMATION_LOWER_BELOW_SCREEN:
3762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if (layer->GetTargetOpacity() > 0.0001)
3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        return false;
3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      break;
3792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    default:
3802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      NOTREACHED() << "Unhandled animation type " << type;
3812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return false;
3822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return true;
3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool SessionStateAnimator::TestApi::ContainersAreAnimated(
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int container_mask, AnimationType type) const {
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  aura::Window::Windows containers;
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  animator_->GetContainers(container_mask, &containers);
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (aura::Window::Windows::const_iterator it = containers.begin();
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       it != containers.end(); ++it) {
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    aura::Window* window = *it;
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui::Layer* layer = window->layer();
3962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (!IsLayerAnimated(layer, type))
3972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return false;
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool SessionStateAnimator::TestApi::RootWindowIsAnimated(AnimationType type)
4032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const {
4041e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  aura::Window* root_window = Shell::GetPrimaryRootWindow();
4052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ui::Layer* layer = root_window->layer();
4062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return IsLayerAnimated(layer, type);
4072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int SessionStateAnimator::kAllLockScreenContainersMask =
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SessionStateAnimator::LOCK_SCREEN_BACKGROUND |
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SessionStateAnimator::LOCK_SCREEN_CONTAINERS |
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SessionStateAnimator::LOCK_SCREEN_RELATED_CONTAINERS;
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int SessionStateAnimator::kAllContainersMask =
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SessionStateAnimator::kAllLockScreenContainersMask |
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SessionStateAnimator::DESKTOP_BACKGROUND |
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SessionStateAnimator::LAUNCHER |
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SessionStateAnimator::NON_LOCK_SCREEN_CONTAINERS;
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SessionStateAnimator::SessionStateAnimator() {
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SessionStateAnimator::~SessionStateAnimator() {
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)base::TimeDelta SessionStateAnimator::GetDuration(AnimationSpeed speed) {
4272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  switch (speed) {
4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case ANIMATION_SPEED_IMMEDIATE:
4292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return base::TimeDelta();
4302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case ANIMATION_SPEED_UNDOABLE:
4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return base::TimeDelta::FromMilliseconds(400);
4322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case ANIMATION_SPEED_REVERT:
4332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return base::TimeDelta::FromMilliseconds(150);
4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case ANIMATION_SPEED_FAST:
4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return base::TimeDelta::FromMilliseconds(150);
4362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case ANIMATION_SPEED_SHOW_LOCK_SCREEN:
4372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return base::TimeDelta::FromMilliseconds(200);
4382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case ANIMATION_SPEED_MOVE_WINDOWS:
4392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return base::TimeDelta::FromMilliseconds(350);
4402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case ANIMATION_SPEED_UNDO_MOVE_WINDOWS:
4412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return base::TimeDelta::FromMilliseconds(350);
4422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case ANIMATION_SPEED_SHUTDOWN:
4432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return base::TimeDelta::FromMilliseconds(1000);
4442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case ANIMATION_SPEED_REVERT_SHUTDOWN:
4452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return base::TimeDelta::FromMilliseconds(500);
4462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Satisfy compilers that do not understand that we will return from switch
4482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // above anyway.
4492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(false) << "Unhandled animation speed " << speed;
4502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return base::TimeDelta();
4512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Fills |containers| with the containers described by |container_mask|.
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SessionStateAnimator::GetContainers(int container_mask,
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         aura::Window::Windows* containers) {
4561e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  aura::Window* root_window = Shell::GetPrimaryRootWindow();
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  containers->clear();
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (container_mask & DESKTOP_BACKGROUND) {
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    containers->push_back(Shell::GetContainer(
461c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        root_window, kShellWindowId_DesktopBackgroundContainer));
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (container_mask & LAUNCHER) {
464c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    containers->push_back(
465c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        Shell::GetContainer(root_window, kShellWindowId_ShelfContainer));
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (container_mask & NON_LOCK_SCREEN_CONTAINERS) {
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // TODO(antrim): Figure out a way to eliminate a need to exclude launcher
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // in such way.
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    aura::Window* non_lock_screen_containers = Shell::GetContainer(
471c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        root_window, kShellWindowId_NonLockScreenContainersContainer);
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    aura::Window::Windows children = non_lock_screen_containers->children();
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (aura::Window::Windows::const_iterator it = children.begin();
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         it != children.end(); ++it) {
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      aura::Window* window = *it;
477c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      if (window->id() == kShellWindowId_ShelfContainer)
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        continue;
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      containers->push_back(window);
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (container_mask & LOCK_SCREEN_BACKGROUND) {
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    containers->push_back(Shell::GetContainer(
484c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        root_window, kShellWindowId_LockScreenBackgroundContainer));
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (container_mask & LOCK_SCREEN_CONTAINERS) {
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    containers->push_back(Shell::GetContainer(
488c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        root_window, kShellWindowId_LockScreenContainersContainer));
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (container_mask & LOCK_SCREEN_RELATED_CONTAINERS) {
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    containers->push_back(Shell::GetContainer(
492c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        root_window, kShellWindowId_LockScreenRelatedContainersContainer));
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SessionStateAnimator::StartAnimation(int container_mask,
4972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                          AnimationType type,
4982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                          AnimationSpeed speed) {
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  aura::Window::Windows containers;
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetContainers(container_mask, &containers);
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (aura::Window::Windows::const_iterator it = containers.begin();
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       it != containers.end(); ++it) {
5032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    RunAnimationForWindow(*it, type, speed, NULL);
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SessionStateAnimator::StartAnimationWithCallback(
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int container_mask,
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AnimationType type,
5102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    AnimationSpeed speed,
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::Callback<void(void)>& callback) {
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  aura::Window::Windows containers;
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetContainers(container_mask, &containers);
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (aura::Window::Windows::const_iterator it = containers.begin();
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       it != containers.end(); ++it) {
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui::LayerAnimationObserver* observer =
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        new CallbackAnimationObserver(callback);
5182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    RunAnimationForWindow(*it, type, speed, observer);
5192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SessionStateAnimator::StartAnimationWithObserver(
5232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int container_mask,
5242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    AnimationType type,
5252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    AnimationSpeed speed,
5262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ui::LayerAnimationObserver* observer) {
5272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  aura::Window::Windows containers;
5282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GetContainers(container_mask, &containers);
5292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (aura::Window::Windows::const_iterator it = containers.begin();
5302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       it != containers.end(); ++it) {
5312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    RunAnimationForWindow(*it, type, speed, observer);
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SessionStateAnimator::StartGlobalAnimation(AnimationType type,
5362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                AnimationSpeed speed) {
5371e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  aura::Window* root_window = Shell::GetPrimaryRootWindow();
5382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RunAnimationForWindow(root_window, type, speed, NULL);
5392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SessionStateAnimator::RunAnimationForWindow(
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    aura::Window* window,
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AnimationType type,
5442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    AnimationSpeed speed,
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui::LayerAnimationObserver* observer) {
5462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::TimeDelta duration = GetDuration(speed);
5472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (type) {
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case ANIMATION_PARTIAL_CLOSE:
5502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      StartSlowCloseAnimationForWindow(window, duration, observer);
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case ANIMATION_UNDO_PARTIAL_CLOSE:
5532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      StartUndoSlowCloseAnimationForWindow(window, duration, observer);
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case ANIMATION_FULL_CLOSE:
5562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      StartFastCloseAnimationForWindow(window, duration, observer);
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case ANIMATION_FADE_IN:
5592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      StartOpacityAnimationForWindow(window, 1.0, duration, observer);
5602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      break;
5612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case ANIMATION_FADE_OUT:
5622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      StartOpacityAnimationForWindow(window, 0.0, duration, observer);
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case ANIMATION_HIDE_IMMEDIATELY:
5652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      DCHECK_EQ(speed, ANIMATION_SPEED_IMMEDIATE);
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      HideWindowImmediately(window, observer);
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case ANIMATION_RESTORE:
5692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      DCHECK_EQ(speed, ANIMATION_SPEED_IMMEDIATE);
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      RestoreWindow(window, observer);
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case ANIMATION_LIFT:
5732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      HideWindow(window, duration, true, observer);
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case ANIMATION_DROP:
5762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ShowWindow(window, duration, true, observer);
5772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      break;
5782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case ANIMATION_UNDO_LIFT:
5792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      TransformWindowToBaseState(window, duration, observer);
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case ANIMATION_RAISE_TO_SCREEN:
5822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ShowWindow(window, duration, false, observer);
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case ANIMATION_LOWER_BELOW_SCREEN:
5852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      HideWindow(window, duration, false, observer);
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case ANIMATION_PARTIAL_FADE_IN:
5882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      StartPartialFadeAnimation(
5892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          window, kPartialFadeRatio, duration, observer);
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case ANIMATION_UNDO_PARTIAL_FADE_IN:
5922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      StartPartialFadeAnimation(window, 0.0, duration, observer);
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case ANIMATION_FULL_FADE_IN:
5952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      StartPartialFadeAnimation(window, 1.0, duration, observer);
5962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      break;
5972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case ANIMATION_GRAYSCALE_BRIGHTNESS:
5982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      StartGrayscaleBrightnessAnimationForWindow(
599d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)          window, 1.0, duration, gfx::Tween::EASE_IN, observer);
6002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      break;
6012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case ANIMATION_UNDO_GRAYSCALE_BRIGHTNESS:
6022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      StartGrayscaleBrightnessAnimationForWindow(
603d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)          window, 0.0, duration, gfx::Tween::EASE_IN_OUT, observer);
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace ash
609