1 /*
2  * Copyright (C) 2019 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 
17 #pragma once
18 
19 #include <set>
20 #include <vector>
21 
22 #include "AnimationContext.h"
23 #include "Animator.h"
24 #include <IContextFactory.h>
25 #include "PropertyValuesAnimatorSet.h"
26 #include "RenderNode.h"
27 
28 namespace android::uirenderer {
29 
30 class ANDROID_API RootRenderNode : public RenderNode {
31 public:
RootRenderNode(std::unique_ptr<ErrorHandler> errorHandler)32     ANDROID_API explicit RootRenderNode(std::unique_ptr<ErrorHandler> errorHandler)
33             : RenderNode(), mErrorHandler(std::move(errorHandler)) {}
34 
~RootRenderNode()35     ANDROID_API virtual ~RootRenderNode() {}
36 
37     virtual void prepareTree(TreeInfo& info) override;
38 
39     ANDROID_API void attachAnimatingNode(RenderNode* animatingNode);
40 
41     void attachPendingVectorDrawableAnimators();
42 
43     void detachAnimators();
44 
45     void pauseAnimators();
46 
47     void doAttachAnimatingNodes(AnimationContext* context);
48 
49     // Run VectorDrawable animators after prepareTree.
50     void runVectorDrawableAnimators(AnimationContext* context, TreeInfo& info);
51 
52     void trimPausedVDAnimators(AnimationContext* context);
53 
54     void pushStagingVectorDrawableAnimators(AnimationContext* context);
55 
56     ANDROID_API void destroy();
57 
58     ANDROID_API void addVectorDrawableAnimator(PropertyValuesAnimatorSet* anim);
59 
60 private:
61     const std::unique_ptr<ErrorHandler> mErrorHandler;
62     std::vector<sp<RenderNode> > mPendingAnimatingRenderNodes;
63     std::set<sp<PropertyValuesAnimatorSet> > mPendingVectorDrawableAnimators;
64     std::set<sp<PropertyValuesAnimatorSet> > mRunningVDAnimators;
65     // mPausedVDAnimators stores a list of animators that have not yet passed the finish time, but
66     // their VectorDrawable targets are no longer in the DisplayList. We skip these animators when
67     // render thread runs animators independent of UI thread (i.e. RT_ONLY mode). These animators
68     // need to be re-activated once their VD target is added back into DisplayList. Since that could
69     // only happen when we do a full sync, we need to make sure to pulse these paused animators at
70     // full sync. If any animator's VD target is found in DisplayList during a full sync, we move
71     // the animator back to the running list.
72     std::set<sp<PropertyValuesAnimatorSet> > mPausedVDAnimators;
73 
74     void detachVectorDrawableAnimator(PropertyValuesAnimatorSet* anim);
75 };
76 
77 #ifdef __ANDROID__ // Layoutlib does not support Animations
78 class ANDROID_API ContextFactoryImpl : public IContextFactory {
79 public:
ContextFactoryImpl(RootRenderNode * rootNode)80     ANDROID_API explicit ContextFactoryImpl(RootRenderNode* rootNode) : mRootNode(rootNode) {}
81 
82     ANDROID_API virtual AnimationContext* createAnimationContext(
83             renderthread::TimeLord& clock) override;
84 
85 private:
86     RootRenderNode* mRootNode;
87 };
88 #endif
89 
90 }  // namespace android::uirenderer
91