| Index: ash/wm/session_state_animator_impl.cc
|
| diff --git a/ash/wm/session_state_animator.cc b/ash/wm/session_state_animator_impl.cc
|
| similarity index 82%
|
| copy from ash/wm/session_state_animator.cc
|
| copy to ash/wm/session_state_animator_impl.cc
|
| index 9900275af8a0bf2032bf10661ecf48fdc58c6add..4fb0d7b4f9d3bc4dea8966dc1154dbc670deb122 100644
|
| --- a/ash/wm/session_state_animator.cc
|
| +++ b/ash/wm/session_state_animator_impl.cc
|
| @@ -2,7 +2,9 @@
|
| // Use of this source code is governed by a BSD-style license that can be
|
| // found in the LICENSE file.
|
|
|
| -#include "ash/wm/session_state_animator.h"
|
| +#include "ash/wm/session_state_animator_impl.h"
|
| +
|
| +#include <vector>
|
|
|
| #include "ash/shell.h"
|
| #include "ash/shell_window_ids.h"
|
| @@ -27,6 +29,13 @@ const float kPartialFadeRatio = 0.3f;
|
| // Minimum size. Not zero as it causes numeric issues.
|
| const float kMinimumScale = 1e-4f;
|
|
|
| +// Returns the primary root window's container.
|
| +aura::Window* GetBackground() {
|
| + aura::Window* root_window = Shell::GetPrimaryRootWindow();
|
| + return Shell::GetContainer(root_window,
|
| + kShellWindowId_DesktopBackgroundContainer);
|
| +}
|
| +
|
| // Returns the transform that should be applied to containers for the slow-close
|
| // animation.
|
| gfx::Transform GetSlowCloseTransform() {
|
| @@ -36,7 +45,7 @@ gfx::Transform GetSlowCloseTransform() {
|
| floor(0.5 * (1.0 - kSlowCloseSizeRatio) * root_size.width() + 0.5),
|
| floor(0.5 * (1.0 - kSlowCloseSizeRatio) * root_size.height() + 0.5));
|
| transform.Scale(kSlowCloseSizeRatio, kSlowCloseSizeRatio);
|
| - return transform;
|
| + return transform;
|
| }
|
|
|
| // Returns the transform that should be applied to containers for the fast-close
|
| @@ -44,6 +53,7 @@ gfx::Transform GetSlowCloseTransform() {
|
| gfx::Transform GetFastCloseTransform() {
|
| gfx::Size root_size = Shell::GetPrimaryRootWindow()->bounds().size();
|
| gfx::Transform transform;
|
| +
|
| transform.Translate(floor(0.5 * root_size.width() + 0.5),
|
| floor(0.5 * root_size.height() + 0.5));
|
| transform.Scale(kMinimumScale, kMinimumScale);
|
| @@ -282,7 +292,7 @@ void StartGrayscaleBrightnessAnimationForWindow(
|
| // finished. It is used in when undoing shutdown animation.
|
| class CallbackAnimationObserver : public ui::LayerAnimationObserver {
|
| public:
|
| - explicit CallbackAnimationObserver(base::Callback<void(void)> &callback)
|
| + explicit CallbackAnimationObserver(base::Closure callback)
|
| : callback_(callback) {
|
| }
|
| virtual ~CallbackAnimationObserver() {
|
| @@ -307,7 +317,7 @@ class CallbackAnimationObserver : public ui::LayerAnimationObserver {
|
| virtual void OnLayerAnimationScheduled(ui::LayerAnimationSequence* seq)
|
| OVERRIDE {}
|
|
|
| - base::Callback<void(void)> callback_;
|
| + base::Closure callback_;
|
|
|
| DISALLOW_COPY_AND_ASSIGN(CallbackAnimationObserver);
|
| };
|
| @@ -385,7 +395,75 @@ bool IsLayerAnimated(ui::Layer* layer,
|
|
|
| } // namespace
|
|
|
| -bool SessionStateAnimator::TestApi::ContainersAreAnimated(
|
| +// This observer is intended to use in cases when some action has to be taken
|
| +// once some animation successfully completes (i.e. it was not aborted).
|
| +// Observer will count a number of sequences it is attached to, and a number of
|
| +// finished sequences (either Ended or Aborted). Once these two numbers are
|
| +// equal, observer will delete itself, calling callback passed to constructor if
|
| +// there were no aborted animations.
|
| +// This way it can be either used to wait for some animation to be finished in
|
| +// multiple layers, to wait once a sequence of animations is finished in one
|
| +// layer or the mixture of both.
|
| +class SessionStateAnimatorImpl::AnimationSequence
|
| + : public SessionStateAnimator::AnimationSequence,
|
| + public ui::LayerAnimationObserver {
|
| + public:
|
| + explicit AnimationSequence(
|
| + SessionStateAnimatorImpl* animator,
|
| + base::Closure callback)
|
| + : SessionStateAnimator::AnimationSequence(callback),
|
| + animator_(animator),
|
| + sequences_attached_(0),
|
| + sequences_completed_(0) {
|
| + }
|
| +
|
| + // SessionStateAnimator::AnimationSequence:
|
| + virtual void StartAnimation(
|
| + int container_mask,
|
| + SessionStateAnimator::AnimationType type,
|
| + SessionStateAnimator::AnimationSpeed speed) OVERRIDE {
|
| + animator_->StartAnimationInSequence(container_mask, type, speed, this);
|
| + }
|
| +
|
| + private:
|
| + virtual ~AnimationSequence() {}
|
| +
|
| + // ui::LayerAnimationObserver:
|
| + virtual void OnLayerAnimationEnded(
|
| + ui::LayerAnimationSequence* sequence) OVERRIDE {
|
| + sequences_completed_++;
|
| + if (sequences_completed_ == sequences_attached_)
|
| + OnAnimationCompleted();
|
| + }
|
| +
|
| + virtual void OnLayerAnimationAborted(
|
| + ui::LayerAnimationSequence* sequence) OVERRIDE {
|
| + sequences_completed_++;
|
| + if (sequences_completed_ == sequences_attached_)
|
| + OnAnimationAborted();
|
| + }
|
| +
|
| + virtual void OnLayerAnimationScheduled(
|
| + ui::LayerAnimationSequence* sequence) OVERRIDE {}
|
| +
|
| + virtual void OnAttachedToSequence(
|
| + ui::LayerAnimationSequence* sequence) OVERRIDE {
|
| + LayerAnimationObserver::OnAttachedToSequence(sequence);
|
| + sequences_attached_++;
|
| + }
|
| +
|
| + SessionStateAnimatorImpl* animator_; // not owned
|
| +
|
| + // Number of sequences this observer was attached to.
|
| + int sequences_attached_;
|
| +
|
| + // Number of sequences either ended or aborted.
|
| + int sequences_completed_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(AnimationSequence);
|
| +};
|
| +
|
| +bool SessionStateAnimatorImpl::TestApi::ContainersAreAnimated(
|
| int container_mask, AnimationType type) const {
|
| aura::Window::Windows containers;
|
| animator_->GetContainers(container_mask, &containers);
|
| @@ -399,63 +477,29 @@ bool SessionStateAnimator::TestApi::ContainersAreAnimated(
|
| return true;
|
| }
|
|
|
| -bool SessionStateAnimator::TestApi::RootWindowIsAnimated(AnimationType type)
|
| +bool SessionStateAnimatorImpl::TestApi::RootWindowIsAnimated(AnimationType type)
|
| const {
|
| aura::Window* root_window = Shell::GetPrimaryRootWindow();
|
| ui::Layer* layer = root_window->layer();
|
| return IsLayerAnimated(layer, type);
|
| }
|
|
|
| -const int SessionStateAnimator::kAllLockScreenContainersMask =
|
| - SessionStateAnimator::LOCK_SCREEN_BACKGROUND |
|
| - SessionStateAnimator::LOCK_SCREEN_CONTAINERS |
|
| - SessionStateAnimator::LOCK_SCREEN_RELATED_CONTAINERS;
|
| -
|
| -const int SessionStateAnimator::kAllContainersMask =
|
| - SessionStateAnimator::kAllLockScreenContainersMask |
|
| - SessionStateAnimator::DESKTOP_BACKGROUND |
|
| - SessionStateAnimator::LAUNCHER |
|
| - SessionStateAnimator::NON_LOCK_SCREEN_CONTAINERS;
|
| -
|
| -SessionStateAnimator::SessionStateAnimator() {
|
| -}
|
| -
|
| -SessionStateAnimator::~SessionStateAnimator() {
|
| +SessionStateAnimatorImpl::SessionStateAnimatorImpl() {
|
| }
|
|
|
| -base::TimeDelta SessionStateAnimator::GetDuration(AnimationSpeed speed) {
|
| - switch (speed) {
|
| - case ANIMATION_SPEED_IMMEDIATE:
|
| - return base::TimeDelta();
|
| - case ANIMATION_SPEED_UNDOABLE:
|
| - return base::TimeDelta::FromMilliseconds(400);
|
| - case ANIMATION_SPEED_REVERT:
|
| - return base::TimeDelta::FromMilliseconds(150);
|
| - case ANIMATION_SPEED_FAST:
|
| - return base::TimeDelta::FromMilliseconds(150);
|
| - case ANIMATION_SPEED_SHOW_LOCK_SCREEN:
|
| - return base::TimeDelta::FromMilliseconds(200);
|
| - case ANIMATION_SPEED_MOVE_WINDOWS:
|
| - return base::TimeDelta::FromMilliseconds(350);
|
| - case ANIMATION_SPEED_UNDO_MOVE_WINDOWS:
|
| - return base::TimeDelta::FromMilliseconds(350);
|
| - case ANIMATION_SPEED_SHUTDOWN:
|
| - return base::TimeDelta::FromMilliseconds(1000);
|
| - case ANIMATION_SPEED_REVERT_SHUTDOWN:
|
| - return base::TimeDelta::FromMilliseconds(500);
|
| - }
|
| - // Satisfy compilers that do not understand that we will return from switch
|
| - // above anyway.
|
| - DCHECK(false) << "Unhandled animation speed " << speed;
|
| - return base::TimeDelta();
|
| +SessionStateAnimatorImpl::~SessionStateAnimatorImpl() {
|
| }
|
|
|
| // Fills |containers| with the containers described by |container_mask|.
|
| -void SessionStateAnimator::GetContainers(int container_mask,
|
| - aura::Window::Windows* containers) {
|
| +void SessionStateAnimatorImpl::GetContainers(int container_mask,
|
| + aura::Window::Windows* containers) {
|
| aura::Window* root_window = Shell::GetPrimaryRootWindow();
|
| containers->clear();
|
|
|
| + if (container_mask & ROOT_CONTAINER) {
|
| + containers->push_back(Shell::GetPrimaryRootWindow());
|
| + }
|
| +
|
| if (container_mask & DESKTOP_BACKGROUND) {
|
| containers->push_back(Shell::GetContainer(
|
| root_window, kShellWindowId_DesktopBackgroundContainer));
|
| @@ -493,9 +537,9 @@ void SessionStateAnimator::GetContainers(int container_mask,
|
| }
|
| }
|
|
|
| -void SessionStateAnimator::StartAnimation(int container_mask,
|
| - AnimationType type,
|
| - AnimationSpeed speed) {
|
| +void SessionStateAnimatorImpl::StartAnimation(int container_mask,
|
| + AnimationType type,
|
| + AnimationSpeed speed) {
|
| aura::Window::Windows containers;
|
| GetContainers(container_mask, &containers);
|
| for (aura::Window::Windows::const_iterator it = containers.begin();
|
| @@ -504,11 +548,11 @@ void SessionStateAnimator::StartAnimation(int container_mask,
|
| }
|
| }
|
|
|
| -void SessionStateAnimator::StartAnimationWithCallback(
|
| +void SessionStateAnimatorImpl::StartAnimationWithCallback(
|
| int container_mask,
|
| AnimationType type,
|
| AnimationSpeed speed,
|
| - base::Callback<void(void)>& callback) {
|
| + base::Closure callback) {
|
| aura::Window::Windows containers;
|
| GetContainers(container_mask, &containers);
|
| for (aura::Window::Windows::const_iterator it = containers.begin();
|
| @@ -519,11 +563,34 @@ void SessionStateAnimator::StartAnimationWithCallback(
|
| }
|
| }
|
|
|
| -void SessionStateAnimator::StartAnimationWithObserver(
|
| +SessionStateAnimator::AnimationSequence*
|
| + SessionStateAnimatorImpl::BeginAnimationSequence(base::Closure callback) {
|
| + return new AnimationSequence(this, callback);
|
| +}
|
| +
|
| +bool SessionStateAnimatorImpl::IsBackgroundHidden() const {
|
| + return !GetBackground()->IsVisible();
|
| +}
|
| +
|
| +void SessionStateAnimatorImpl::ShowBackground() {
|
| + ui::ScopedLayerAnimationSettings settings(
|
| + GetBackground()->layer()->GetAnimator());
|
| + settings.SetTransitionDuration(base::TimeDelta());
|
| + GetBackground()->Show();
|
| +}
|
| +
|
| +void SessionStateAnimatorImpl::HideBackground() {
|
| + ui::ScopedLayerAnimationSettings settings(
|
| + GetBackground()->layer()->GetAnimator());
|
| + settings.SetTransitionDuration(base::TimeDelta());
|
| + GetBackground()->Hide();
|
| +}
|
| +
|
| +void SessionStateAnimatorImpl::StartAnimationInSequence(
|
| int container_mask,
|
| AnimationType type,
|
| AnimationSpeed speed,
|
| - ui::LayerAnimationObserver* observer) {
|
| + AnimationSequence* observer) {
|
| aura::Window::Windows containers;
|
| GetContainers(container_mask, &containers);
|
| for (aura::Window::Windows::const_iterator it = containers.begin();
|
| @@ -532,13 +599,7 @@ void SessionStateAnimator::StartAnimationWithObserver(
|
| }
|
| }
|
|
|
| -void SessionStateAnimator::StartGlobalAnimation(AnimationType type,
|
| - AnimationSpeed speed) {
|
| - aura::Window* root_window = Shell::GetPrimaryRootWindow();
|
| - RunAnimationForWindow(root_window, type, speed, NULL);
|
| -}
|
| -
|
| -void SessionStateAnimator::RunAnimationForWindow(
|
| +void SessionStateAnimatorImpl::RunAnimationForWindow(
|
| aura::Window* window,
|
| AnimationType type,
|
| AnimationSpeed speed,
|
|
|