1324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// Copyright (c) 2012 The Chromium Authors. All rights reserved. 2324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// Use of this source code is governed by a BSD-style license that can be 3324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// found in the LICENSE file. 4324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 5324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#ifndef UI_COMPOSITOR_LAYER_ANIMATION_OBSERVER_H_ 6324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define UI_COMPOSITOR_LAYER_ANIMATION_OBSERVER_H_ 7324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 8324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#include <map> 9324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#include <set> 10324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 11324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#include "base/basictypes.h" 12324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#include "base/compiler_specific.h" 13324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#include "ui/compositor/compositor_export.h" 14324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#include "ui/compositor/layer_animation_element.h" 15324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 16324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvernamespace ui { 17324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 18324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverclass LayerAnimationSequence; 19324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverclass ScopedLayerAnimationSettings; 20324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverclass ImplicitAnimationObserver; 21324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 22324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// LayerAnimationObservers are notified when animations complete. 23324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverclass COMPOSITOR_EXPORT LayerAnimationObserver { 24324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public: 25324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Called when the |sequence| ends. Not called if |sequence| is aborted. 26324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver virtual void OnLayerAnimationEnded( 27324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver LayerAnimationSequence* sequence) = 0; 28324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 29324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Called if |sequence| is aborted for any reason. Should never do anything 30324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // that may cause another animation to be started. 31324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver virtual void OnLayerAnimationAborted( 32324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver LayerAnimationSequence* sequence) = 0; 33324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 34324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Called when the animation is scheduled. 35324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver virtual void OnLayerAnimationScheduled( 36324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver LayerAnimationSequence* sequence) = 0; 37324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 38324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver protected: 39324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver typedef std::set<LayerAnimationSequence*> AttachedSequences; 40324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 41324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver LayerAnimationObserver(); 42324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver virtual ~LayerAnimationObserver(); 43324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 44324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // If the animator is destroyed during an animation, the animations are 45324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // aborted. The resulting NotifyAborted notifications will NOT be sent to 46324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // this observer if this function returns false. NOTE: IF YOU OVERRIDE THIS 47324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // FUNCTION TO RETURN TRUE, YOU MUST REMEMBER TO REMOVE YOURSELF AS AN 48324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // OBSERVER WHEN YOU ARE DESTROYED. 49324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver virtual bool RequiresNotificationWhenAnimatorDestroyed() const; 50324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 51324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Called when |this| is added to |sequence|'s observer list. 52324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver virtual void OnAttachedToSequence(LayerAnimationSequence* sequence); 53324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 54324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Called when |this| is removed to |sequence|'s observer list. 55324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver virtual void OnDetachedFromSequence(LayerAnimationSequence* sequence); 56324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 57324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Detaches this observer from all sequences it is currently observing. 58324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver void StopObserving(); 59324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 60324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver const AttachedSequences& attached_sequences() const { 61324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return attached_sequences_; 62324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 63324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 64324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver private: 65324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver friend class LayerAnimationSequence; 66324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 67324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Called when |this| is added to |sequence|'s observer list. 68324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver void AttachedToSequence(LayerAnimationSequence* sequence); 69324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 70324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Called when |this| is removed to |sequence|'s observer list. 71324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // This will only result in notifications if |send_notification| is true. 72324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver void DetachedFromSequence(LayerAnimationSequence* sequence, 73324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver bool send_notification); 74324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 75324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver AttachedSequences attached_sequences_; 76324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}; 77324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 78324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// An implicit animation observer is intended to be used in conjunction with a 79324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// ScopedLayerAnimationSettings object in order to receive a notification when 80324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// all implicit animations complete. 81324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverclass COMPOSITOR_EXPORT ImplicitAnimationObserver 82324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver : public LayerAnimationObserver { 83324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public: 84324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ImplicitAnimationObserver(); 85324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver virtual ~ImplicitAnimationObserver(); 86324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 87324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Called when the first animation sequence has started. 88 virtual void OnImplicitAnimationsScheduled() {} 89 90 virtual void OnImplicitAnimationsCompleted() = 0; 91 92 protected: 93 // Deactivates the observer and clears the collection of animations it is 94 // waiting for. 95 void StopObservingImplicitAnimations(); 96 97 // Returns whether animation for |property| was aborted. 98 // Note that if the property wasn't animated, then it couldn't have been 99 // aborted, so this will return false for that property. 100 bool WasAnimationAbortedForProperty( 101 LayerAnimationElement::AnimatableProperty property) const; 102 103 // Returns whether animation for |property| was completed successfully. 104 // Note that if the property wasn't animated, then it couldn't have been 105 // completed, so this will return false for that property. 106 bool WasAnimationCompletedForProperty( 107 LayerAnimationElement::AnimatableProperty property) const; 108 109 private: 110 enum AnimationStatus { 111 ANIMATION_STATUS_UNKNOWN, 112 ANIMATION_STATUS_COMPLETED, 113 ANIMATION_STATUS_ABORTED, 114 }; 115 116 friend class ScopedLayerAnimationSettings; 117 118 // LayerAnimationObserver implementation 119 virtual void OnLayerAnimationEnded( 120 LayerAnimationSequence* sequence) OVERRIDE; 121 virtual void OnLayerAnimationAborted( 122 LayerAnimationSequence* sequence) OVERRIDE; 123 virtual void OnLayerAnimationScheduled( 124 LayerAnimationSequence* sequence) OVERRIDE; 125 virtual void OnAttachedToSequence( 126 LayerAnimationSequence* sequence) OVERRIDE; 127 virtual void OnDetachedFromSequence( 128 LayerAnimationSequence* sequence) OVERRIDE; 129 130 // OnImplicitAnimationsCompleted is not fired unless the observer is active. 131 bool active() const { return active_; } 132 void SetActive(bool active); 133 134 void CheckCompleted(); 135 136 void UpdatePropertyAnimationStatus(LayerAnimationSequence* sequence, 137 AnimationStatus status); 138 AnimationStatus AnimationStatusForProperty( 139 LayerAnimationElement::AnimatableProperty property) const; 140 141 bool active_; 142 143 // Set to true in the destructor (if non-NULL). Used to detect deletion while 144 // calling out. 145 bool* destroyed_; 146 147 typedef std::map<LayerAnimationElement::AnimatableProperty, 148 AnimationStatus> PropertyAnimationStatusMap; 149 PropertyAnimationStatusMap property_animation_status_; 150 151 // True if OnLayerAnimationScheduled() has been called at least once. 152 bool first_sequence_scheduled_; 153}; 154 155} // namespace ui 156 157#endif // UI_COMPOSITOR_LAYER_ANIMATION_OBSERVER_H_ 158