1faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase/*
2faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase * Copyright (C) 2013 The Android Open Source Project
3faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase *
4faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase * Licensed under the Apache License, Version 2.0 (the "License");
5faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase * you may not use this file except in compliance with the License.
6faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase * You may obtain a copy of the License at
7faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase *
8faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase *      http://www.apache.org/licenses/LICENSE-2.0
9faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase *
10faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase * Unless required by applicable law or agreed to in writing, software
11faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase * distributed under the License is distributed on an "AS IS" BASIS,
12faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase * See the License for the specific language governing permissions and
14faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase * limitations under the License.
15faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase */
166ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase
17d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haasepackage android.transition;
18faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase
19d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haaseimport android.animation.TimeInterpolator;
20ecd857be3946283ebb4306e2c03ae70f5c5bb152George Mountimport android.content.Context;
21ecd857be3946283ebb4306e2c03ae70f5c5bb152George Mountimport android.content.res.TypedArray;
22faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haaseimport android.util.AndroidRuntimeException;
23ecd857be3946283ebb4306e2c03ae70f5c5bb152George Mountimport android.util.AttributeSet;
24d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haaseimport android.view.View;
25faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haaseimport android.view.ViewGroup;
26faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase
27413739e8c62a7cd83ec519203a2628504b1b0d16George Mountimport com.android.internal.R;
28413739e8c62a7cd83ec519203a2628504b1b0d16George Mount
29faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haaseimport java.util.ArrayList;
30faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase
31faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase/**
32d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase * A TransitionSet is a parent of child transitions (including other
33d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase * TransitionSets). Using TransitionSets enables more complex
34d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase * choreography of transitions, where some sets play {@link #ORDERING_TOGETHER} and
35d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase * others play {@link #ORDERING_SEQUENTIAL}. For example, {@link AutoTransition}
36d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase * uses a TransitionSet to sequentially play a Fade(Fade.OUT), followed by
37d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase * a {@link ChangeBounds}, followed by a Fade(Fade.OUT) transition.
38aafc91c05acfb2d5a95f46f27e1deb2dfaa15c32Chet Haase *
39aafc91c05acfb2d5a95f46f27e1deb2dfaa15c32Chet Haase * <p>A TransitionSet can be described in a resource file by using the
40aafc91c05acfb2d5a95f46f27e1deb2dfaa15c32Chet Haase * tag <code>transitionSet</code>, along with the standard
41aafc91c05acfb2d5a95f46f27e1deb2dfaa15c32Chet Haase * attributes of {@link android.R.styleable#TransitionSet} and
42aafc91c05acfb2d5a95f46f27e1deb2dfaa15c32Chet Haase * {@link android.R.styleable#Transition}. Child transitions of the
43aafc91c05acfb2d5a95f46f27e1deb2dfaa15c32Chet Haase * TransitionSet object can be loaded by adding those child tags inside the
44aafc91c05acfb2d5a95f46f27e1deb2dfaa15c32Chet Haase * enclosing <code>transitionSet</code> tag. For example, the following xml
45aafc91c05acfb2d5a95f46f27e1deb2dfaa15c32Chet Haase * describes a TransitionSet that plays a Fade and then a ChangeBounds
46aafc91c05acfb2d5a95f46f27e1deb2dfaa15c32Chet Haase * transition on the affected view targets:</p>
47aafc91c05acfb2d5a95f46f27e1deb2dfaa15c32Chet Haase * <pre>
48aafc91c05acfb2d5a95f46f27e1deb2dfaa15c32Chet Haase *     &lt;transitionSet xmlns:android="http://schemas.android.com/apk/res/android"
4993aaab034fec85d3a6ca9dab6d1fd6c0610c6b62George Mount *             android:transitionOrdering="sequential"&gt;
50aafc91c05acfb2d5a95f46f27e1deb2dfaa15c32Chet Haase *         &lt;fade/&gt;
51aafc91c05acfb2d5a95f46f27e1deb2dfaa15c32Chet Haase *         &lt;changeBounds/&gt;
52aafc91c05acfb2d5a95f46f27e1deb2dfaa15c32Chet Haase *     &lt;/transitionSet&gt;
53aafc91c05acfb2d5a95f46f27e1deb2dfaa15c32Chet Haase * </pre>
54faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase */
55d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haasepublic class TransitionSet extends Transition {
56faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase
57faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase    ArrayList<Transition> mTransitions = new ArrayList<Transition>();
58faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase    private boolean mPlayTogether = true;
59faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase    int mCurrentListeners;
60faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase    boolean mStarted = false;
61faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase
62faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase    /**
63d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase     * A flag used to indicate that the child transitions of this set
64faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase     * should all start at the same time.
65faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase     */
66d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    public static final int ORDERING_TOGETHER = 0;
67faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase    /**
68d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase     * A flag used to indicate that the child transitions of this set should
69faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase     * play in sequence; when one child transition ends, the next child
70faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase     * transition begins. Note that a transition does not end until all
71faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase     * instances of it (which are playing on all applicable targets of the
72faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase     * transition) end.
73faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase     */
74d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    public static final int ORDERING_SEQUENTIAL = 1;
75faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase
76faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase    /**
77d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase     * Constructs an empty transition set. Add child transitions to the
78d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase     * set by calling {@link #addTransition(Transition)} )}. By default,
79d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase     * child transitions will play {@link #ORDERING_TOGETHER together}.
80faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase     */
81d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    public TransitionSet() {
82faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase    }
83faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase
84ecd857be3946283ebb4306e2c03ae70f5c5bb152George Mount    public TransitionSet(Context context, AttributeSet attrs) {
85ecd857be3946283ebb4306e2c03ae70f5c5bb152George Mount        super(context, attrs);
86ecd857be3946283ebb4306e2c03ae70f5c5bb152George Mount        TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.TransitionSet);
87ecd857be3946283ebb4306e2c03ae70f5c5bb152George Mount        int ordering = a.getInt(R.styleable.TransitionSet_transitionOrdering,
88ecd857be3946283ebb4306e2c03ae70f5c5bb152George Mount                TransitionSet.ORDERING_TOGETHER);
89ecd857be3946283ebb4306e2c03ae70f5c5bb152George Mount        setOrdering(ordering);
90ecd857be3946283ebb4306e2c03ae70f5c5bb152George Mount        a.recycle();
91ecd857be3946283ebb4306e2c03ae70f5c5bb152George Mount    }
92ecd857be3946283ebb4306e2c03ae70f5c5bb152George Mount
93faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase    /**
94d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase     * Sets the play order of this set's child transitions.
95faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase     *
96d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase     * @param ordering {@link #ORDERING_TOGETHER} to play this set's child
97d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase     * transitions together, {@link #ORDERING_SEQUENTIAL} to play the child
98faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase     * transitions in sequence.
99d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase     * @return This transitionSet object.
100faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase     */
101d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    public TransitionSet setOrdering(int ordering) {
102faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        switch (ordering) {
103d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase            case ORDERING_SEQUENTIAL:
104faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase                mPlayTogether = false;
105faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase                break;
106d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase            case ORDERING_TOGETHER:
107faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase                mPlayTogether = true;
108faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase                break;
109faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase            default:
110d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase                throw new AndroidRuntimeException("Invalid parameter for TransitionSet " +
111faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase                        "ordering: " + ordering);
112faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        }
113d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase        return this;
114faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase    }
115faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase
116faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase    /**
117d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase     * Returns the ordering of this TransitionSet. By default, the value is
118d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase     * {@link #ORDERING_TOGETHER}.
119d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase     *
120d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase     * @return {@link #ORDERING_TOGETHER} if child transitions will play at the same
121d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase     * time, {@link #ORDERING_SEQUENTIAL} if they will play in sequence.
122faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase     *
123d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase     * @see #setOrdering(int)
124faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase     */
125d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    public int getOrdering() {
126d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase        return mPlayTogether ? ORDERING_TOGETHER : ORDERING_SEQUENTIAL;
127d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    }
128d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase
129d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    /**
130d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase     * Adds child transition to this set. The order in which this child transition
131d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase     * is added relative to other child transitions that are added, in addition to
132d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase     * the {@link #getOrdering() ordering} property, determines the
133d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase     * order in which the transitions are started.
134d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase     *
135d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase     * <p>If this transitionSet has a {@link #getDuration() duration} set on it, the
136d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase     * child transition will inherit that duration. Transitions are assumed to have
137d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase     * a maximum of one transitionSet parent.</p>
138d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase     *
139d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase     * @param transition A non-null child transition to be added to this set.
140d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase     * @return This transitionSet object.
141d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase     */
142d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    public TransitionSet addTransition(Transition transition) {
143d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase        if (transition != null) {
144d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase            mTransitions.add(transition);
145d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase            transition.mParent = this;
146d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase            if (mDuration >= 0) {
147d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase                transition.setDuration(mDuration);
148faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase            }
149faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        }
150d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase        return this;
151faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase    }
152faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase
153faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase    /**
1547f15164ecb4c93cbb3cc886a3028621c0d0fffccGeorge Mount     * Returns the number of child transitions in the TransitionSet.
1557f15164ecb4c93cbb3cc886a3028621c0d0fffccGeorge Mount     *
1567f15164ecb4c93cbb3cc886a3028621c0d0fffccGeorge Mount     * @return The number of child transitions in the TransitionSet.
1577f15164ecb4c93cbb3cc886a3028621c0d0fffccGeorge Mount     * @see #addTransition(Transition)
1587f15164ecb4c93cbb3cc886a3028621c0d0fffccGeorge Mount     * @see #getTransitionAt(int)
1597f15164ecb4c93cbb3cc886a3028621c0d0fffccGeorge Mount     */
1607f15164ecb4c93cbb3cc886a3028621c0d0fffccGeorge Mount    public int getTransitionCount() {
1617f15164ecb4c93cbb3cc886a3028621c0d0fffccGeorge Mount        return mTransitions.size();
1627f15164ecb4c93cbb3cc886a3028621c0d0fffccGeorge Mount    }
1637f15164ecb4c93cbb3cc886a3028621c0d0fffccGeorge Mount
1647f15164ecb4c93cbb3cc886a3028621c0d0fffccGeorge Mount    /**
1657f15164ecb4c93cbb3cc886a3028621c0d0fffccGeorge Mount     * Returns the child Transition at the specified position in the TransitionSet.
1667f15164ecb4c93cbb3cc886a3028621c0d0fffccGeorge Mount     *
1677f15164ecb4c93cbb3cc886a3028621c0d0fffccGeorge Mount     * @param index The position of the Transition to retrieve.
1687f15164ecb4c93cbb3cc886a3028621c0d0fffccGeorge Mount     * @see #addTransition(Transition)
1697f15164ecb4c93cbb3cc886a3028621c0d0fffccGeorge Mount     * @see #getTransitionCount()
1707f15164ecb4c93cbb3cc886a3028621c0d0fffccGeorge Mount     */
1717f15164ecb4c93cbb3cc886a3028621c0d0fffccGeorge Mount    public Transition getTransitionAt(int index) {
1727f15164ecb4c93cbb3cc886a3028621c0d0fffccGeorge Mount        if (index < 0 || index >= mTransitions.size()) {
1737f15164ecb4c93cbb3cc886a3028621c0d0fffccGeorge Mount            return null;
1747f15164ecb4c93cbb3cc886a3028621c0d0fffccGeorge Mount        }
1757f15164ecb4c93cbb3cc886a3028621c0d0fffccGeorge Mount        return mTransitions.get(index);
1767f15164ecb4c93cbb3cc886a3028621c0d0fffccGeorge Mount    }
1777f15164ecb4c93cbb3cc886a3028621c0d0fffccGeorge Mount
1787f15164ecb4c93cbb3cc886a3028621c0d0fffccGeorge Mount    /**
179d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase     * Setting a non-negative duration on a TransitionSet causes all of the child
180867a86613d4152a93423300f83597300e6ebeebeChet Haase     * transitions (current and future) to inherit this duration.
181867a86613d4152a93423300f83597300e6ebeebeChet Haase     *
182867a86613d4152a93423300f83597300e6ebeebeChet Haase     * @param duration The length of the animation, in milliseconds.
183d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase     * @return This transitionSet object.
184867a86613d4152a93423300f83597300e6ebeebeChet Haase     */
185867a86613d4152a93423300f83597300e6ebeebeChet Haase    @Override
186d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    public TransitionSet setDuration(long duration) {
187867a86613d4152a93423300f83597300e6ebeebeChet Haase        super.setDuration(duration);
188e3b50aecfd913d3032460a99224803ba688bab27George Mount        if (mDuration >= 0 && mTransitions != null) {
189867a86613d4152a93423300f83597300e6ebeebeChet Haase            int numTransitions = mTransitions.size();
190867a86613d4152a93423300f83597300e6ebeebeChet Haase            for (int i = 0; i < numTransitions; ++i) {
191867a86613d4152a93423300f83597300e6ebeebeChet Haase                mTransitions.get(i).setDuration(duration);
192867a86613d4152a93423300f83597300e6ebeebeChet Haase            }
193867a86613d4152a93423300f83597300e6ebeebeChet Haase        }
194867a86613d4152a93423300f83597300e6ebeebeChet Haase        return this;
195867a86613d4152a93423300f83597300e6ebeebeChet Haase    }
196867a86613d4152a93423300f83597300e6ebeebeChet Haase
197d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    @Override
198d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    public TransitionSet setStartDelay(long startDelay) {
199d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase        return (TransitionSet) super.setStartDelay(startDelay);
200d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    }
201d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase
202d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    @Override
203d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    public TransitionSet setInterpolator(TimeInterpolator interpolator) {
204d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase        return (TransitionSet) super.setInterpolator(interpolator);
205d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    }
206d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase
207d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    @Override
208d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    public TransitionSet addTarget(View target) {
209d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount        for (int i = 0; i < mTransitions.size(); i++) {
210d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount            mTransitions.get(i).addTarget(target);
211d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount        }
212d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase        return (TransitionSet) super.addTarget(target);
213d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    }
214d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase
215d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    @Override
216ff58f92a0a77ad849ba714b5adac96790eca0048Chet Haase    public TransitionSet addTarget(int targetId) {
217d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount        for (int i = 0; i < mTransitions.size(); i++) {
218d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount            mTransitions.get(i).addTarget(targetId);
219d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount        }
220ff58f92a0a77ad849ba714b5adac96790eca0048Chet Haase        return (TransitionSet) super.addTarget(targetId);
221d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    }
222d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase
223d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    @Override
224d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount    public TransitionSet addTarget(String targetName) {
225d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount        for (int i = 0; i < mTransitions.size(); i++) {
226d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount            mTransitions.get(i).addTarget(targetName);
227d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount        }
228d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount        return (TransitionSet) super.addTarget(targetName);
229d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount    }
230d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount
231d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount    @Override
232d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount    public TransitionSet addTarget(Class targetType) {
233d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount        for (int i = 0; i < mTransitions.size(); i++) {
234d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount            mTransitions.get(i).addTarget(targetType);
235d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount        }
236d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount        return (TransitionSet) super.addTarget(targetType);
237d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount    }
238d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount
239d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount    @Override
240d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    public TransitionSet addListener(TransitionListener listener) {
241d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase        return (TransitionSet) super.addListener(listener);
242d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    }
243d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase
244d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    @Override
245ff58f92a0a77ad849ba714b5adac96790eca0048Chet Haase    public TransitionSet removeTarget(int targetId) {
246d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount        for (int i = 0; i < mTransitions.size(); i++) {
247d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount            mTransitions.get(i).removeTarget(targetId);
248d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount        }
249ff58f92a0a77ad849ba714b5adac96790eca0048Chet Haase        return (TransitionSet) super.removeTarget(targetId);
250d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    }
251d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase
252d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    @Override
253d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    public TransitionSet removeTarget(View target) {
254d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount        for (int i = 0; i < mTransitions.size(); i++) {
255d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount            mTransitions.get(i).removeTarget(target);
256d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount        }
257d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount        return (TransitionSet) super.removeTarget(target);
258d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount    }
259d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount
260d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount    @Override
261d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount    public TransitionSet removeTarget(Class target) {
262d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount        for (int i = 0; i < mTransitions.size(); i++) {
263d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount            mTransitions.get(i).removeTarget(target);
264d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount        }
265d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount        return (TransitionSet) super.removeTarget(target);
266d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount    }
267d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount
268d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount    @Override
269d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount    public TransitionSet removeTarget(String target) {
270d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount        for (int i = 0; i < mTransitions.size(); i++) {
271d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount            mTransitions.get(i).removeTarget(target);
272d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount        }
273d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase        return (TransitionSet) super.removeTarget(target);
274d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    }
275d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase
276d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    @Override
277d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount    public Transition excludeTarget(View target, boolean exclude) {
278d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount        for (int i = 0; i < mTransitions.size(); i++) {
279d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount            mTransitions.get(i).excludeTarget(target, exclude);
280d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount        }
281d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount        return super.excludeTarget(target, exclude);
282d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount    }
283d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount
284d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount    @Override
2850a2ae002e60f7ea9b6bea282086b5eb0ae3c6e51George Mount    public Transition excludeTarget(String targetName, boolean exclude) {
286d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount        for (int i = 0; i < mTransitions.size(); i++) {
2870a2ae002e60f7ea9b6bea282086b5eb0ae3c6e51George Mount            mTransitions.get(i).excludeTarget(targetName, exclude);
288d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount        }
2890a2ae002e60f7ea9b6bea282086b5eb0ae3c6e51George Mount        return super.excludeTarget(targetName, exclude);
290d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount    }
291d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount
292d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount    @Override
293d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount    public Transition excludeTarget(int targetId, boolean exclude) {
294d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount        for (int i = 0; i < mTransitions.size(); i++) {
295d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount            mTransitions.get(i).excludeTarget(targetId, exclude);
296d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount        }
297d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount        return super.excludeTarget(targetId, exclude);
298d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount    }
299d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount
300d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount    @Override
301d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount    public Transition excludeTarget(Class type, boolean exclude) {
302d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount        for (int i = 0; i < mTransitions.size(); i++) {
303d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount            mTransitions.get(i).excludeTarget(type, exclude);
304d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount        }
305d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount        return super.excludeTarget(type, exclude);
306d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount    }
307d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount
308d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount    @Override
309d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    public TransitionSet removeListener(TransitionListener listener) {
310d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase        return (TransitionSet) super.removeListener(listener);
311d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    }
312d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase
313ecd857be3946283ebb4306e2c03ae70f5c5bb152George Mount    @Override
314ecd857be3946283ebb4306e2c03ae70f5c5bb152George Mount    public void setPathMotion(PathMotion pathMotion) {
315ecd857be3946283ebb4306e2c03ae70f5c5bb152George Mount        super.setPathMotion(pathMotion);
316ecd857be3946283ebb4306e2c03ae70f5c5bb152George Mount        for (int i = 0; i < mTransitions.size(); i++) {
317ecd857be3946283ebb4306e2c03ae70f5c5bb152George Mount            mTransitions.get(i).setPathMotion(pathMotion);
318ecd857be3946283ebb4306e2c03ae70f5c5bb152George Mount        }
319ecd857be3946283ebb4306e2c03ae70f5c5bb152George Mount    }
320ecd857be3946283ebb4306e2c03ae70f5c5bb152George Mount
321867a86613d4152a93423300f83597300e6ebeebeChet Haase    /**
322d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase     * Removes the specified child transition from this set.
323faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase     *
324faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase     * @param transition The transition to be removed.
325d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase     * @return This transitionSet object.
326faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase     */
327d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    public TransitionSet removeTransition(Transition transition) {
328faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        mTransitions.remove(transition);
3296ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase        transition.mParent = null;
330d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase        return this;
331faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase    }
332faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase
333faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase    /**
334faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase     * Sets up listeners for each of the child transitions. This is used to
335d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase     * determine when this transition set is finished (all child transitions
336faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase     * must finish first).
337faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase     */
338faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase    private void setupStartEndListeners() {
339d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase        TransitionSetListener listener = new TransitionSetListener(this);
340faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        for (Transition childTransition : mTransitions) {
3416ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase            childTransition.addListener(listener);
342faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        }
343faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        mCurrentListeners = mTransitions.size();
344faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase    }
345faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase
346faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase    /**
347faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase     * This listener is used to detect when all child transitions are done, at
348d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase     * which point this transition set is also done.
349faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase     */
350d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    static class TransitionSetListener extends TransitionListenerAdapter {
351d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase        TransitionSet mTransitionSet;
352d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase        TransitionSetListener(TransitionSet transitionSet) {
353d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase            mTransitionSet = transitionSet;
3546ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase        }
355faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        @Override
356faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        public void onTransitionStart(Transition transition) {
357d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase            if (!mTransitionSet.mStarted) {
358d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase                mTransitionSet.start();
359d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase                mTransitionSet.mStarted = true;
360faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase            }
361faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        }
362faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase
363faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        @Override
364faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        public void onTransitionEnd(Transition transition) {
365d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase            --mTransitionSet.mCurrentListeners;
366d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase            if (mTransitionSet.mCurrentListeners == 0) {
367faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase                // All child trans
368d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase                mTransitionSet.mStarted = false;
369d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase                mTransitionSet.end();
370faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase            }
371faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase            transition.removeListener(this);
372faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        }
3736ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase    }
374faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase
375faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase    /**
376faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase     * @hide
377faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase     */
378faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase    @Override
379d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    protected void createAnimators(ViewGroup sceneRoot, TransitionValuesMaps startValues,
3804d1ecf5daf6ad0b5420f3f3657e2cbaeea630240George Mount            TransitionValuesMaps endValues, ArrayList<TransitionValues> startValuesList,
3814d1ecf5daf6ad0b5420f3f3657e2cbaeea630240George Mount            ArrayList<TransitionValues> endValuesList) {
38204600023d096dfd7ed2b53d6ee273c57b6c2c20fGeorge Mount        long startDelay = getStartDelay();
38304600023d096dfd7ed2b53d6ee273c57b6c2c20fGeorge Mount        int numTransitions = mTransitions.size();
38404600023d096dfd7ed2b53d6ee273c57b6c2c20fGeorge Mount        for (int i = 0; i < numTransitions; i++) {
38504600023d096dfd7ed2b53d6ee273c57b6c2c20fGeorge Mount            Transition childTransition = mTransitions.get(i);
38604600023d096dfd7ed2b53d6ee273c57b6c2c20fGeorge Mount            // We only set the start delay on the first transition if we are playing
38704600023d096dfd7ed2b53d6ee273c57b6c2c20fGeorge Mount            // the transitions sequentially.
38804600023d096dfd7ed2b53d6ee273c57b6c2c20fGeorge Mount            if (startDelay > 0 && (mPlayTogether || i == 0)) {
38904600023d096dfd7ed2b53d6ee273c57b6c2c20fGeorge Mount                long childStartDelay = childTransition.getStartDelay();
39004600023d096dfd7ed2b53d6ee273c57b6c2c20fGeorge Mount                if (childStartDelay > 0) {
39104600023d096dfd7ed2b53d6ee273c57b6c2c20fGeorge Mount                    childTransition.setStartDelay(startDelay + childStartDelay);
39204600023d096dfd7ed2b53d6ee273c57b6c2c20fGeorge Mount                } else {
39304600023d096dfd7ed2b53d6ee273c57b6c2c20fGeorge Mount                    childTransition.setStartDelay(startDelay);
39404600023d096dfd7ed2b53d6ee273c57b6c2c20fGeorge Mount                }
39504600023d096dfd7ed2b53d6ee273c57b6c2c20fGeorge Mount            }
3964d1ecf5daf6ad0b5420f3f3657e2cbaeea630240George Mount            childTransition.createAnimators(sceneRoot, startValues, endValues, startValuesList,
3974d1ecf5daf6ad0b5420f3f3657e2cbaeea630240George Mount                    endValuesList);
398faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        }
399faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase    }
400faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase
401faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase    /**
402faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase     * @hide
403faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase     */
404faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase    @Override
405d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    protected void runAnimators() {
40638a664986ba5ed101916c49c926d176c434b725bGeorge Mount        if (mTransitions.isEmpty()) {
40738a664986ba5ed101916c49c926d176c434b725bGeorge Mount            start();
40838a664986ba5ed101916c49c926d176c434b725bGeorge Mount            end();
40938a664986ba5ed101916c49c926d176c434b725bGeorge Mount            return;
41038a664986ba5ed101916c49c926d176c434b725bGeorge Mount        }
411faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        setupStartEndListeners();
41238a664986ba5ed101916c49c926d176c434b725bGeorge Mount        int numTransitions = mTransitions.size();
413faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        if (!mPlayTogether) {
414faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase            // Setup sequence with listeners
415faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase            // TODO: Need to add listeners in such a way that we can remove them later if canceled
41638a664986ba5ed101916c49c926d176c434b725bGeorge Mount            for (int i = 1; i < numTransitions; ++i) {
417faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase                Transition previousTransition = mTransitions.get(i - 1);
418faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase                final Transition nextTransition = mTransitions.get(i);
419faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase                previousTransition.addListener(new TransitionListenerAdapter() {
420faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase                    @Override
421faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase                    public void onTransitionEnd(Transition transition) {
422d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase                        nextTransition.runAnimators();
423faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase                        transition.removeListener(this);
424faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase                    }
425faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase                });
426faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase            }
427faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase            Transition firstTransition = mTransitions.get(0);
428faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase            if (firstTransition != null) {
429d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase                firstTransition.runAnimators();
430faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase            }
431faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        } else {
43238a664986ba5ed101916c49c926d176c434b725bGeorge Mount            for (int i = 0; i < numTransitions; ++i) {
43338a664986ba5ed101916c49c926d176c434b725bGeorge Mount                mTransitions.get(i).runAnimators();
434faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase            }
435faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        }
436faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase    }
437faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase
438faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase    @Override
439d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    public void captureStartValues(TransitionValues transitionValues) {
44030da61d477bcb6cc7718f9516c444359352fe148George Mount        if (isValidTarget(transitionValues.view)) {
441ff58f92a0a77ad849ba714b5adac96790eca0048Chet Haase            for (Transition childTransition : mTransitions) {
44230da61d477bcb6cc7718f9516c444359352fe148George Mount                if (childTransition.isValidTarget(transitionValues.view)) {
443ff58f92a0a77ad849ba714b5adac96790eca0048Chet Haase                    childTransition.captureStartValues(transitionValues);
4445030c7f6f15c5c2cac2403f863e4f618a8cfaedfGeorge Mount                    transitionValues.targetedTransitions.add(childTransition);
445ff58f92a0a77ad849ba714b5adac96790eca0048Chet Haase                }
446d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase            }
447d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase        }
448d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    }
449d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase
450d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    @Override
451d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    public void captureEndValues(TransitionValues transitionValues) {
45230da61d477bcb6cc7718f9516c444359352fe148George Mount        if (isValidTarget(transitionValues.view)) {
453ff58f92a0a77ad849ba714b5adac96790eca0048Chet Haase            for (Transition childTransition : mTransitions) {
45430da61d477bcb6cc7718f9516c444359352fe148George Mount                if (childTransition.isValidTarget(transitionValues.view)) {
455ff58f92a0a77ad849ba714b5adac96790eca0048Chet Haase                    childTransition.captureEndValues(transitionValues);
4565030c7f6f15c5c2cac2403f863e4f618a8cfaedfGeorge Mount                    transitionValues.targetedTransitions.add(childTransition);
457ff58f92a0a77ad849ba714b5adac96790eca0048Chet Haase                }
458faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase            }
459faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        }
460faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase    }
461faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase
462d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount    @Override
463d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount    void capturePropagationValues(TransitionValues transitionValues) {
464d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount        super.capturePropagationValues(transitionValues);
465d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount        int numTransitions = mTransitions.size();
466d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount        for (int i = 0; i < numTransitions; ++i) {
467d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount            mTransitions.get(i).capturePropagationValues(transitionValues);
468d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount        }
469d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount    }
470d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount
471199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase    /** @hide */
472faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase    @Override
473cf68aad3164303df59b2a669d186a94533c9c743George Mount    public void pause(View sceneRoot) {
474cf68aad3164303df59b2a669d186a94533c9c743George Mount        super.pause(sceneRoot);
475e9d32ea13ee14fc0eb4e45ca627ca77729d38bfeChet Haase        int numTransitions = mTransitions.size();
476e9d32ea13ee14fc0eb4e45ca627ca77729d38bfeChet Haase        for (int i = 0; i < numTransitions; ++i) {
477cf68aad3164303df59b2a669d186a94533c9c743George Mount            mTransitions.get(i).pause(sceneRoot);
478199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase        }
479199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase    }
480199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase
481199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase    /** @hide */
482199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase    @Override
483cf68aad3164303df59b2a669d186a94533c9c743George Mount    public void resume(View sceneRoot) {
484cf68aad3164303df59b2a669d186a94533c9c743George Mount        super.resume(sceneRoot);
485199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase        int numTransitions = mTransitions.size();
486199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase        for (int i = 0; i < numTransitions; ++i) {
487cf68aad3164303df59b2a669d186a94533c9c743George Mount            mTransitions.get(i).resume(sceneRoot);
488199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase        }
489199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase    }
490199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase
491d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    /** @hide */
492199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase    @Override
493199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase    protected void cancel() {
494199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase        super.cancel();
495199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase        int numTransitions = mTransitions.size();
496199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase        for (int i = 0; i < numTransitions; ++i) {
497199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase            mTransitions.get(i).cancel();
498e9d32ea13ee14fc0eb4e45ca627ca77729d38bfeChet Haase        }
499e9d32ea13ee14fc0eb4e45ca627ca77729d38bfeChet Haase    }
500e9d32ea13ee14fc0eb4e45ca627ca77729d38bfeChet Haase
501413739e8c62a7cd83ec519203a2628504b1b0d16George Mount    /** @hide */
502413739e8c62a7cd83ec519203a2628504b1b0d16George Mount    @Override
503413739e8c62a7cd83ec519203a2628504b1b0d16George Mount    void forceToEnd(ViewGroup sceneRoot) {
504413739e8c62a7cd83ec519203a2628504b1b0d16George Mount        super.forceToEnd(sceneRoot);
505413739e8c62a7cd83ec519203a2628504b1b0d16George Mount        int numTransitions = mTransitions.size();
506413739e8c62a7cd83ec519203a2628504b1b0d16George Mount        for (int i = 0; i < numTransitions; ++i) {
507413739e8c62a7cd83ec519203a2628504b1b0d16George Mount            mTransitions.get(i).forceToEnd(sceneRoot);
508413739e8c62a7cd83ec519203a2628504b1b0d16George Mount        }
509413739e8c62a7cd83ec519203a2628504b1b0d16George Mount    }
510413739e8c62a7cd83ec519203a2628504b1b0d16George Mount
511e9d32ea13ee14fc0eb4e45ca627ca77729d38bfeChet Haase    @Override
512d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    TransitionSet setSceneRoot(ViewGroup sceneRoot) {
5136ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase        super.setSceneRoot(sceneRoot);
5146ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase        int numTransitions = mTransitions.size();
5156ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase        for (int i = 0; i < numTransitions; ++i) {
5166ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase            mTransitions.get(i).setSceneRoot(sceneRoot);
5176ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase        }
518d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase        return (TransitionSet) this;
5196ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase    }
5206ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase
5216ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase    @Override
522b7a7fc9d233bad507ce893882352618b13647058Chet Haase    void setCanRemoveViews(boolean canRemoveViews) {
523b7a7fc9d233bad507ce893882352618b13647058Chet Haase        super.setCanRemoveViews(canRemoveViews);
524b7a7fc9d233bad507ce893882352618b13647058Chet Haase        int numTransitions = mTransitions.size();
525b7a7fc9d233bad507ce893882352618b13647058Chet Haase        for (int i = 0; i < numTransitions; ++i) {
526b7a7fc9d233bad507ce893882352618b13647058Chet Haase            mTransitions.get(i).setCanRemoveViews(canRemoveViews);
527b7a7fc9d233bad507ce893882352618b13647058Chet Haase        }
528b7a7fc9d233bad507ce893882352618b13647058Chet Haase    }
529b7a7fc9d233bad507ce893882352618b13647058Chet Haase
530b7a7fc9d233bad507ce893882352618b13647058Chet Haase    @Override
531d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount    public void setPropagation(TransitionPropagation propagation) {
532d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount        super.setPropagation(propagation);
533d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount        int numTransitions = mTransitions.size();
534d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount        for (int i = 0; i < numTransitions; ++i) {
535d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount            mTransitions.get(i).setPropagation(propagation);
536d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount        }
537d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount    }
538d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount
539d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount    @Override
540d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount    public void setEpicenterCallback(EpicenterCallback epicenterCallback) {
541d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount        super.setEpicenterCallback(epicenterCallback);
542d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount        int numTransitions = mTransitions.size();
543d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount        for (int i = 0; i < numTransitions; ++i) {
544d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount            mTransitions.get(i).setEpicenterCallback(epicenterCallback);
545d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount        }
546d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount    }
547d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount
548d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount    @Override
549faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase    String toString(String indent) {
550faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        String result = super.toString(indent);
551faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        for (int i = 0; i < mTransitions.size(); ++i) {
552faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase            result += "\n" + mTransitions.get(i).toString(indent + "  ");
553faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        }
554faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        return result;
555faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase    }
556faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase
5576ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase    @Override
558d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    public TransitionSet clone() {
559d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase        TransitionSet clone = (TransitionSet) super.clone();
5606ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase        clone.mTransitions = new ArrayList<Transition>();
5616ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase        int numTransitions = mTransitions.size();
5626ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase        for (int i = 0; i < numTransitions; ++i) {
563c46181a963be736186ae29101625a05b5c1f0ba8Chet Haase            clone.addTransition((Transition) mTransitions.get(i).clone());
5646ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase        }
5656ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase        return clone;
5666ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase    }
567faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase}
568