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