15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/compositor/layer_animation_observer.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/compositor/layer_animation_sequence.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ui { 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// LayerAnimationObserver 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)LayerAnimationObserver::LayerAnimationObserver() { 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)LayerAnimationObserver::~LayerAnimationObserver() { 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StopObserving(); 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool LayerAnimationObserver::RequiresNotificationWhenAnimatorDestroyed() const { 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LayerAnimationObserver::OnAttachedToSequence( 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LayerAnimationSequence* sequence) { 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LayerAnimationObserver::OnDetachedFromSequence( 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LayerAnimationSequence* sequence) { 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LayerAnimationObserver::StopObserving() { 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (!attached_sequences_.empty()) { 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LayerAnimationSequence* sequence = *attached_sequences_.begin(); 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sequence->RemoveObserver(this); 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LayerAnimationObserver::AttachedToSequence( 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LayerAnimationSequence* sequence) { 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(attached_sequences_.find(sequence) == attached_sequences_.end()); 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) attached_sequences_.insert(sequence); 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnAttachedToSequence(sequence); 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LayerAnimationObserver::DetachedFromSequence( 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LayerAnimationSequence* sequence, bool send_notification) { 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (attached_sequences_.find(sequence) != attached_sequences_.end()) 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) attached_sequences_.erase(sequence); 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (send_notification) 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnDetachedFromSequence(sequence); 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ImplicitAnimationObserver 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ImplicitAnimationObserver::ImplicitAnimationObserver() 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : active_(false), 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) destroyed_(NULL), 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) first_sequence_scheduled_(false) { 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ImplicitAnimationObserver::~ImplicitAnimationObserver() { 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (destroyed_) 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *destroyed_ = true; 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ImplicitAnimationObserver::SetActive(bool active) { 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) active_ = active; 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckCompleted(); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ImplicitAnimationObserver::StopObservingImplicitAnimations() { 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetActive(false); 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StopObserving(); 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 79b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)bool ImplicitAnimationObserver::WasAnimationAbortedForProperty( 80b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) LayerAnimationElement::AnimatableProperty property) const { 81b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) return AnimationStatusForProperty(property) == ANIMATION_STATUS_ABORTED; 82b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)} 83b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 84b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)bool ImplicitAnimationObserver::WasAnimationCompletedForProperty( 85b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) LayerAnimationElement::AnimatableProperty property) const { 86b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) return AnimationStatusForProperty(property) == ANIMATION_STATUS_COMPLETED; 87b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)} 88b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ImplicitAnimationObserver::OnLayerAnimationEnded( 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LayerAnimationSequence* sequence) { 91b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) UpdatePropertyAnimationStatus(sequence, ANIMATION_STATUS_COMPLETED); 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool destroyed = false; 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) destroyed_ = &destroyed; 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sequence->RemoveObserver(this); 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (destroyed) 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) destroyed_ = NULL; 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(attached_sequences().find(sequence) == attached_sequences().end()); 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckCompleted(); 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ImplicitAnimationObserver::OnLayerAnimationAborted( 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LayerAnimationSequence* sequence) { 104b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) UpdatePropertyAnimationStatus(sequence, ANIMATION_STATUS_ABORTED); 105eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch bool destroyed = false; 106eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch destroyed_ = &destroyed; 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sequence->RemoveObserver(this); 108eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (destroyed) 109eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return; 110eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch destroyed_ = NULL; 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(attached_sequences().find(sequence) == attached_sequences().end()); 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckCompleted(); 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ImplicitAnimationObserver::OnLayerAnimationScheduled( 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LayerAnimationSequence* sequence) { 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!first_sequence_scheduled_) { 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) first_sequence_scheduled_ = true; 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnImplicitAnimationsScheduled(); 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ImplicitAnimationObserver::OnAttachedToSequence( 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LayerAnimationSequence* sequence) { 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ImplicitAnimationObserver::OnDetachedFromSequence( 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LayerAnimationSequence* sequence) { 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(attached_sequences().find(sequence) == attached_sequences().end()); 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckCompleted(); 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ImplicitAnimationObserver::CheckCompleted() { 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (active_ && attached_sequences().empty()) { 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) active_ = false; 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnImplicitAnimationsCompleted(); 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 140b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)void ImplicitAnimationObserver::UpdatePropertyAnimationStatus( 141b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) LayerAnimationSequence* sequence, 142b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) AnimationStatus status) { 1435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) LayerAnimationElement::AnimatableProperties properties = 144b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) sequence->properties(); 1455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) for (unsigned i = LayerAnimationElement::FIRST_PROPERTY; 1465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) i != LayerAnimationElement::SENTINEL; 1475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) i = i << 1) { 1485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (i & properties) { 1495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) LayerAnimationElement::AnimatableProperty property = 1505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static_cast<LayerAnimationElement::AnimatableProperty>(i); 1515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) property_animation_status_[property] = status; 1525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 153b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } 154b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)} 155b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 156b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)ImplicitAnimationObserver::AnimationStatus 157b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)ImplicitAnimationObserver::AnimationStatusForProperty( 158b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) LayerAnimationElement::AnimatableProperty property) const { 159b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) PropertyAnimationStatusMap::const_iterator iter = 160b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) property_animation_status_.find(property); 161b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) return iter == property_animation_status_.end() ? ANIMATION_STATUS_UNKNOWN : 162b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) iter->second; 163b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)} 164b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace ui 166