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