149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes/*
249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes * Copyright (C) 2014 The Android Open Source Project
349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes *
449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes * Licensed under the Apache License, Version 2.0 (the "License");
549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes * you may not use this file except in compliance with the License.
649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes * You may obtain a copy of the License at
749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes *
849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes *      http://www.apache.org/licenses/LICENSE-2.0
949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes *
1049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes * Unless required by applicable law or agreed to in writing, software
1149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes * distributed under the License is distributed on an "AS IS" BASIS,
1249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes * See the License for the specific language governing permissions and
1449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes * limitations under the License.
1549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes */
1649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
1749c78900da0d43140fb602431fb93212bd7f6c70Chris Banespackage android.support.v7.internal.view;
1849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
1949c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.support.v4.view.ViewPropertyAnimatorCompat;
2049c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.support.v4.view.ViewPropertyAnimatorListener;
2149c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.support.v4.view.ViewPropertyAnimatorListenerAdapter;
2249c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.view.View;
2349c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.view.animation.Interpolator;
2449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
2549c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport java.util.ArrayList;
2649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
2749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes/**
2855b8ae653ab9402efb19d6309155d18fbebb849eChris Banes * A very naive implementation of a set of
2955b8ae653ab9402efb19d6309155d18fbebb849eChris Banes * {@link android.support.v4.view.ViewPropertyAnimatorCompat}.
3049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes *
3149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes * @hide
3249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes */
3355b8ae653ab9402efb19d6309155d18fbebb849eChris Banespublic class ViewPropertyAnimatorCompatSet {
3449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
3549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    private final ArrayList<ViewPropertyAnimatorCompat> mAnimators;
3649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
3749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    private long mDuration = -1;
3849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    private Interpolator mInterpolator;
3949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    private ViewPropertyAnimatorListener mListener;
4049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
4149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    private boolean mIsStarted;
4249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
4355b8ae653ab9402efb19d6309155d18fbebb849eChris Banes    public ViewPropertyAnimatorCompatSet() {
4449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mAnimators = new ArrayList<ViewPropertyAnimatorCompat>();
4549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
4649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
4755b8ae653ab9402efb19d6309155d18fbebb849eChris Banes    public ViewPropertyAnimatorCompatSet play(ViewPropertyAnimatorCompat animator) {
484c2a95906254748cb9a843b061288265d6e185a9Chris Banes        if (!mIsStarted) {
494c2a95906254748cb9a843b061288265d6e185a9Chris Banes            mAnimators.add(animator);
504c2a95906254748cb9a843b061288265d6e185a9Chris Banes        }
514c2a95906254748cb9a843b061288265d6e185a9Chris Banes        return this;
5249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
5349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
5449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void start() {
5549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        if (mIsStarted) return;
5649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        for (ViewPropertyAnimatorCompat animator : mAnimators) {
5749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            if (mDuration >= 0) {
5849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                animator.setDuration(mDuration);
5949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            }
6049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            if (mInterpolator != null) {
6149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                animator.setInterpolator(mInterpolator);
6249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            }
6349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            if (mListener != null) {
6449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                animator.setListener(mProxyListener);
6549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            }
6649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            animator.start();
6749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        }
6849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
6949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mIsStarted = true;
7049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
7149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
729fdc99636a0164602ccbdbfc468b38548b387853Yigit Boyar    private void onAnimationsEnded() {
739fdc99636a0164602ccbdbfc468b38548b387853Yigit Boyar        mIsStarted = false;
749fdc99636a0164602ccbdbfc468b38548b387853Yigit Boyar    }
759fdc99636a0164602ccbdbfc468b38548b387853Yigit Boyar
7649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void cancel() {
779fdc99636a0164602ccbdbfc468b38548b387853Yigit Boyar        if (!mIsStarted) {
789fdc99636a0164602ccbdbfc468b38548b387853Yigit Boyar            return;
799fdc99636a0164602ccbdbfc468b38548b387853Yigit Boyar        }
8049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        for (ViewPropertyAnimatorCompat animator : mAnimators) {
8149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            animator.cancel();
8249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        }
839fdc99636a0164602ccbdbfc468b38548b387853Yigit Boyar        mIsStarted = false;
8449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
8549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
8655b8ae653ab9402efb19d6309155d18fbebb849eChris Banes    public ViewPropertyAnimatorCompatSet setDuration(long duration) {
874c2a95906254748cb9a843b061288265d6e185a9Chris Banes        if (!mIsStarted) {
884c2a95906254748cb9a843b061288265d6e185a9Chris Banes            mDuration = duration;
894c2a95906254748cb9a843b061288265d6e185a9Chris Banes        }
904c2a95906254748cb9a843b061288265d6e185a9Chris Banes        return this;
9149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
9249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
9355b8ae653ab9402efb19d6309155d18fbebb849eChris Banes    public ViewPropertyAnimatorCompatSet setInterpolator(Interpolator interpolator) {
944c2a95906254748cb9a843b061288265d6e185a9Chris Banes        if (!mIsStarted) {
954c2a95906254748cb9a843b061288265d6e185a9Chris Banes            mInterpolator = interpolator;
964c2a95906254748cb9a843b061288265d6e185a9Chris Banes        }
974c2a95906254748cb9a843b061288265d6e185a9Chris Banes        return this;
9849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
9949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
10055b8ae653ab9402efb19d6309155d18fbebb849eChris Banes    public ViewPropertyAnimatorCompatSet setListener(ViewPropertyAnimatorListener listener) {
1014c2a95906254748cb9a843b061288265d6e185a9Chris Banes        if (!mIsStarted) {
1024c2a95906254748cb9a843b061288265d6e185a9Chris Banes            mListener = listener;
1034c2a95906254748cb9a843b061288265d6e185a9Chris Banes        }
1044c2a95906254748cb9a843b061288265d6e185a9Chris Banes        return this;
10549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
10649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
10749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    private final ViewPropertyAnimatorListenerAdapter mProxyListener
10849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            = new ViewPropertyAnimatorListenerAdapter() {
1099fdc99636a0164602ccbdbfc468b38548b387853Yigit Boyar        private boolean mProxyStarted = false;
1109fdc99636a0164602ccbdbfc468b38548b387853Yigit Boyar        private int mProxyEndCount = 0;
11149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
11249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        @Override
11349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        public void onAnimationStart(View view) {
1149fdc99636a0164602ccbdbfc468b38548b387853Yigit Boyar            if (mProxyStarted) {
1159fdc99636a0164602ccbdbfc468b38548b387853Yigit Boyar                return;
1169fdc99636a0164602ccbdbfc468b38548b387853Yigit Boyar            }
1179fdc99636a0164602ccbdbfc468b38548b387853Yigit Boyar            mProxyStarted = true;
1189fdc99636a0164602ccbdbfc468b38548b387853Yigit Boyar            if (mListener != null) {
11949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                mListener.onAnimationStart(null);
12049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            }
12149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        }
12249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
1239fdc99636a0164602ccbdbfc468b38548b387853Yigit Boyar        void onEnd() {
1249fdc99636a0164602ccbdbfc468b38548b387853Yigit Boyar            mProxyEndCount = 0;
1259fdc99636a0164602ccbdbfc468b38548b387853Yigit Boyar            mProxyStarted = false;
1269fdc99636a0164602ccbdbfc468b38548b387853Yigit Boyar            onAnimationsEnded();
1279fdc99636a0164602ccbdbfc468b38548b387853Yigit Boyar        }
1289fdc99636a0164602ccbdbfc468b38548b387853Yigit Boyar
12949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        @Override
13049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        public void onAnimationEnd(View view) {
1319fdc99636a0164602ccbdbfc468b38548b387853Yigit Boyar            if (++mProxyEndCount == mAnimators.size()) {
1329fdc99636a0164602ccbdbfc468b38548b387853Yigit Boyar                if (mListener != null) {
1339fdc99636a0164602ccbdbfc468b38548b387853Yigit Boyar                    mListener.onAnimationEnd(null);
1349fdc99636a0164602ccbdbfc468b38548b387853Yigit Boyar                }
1359fdc99636a0164602ccbdbfc468b38548b387853Yigit Boyar                onEnd();
13649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            }
13749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        }
13849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    };
13949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes}
140