layer_animation_observer.cc revision eb525c5499e34cc9c4b825d6d9e75bb07cc06ace
1ff33acef44ed77b7907c7e6dd48f66fe32c0323fBrian Carlstrom// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2ff33acef44ed77b7907c7e6dd48f66fe32c0323fBrian Carlstrom// Use of this source code is governed by a BSD-style license that can be
3ff33acef44ed77b7907c7e6dd48f66fe32c0323fBrian Carlstrom// found in the LICENSE file.
4ff33acef44ed77b7907c7e6dd48f66fe32c0323fBrian Carlstrom
5ff33acef44ed77b7907c7e6dd48f66fe32c0323fBrian Carlstrom#include "ui/compositor/layer_animation_observer.h"
6ff33acef44ed77b7907c7e6dd48f66fe32c0323fBrian Carlstrom
7ff33acef44ed77b7907c7e6dd48f66fe32c0323fBrian Carlstrom#include "ui/compositor/layer_animation_sequence.h"
8ff33acef44ed77b7907c7e6dd48f66fe32c0323fBrian Carlstrom
9ff33acef44ed77b7907c7e6dd48f66fe32c0323fBrian Carlstromnamespace ui {
10ff33acef44ed77b7907c7e6dd48f66fe32c0323fBrian Carlstrom
11ff33acef44ed77b7907c7e6dd48f66fe32c0323fBrian Carlstrom////////////////////////////////////////////////////////////////////////////////
12ff33acef44ed77b7907c7e6dd48f66fe32c0323fBrian Carlstrom// LayerAnimationObserver
13ff33acef44ed77b7907c7e6dd48f66fe32c0323fBrian Carlstrom
14ff33acef44ed77b7907c7e6dd48f66fe32c0323fBrian CarlstromLayerAnimationObserver::LayerAnimationObserver() {
15ff33acef44ed77b7907c7e6dd48f66fe32c0323fBrian Carlstrom}
16ff33acef44ed77b7907c7e6dd48f66fe32c0323fBrian Carlstrom
17860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny RootLayerAnimationObserver::~LayerAnimationObserver() {
18ff33acef44ed77b7907c7e6dd48f66fe32c0323fBrian Carlstrom  StopObserving();
19aceaabe71de0da877be36f5bfb88c7111f81fc3eKenny Root}
20aceaabe71de0da877be36f5bfb88c7111f81fc3eKenny Root
21aceaabe71de0da877be36f5bfb88c7111f81fc3eKenny Rootbool LayerAnimationObserver::RequiresNotificationWhenAnimatorDestroyed() const {
22aceaabe71de0da877be36f5bfb88c7111f81fc3eKenny Root  return false;
23ff33acef44ed77b7907c7e6dd48f66fe32c0323fBrian Carlstrom}
24ff33acef44ed77b7907c7e6dd48f66fe32c0323fBrian Carlstrom
25ff33acef44ed77b7907c7e6dd48f66fe32c0323fBrian Carlstromvoid LayerAnimationObserver::OnAttachedToSequence(
26ff33acef44ed77b7907c7e6dd48f66fe32c0323fBrian Carlstrom    LayerAnimationSequence* sequence) {
27ff33acef44ed77b7907c7e6dd48f66fe32c0323fBrian Carlstrom}
28ff33acef44ed77b7907c7e6dd48f66fe32c0323fBrian Carlstrom
29ff33acef44ed77b7907c7e6dd48f66fe32c0323fBrian Carlstromvoid LayerAnimationObserver::OnDetachedFromSequence(
30ff33acef44ed77b7907c7e6dd48f66fe32c0323fBrian Carlstrom    LayerAnimationSequence* sequence) {
31aceaabe71de0da877be36f5bfb88c7111f81fc3eKenny Root}
32aceaabe71de0da877be36f5bfb88c7111f81fc3eKenny Root
33ff33acef44ed77b7907c7e6dd48f66fe32c0323fBrian Carlstromvoid LayerAnimationObserver::StopObserving() {
34ff33acef44ed77b7907c7e6dd48f66fe32c0323fBrian Carlstrom  while (!attached_sequences_.empty()) {
35ff33acef44ed77b7907c7e6dd48f66fe32c0323fBrian Carlstrom    LayerAnimationSequence* sequence = *attached_sequences_.begin();
36ff33acef44ed77b7907c7e6dd48f66fe32c0323fBrian Carlstrom    sequence->RemoveObserver(this);
37ff33acef44ed77b7907c7e6dd48f66fe32c0323fBrian Carlstrom  }
38ff33acef44ed77b7907c7e6dd48f66fe32c0323fBrian Carlstrom}
39ff33acef44ed77b7907c7e6dd48f66fe32c0323fBrian Carlstrom
40ff33acef44ed77b7907c7e6dd48f66fe32c0323fBrian Carlstromvoid LayerAnimationObserver::AttachedToSequence(
41ff33acef44ed77b7907c7e6dd48f66fe32c0323fBrian Carlstrom    LayerAnimationSequence* sequence) {
42ff33acef44ed77b7907c7e6dd48f66fe32c0323fBrian Carlstrom  DCHECK(attached_sequences_.find(sequence) == attached_sequences_.end());
43ff33acef44ed77b7907c7e6dd48f66fe32c0323fBrian Carlstrom  attached_sequences_.insert(sequence);
44ff33acef44ed77b7907c7e6dd48f66fe32c0323fBrian Carlstrom  OnAttachedToSequence(sequence);
45ff33acef44ed77b7907c7e6dd48f66fe32c0323fBrian Carlstrom}
46ff33acef44ed77b7907c7e6dd48f66fe32c0323fBrian Carlstrom
47ff33acef44ed77b7907c7e6dd48f66fe32c0323fBrian Carlstromvoid LayerAnimationObserver::DetachedFromSequence(
48ff33acef44ed77b7907c7e6dd48f66fe32c0323fBrian Carlstrom    LayerAnimationSequence* sequence, bool send_notification) {
49ff33acef44ed77b7907c7e6dd48f66fe32c0323fBrian Carlstrom  if (attached_sequences_.find(sequence) != attached_sequences_.end())
50ff33acef44ed77b7907c7e6dd48f66fe32c0323fBrian Carlstrom    attached_sequences_.erase(sequence);
51ff33acef44ed77b7907c7e6dd48f66fe32c0323fBrian Carlstrom  if (send_notification)
52ff33acef44ed77b7907c7e6dd48f66fe32c0323fBrian Carlstrom    OnDetachedFromSequence(sequence);
53ff33acef44ed77b7907c7e6dd48f66fe32c0323fBrian Carlstrom}
54ff33acef44ed77b7907c7e6dd48f66fe32c0323fBrian Carlstrom
55ff33acef44ed77b7907c7e6dd48f66fe32c0323fBrian Carlstrom////////////////////////////////////////////////////////////////////////////////
56ff33acef44ed77b7907c7e6dd48f66fe32c0323fBrian Carlstrom// ImplicitAnimationObserver
57ff33acef44ed77b7907c7e6dd48f66fe32c0323fBrian Carlstrom
58ff33acef44ed77b7907c7e6dd48f66fe32c0323fBrian CarlstromImplicitAnimationObserver::ImplicitAnimationObserver()
59ff33acef44ed77b7907c7e6dd48f66fe32c0323fBrian Carlstrom    : active_(false),
60ff33acef44ed77b7907c7e6dd48f66fe32c0323fBrian Carlstrom      destroyed_(NULL),
61ff33acef44ed77b7907c7e6dd48f66fe32c0323fBrian Carlstrom      first_sequence_scheduled_(false) {
62ff33acef44ed77b7907c7e6dd48f66fe32c0323fBrian Carlstrom}
63ff33acef44ed77b7907c7e6dd48f66fe32c0323fBrian Carlstrom
64ff33acef44ed77b7907c7e6dd48f66fe32c0323fBrian CarlstromImplicitAnimationObserver::~ImplicitAnimationObserver() {
65ff33acef44ed77b7907c7e6dd48f66fe32c0323fBrian Carlstrom  if (destroyed_)
66ff33acef44ed77b7907c7e6dd48f66fe32c0323fBrian Carlstrom    *destroyed_ = true;
67ff33acef44ed77b7907c7e6dd48f66fe32c0323fBrian Carlstrom}
68ff33acef44ed77b7907c7e6dd48f66fe32c0323fBrian Carlstrom
69ff33acef44ed77b7907c7e6dd48f66fe32c0323fBrian Carlstromvoid ImplicitAnimationObserver::SetActive(bool active) {
70ff33acef44ed77b7907c7e6dd48f66fe32c0323fBrian Carlstrom  active_ = active;
71ff33acef44ed77b7907c7e6dd48f66fe32c0323fBrian Carlstrom  CheckCompleted();
72ff33acef44ed77b7907c7e6dd48f66fe32c0323fBrian Carlstrom}
73ff33acef44ed77b7907c7e6dd48f66fe32c0323fBrian Carlstrom
74ff33acef44ed77b7907c7e6dd48f66fe32c0323fBrian Carlstromvoid ImplicitAnimationObserver::StopObservingImplicitAnimations() {
75ff33acef44ed77b7907c7e6dd48f66fe32c0323fBrian Carlstrom  SetActive(false);
76ff33acef44ed77b7907c7e6dd48f66fe32c0323fBrian Carlstrom  StopObserving();
77ff33acef44ed77b7907c7e6dd48f66fe32c0323fBrian Carlstrom}
78ff33acef44ed77b7907c7e6dd48f66fe32c0323fBrian Carlstrom
79ff33acef44ed77b7907c7e6dd48f66fe32c0323fBrian Carlstrombool ImplicitAnimationObserver::WasAnimationAbortedForProperty(
80ff33acef44ed77b7907c7e6dd48f66fe32c0323fBrian Carlstrom    LayerAnimationElement::AnimatableProperty property) const {
81ff33acef44ed77b7907c7e6dd48f66fe32c0323fBrian Carlstrom  return AnimationStatusForProperty(property) == ANIMATION_STATUS_ABORTED;
82ff33acef44ed77b7907c7e6dd48f66fe32c0323fBrian Carlstrom}
83ff33acef44ed77b7907c7e6dd48f66fe32c0323fBrian Carlstrom
84ff33acef44ed77b7907c7e6dd48f66fe32c0323fBrian Carlstrombool ImplicitAnimationObserver::WasAnimationCompletedForProperty(
85ff33acef44ed77b7907c7e6dd48f66fe32c0323fBrian Carlstrom    LayerAnimationElement::AnimatableProperty property) const {
86ff33acef44ed77b7907c7e6dd48f66fe32c0323fBrian Carlstrom  return AnimationStatusForProperty(property) == ANIMATION_STATUS_COMPLETED;
87ff33acef44ed77b7907c7e6dd48f66fe32c0323fBrian Carlstrom}
88ff33acef44ed77b7907c7e6dd48f66fe32c0323fBrian Carlstrom
89ff33acef44ed77b7907c7e6dd48f66fe32c0323fBrian Carlstromvoid ImplicitAnimationObserver::OnLayerAnimationEnded(
90ff33acef44ed77b7907c7e6dd48f66fe32c0323fBrian Carlstrom    LayerAnimationSequence* sequence) {
91ff33acef44ed77b7907c7e6dd48f66fe32c0323fBrian Carlstrom  UpdatePropertyAnimationStatus(sequence, ANIMATION_STATUS_COMPLETED);
92ff33acef44ed77b7907c7e6dd48f66fe32c0323fBrian Carlstrom  bool destroyed = false;
93ff33acef44ed77b7907c7e6dd48f66fe32c0323fBrian Carlstrom  destroyed_ = &destroyed;
94ff33acef44ed77b7907c7e6dd48f66fe32c0323fBrian Carlstrom  sequence->RemoveObserver(this);
95ff33acef44ed77b7907c7e6dd48f66fe32c0323fBrian Carlstrom  if (destroyed)
96f24ba0620d88b7d71ddb089b97d29fb1b073718dKenny Root    return;
97f24ba0620d88b7d71ddb089b97d29fb1b073718dKenny Root  destroyed_ = NULL;
98f24ba0620d88b7d71ddb089b97d29fb1b073718dKenny Root  DCHECK(attached_sequences().find(sequence) == attached_sequences().end());
99f24ba0620d88b7d71ddb089b97d29fb1b073718dKenny Root  CheckCompleted();
100f24ba0620d88b7d71ddb089b97d29fb1b073718dKenny Root}
101f24ba0620d88b7d71ddb089b97d29fb1b073718dKenny Root
102f24ba0620d88b7d71ddb089b97d29fb1b073718dKenny Rootvoid ImplicitAnimationObserver::OnLayerAnimationAborted(
103f24ba0620d88b7d71ddb089b97d29fb1b073718dKenny Root    LayerAnimationSequence* sequence) {
104ff33acef44ed77b7907c7e6dd48f66fe32c0323fBrian Carlstrom  UpdatePropertyAnimationStatus(sequence, ANIMATION_STATUS_ABORTED);
105ff33acef44ed77b7907c7e6dd48f66fe32c0323fBrian Carlstrom  bool destroyed = false;
106ff33acef44ed77b7907c7e6dd48f66fe32c0323fBrian Carlstrom  destroyed_ = &destroyed;
107ff33acef44ed77b7907c7e6dd48f66fe32c0323fBrian Carlstrom  sequence->RemoveObserver(this);
108ff33acef44ed77b7907c7e6dd48f66fe32c0323fBrian Carlstrom  if (destroyed)
109ff33acef44ed77b7907c7e6dd48f66fe32c0323fBrian Carlstrom    return;
110ff33acef44ed77b7907c7e6dd48f66fe32c0323fBrian Carlstrom  destroyed_ = NULL;
111ff33acef44ed77b7907c7e6dd48f66fe32c0323fBrian Carlstrom  DCHECK(attached_sequences().find(sequence) == attached_sequences().end());
112ff33acef44ed77b7907c7e6dd48f66fe32c0323fBrian Carlstrom  CheckCompleted();
113ff33acef44ed77b7907c7e6dd48f66fe32c0323fBrian Carlstrom}
114ff33acef44ed77b7907c7e6dd48f66fe32c0323fBrian Carlstrom
115ff33acef44ed77b7907c7e6dd48f66fe32c0323fBrian Carlstromvoid ImplicitAnimationObserver::OnLayerAnimationScheduled(
116ff33acef44ed77b7907c7e6dd48f66fe32c0323fBrian Carlstrom    LayerAnimationSequence* sequence) {
117ff33acef44ed77b7907c7e6dd48f66fe32c0323fBrian Carlstrom  if (!first_sequence_scheduled_) {
118ff33acef44ed77b7907c7e6dd48f66fe32c0323fBrian Carlstrom    first_sequence_scheduled_ = true;
119ff33acef44ed77b7907c7e6dd48f66fe32c0323fBrian Carlstrom    OnImplicitAnimationsScheduled();
120ff33acef44ed77b7907c7e6dd48f66fe32c0323fBrian Carlstrom  }
121ff33acef44ed77b7907c7e6dd48f66fe32c0323fBrian Carlstrom}
122ff33acef44ed77b7907c7e6dd48f66fe32c0323fBrian Carlstrom
123ff33acef44ed77b7907c7e6dd48f66fe32c0323fBrian Carlstromvoid ImplicitAnimationObserver::OnAttachedToSequence(
124ff33acef44ed77b7907c7e6dd48f66fe32c0323fBrian Carlstrom    LayerAnimationSequence* sequence) {
125ff33acef44ed77b7907c7e6dd48f66fe32c0323fBrian Carlstrom}
126ff33acef44ed77b7907c7e6dd48f66fe32c0323fBrian Carlstrom
127ff33acef44ed77b7907c7e6dd48f66fe32c0323fBrian Carlstromvoid ImplicitAnimationObserver::OnDetachedFromSequence(
128ff33acef44ed77b7907c7e6dd48f66fe32c0323fBrian Carlstrom    LayerAnimationSequence* sequence) {
129ff33acef44ed77b7907c7e6dd48f66fe32c0323fBrian Carlstrom  DCHECK(attached_sequences().find(sequence) == attached_sequences().end());
130ff33acef44ed77b7907c7e6dd48f66fe32c0323fBrian Carlstrom  CheckCompleted();
131ff33acef44ed77b7907c7e6dd48f66fe32c0323fBrian Carlstrom}
132ff33acef44ed77b7907c7e6dd48f66fe32c0323fBrian Carlstrom
133ff33acef44ed77b7907c7e6dd48f66fe32c0323fBrian Carlstromvoid ImplicitAnimationObserver::CheckCompleted() {
134ff33acef44ed77b7907c7e6dd48f66fe32c0323fBrian Carlstrom  if (active_ && attached_sequences().empty()) {
135ff33acef44ed77b7907c7e6dd48f66fe32c0323fBrian Carlstrom    active_ = false;
136ff33acef44ed77b7907c7e6dd48f66fe32c0323fBrian Carlstrom    OnImplicitAnimationsCompleted();
137ff33acef44ed77b7907c7e6dd48f66fe32c0323fBrian Carlstrom  }
138ff33acef44ed77b7907c7e6dd48f66fe32c0323fBrian Carlstrom}
139ff33acef44ed77b7907c7e6dd48f66fe32c0323fBrian Carlstrom
140ff33acef44ed77b7907c7e6dd48f66fe32c0323fBrian Carlstromvoid ImplicitAnimationObserver::UpdatePropertyAnimationStatus(
141ff33acef44ed77b7907c7e6dd48f66fe32c0323fBrian Carlstrom    LayerAnimationSequence* sequence,
142ff33acef44ed77b7907c7e6dd48f66fe32c0323fBrian Carlstrom    AnimationStatus status) {
143ff33acef44ed77b7907c7e6dd48f66fe32c0323fBrian Carlstrom  const LayerAnimationElement::AnimatableProperties& properties =
144ff33acef44ed77b7907c7e6dd48f66fe32c0323fBrian Carlstrom      sequence->properties();
145ff33acef44ed77b7907c7e6dd48f66fe32c0323fBrian Carlstrom  for (LayerAnimationElement::AnimatableProperties::const_iterator i =
146ff33acef44ed77b7907c7e6dd48f66fe32c0323fBrian Carlstrom           properties.begin(); i != properties.end(); ++i) {
147ff33acef44ed77b7907c7e6dd48f66fe32c0323fBrian Carlstrom    property_animation_status_[(*i)] = status;
148ff33acef44ed77b7907c7e6dd48f66fe32c0323fBrian Carlstrom  }
149ff33acef44ed77b7907c7e6dd48f66fe32c0323fBrian Carlstrom}
150ff33acef44ed77b7907c7e6dd48f66fe32c0323fBrian Carlstrom
151ff33acef44ed77b7907c7e6dd48f66fe32c0323fBrian CarlstromImplicitAnimationObserver::AnimationStatus
152ff33acef44ed77b7907c7e6dd48f66fe32c0323fBrian CarlstromImplicitAnimationObserver::AnimationStatusForProperty(
153ff33acef44ed77b7907c7e6dd48f66fe32c0323fBrian Carlstrom    LayerAnimationElement::AnimatableProperty property) const {
154ff33acef44ed77b7907c7e6dd48f66fe32c0323fBrian Carlstrom  PropertyAnimationStatusMap::const_iterator iter =
155ff33acef44ed77b7907c7e6dd48f66fe32c0323fBrian Carlstrom      property_animation_status_.find(property);
156ff33acef44ed77b7907c7e6dd48f66fe32c0323fBrian Carlstrom  return iter == property_animation_status_.end() ? ANIMATION_STATUS_UNKNOWN :
157ff33acef44ed77b7907c7e6dd48f66fe32c0323fBrian Carlstrom      iter->second;
158ff33acef44ed77b7907c7e6dd48f66fe32c0323fBrian Carlstrom}
159ff33acef44ed77b7907c7e6dd48f66fe32c0323fBrian Carlstrom
160ff33acef44ed77b7907c7e6dd48f66fe32c0323fBrian Carlstrom}  // namespace ui
161ff33acef44ed77b7907c7e6dd48f66fe32c0323fBrian Carlstrom