blob: 12de4ecac94b45e59f511c389ef868f4c8dfe333 [file] [log] [blame]
Fedor Kudasov34a25762019-06-28 21:53:56 +01001/*
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
Fedor Kudasov34a25762019-06-28 21:53:56 +010019#include <set>
20#include <vector>
21
22#include "AnimationContext.h"
23#include "Animator.h"
Fedor Kudasovbc409cf2019-07-03 13:56:56 +010024#include <IContextFactory.h>
Fedor Kudasov34a25762019-06-28 21:53:56 +010025#include "PropertyValuesAnimatorSet.h"
26#include "RenderNode.h"
27
28namespace android::uirenderer {
29
30class ANDROID_API RootRenderNode : public RenderNode {
31public:
32 ANDROID_API explicit RootRenderNode(std::unique_ptr<ErrorHandler> errorHandler)
33 : RenderNode(), mErrorHandler(std::move(errorHandler)) {}
34
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
60private:
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
Fedor Kudasov09cfce02019-07-04 09:41:13 +010077#ifdef __ANDROID__ // Layoutlib does not support Animations
Fedor Kudasov34a25762019-06-28 21:53:56 +010078class ANDROID_API ContextFactoryImpl : public IContextFactory {
79public:
80 ANDROID_API explicit ContextFactoryImpl(RootRenderNode* rootNode) : mRootNode(rootNode) {}
81
82 ANDROID_API virtual AnimationContext* createAnimationContext(
83 renderthread::TimeLord& clock) override;
84
85private:
86 RootRenderNode* mRootNode;
87};
Fedor Kudasov09cfce02019-07-04 09:41:13 +010088#endif
Fedor Kudasov34a25762019-06-28 21:53:56 +010089
90} // namespace android::uirenderer