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