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