blob: 1d3f5a8a51e03dc89868a9fd87bf545d46683ee2 [file] [log] [blame]
/*
* 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