1 /* 2 * Copyright (C) 2014 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 #ifndef TREEANIMATIONTRACKER_H_ 17 #define TREEANIMATIONTRACKER_H_ 18 19 #include <cutils/compiler.h> 20 #include <utils/RefBase.h> 21 #include <utils/StrongPointer.h> 22 23 #include "TreeInfo.h" 24 #include "renderthread/TimeLord.h" 25 #include "utils/Macros.h" 26 27 namespace android { 28 namespace uirenderer { 29 30 class AnimationContext; 31 class AnimationListener; 32 class BaseRenderNodeAnimator; 33 class RenderNode; 34 35 /* 36 * AnimationHandle is several classes merged into one. 37 * 1: It maintains the reference to the AnimationContext required to run animators. 38 * 2: It keeps a strong reference to RenderNodes with animators so that 39 * we don't lose them if they are no longer in the display tree. This is 40 * required so that we can keep animating them, and properly notify listeners 41 * of onAnimationFinished. 42 * 3: It forms a doubly linked list so that we can cheaply move between states. 43 */ 44 class AnimationHandle { 45 PREVENT_COPY_AND_ASSIGN(AnimationHandle); 46 public: 47 AnimationContext& context() { return mContext; } 48 49 // Called by the RenderNode when it has internally pulsed its own animations 50 // this frame and does not need to be run again this frame. 51 void notifyAnimationsRan(); 52 53 // Stops tracking the RenderNode and destroys the handle. The node must be 54 // re-attached to the AnimationContext to receive managed animation 55 // pulses. 56 void release(); 57 58 private: 59 friend class AnimationContext; 60 AnimationHandle(AnimationContext& context); 61 AnimationHandle(RenderNode& animatingNode, AnimationContext& context); 62 ~AnimationHandle(); 63 64 void insertAfter(AnimationHandle* prev); 65 void removeFromList(); 66 67 sp<RenderNode> mRenderNode; 68 69 AnimationContext& mContext; 70 71 AnimationHandle* mPreviousHandle; 72 AnimationHandle* mNextHandle; 73 }; 74 75 class AnimationContext { 76 PREVENT_COPY_AND_ASSIGN(AnimationContext); 77 public: 78 ANDROID_API AnimationContext(renderthread::TimeLord& clock); 79 ANDROID_API virtual ~AnimationContext(); 80 81 nsecs_t frameTimeMs() { return mFrameTimeMs; } 82 bool hasAnimations() { 83 return mCurrentFrameAnimations.mNextHandle 84 || mNextFrameAnimations.mNextHandle; 85 } 86 87 // Will always add to the next frame list, which is swapped when 88 // startFrame() is called 89 ANDROID_API void addAnimatingRenderNode(RenderNode& node); 90 91 // Marks the start of a frame, which will update the frame time and move all 92 // next frame animations into the current frame 93 ANDROID_API virtual void startFrame(TreeInfo::TraversalMode mode); 94 95 // Runs any animations still left in mCurrentFrameAnimations that were not run 96 // as part of the standard RenderNode:prepareTree pass. 97 ANDROID_API virtual void runRemainingAnimations(TreeInfo& info); 98 99 ANDROID_API virtual void callOnFinished(BaseRenderNodeAnimator* animator, AnimationListener* listener); 100 101 ANDROID_API virtual void destroy(); 102 103 ANDROID_API virtual void pauseAnimators() {} 104 105 private: 106 friend class AnimationHandle; 107 void addAnimationHandle(AnimationHandle* handle); 108 109 renderthread::TimeLord& mClock; 110 111 // Animations left to run this frame, at the end of the frame this should 112 // be null 113 AnimationHandle mCurrentFrameAnimations; 114 // Animations queued for next frame 115 AnimationHandle mNextFrameAnimations; 116 117 nsecs_t mFrameTimeMs; 118 }; 119 120 } /* namespace uirenderer */ 121 } /* namespace android */ 122 123 #endif /* TREEANIMATIONTRACKER_H_ */ 124