| Index: ash/wm/lock_state_controller.cc
|
| diff --git a/ash/wm/lock_state_controller.cc b/ash/wm/lock_state_controller.cc
|
| index ebb0698c8f46c6b6262584883b4833de808d485d..a03a95869c9dc4648c5ce50bac69f7bde62c5b0b 100644
|
| --- a/ash/wm/lock_state_controller.cc
|
| +++ b/ash/wm/lock_state_controller.cc
|
| @@ -5,6 +5,7 @@
|
| #include "ash/wm/lock_state_controller.h"
|
|
|
| #include <algorithm>
|
| +#include <string>
|
|
|
| #include "ash/accessibility_delegate.h"
|
| #include "ash/ash_switches.h"
|
| @@ -14,13 +15,12 @@
|
| #include "ash/shell_delegate.h"
|
| #include "ash/shell_window_ids.h"
|
| #include "ash/wm/session_state_animator.h"
|
| +#include "ash/wm/session_state_animator_impl.h"
|
| #include "base/bind_helpers.h"
|
| #include "base/command_line.h"
|
| #include "base/strings/string_util.h"
|
| #include "base/timer/timer.h"
|
| #include "ui/aura/window_tree_host.h"
|
| -#include "ui/compositor/layer_animation_sequence.h"
|
| -#include "ui/compositor/scoped_layer_animation_settings.h"
|
| #include "ui/views/controls/menu/menu_controller.h"
|
| #include "ui/wm/core/compound_event_filter.h"
|
|
|
| @@ -41,113 +41,6 @@ namespace {
|
| const int kMaxShutdownSoundDurationMs = 1500;
|
| #endif
|
|
|
| -aura::Window* GetBackground() {
|
| - aura::Window* root_window = Shell::GetPrimaryRootWindow();
|
| - return Shell::GetContainer(root_window,
|
| - kShellWindowId_DesktopBackgroundContainer);
|
| -}
|
| -
|
| -bool IsBackgroundHidden() {
|
| - return !GetBackground()->IsVisible();
|
| -}
|
| -
|
| -void ShowBackground() {
|
| - ui::ScopedLayerAnimationSettings settings(
|
| - GetBackground()->layer()->GetAnimator());
|
| - settings.SetTransitionDuration(base::TimeDelta());
|
| - GetBackground()->Show();
|
| -}
|
| -
|
| -void HideBackground() {
|
| - ui::ScopedLayerAnimationSettings settings(
|
| - GetBackground()->layer()->GetAnimator());
|
| - settings.SetTransitionDuration(base::TimeDelta());
|
| - GetBackground()->Hide();
|
| -}
|
| -
|
| -// 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 AnimationFinishedObserver : public ui::LayerAnimationObserver {
|
| - public:
|
| - explicit AnimationFinishedObserver(base::Closure &callback)
|
| - : callback_(callback),
|
| - sequences_attached_(0),
|
| - sequences_completed_(0),
|
| - paused_(false) {
|
| - }
|
| -
|
| - // Pauses observer: no checks will be made while paused. It can be used when
|
| - // a sequence has some immediate animations in the beginning, and for
|
| - // animations that can be tested with flag that makes all animations
|
| - // immediate.
|
| - void Pause() {
|
| - paused_ = true;
|
| - }
|
| -
|
| - // Unpauses observer. It does a check and calls callback if conditions are
|
| - // met.
|
| - void Unpause() {
|
| - if (!paused_)
|
| - return;
|
| - paused_ = false;
|
| - if (sequences_completed_ == sequences_attached_) {
|
| - callback_.Run();
|
| - delete this;
|
| - }
|
| - }
|
| -
|
| - private:
|
| - virtual ~AnimationFinishedObserver() {
|
| - }
|
| -
|
| - // LayerAnimationObserver implementation
|
| - virtual void OnLayerAnimationEnded(
|
| - ui::LayerAnimationSequence* sequence) OVERRIDE {
|
| - sequences_completed_++;
|
| - if ((sequences_completed_ == sequences_attached_) && !paused_) {
|
| - callback_.Run();
|
| - delete this;
|
| - }
|
| - }
|
| -
|
| - virtual void OnLayerAnimationAborted(
|
| - ui::LayerAnimationSequence* sequence) OVERRIDE {
|
| - sequences_completed_++;
|
| - if ((sequences_completed_ == sequences_attached_) && !paused_)
|
| - delete this;
|
| - }
|
| -
|
| - virtual void OnLayerAnimationScheduled(
|
| - ui::LayerAnimationSequence* sequence) OVERRIDE {
|
| - }
|
| -
|
| - virtual void OnAttachedToSequence(
|
| - ui::LayerAnimationSequence* sequence) OVERRIDE {
|
| - LayerAnimationObserver::OnAttachedToSequence(sequence);
|
| - sequences_attached_++;
|
| - }
|
| -
|
| - // Callback to be called.
|
| - base::Closure callback_;
|
| -
|
| - // Number of sequences this observer was attached to.
|
| - int sequences_attached_;
|
| -
|
| - // Number of sequences either ended or aborted.
|
| - int sequences_completed_;
|
| -
|
| - bool paused_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(AnimationFinishedObserver);
|
| -};
|
| -
|
| } // namespace
|
|
|
| const int LockStateController::kLockTimeoutMs = 400;
|
| @@ -164,7 +57,7 @@ LockStateController::TestApi::~TestApi() {
|
| }
|
|
|
| LockStateController::LockStateController()
|
| - : animator_(new SessionStateAnimator()),
|
| + : animator_(new SessionStateAnimatorImpl()),
|
| login_status_(user::LOGGED_IN_NONE),
|
| system_is_locked_(false),
|
| shutting_down_(false),
|
| @@ -179,8 +72,9 @@ LockStateController::~LockStateController() {
|
| Shell::GetPrimaryRootWindow()->GetHost()->RemoveObserver(this);
|
| }
|
|
|
| -void LockStateController::SetDelegate(LockStateControllerDelegate* delegate) {
|
| - delegate_.reset(delegate);
|
| +void LockStateController::SetDelegate(
|
| + scoped_ptr<LockStateControllerDelegate> delegate) {
|
| + delegate_ = delegate.Pass();
|
| }
|
|
|
| void LockStateController::AddObserver(LockStateObserver* observer) {
|
| @@ -209,9 +103,11 @@ void LockStateController::StartShutdownAnimation() {
|
| StartCancellableShutdownAnimation();
|
| }
|
|
|
| -void LockStateController::StartLockAnimationAndLockImmediately() {
|
| +void LockStateController::StartLockAnimationAndLockImmediately(
|
| + bool shutdown_after_lock) {
|
| if (animating_lock_)
|
| return;
|
| + shutdown_after_lock_ = shutdown_after_lock;
|
| StartImmediatePreLockAnimation(true /* request_lock_on_completion */);
|
| }
|
|
|
| @@ -253,7 +149,8 @@ void LockStateController::CancelShutdownAnimation() {
|
| return;
|
| }
|
|
|
| - animator_->StartGlobalAnimation(
|
| + animator_->StartAnimation(
|
| + SessionStateAnimator::ROOT_CONTAINER,
|
| SessionStateAnimator::ANIMATION_UNDO_GRAYSCALE_BRIGHTNESS,
|
| SessionStateAnimator::ANIMATION_SPEED_REVERT_SHUTDOWN);
|
| pre_shutdown_timer_.Stop();
|
| @@ -277,7 +174,8 @@ void LockStateController::RequestShutdown() {
|
| shell->cursor_manager()->HideCursor();
|
| shell->cursor_manager()->LockCursor();
|
|
|
| - animator_->StartGlobalAnimation(
|
| + animator_->StartAnimation(
|
| + SessionStateAnimator::ROOT_CONTAINER,
|
| SessionStateAnimator::ANIMATION_GRAYSCALE_BRIGHTNESS,
|
| SessionStateAnimator::ANIMATION_SPEED_SHUTDOWN);
|
| StartRealShutdownTimer(true);
|
| @@ -314,7 +212,7 @@ void LockStateController::OnAppTerminating() {
|
| Shell* shell = ash::Shell::GetInstance();
|
| shell->cursor_manager()->HideCursor();
|
| shell->cursor_manager()->LockCursor();
|
| - animator_->StartAnimation(SessionStateAnimator::kAllContainersMask,
|
| + animator_->StartAnimation(SessionStateAnimator::kAllNonRootContainersMask,
|
| SessionStateAnimator::ANIMATION_HIDE_IMMEDIATELY,
|
| SessionStateAnimator::ANIMATION_SPEED_IMMEDIATE);
|
| }
|
| @@ -418,7 +316,8 @@ void LockStateController::StartCancellableShutdownAnimation() {
|
| // Hide cursor, but let it reappear if the mouse moves.
|
| shell->cursor_manager()->HideCursor();
|
|
|
| - animator_->StartGlobalAnimation(
|
| + animator_->StartAnimation(
|
| + SessionStateAnimator::ROOT_CONTAINER,
|
| SessionStateAnimator::ANIMATION_GRAYSCALE_BRIGHTNESS,
|
| SessionStateAnimator::ANIMATION_SPEED_SHUTDOWN);
|
| StartPreShutdownAnimationTimer();
|
| @@ -434,29 +333,25 @@ void LockStateController::StartImmediatePreLockAnimation(
|
| base::Bind(&LockStateController::PreLockAnimationFinished,
|
| weak_ptr_factory_.GetWeakPtr(),
|
| request_lock_on_completion);
|
| - AnimationFinishedObserver* observer =
|
| - new AnimationFinishedObserver(next_animation_starter);
|
| -
|
| - observer->Pause();
|
| + SessionStateAnimator::AnimationSequence* animation_sequence =
|
| + animator_->BeginAnimationSequence(next_animation_starter);
|
|
|
| - animator_->StartAnimationWithObserver(
|
| + animation_sequence->StartAnimation(
|
| SessionStateAnimator::NON_LOCK_SCREEN_CONTAINERS,
|
| SessionStateAnimator::ANIMATION_LIFT,
|
| - SessionStateAnimator::ANIMATION_SPEED_MOVE_WINDOWS,
|
| - observer);
|
| - animator_->StartAnimationWithObserver(
|
| + SessionStateAnimator::ANIMATION_SPEED_MOVE_WINDOWS);
|
| + animation_sequence->StartAnimation(
|
| SessionStateAnimator::LAUNCHER,
|
| SessionStateAnimator::ANIMATION_FADE_OUT,
|
| - SessionStateAnimator::ANIMATION_SPEED_MOVE_WINDOWS,
|
| - observer);
|
| + SessionStateAnimator::ANIMATION_SPEED_MOVE_WINDOWS);
|
| // Hide the screen locker containers so we can raise them later.
|
| animator_->StartAnimation(SessionStateAnimator::LOCK_SCREEN_CONTAINERS,
|
| SessionStateAnimator::ANIMATION_HIDE_IMMEDIATELY,
|
| SessionStateAnimator::ANIMATION_SPEED_IMMEDIATE);
|
| AnimateBackgroundAppearanceIfNecessary(
|
| - SessionStateAnimator::ANIMATION_SPEED_MOVE_WINDOWS, observer);
|
| + SessionStateAnimator::ANIMATION_SPEED_MOVE_WINDOWS, animation_sequence);
|
|
|
| - observer->Unpause();
|
| + animation_sequence->EndSequence();
|
|
|
| DispatchCancelMode();
|
| FOR_EACH_OBSERVER(LockStateObserver, observers_,
|
| @@ -471,32 +366,28 @@ void LockStateController::StartCancellablePreLockAnimation() {
|
| base::Bind(&LockStateController::PreLockAnimationFinished,
|
| weak_ptr_factory_.GetWeakPtr(),
|
| true /* request_lock */);
|
| - AnimationFinishedObserver* observer =
|
| - new AnimationFinishedObserver(next_animation_starter);
|
| -
|
| - observer->Pause();
|
| + SessionStateAnimator::AnimationSequence* animation_sequence =
|
| + animator_->BeginAnimationSequence(next_animation_starter);
|
|
|
| - animator_->StartAnimationWithObserver(
|
| + animation_sequence->StartAnimation(
|
| SessionStateAnimator::NON_LOCK_SCREEN_CONTAINERS,
|
| SessionStateAnimator::ANIMATION_LIFT,
|
| - SessionStateAnimator::ANIMATION_SPEED_UNDOABLE,
|
| - observer);
|
| - animator_->StartAnimationWithObserver(
|
| + SessionStateAnimator::ANIMATION_SPEED_UNDOABLE);
|
| + animation_sequence->StartAnimation(
|
| SessionStateAnimator::LAUNCHER,
|
| SessionStateAnimator::ANIMATION_FADE_OUT,
|
| - SessionStateAnimator::ANIMATION_SPEED_UNDOABLE,
|
| - observer);
|
| + SessionStateAnimator::ANIMATION_SPEED_UNDOABLE);
|
| // Hide the screen locker containers so we can raise them later.
|
| animator_->StartAnimation(SessionStateAnimator::LOCK_SCREEN_CONTAINERS,
|
| SessionStateAnimator::ANIMATION_HIDE_IMMEDIATELY,
|
| SessionStateAnimator::ANIMATION_SPEED_IMMEDIATE);
|
| AnimateBackgroundAppearanceIfNecessary(
|
| - SessionStateAnimator::ANIMATION_SPEED_UNDOABLE, observer);
|
| + SessionStateAnimator::ANIMATION_SPEED_UNDOABLE, animation_sequence);
|
|
|
| DispatchCancelMode();
|
| FOR_EACH_OBSERVER(LockStateObserver, observers_,
|
| OnLockStateEvent(LockStateObserver::EVENT_PRELOCK_ANIMATION_STARTED));
|
| - observer->Unpause();
|
| + animation_sequence->EndSequence();
|
| }
|
|
|
| void LockStateController::CancelPreLockAnimation() {
|
| @@ -504,25 +395,22 @@ void LockStateController::CancelPreLockAnimation() {
|
| base::Closure next_animation_starter =
|
| base::Bind(&LockStateController::LockAnimationCancelled,
|
| weak_ptr_factory_.GetWeakPtr());
|
| - AnimationFinishedObserver* observer =
|
| - new AnimationFinishedObserver(next_animation_starter);
|
| + SessionStateAnimator::AnimationSequence* animation_sequence =
|
| + animator_->BeginAnimationSequence(next_animation_starter);
|
|
|
| - observer->Pause();
|
| -
|
| - animator_->StartAnimationWithObserver(
|
| + animation_sequence->StartAnimation(
|
| SessionStateAnimator::NON_LOCK_SCREEN_CONTAINERS,
|
| SessionStateAnimator::ANIMATION_UNDO_LIFT,
|
| - SessionStateAnimator::ANIMATION_SPEED_UNDO_MOVE_WINDOWS,
|
| - observer);
|
| - animator_->StartAnimationWithObserver(
|
| + SessionStateAnimator::ANIMATION_SPEED_UNDO_MOVE_WINDOWS);
|
| + animation_sequence->StartAnimation(
|
| SessionStateAnimator::LAUNCHER,
|
| SessionStateAnimator::ANIMATION_FADE_IN,
|
| - SessionStateAnimator::ANIMATION_SPEED_UNDO_MOVE_WINDOWS,
|
| - observer);
|
| + SessionStateAnimator::ANIMATION_SPEED_UNDO_MOVE_WINDOWS);
|
| AnimateBackgroundHidingIfNecessary(
|
| - SessionStateAnimator::ANIMATION_SPEED_UNDO_MOVE_WINDOWS, observer);
|
| + SessionStateAnimator::ANIMATION_SPEED_UNDO_MOVE_WINDOWS,
|
| + animation_sequence);
|
|
|
| - observer->Unpause();
|
| + animation_sequence->EndSequence();
|
| }
|
|
|
| void LockStateController::StartPostLockAnimation() {
|
| @@ -530,17 +418,14 @@ void LockStateController::StartPostLockAnimation() {
|
| base::Closure next_animation_starter =
|
| base::Bind(&LockStateController::PostLockAnimationFinished,
|
| weak_ptr_factory_.GetWeakPtr());
|
| + SessionStateAnimator::AnimationSequence* animation_sequence =
|
| + animator_->BeginAnimationSequence(next_animation_starter);
|
|
|
| - AnimationFinishedObserver* observer =
|
| - new AnimationFinishedObserver(next_animation_starter);
|
| -
|
| - observer->Pause();
|
| - animator_->StartAnimationWithObserver(
|
| + animation_sequence->StartAnimation(
|
| SessionStateAnimator::LOCK_SCREEN_CONTAINERS,
|
| SessionStateAnimator::ANIMATION_RAISE_TO_SCREEN,
|
| - SessionStateAnimator::ANIMATION_SPEED_MOVE_WINDOWS,
|
| - observer);
|
| - observer->Unpause();
|
| + SessionStateAnimator::ANIMATION_SPEED_MOVE_WINDOWS);
|
| + animation_sequence->EndSequence();
|
| }
|
|
|
| void LockStateController::StartUnlockAnimationBeforeUIDestroyed(
|
| @@ -558,25 +443,20 @@ void LockStateController::StartUnlockAnimationAfterUIDestroyed() {
|
| base::Closure next_animation_starter =
|
| base::Bind(&LockStateController::UnlockAnimationAfterUIDestroyedFinished,
|
| weak_ptr_factory_.GetWeakPtr());
|
| + SessionStateAnimator::AnimationSequence* animation_sequence =
|
| + animator_->BeginAnimationSequence(next_animation_starter);
|
|
|
| - AnimationFinishedObserver* observer =
|
| - new AnimationFinishedObserver(next_animation_starter);
|
| -
|
| - observer->Pause();
|
| -
|
| - animator_->StartAnimationWithObserver(
|
| + animation_sequence->StartAnimation(
|
| SessionStateAnimator::NON_LOCK_SCREEN_CONTAINERS,
|
| SessionStateAnimator::ANIMATION_DROP,
|
| - SessionStateAnimator::ANIMATION_SPEED_MOVE_WINDOWS,
|
| - observer);
|
| - animator_->StartAnimationWithObserver(
|
| + SessionStateAnimator::ANIMATION_SPEED_MOVE_WINDOWS);
|
| + animation_sequence->StartAnimation(
|
| SessionStateAnimator::LAUNCHER,
|
| SessionStateAnimator::ANIMATION_FADE_IN,
|
| - SessionStateAnimator::ANIMATION_SPEED_MOVE_WINDOWS,
|
| - observer);
|
| + SessionStateAnimator::ANIMATION_SPEED_MOVE_WINDOWS);
|
| AnimateBackgroundHidingIfNecessary(
|
| - SessionStateAnimator::ANIMATION_SPEED_MOVE_WINDOWS, observer);
|
| - observer->Unpause();
|
| + SessionStateAnimator::ANIMATION_SPEED_MOVE_WINDOWS, animation_sequence);
|
| + animation_sequence->EndSequence();
|
| }
|
|
|
| void LockStateController::LockAnimationCancelled() {
|
| @@ -642,14 +522,15 @@ void LockStateController::UnlockAnimationAfterUIDestroyedFinished() {
|
| void LockStateController::StoreUnlockedProperties() {
|
| if (!unlocked_properties_) {
|
| unlocked_properties_.reset(new UnlockedStateProperties());
|
| - unlocked_properties_->background_is_hidden = IsBackgroundHidden();
|
| + unlocked_properties_->background_is_hidden =
|
| + animator_->IsBackgroundHidden();
|
| }
|
| if (unlocked_properties_->background_is_hidden) {
|
| // Hide background so that it can be animated later.
|
| animator_->StartAnimation(SessionStateAnimator::DESKTOP_BACKGROUND,
|
| SessionStateAnimator::ANIMATION_HIDE_IMMEDIATELY,
|
| SessionStateAnimator::ANIMATION_SPEED_IMMEDIATE);
|
| - ShowBackground();
|
| + animator_->ShowBackground();
|
| }
|
| }
|
|
|
| @@ -657,7 +538,7 @@ void LockStateController::RestoreUnlockedProperties() {
|
| if (!unlocked_properties_)
|
| return;
|
| if (unlocked_properties_->background_is_hidden) {
|
| - HideBackground();
|
| + animator_->HideBackground();
|
| // Restore background visibility.
|
| animator_->StartAnimation(SessionStateAnimator::DESKTOP_BACKGROUND,
|
| SessionStateAnimator::ANIMATION_FADE_IN,
|
| @@ -668,27 +549,25 @@ void LockStateController::RestoreUnlockedProperties() {
|
|
|
| void LockStateController::AnimateBackgroundAppearanceIfNecessary(
|
| SessionStateAnimator::AnimationSpeed speed,
|
| - ui::LayerAnimationObserver* observer) {
|
| + SessionStateAnimator::AnimationSequence* animation_sequence) {
|
| if (unlocked_properties_.get() &&
|
| unlocked_properties_->background_is_hidden) {
|
| - animator_->StartAnimationWithObserver(
|
| + animation_sequence->StartAnimation(
|
| SessionStateAnimator::DESKTOP_BACKGROUND,
|
| SessionStateAnimator::ANIMATION_FADE_IN,
|
| - speed,
|
| - observer);
|
| + speed);
|
| }
|
| }
|
|
|
| void LockStateController::AnimateBackgroundHidingIfNecessary(
|
| SessionStateAnimator::AnimationSpeed speed,
|
| - ui::LayerAnimationObserver* observer) {
|
| + SessionStateAnimator::AnimationSequence* animation_sequence) {
|
| if (unlocked_properties_.get() &&
|
| unlocked_properties_->background_is_hidden) {
|
| - animator_->StartAnimationWithObserver(
|
| + animation_sequence->StartAnimation(
|
| SessionStateAnimator::DESKTOP_BACKGROUND,
|
| SessionStateAnimator::ANIMATION_FADE_OUT,
|
| - speed,
|
| - observer);
|
| + speed);
|
| }
|
| }
|
|
|
|
|