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 "ui/compositor/layer_animation_observer.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/compositor/layer_animation_sequence.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ui {
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// LayerAnimationObserver
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)LayerAnimationObserver::LayerAnimationObserver() {
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)LayerAnimationObserver::~LayerAnimationObserver() {
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StopObserving();
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool LayerAnimationObserver::RequiresNotificationWhenAnimatorDestroyed() const {
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LayerAnimationObserver::OnAttachedToSequence(
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LayerAnimationSequence* sequence) {
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LayerAnimationObserver::OnDetachedFromSequence(
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LayerAnimationSequence* sequence) {
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LayerAnimationObserver::StopObserving() {
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  while (!attached_sequences_.empty()) {
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LayerAnimationSequence* sequence = *attached_sequences_.begin();
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sequence->RemoveObserver(this);
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LayerAnimationObserver::AttachedToSequence(
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LayerAnimationSequence* sequence) {
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(attached_sequences_.find(sequence) == attached_sequences_.end());
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  attached_sequences_.insert(sequence);
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  OnAttachedToSequence(sequence);
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LayerAnimationObserver::DetachedFromSequence(
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LayerAnimationSequence* sequence, bool send_notification) {
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (attached_sequences_.find(sequence) != attached_sequences_.end())
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    attached_sequences_.erase(sequence);
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (send_notification)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    OnDetachedFromSequence(sequence);
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ImplicitAnimationObserver
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ImplicitAnimationObserver::ImplicitAnimationObserver()
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : active_(false),
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      destroyed_(NULL),
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      first_sequence_scheduled_(false) {
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ImplicitAnimationObserver::~ImplicitAnimationObserver() {
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (destroyed_)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *destroyed_ = true;
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ImplicitAnimationObserver::SetActive(bool active) {
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  active_ = active;
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckCompleted();
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ImplicitAnimationObserver::StopObservingImplicitAnimations() {
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetActive(false);
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StopObserving();
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
79b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)bool ImplicitAnimationObserver::WasAnimationAbortedForProperty(
80b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    LayerAnimationElement::AnimatableProperty property) const {
81b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  return AnimationStatusForProperty(property) == ANIMATION_STATUS_ABORTED;
82b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)}
83b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
84b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)bool ImplicitAnimationObserver::WasAnimationCompletedForProperty(
85b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    LayerAnimationElement::AnimatableProperty property) const {
86b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  return AnimationStatusForProperty(property) == ANIMATION_STATUS_COMPLETED;
87b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)}
88b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ImplicitAnimationObserver::OnLayerAnimationEnded(
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LayerAnimationSequence* sequence) {
91b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  UpdatePropertyAnimationStatus(sequence, ANIMATION_STATUS_COMPLETED);
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool destroyed = false;
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  destroyed_ = &destroyed;
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sequence->RemoveObserver(this);
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (destroyed)
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  destroyed_ = NULL;
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(attached_sequences().find(sequence) == attached_sequences().end());
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckCompleted();
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ImplicitAnimationObserver::OnLayerAnimationAborted(
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LayerAnimationSequence* sequence) {
104b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  UpdatePropertyAnimationStatus(sequence, ANIMATION_STATUS_ABORTED);
105eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  bool destroyed = false;
106eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  destroyed_ = &destroyed;
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sequence->RemoveObserver(this);
108eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (destroyed)
109eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return;
110eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  destroyed_ = NULL;
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(attached_sequences().find(sequence) == attached_sequences().end());
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckCompleted();
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ImplicitAnimationObserver::OnLayerAnimationScheduled(
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LayerAnimationSequence* sequence) {
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!first_sequence_scheduled_) {
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    first_sequence_scheduled_ = true;
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    OnImplicitAnimationsScheduled();
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ImplicitAnimationObserver::OnAttachedToSequence(
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LayerAnimationSequence* sequence) {
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ImplicitAnimationObserver::OnDetachedFromSequence(
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LayerAnimationSequence* sequence) {
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(attached_sequences().find(sequence) == attached_sequences().end());
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckCompleted();
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ImplicitAnimationObserver::CheckCompleted() {
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (active_ && attached_sequences().empty()) {
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    active_ = false;
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    OnImplicitAnimationsCompleted();
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
140b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)void ImplicitAnimationObserver::UpdatePropertyAnimationStatus(
141b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    LayerAnimationSequence* sequence,
142b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    AnimationStatus status) {
1435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  LayerAnimationElement::AnimatableProperties properties =
144b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      sequence->properties();
1455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  for (unsigned i = LayerAnimationElement::FIRST_PROPERTY;
1465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)       i != LayerAnimationElement::SENTINEL;
1475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)       i = i << 1) {
1485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (i & properties) {
1495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      LayerAnimationElement::AnimatableProperty property =
1505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          static_cast<LayerAnimationElement::AnimatableProperty>(i);
1515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      property_animation_status_[property] = status;
1525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
153b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  }
154b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)}
155b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
156b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)ImplicitAnimationObserver::AnimationStatus
157b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)ImplicitAnimationObserver::AnimationStatusForProperty(
158b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    LayerAnimationElement::AnimatableProperty property) const {
159b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  PropertyAnimationStatusMap::const_iterator iter =
160b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      property_animation_status_.find(property);
161b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  return iter == property_animation_status_.end() ? ANIMATION_STATUS_UNKNOWN :
162b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      iter->second;
163b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)}
164b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace ui
166