/* * 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 #include #include "AnimationContext.h" #include "Animator.h" #include #include "PropertyValuesAnimatorSet.h" #include "RenderNode.h" namespace android::uirenderer { class RootRenderNode : public RenderNode { public: explicit RootRenderNode(std::unique_ptr 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 mErrorHandler; std::vector > mPendingAnimatingRenderNodes; std::set > mPendingVectorDrawableAnimators; std::set > 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 > 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