11320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Copyright 2014 The Chromium Authors. All rights reserved.
21320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Use of this source code is governed by a BSD-style license that can be
31320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// found in the LICENSE file.
41320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
51320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ash/test/test_session_state_animator.h"
61320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
71320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include <vector>
81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
91320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/bind.h"
101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinamespace ash {
121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinamespace test {
131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinamespace {
151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// A no-op callback that can be used when managing an animation that didn't
161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// actually have a callback given.
171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid DummyCallback() {}
181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst SessionStateAnimator::Container
211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    TestSessionStateAnimator::kAllContainers[] = {
221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        SessionStateAnimator::DESKTOP_BACKGROUND,
231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        SessionStateAnimator::LAUNCHER,
241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        SessionStateAnimator::NON_LOCK_SCREEN_CONTAINERS,
251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        SessionStateAnimator::LOCK_SCREEN_BACKGROUND,
261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        SessionStateAnimator::LOCK_SCREEN_CONTAINERS,
271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        SessionStateAnimator::LOCK_SCREEN_RELATED_CONTAINERS,
281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        SessionStateAnimator::ROOT_CONTAINER
291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    };
301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// A simple SessionStateAnimator::AnimationSequence that tracks the number of
321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// attached sequences.  The callback will be invoked if all animations complete
331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// successfully.
341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass TestSessionStateAnimator::AnimationSequence
351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    : public SessionStateAnimator::AnimationSequence {
361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public:
371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  AnimationSequence(base::Closure callback, TestSessionStateAnimator* animator)
381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      : SessionStateAnimator::AnimationSequence(callback),
391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        sequence_count_(0),
401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        sequence_aborted_(false),
411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        animator_(animator) {
421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual ~AnimationSequence() {}
451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual void SequenceAttached() {
471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ++sequence_count_;
481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Notify the sequence that is has completed.
511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual void SequenceFinished(bool successfully) {
521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    DCHECK_GT(sequence_count_, 0);
531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    --sequence_count_;
541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    sequence_aborted_ |= !successfully;
551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (sequence_count_ == 0) {
561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (sequence_aborted_)
571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        OnAnimationAborted();
581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      else
591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        OnAnimationCompleted();
601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // ash::SessionStateAnimator::AnimationSequence:
641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual void StartAnimation(int container_mask,
651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                              AnimationType type,
661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                              AnimationSpeed speed) OVERRIDE {
671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    animator_->StartAnimationInSequence(container_mask, type, speed, this);
681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci private:
711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Tracks the number of contained animations.
721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  int sequence_count_;
731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // True if the sequence was aborted.
751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  bool sequence_aborted_;
761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // The TestSessionAnimator that created this.  Not owned.
781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  TestSessionStateAnimator* animator_;
791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DISALLOW_COPY_AND_ASSIGN(AnimationSequence);
811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci};
821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTestSessionStateAnimator::ActiveAnimation::ActiveAnimation(
841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    int animation_epoch,
851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    base::TimeDelta duration,
861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    SessionStateAnimator::Container container,
871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    AnimationType type,
881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    AnimationSpeed speed,
891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    base::Closure success_callback,
901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    base::Closure failed_callback)
911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    : animation_epoch(animation_epoch),
921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      remaining_duration(duration),
931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      container(container),
941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      type(type),
951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      speed(speed),
961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      success_callback(success_callback),
971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      failed_callback(failed_callback) {
981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTestSessionStateAnimator::ActiveAnimation::~ActiveAnimation() {
1011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTestSessionStateAnimator::TestSessionStateAnimator()
1041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    : last_animation_epoch_(0),
1051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      is_background_hidden_(false) {
1061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTestSessionStateAnimator::~TestSessionStateAnimator() {
1091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  CompleteAllAnimations(false);
1101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid TestSessionStateAnimator::ResetAnimationEpoch() {
1131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  CompleteAllAnimations(false);
1141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  last_animation_epoch_ = 0;
1151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid TestSessionStateAnimator::Advance(const base::TimeDelta& duration) {
1181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  for (ActiveAnimationsMap::iterator container_iter =
1191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci           active_animations_.begin();
1201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci       container_iter != active_animations_.end();
1211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci       ++container_iter) {
1221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    AnimationList::iterator animation_iter = (*container_iter).second.begin();
1231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    while (animation_iter != (*container_iter).second.end()) {
1241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ActiveAnimation& active_animation = *animation_iter;
1251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      active_animation.remaining_duration -= duration;
1261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (active_animation.remaining_duration <= base::TimeDelta()) {
1271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        active_animation.success_callback.Run();
1281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        animation_iter = (*container_iter).second.erase(animation_iter);
1291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      } else {
1301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        ++animation_iter;
1311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
1321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
1331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
1341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid TestSessionStateAnimator::CompleteAnimations(int animation_epoch,
1371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                  bool completed_successfully) {
1381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  for (ActiveAnimationsMap::iterator container_iter =
1391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci           active_animations_.begin();
1401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci       container_iter != active_animations_.end();
1411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci       ++container_iter) {
1421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    AnimationList::iterator animation_iter = (*container_iter).second.begin();
1431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    while (animation_iter != (*container_iter).second.end()) {
1441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ActiveAnimation active_animation = *animation_iter;
1451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (active_animation.animation_epoch <= animation_epoch) {
1461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (completed_successfully)
1471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          active_animation.success_callback.Run();
1481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        else
1491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          active_animation.failed_callback.Run();
1501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        animation_iter = (*container_iter).second.erase(animation_iter);
1511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      } else {
1521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        ++animation_iter;
1531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
1541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
1551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
1561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid TestSessionStateAnimator::CompleteAllAnimations(
1591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    bool completed_successfully) {
1601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  CompleteAnimations(last_animation_epoch_, completed_successfully);
1611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccibool TestSessionStateAnimator::IsContainerAnimated(
1641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    SessionStateAnimator::Container container,
1651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    SessionStateAnimator::AnimationType type) const {
1661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ActiveAnimationsMap::const_iterator container_iter =
1671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      active_animations_.find(container);
1681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (container_iter != active_animations_.end()) {
1691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    for (AnimationList::const_iterator animation_iter =
1701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          (*container_iter).second.begin();
1711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci         animation_iter != (*container_iter).second.end();
1721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci         ++animation_iter) {
1731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      const ActiveAnimation& active_animation = *animation_iter;
1741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (active_animation.type == type)
1751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return true;
1761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
1771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
1781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return false;
1791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccibool TestSessionStateAnimator::AreContainersAnimated(
1821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    int container_mask, SessionStateAnimator::AnimationType type) const {
1831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  for (size_t i = 0; i < arraysize(kAllContainers); ++i) {
1841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (container_mask & kAllContainers[i] &&
1851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        !IsContainerAnimated(kAllContainers[i], type)) {
1861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return false;
1871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
1881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
1891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return true;
1901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccisize_t TestSessionStateAnimator::GetAnimationCount() const {
1931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  size_t count = 0;
1941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  for (ActiveAnimationsMap::const_iterator container_iter =
1951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          active_animations_.begin();
1961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci       container_iter != active_animations_.end();
1971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci       ++container_iter) {
1981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    count += (*container_iter).second.size();
1991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
2001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return count;
2011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
2021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid TestSessionStateAnimator::StartAnimation(int container_mask,
2041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                              AnimationType type,
2051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                              AnimationSpeed speed) {
2061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ++last_animation_epoch_;
2071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  for (size_t i = 0; i < arraysize(kAllContainers); ++i) {
2081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (container_mask & kAllContainers[i]) {
2091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      // Use a dummy no-op callback because one isn't required by the client
2101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      // but one is required when completing or aborting animations.
2111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      base::Closure callback = base::Bind(&DummyCallback);
2121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      AddAnimation(kAllContainers[i], type, speed, callback, callback);
2131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
2141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
2151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
2161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid TestSessionStateAnimator::StartAnimationWithCallback(
2181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    int container_mask,
2191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    AnimationType type,
2201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    AnimationSpeed speed,
2211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    base::Closure callback) {
2221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ++last_animation_epoch_;
2231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  for (size_t i = 0; i < arraysize(kAllContainers); ++i)
2241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (container_mask & kAllContainers[i]) {
2251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      // ash::SessionStateAnimatorImpl invokes the callback whether or not the
2261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      // animation was completed successfully or not.
2271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      AddAnimation(kAllContainers[i], type, speed, callback, callback);
2281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
2291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
2301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciash::SessionStateAnimator::AnimationSequence*
2321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    TestSessionStateAnimator::BeginAnimationSequence(base::Closure callback) {
2331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return new AnimationSequence(callback, this);
2341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
2351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccibool TestSessionStateAnimator::IsBackgroundHidden() const {
2371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return is_background_hidden_;
2381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
2391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid TestSessionStateAnimator::ShowBackground() {
2411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  is_background_hidden_ = false;
2421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
2431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid TestSessionStateAnimator::HideBackground() {
2451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  is_background_hidden_ = true;
2461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
2471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid TestSessionStateAnimator::StartAnimationInSequence(
2491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    int container_mask,
2501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    AnimationType type,
2511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    AnimationSpeed speed,
2521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    AnimationSequence* animation_sequence) {
2531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ++last_animation_epoch_;
2541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  for (size_t i = 0; i < arraysize(kAllContainers); ++i) {
2551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (container_mask & kAllContainers[i]) {
2561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      base::Closure success_callback =
2571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          base::Bind(&AnimationSequence::SequenceFinished,
2581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                     base::Unretained(animation_sequence), true);
2591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      base::Closure failed_callback =
2601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          base::Bind(&AnimationSequence::SequenceFinished,
2611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                     base::Unretained(animation_sequence), false);
2621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      animation_sequence->SequenceAttached();
2631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      AddAnimation(kAllContainers[i], type, speed, success_callback,
2641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          failed_callback);
2651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
2661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
2671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
2681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid TestSessionStateAnimator::AddAnimation(
2701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    SessionStateAnimator::Container container,
2711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    AnimationType type,
2721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    AnimationSpeed speed,
2731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    base::Closure success_callback,
2741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    base::Closure failed_callback) {
2751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  base::TimeDelta duration = GetDuration(speed);
2761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ActiveAnimation active_animation(last_animation_epoch_,
2771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                   duration,
2781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                   container,
2791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                   type,
2801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                   speed,
2811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                   success_callback,
2821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                   failed_callback);
2831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // This test double is limited to only have one animation active for a given
2841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // container at a time.
2851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  AbortAnimation(container);
2861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  active_animations_[container].push_back(active_animation);
2871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
2881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid TestSessionStateAnimator::AbortAnimation(
2901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    SessionStateAnimator::Container container) {
2911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ActiveAnimationsMap::iterator container_iter =
2921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      active_animations_.find(container);
2931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (container_iter != active_animations_.end()) {
2941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    AnimationList::iterator animation_iter = (*container_iter).second.begin();
2951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    while (animation_iter != (*container_iter).second.end()) {
2961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ActiveAnimation active_animation = *animation_iter;
2971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      active_animation.failed_callback.Run();
2981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      animation_iter = (*container_iter).second.erase(animation_iter);
2991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
3001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
3011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
3021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}  // namespace test
3041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}  // namespace ash
305