1766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu/*
2766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu * Copyright (C) 2016 The Android Open Source Project
3766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu *
4766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu * Licensed under the Apache License, Version 2.0 (the "License");
5766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu * you may not use this file except in compliance with the License.
6766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu * You may obtain a copy of the License at
7766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu *
8766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu *      http://www.apache.org/licenses/LICENSE-2.0
9766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu *
10766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu * Unless required by applicable law or agreed to in writing, software
11766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu * distributed under the License is distributed on an "AS IS" BASIS,
12766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu * See the License for the specific language governing permissions and
14766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu * limitations under the License.
15766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu */
16766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu
17766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu#pragma once
18766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu
19766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu#include "Animator.h"
20766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu#include "PropertyValuesHolder.h"
21766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu#include "Interpolator.h"
22766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu
23766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liunamespace android {
24766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liunamespace uirenderer {
25766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu
26766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liuclass PropertyAnimator {
27766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liupublic:
28766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    PropertyAnimator(PropertyValuesHolder* holder, Interpolator* interpolator, nsecs_t startDelay,
29f7167e8f286cff91dec01fdf617bf568f1d100e6Doris Liu            nsecs_t duration, int repeatCount, RepeatMode repeatMode);
30766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    void setCurrentPlayTime(nsecs_t playTime);
31766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    nsecs_t getTotalDuration() {
32766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu        return mTotalDuration;
33766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    }
34f7167e8f286cff91dec01fdf617bf568f1d100e6Doris Liu    // fraction range: [0, 1], iteration range [0, repeatCount]
35f7167e8f286cff91dec01fdf617bf568f1d100e6Doris Liu    void setFraction(float fraction, long iteration);
36766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu
37766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liuprivate:
38766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    std::unique_ptr<PropertyValuesHolder> mPropertyValuesHolder;
39766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    std::unique_ptr<Interpolator> mInterpolator;
40766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    nsecs_t mStartDelay;
41766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    nsecs_t mDuration;
42766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    uint32_t mRepeatCount;
43766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    nsecs_t mTotalDuration;
44f7167e8f286cff91dec01fdf617bf568f1d100e6Doris Liu    RepeatMode mRepeatMode;
45f7167e8f286cff91dec01fdf617bf568f1d100e6Doris Liu    double mLatestFraction = 0;
46766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu};
47766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu
48718cd3eb70703c43f29ca37907bbf0e153d8cca0Doris Liu// TODO: This class should really be named VectorDrawableAnimator
49766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liuclass ANDROID_API PropertyValuesAnimatorSet : public BaseRenderNodeAnimator {
50766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liupublic:
51766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    friend class PropertyAnimatorSetListener;
52766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    PropertyValuesAnimatorSet();
53766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu
54766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    void start(AnimationListener* listener);
55766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    void reverse(AnimationListener* listener);
56718cd3eb70703c43f29ca37907bbf0e153d8cca0Doris Liu    virtual void reset() override;
57718cd3eb70703c43f29ca37907bbf0e153d8cca0Doris Liu    virtual void end() override;
58766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu
59766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    void addPropertyAnimator(PropertyValuesHolder* propertyValuesHolder,
60766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu            Interpolator* interpolators, int64_t startDelays,
61f7167e8f286cff91dec01fdf617bf568f1d100e6Doris Liu            nsecs_t durations, int repeatCount, RepeatMode repeatMode);
62766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    virtual uint32_t dirtyMask();
63718cd3eb70703c43f29ca37907bbf0e153d8cca0Doris Liu    bool isInfinite() { return mIsInfinite; }
64718cd3eb70703c43f29ca37907bbf0e153d8cca0Doris Liu    void setVectorDrawable(VectorDrawableRoot* vd) { mVectorDrawable = vd; }
6598980cdfff34d1cace1ab60fa54e248c0ee8bc8eDoris Liu    VectorDrawableRoot* getVectorDrawable() const { return mVectorDrawable.get(); }
66718cd3eb70703c43f29ca37907bbf0e153d8cca0Doris Liu    AnimationListener* getOneShotListener() { return mOneShotListener.get(); }
67718cd3eb70703c43f29ca37907bbf0e153d8cca0Doris Liu    void clearOneShotListener() { mOneShotListener = nullptr; }
68718cd3eb70703c43f29ca37907bbf0e153d8cca0Doris Liu    uint32_t getRequestId() const { return mRequestId; }
69766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu
70766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liuprotected:
71766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    virtual float getValue(RenderNode* target) const override;
72766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    virtual void setValue(RenderNode* target, float value) override;
73766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    virtual void onPlayTimeChanged(nsecs_t playTime) override;
74766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu
75766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liuprivate:
76766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    void init();
77766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    void onFinished(BaseRenderNodeAnimator* animator);
78766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    // Listener set from outside
79766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    sp<AnimationListener> mOneShotListener;
80766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    std::vector< std::unique_ptr<PropertyAnimator> > mAnimators;
81766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    float mLastFraction = 0.0f;
82766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    bool mInitialized = false;
8398980cdfff34d1cace1ab60fa54e248c0ee8bc8eDoris Liu    sp<VectorDrawableRoot> mVectorDrawable;
84718cd3eb70703c43f29ca37907bbf0e153d8cca0Doris Liu    bool mIsInfinite = false;
85718cd3eb70703c43f29ca37907bbf0e153d8cca0Doris Liu    // This request id gets incremented (on UI thread only) when a new request to modfiy the
86718cd3eb70703c43f29ca37907bbf0e153d8cca0Doris Liu    // lifecycle of an animation happens, namely when start/end/reset/reverse is called.
87718cd3eb70703c43f29ca37907bbf0e153d8cca0Doris Liu    uint32_t mRequestId = 0;
88766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu};
89766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu
90766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liuclass PropertyAnimatorSetListener : public AnimationListener {
91766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liupublic:
92a619ec70cf765d9166f0862e74653711b87307b3Chih-Hung Hsieh    explicit PropertyAnimatorSetListener(PropertyValuesAnimatorSet* set) : mSet(set) {}
93766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    virtual void onAnimationFinished(BaseRenderNodeAnimator* animator) override;
94766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu
95766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liuprivate:
96766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    PropertyValuesAnimatorSet* mSet;
97766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu};
98766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu
99766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu} // namespace uirenderer
100766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu} // namespace android
101