1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "ui/compositor/layer_animation_observer.h"
7 #include "ui/compositor/layer_animation_sequence.h"
11 ////////////////////////////////////////////////////////////////////////////////
12 // LayerAnimationObserver
14 LayerAnimationObserver::LayerAnimationObserver() {
17 LayerAnimationObserver::~LayerAnimationObserver() {
21 bool LayerAnimationObserver::RequiresNotificationWhenAnimatorDestroyed() const {
25 void LayerAnimationObserver::OnAttachedToSequence(
26 LayerAnimationSequence
* sequence
) {
29 void LayerAnimationObserver::OnDetachedFromSequence(
30 LayerAnimationSequence
* sequence
) {
33 void LayerAnimationObserver::StopObserving() {
34 while (!attached_sequences_
.empty()) {
35 LayerAnimationSequence
* sequence
= *attached_sequences_
.begin();
36 sequence
->RemoveObserver(this);
40 void LayerAnimationObserver::AttachedToSequence(
41 LayerAnimationSequence
* sequence
) {
42 DCHECK(attached_sequences_
.find(sequence
) == attached_sequences_
.end());
43 attached_sequences_
.insert(sequence
);
44 OnAttachedToSequence(sequence
);
47 void LayerAnimationObserver::DetachedFromSequence(
48 LayerAnimationSequence
* sequence
, bool send_notification
) {
49 if (attached_sequences_
.find(sequence
) != attached_sequences_
.end())
50 attached_sequences_
.erase(sequence
);
51 if (send_notification
)
52 OnDetachedFromSequence(sequence
);
55 ////////////////////////////////////////////////////////////////////////////////
56 // ImplicitAnimationObserver
58 ImplicitAnimationObserver::ImplicitAnimationObserver()
61 first_sequence_scheduled_(false) {
64 ImplicitAnimationObserver::~ImplicitAnimationObserver() {
69 void ImplicitAnimationObserver::SetActive(bool active
) {
74 void ImplicitAnimationObserver::StopObservingImplicitAnimations() {
79 bool ImplicitAnimationObserver::WasAnimationAbortedForProperty(
80 LayerAnimationElement::AnimatableProperty property
) const {
81 return AnimationStatusForProperty(property
) == ANIMATION_STATUS_ABORTED
;
84 bool ImplicitAnimationObserver::WasAnimationCompletedForProperty(
85 LayerAnimationElement::AnimatableProperty property
) const {
86 return AnimationStatusForProperty(property
) == ANIMATION_STATUS_COMPLETED
;
89 void ImplicitAnimationObserver::OnLayerAnimationEnded(
90 LayerAnimationSequence
* sequence
) {
91 UpdatePropertyAnimationStatus(sequence
, ANIMATION_STATUS_COMPLETED
);
92 bool destroyed
= false;
93 destroyed_
= &destroyed
;
94 sequence
->RemoveObserver(this);
98 DCHECK(attached_sequences().find(sequence
) == attached_sequences().end());
102 void ImplicitAnimationObserver::OnLayerAnimationAborted(
103 LayerAnimationSequence
* sequence
) {
104 UpdatePropertyAnimationStatus(sequence
, ANIMATION_STATUS_ABORTED
);
105 bool destroyed
= false;
106 destroyed_
= &destroyed
;
107 sequence
->RemoveObserver(this);
111 DCHECK(attached_sequences().find(sequence
) == attached_sequences().end());
115 void ImplicitAnimationObserver::OnLayerAnimationScheduled(
116 LayerAnimationSequence
* sequence
) {
117 if (!first_sequence_scheduled_
) {
118 first_sequence_scheduled_
= true;
119 OnImplicitAnimationsScheduled();
123 void ImplicitAnimationObserver::OnAttachedToSequence(
124 LayerAnimationSequence
* sequence
) {
127 void ImplicitAnimationObserver::OnDetachedFromSequence(
128 LayerAnimationSequence
* sequence
) {
129 DCHECK(attached_sequences().find(sequence
) == attached_sequences().end());
133 void ImplicitAnimationObserver::CheckCompleted() {
134 if (active_
&& attached_sequences().empty()) {
136 OnImplicitAnimationsCompleted();
140 void ImplicitAnimationObserver::UpdatePropertyAnimationStatus(
141 LayerAnimationSequence
* sequence
,
142 AnimationStatus status
) {
143 LayerAnimationElement::AnimatableProperties properties
=
144 sequence
->properties();
145 for (unsigned i
= LayerAnimationElement::FIRST_PROPERTY
;
146 i
!= LayerAnimationElement::SENTINEL
;
148 if (i
& properties
) {
149 LayerAnimationElement::AnimatableProperty property
=
150 static_cast<LayerAnimationElement::AnimatableProperty
>(i
);
151 property_animation_status_
[property
] = status
;
156 ImplicitAnimationObserver::AnimationStatus
157 ImplicitAnimationObserver::AnimationStatusForProperty(
158 LayerAnimationElement::AnimatableProperty property
) const {
159 PropertyAnimationStatusMap::const_iterator iter
=
160 property_animation_status_
.find(property
);
161 return iter
== property_animation_status_
.end() ? ANIMATION_STATUS_UNKNOWN
: