1 /*
2  * Copyright (C) 2016 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 "Animator.h"
20 #include "Interpolator.h"
21 #include "PropertyValuesHolder.h"
22 
23 namespace android {
24 namespace uirenderer {
25 
26 class PropertyAnimator {
27 public:
28     PropertyAnimator(PropertyValuesHolder* holder, Interpolator* interpolator, nsecs_t startDelay,
29                      nsecs_t duration, int repeatCount, RepeatMode repeatMode);
30     void setCurrentPlayTime(nsecs_t playTime);
getTotalDuration()31     nsecs_t getTotalDuration() { return mTotalDuration; }
32     // fraction range: [0, 1], iteration range [0, repeatCount]
33     void setFraction(float fraction, long iteration);
34 
35 private:
36     std::unique_ptr<PropertyValuesHolder> mPropertyValuesHolder;
37     std::unique_ptr<Interpolator> mInterpolator;
38     nsecs_t mStartDelay;
39     nsecs_t mDuration;
40     uint32_t mRepeatCount;
41     nsecs_t mTotalDuration;
42     RepeatMode mRepeatMode;
43     double mLatestFraction = 0;
44 };
45 
46 // TODO: This class should really be named VectorDrawableAnimator
47 class ANDROID_API PropertyValuesAnimatorSet : public BaseRenderNodeAnimator {
48 public:
49     friend class PropertyAnimatorSetListener;
50     PropertyValuesAnimatorSet();
51 
52     void start(AnimationListener* listener);
53     void reverse(AnimationListener* listener);
54     virtual void reset() override;
55     virtual void end() override;
56 
57     void addPropertyAnimator(PropertyValuesHolder* propertyValuesHolder,
58                              Interpolator* interpolators, int64_t startDelays, nsecs_t durations,
59                              int repeatCount, RepeatMode repeatMode);
60     virtual uint32_t dirtyMask();
isInfinite()61     bool isInfinite() { return mIsInfinite; }
setVectorDrawable(VectorDrawableRoot * vd)62     void setVectorDrawable(VectorDrawableRoot* vd) { mVectorDrawable = vd; }
getVectorDrawable()63     VectorDrawableRoot* getVectorDrawable() const { return mVectorDrawable.get(); }
getOneShotListener()64     AnimationListener* getOneShotListener() { return mOneShotListener.get(); }
clearOneShotListener()65     void clearOneShotListener() { mOneShotListener = nullptr; }
getRequestId()66     uint32_t getRequestId() const { return mRequestId; }
67 
68 protected:
69     virtual float getValue(RenderNode* target) const override;
70     virtual void setValue(RenderNode* target, float value) override;
71     virtual void onPlayTimeChanged(nsecs_t playTime) override;
72 
73 private:
74     void init();
75     void onFinished(BaseRenderNodeAnimator* animator);
76     // Listener set from outside
77     sp<AnimationListener> mOneShotListener;
78     std::vector<std::unique_ptr<PropertyAnimator> > mAnimators;
79     float mLastFraction = 0.0f;
80     bool mInitialized = false;
81     sp<VectorDrawableRoot> mVectorDrawable;
82     bool mIsInfinite = false;
83     // This request id gets incremented (on UI thread only) when a new request to modfiy the
84     // lifecycle of an animation happens, namely when start/end/reset/reverse is called.
85     uint32_t mRequestId = 0;
86 };
87 
88 class PropertyAnimatorSetListener : public AnimationListener {
89 public:
PropertyAnimatorSetListener(PropertyValuesAnimatorSet * set)90     explicit PropertyAnimatorSetListener(PropertyValuesAnimatorSet* set) : mSet(set) {}
91     virtual void onAnimationFinished(BaseRenderNodeAnimator* animator) override;
92 
93 private:
94     PropertyValuesAnimatorSet* mSet;
95 };
96 
97 }  // namespace uirenderer
98 }  // namespace android
99