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,
29766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu            nsecs_t duration, int repeatCount);
30766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    void setCurrentPlayTime(nsecs_t playTime);
31766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    nsecs_t getTotalDuration() {
32766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu        return mTotalDuration;
33766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    }
34766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    void setFraction(float fraction);
35766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu
36766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liuprivate:
37766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    std::unique_ptr<PropertyValuesHolder> mPropertyValuesHolder;
38766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    std::unique_ptr<Interpolator> mInterpolator;
39766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    nsecs_t mStartDelay;
40766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    nsecs_t mDuration;
41766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    uint32_t mRepeatCount;
42766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    nsecs_t mTotalDuration;
43766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    float mLatestFraction = 0.0f;
44766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu};
45766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu
46766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liuclass ANDROID_API PropertyValuesAnimatorSet : public BaseRenderNodeAnimator {
47766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liupublic:
48766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    friend class PropertyAnimatorSetListener;
49766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    PropertyValuesAnimatorSet();
50766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu
51766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    void start(AnimationListener* listener);
52766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    void reverse(AnimationListener* listener);
53766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu
54766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    void addPropertyAnimator(PropertyValuesHolder* propertyValuesHolder,
55766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu            Interpolator* interpolators, int64_t startDelays,
56766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu            nsecs_t durations, int repeatCount);
57766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    virtual uint32_t dirtyMask();
58766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu
59766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liuprotected:
60766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    virtual float getValue(RenderNode* target) const override;
61766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    virtual void setValue(RenderNode* target, float value) override;
62766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    virtual void onPlayTimeChanged(nsecs_t playTime) override;
63766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu
64766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liuprivate:
65766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    void init();
66766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    void onFinished(BaseRenderNodeAnimator* animator);
67766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    // Listener set from outside
68766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    sp<AnimationListener> mOneShotListener;
69766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    std::vector< std::unique_ptr<PropertyAnimator> > mAnimators;
70766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    float mLastFraction = 0.0f;
71766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    bool mInitialized = false;
72766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu};
73766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu
74766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liuclass PropertyAnimatorSetListener : public AnimationListener {
75766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liupublic:
76766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    PropertyAnimatorSetListener(PropertyValuesAnimatorSet* set) : mSet(set) {}
77766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    virtual void onAnimationFinished(BaseRenderNodeAnimator* animator) override;
78766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu
79766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liuprivate:
80766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    PropertyValuesAnimatorSet* mSet;
81766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu};
82766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu
83766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu} // namespace uirenderer
84766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu} // namespace android
85