| /* | 
 |  * Copyright (C) 2019 The Android Open Source Project | 
 |  * | 
 |  * Licensed under the Apache License, Version 2.0 (the "License"); | 
 |  * you may not use this file except in compliance with the License. | 
 |  * You may obtain a copy of the License at | 
 |  * | 
 |  *      http://www.apache.org/licenses/LICENSE-2.0 | 
 |  * | 
 |  * Unless required by applicable law or agreed to in writing, software | 
 |  * distributed under the License is distributed on an "AS IS" BASIS, | 
 |  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
 |  * See the License for the specific language governing permissions and | 
 |  * limitations under the License. | 
 |  */ | 
 |  | 
 | #pragma once | 
 |  | 
 | #include <set> | 
 | #include <vector> | 
 |  | 
 | #include "AnimationContext.h" | 
 | #include "Animator.h" | 
 | #include <IContextFactory.h> | 
 | #include "PropertyValuesAnimatorSet.h" | 
 | #include "RenderNode.h" | 
 |  | 
 | namespace android::uirenderer { | 
 |  | 
 | class RootRenderNode : public RenderNode { | 
 | public: | 
 |     explicit RootRenderNode(std::unique_ptr<ErrorHandler> errorHandler) | 
 |             : RenderNode(), mErrorHandler(std::move(errorHandler)) {} | 
 |  | 
 |     virtual ~RootRenderNode() {} | 
 |  | 
 |     virtual void prepareTree(TreeInfo& info) override; | 
 |  | 
 |     void attachAnimatingNode(RenderNode* animatingNode); | 
 |  | 
 |     void attachPendingVectorDrawableAnimators(); | 
 |  | 
 |     void detachAnimators(); | 
 |  | 
 |     void pauseAnimators(); | 
 |  | 
 |     void doAttachAnimatingNodes(AnimationContext* context); | 
 |  | 
 |     // Run VectorDrawable animators after prepareTree. | 
 |     void runVectorDrawableAnimators(AnimationContext* context, TreeInfo& info); | 
 |  | 
 |     void trimPausedVDAnimators(AnimationContext* context); | 
 |  | 
 |     void pushStagingVectorDrawableAnimators(AnimationContext* context); | 
 |  | 
 |     void destroy(); | 
 |  | 
 |     void addVectorDrawableAnimator(PropertyValuesAnimatorSet* anim); | 
 |  | 
 | private: | 
 |     const std::unique_ptr<ErrorHandler> mErrorHandler; | 
 |     std::vector<sp<RenderNode> > mPendingAnimatingRenderNodes; | 
 |     std::set<sp<PropertyValuesAnimatorSet> > mPendingVectorDrawableAnimators; | 
 |     std::set<sp<PropertyValuesAnimatorSet> > mRunningVDAnimators; | 
 |     // mPausedVDAnimators stores a list of animators that have not yet passed the finish time, but | 
 |     // their VectorDrawable targets are no longer in the DisplayList. We skip these animators when | 
 |     // render thread runs animators independent of UI thread (i.e. RT_ONLY mode). These animators | 
 |     // need to be re-activated once their VD target is added back into DisplayList. Since that could | 
 |     // only happen when we do a full sync, we need to make sure to pulse these paused animators at | 
 |     // full sync. If any animator's VD target is found in DisplayList during a full sync, we move | 
 |     // the animator back to the running list. | 
 |     std::set<sp<PropertyValuesAnimatorSet> > mPausedVDAnimators; | 
 |  | 
 |     void detachVectorDrawableAnimator(PropertyValuesAnimatorSet* anim); | 
 | }; | 
 |  | 
 | #ifdef __ANDROID__ // Layoutlib does not support Animations | 
 | class ContextFactoryImpl : public IContextFactory { | 
 | public: | 
 |     explicit ContextFactoryImpl(RootRenderNode* rootNode) : mRootNode(rootNode) {} | 
 |  | 
 |     virtual AnimationContext* createAnimationContext(renderthread::TimeLord& clock) override; | 
 |  | 
 | private: | 
 |     RootRenderNode* mRootNode; | 
 | }; | 
 | #endif | 
 |  | 
 | }  // namespace android::uirenderer |