1/*
2 * Copyright (C) 2014 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
17package android.support.v7.internal.view;
18
19import android.support.v4.view.ViewPropertyAnimatorCompat;
20import android.support.v4.view.ViewPropertyAnimatorListener;
21import android.support.v4.view.ViewPropertyAnimatorListenerAdapter;
22import android.view.View;
23import android.view.animation.Interpolator;
24
25import java.util.ArrayList;
26
27/**
28 * A very naive implementation of a set of
29 * {@link android.support.v4.view.ViewPropertyAnimatorCompat}.
30 *
31 * @hide
32 */
33public class ViewPropertyAnimatorCompatSet {
34
35    private final ArrayList<ViewPropertyAnimatorCompat> mAnimators;
36
37    private long mDuration = -1;
38    private Interpolator mInterpolator;
39    private ViewPropertyAnimatorListener mListener;
40
41    private boolean mIsStarted;
42
43    public ViewPropertyAnimatorCompatSet() {
44        mAnimators = new ArrayList<ViewPropertyAnimatorCompat>();
45    }
46
47    public ViewPropertyAnimatorCompatSet play(ViewPropertyAnimatorCompat animator) {
48        if (!mIsStarted) {
49            mAnimators.add(animator);
50        }
51        return this;
52    }
53
54    public void start() {
55        if (mIsStarted) return;
56        for (ViewPropertyAnimatorCompat animator : mAnimators) {
57            if (mDuration >= 0) {
58                animator.setDuration(mDuration);
59            }
60            if (mInterpolator != null) {
61                animator.setInterpolator(mInterpolator);
62            }
63            if (mListener != null) {
64                animator.setListener(mProxyListener);
65            }
66            animator.start();
67        }
68
69        mIsStarted = true;
70    }
71
72    private void onAnimationsEnded() {
73        mIsStarted = false;
74    }
75
76    public void cancel() {
77        if (!mIsStarted) {
78            return;
79        }
80        for (ViewPropertyAnimatorCompat animator : mAnimators) {
81            animator.cancel();
82        }
83        mIsStarted = false;
84    }
85
86    public ViewPropertyAnimatorCompatSet setDuration(long duration) {
87        if (!mIsStarted) {
88            mDuration = duration;
89        }
90        return this;
91    }
92
93    public ViewPropertyAnimatorCompatSet setInterpolator(Interpolator interpolator) {
94        if (!mIsStarted) {
95            mInterpolator = interpolator;
96        }
97        return this;
98    }
99
100    public ViewPropertyAnimatorCompatSet setListener(ViewPropertyAnimatorListener listener) {
101        if (!mIsStarted) {
102            mListener = listener;
103        }
104        return this;
105    }
106
107    private final ViewPropertyAnimatorListenerAdapter mProxyListener
108            = new ViewPropertyAnimatorListenerAdapter() {
109        private boolean mProxyStarted = false;
110        private int mProxyEndCount = 0;
111
112        @Override
113        public void onAnimationStart(View view) {
114            if (mProxyStarted) {
115                return;
116            }
117            mProxyStarted = true;
118            if (mListener != null) {
119                mListener.onAnimationStart(null);
120            }
121        }
122
123        void onEnd() {
124            mProxyEndCount = 0;
125            mProxyStarted = false;
126            onAnimationsEnded();
127        }
128
129        @Override
130        public void onAnimationEnd(View view) {
131            if (++mProxyEndCount == mAnimators.size()) {
132                if (mListener != null) {
133                    mListener.onAnimationEnd(null);
134                }
135                onEnd();
136            }
137        }
138    };
139}
140