blob: 1d3f5a8a51e03dc89868a9fd87bf545d46683ee2 [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
Derek Sollenberger3fedf5a2020-02-21 13:07:28 -050030class RootRenderNode : public RenderNode {
Fedor Kudasov34a25762019-06-28 21:53:56 +010031public:
Derek Sollenberger3fedf5a2020-02-21 13:07:28 -050032 explicit RootRenderNode(std::unique_ptr<ErrorHandler> errorHandler)
Fedor Kudasov34a25762019-06-28 21:53:56 +010033 : RenderNode(), mErrorHandler(std::move(errorHandler)) {}
34
Derek Sollenberger3fedf5a2020-02-21 13:07:28 -050035 virtual ~RootRenderNode() {}
Fedor Kudasov34a25762019-06-28 21:53:56 +010036
37 virtual void prepareTree(TreeInfo& info) override;
38
Derek Sollenberger3fedf5a2020-02-21 13:07:28 -050039 void attachAnimatingNode(RenderNode* animatingNode);
Fedor Kudasov34a25762019-06-28 21:53:56 +010040
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
Derek Sollenberger3fedf5a2020-02-21 13:07:28 -050056 void destroy();
Fedor Kudasov34a25762019-06-28 21:53:56 +010057
Derek Sollenberger3fedf5a2020-02-21 13:07:28 -050058 void addVectorDrawableAnimator(PropertyValuesAnimatorSet* anim);
Fedor Kudasov34a25762019-06-28 21:53:56 +010059
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
Derek Sollenberger3fedf5a2020-02-21 13:07:28 -050078class ContextFactoryImpl : public IContextFactory {
Fedor Kudasov34a25762019-06-28 21:53:56 +010079public:
Derek Sollenberger3fedf5a2020-02-21 13:07:28 -050080 explicit ContextFactoryImpl(RootRenderNode* rootNode) : mRootNode(rootNode) {}
Fedor Kudasov34a25762019-06-28 21:53:56 +010081
Derek Sollenberger3fedf5a2020-02-21 13:07:28 -050082 virtual AnimationContext* createAnimationContext(renderthread::TimeLord& clock) override;
Fedor Kudasov34a25762019-06-28 21:53:56 +010083
84private:
85 RootRenderNode* mRootNode;
86};
Fedor Kudasov09cfce02019-07-04 09:41:13 +010087#endif
Fedor Kudasov34a25762019-06-28 21:53:56 +010088
89} // namespace android::uirenderer