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