TransitionSet.java revision ff58f92a0a77ad849ba714b5adac96790eca0048
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;
20faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haaseimport android.util.AndroidRuntimeException;
21d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haaseimport android.view.View;
22faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haaseimport android.view.ViewGroup;
23faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase
24faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haaseimport java.util.ArrayList;
25faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase
26faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase/**
27d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase * A TransitionSet is a parent of child transitions (including other
28d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase * TransitionSets). Using TransitionSets enables more complex
29d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase * choreography of transitions, where some sets play {@link #ORDERING_TOGETHER} and
30d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase * others play {@link #ORDERING_SEQUENTIAL}. For example, {@link AutoTransition}
31d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase * uses a TransitionSet to sequentially play a Fade(Fade.OUT), followed by
32d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase * a {@link ChangeBounds}, followed by a Fade(Fade.OUT) transition.
33faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase */
34d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haasepublic class TransitionSet extends Transition {
35faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase
36faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase    ArrayList<Transition> mTransitions = new ArrayList<Transition>();
37faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase    private boolean mPlayTogether = true;
38faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase    int mCurrentListeners;
39faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase    boolean mStarted = false;
40faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase
41faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase    /**
42d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase     * A flag used to indicate that the child transitions of this set
43faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase     * should all start at the same time.
44faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase     */
45d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    public static final int ORDERING_TOGETHER = 0;
46faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase    /**
47d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase     * A flag used to indicate that the child transitions of this set should
48faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase     * play in sequence; when one child transition ends, the next child
49faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase     * transition begins. Note that a transition does not end until all
50faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase     * instances of it (which are playing on all applicable targets of the
51faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase     * transition) end.
52faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase     */
53d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    public static final int ORDERING_SEQUENTIAL = 1;
54faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase
55faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase    /**
56d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase     * Constructs an empty transition set. Add child transitions to the
57d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase     * set by calling {@link #addTransition(Transition)} )}. By default,
58d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase     * child transitions will play {@link #ORDERING_TOGETHER together}.
59faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase     */
60d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    public TransitionSet() {
61faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase    }
62faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase
63faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase    /**
64d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase     * Sets the play order of this set's child transitions.
65faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase     *
66d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase     * @param ordering {@link #ORDERING_TOGETHER} to play this set's child
67d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase     * transitions together, {@link #ORDERING_SEQUENTIAL} to play the child
68faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase     * transitions in sequence.
69d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase     * @return This transitionSet object.
70faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase     */
71d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    public TransitionSet setOrdering(int ordering) {
72faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        switch (ordering) {
73d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase            case ORDERING_SEQUENTIAL:
74faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase                mPlayTogether = false;
75faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase                break;
76d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase            case ORDERING_TOGETHER:
77faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase                mPlayTogether = true;
78faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase                break;
79faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase            default:
80d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase                throw new AndroidRuntimeException("Invalid parameter for TransitionSet " +
81faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase                        "ordering: " + ordering);
82faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        }
83d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase        return this;
84faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase    }
85faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase
86faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase    /**
87d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase     * Returns the ordering of this TransitionSet. By default, the value is
88d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase     * {@link #ORDERING_TOGETHER}.
89d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase     *
90d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase     * @return {@link #ORDERING_TOGETHER} if child transitions will play at the same
91d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase     * time, {@link #ORDERING_SEQUENTIAL} if they will play in sequence.
92faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase     *
93d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase     * @see #setOrdering(int)
94faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase     */
95d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    public int getOrdering() {
96d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase        return mPlayTogether ? ORDERING_TOGETHER : ORDERING_SEQUENTIAL;
97d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    }
98d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase
99d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    /**
100d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase     * Adds child transition to this set. The order in which this child transition
101d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase     * is added relative to other child transitions that are added, in addition to
102d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase     * the {@link #getOrdering() ordering} property, determines the
103d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase     * order in which the transitions are started.
104d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase     *
105d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase     * <p>If this transitionSet has a {@link #getDuration() duration} set on it, the
106d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase     * child transition will inherit that duration. Transitions are assumed to have
107d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase     * a maximum of one transitionSet parent.</p>
108d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase     *
109d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase     * @param transition A non-null child transition to be added to this set.
110d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase     * @return This transitionSet object.
111d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase     */
112d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    public TransitionSet addTransition(Transition transition) {
113d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase        if (transition != null) {
114d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase            mTransitions.add(transition);
115d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase            transition.mParent = this;
116d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase            if (mDuration >= 0) {
117d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase                transition.setDuration(mDuration);
118faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase            }
119faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        }
120d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase        return this;
121faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase    }
122faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase
123faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase    /**
124d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase     * Setting a non-negative duration on a TransitionSet causes all of the child
125867a86613d4152a93423300f83597300e6ebeebeChet Haase     * transitions (current and future) to inherit this duration.
126867a86613d4152a93423300f83597300e6ebeebeChet Haase     *
127867a86613d4152a93423300f83597300e6ebeebeChet Haase     * @param duration The length of the animation, in milliseconds.
128d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase     * @return This transitionSet object.
129867a86613d4152a93423300f83597300e6ebeebeChet Haase     */
130867a86613d4152a93423300f83597300e6ebeebeChet Haase    @Override
131d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    public TransitionSet setDuration(long duration) {
132867a86613d4152a93423300f83597300e6ebeebeChet Haase        super.setDuration(duration);
133867a86613d4152a93423300f83597300e6ebeebeChet Haase        if (mDuration >= 0) {
134867a86613d4152a93423300f83597300e6ebeebeChet Haase            int numTransitions = mTransitions.size();
135867a86613d4152a93423300f83597300e6ebeebeChet Haase            for (int i = 0; i < numTransitions; ++i) {
136867a86613d4152a93423300f83597300e6ebeebeChet Haase                mTransitions.get(i).setDuration(duration);
137867a86613d4152a93423300f83597300e6ebeebeChet Haase            }
138867a86613d4152a93423300f83597300e6ebeebeChet Haase        }
139867a86613d4152a93423300f83597300e6ebeebeChet Haase        return this;
140867a86613d4152a93423300f83597300e6ebeebeChet Haase    }
141867a86613d4152a93423300f83597300e6ebeebeChet Haase
142d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    @Override
143d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    public TransitionSet setStartDelay(long startDelay) {
144d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase        return (TransitionSet) super.setStartDelay(startDelay);
145d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    }
146d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase
147d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    @Override
148d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    public TransitionSet setInterpolator(TimeInterpolator interpolator) {
149d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase        return (TransitionSet) super.setInterpolator(interpolator);
150d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    }
151d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase
152d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    @Override
153d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    public TransitionSet addTarget(View target) {
154d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase        return (TransitionSet) super.addTarget(target);
155d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    }
156d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase
157d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    @Override
158ff58f92a0a77ad849ba714b5adac96790eca0048Chet Haase    public TransitionSet addTarget(int targetId) {
159ff58f92a0a77ad849ba714b5adac96790eca0048Chet Haase        return (TransitionSet) super.addTarget(targetId);
160d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    }
161d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase
162d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    @Override
163d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    public TransitionSet addListener(TransitionListener listener) {
164d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase        return (TransitionSet) super.addListener(listener);
165d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    }
166d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase
167d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    @Override
168ff58f92a0a77ad849ba714b5adac96790eca0048Chet Haase    public TransitionSet removeTarget(int targetId) {
169ff58f92a0a77ad849ba714b5adac96790eca0048Chet Haase        return (TransitionSet) super.removeTarget(targetId);
170d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    }
171d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase
172d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    @Override
173d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    public TransitionSet removeTarget(View target) {
174d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase        return (TransitionSet) super.removeTarget(target);
175d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    }
176d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase
177d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    @Override
178d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    public TransitionSet removeListener(TransitionListener listener) {
179d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase        return (TransitionSet) super.removeListener(listener);
180d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    }
181d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase
182867a86613d4152a93423300f83597300e6ebeebeChet Haase    /**
183d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase     * Removes the specified child transition from this set.
184faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase     *
185faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase     * @param transition The transition to be removed.
186d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase     * @return This transitionSet object.
187faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase     */
188d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    public TransitionSet removeTransition(Transition transition) {
189faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        mTransitions.remove(transition);
1906ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase        transition.mParent = null;
191d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase        return this;
192faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase    }
193faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase
194faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase    /**
195faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase     * Sets up listeners for each of the child transitions. This is used to
196d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase     * determine when this transition set is finished (all child transitions
197faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase     * must finish first).
198faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase     */
199faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase    private void setupStartEndListeners() {
200d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase        TransitionSetListener listener = new TransitionSetListener(this);
201faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        for (Transition childTransition : mTransitions) {
2026ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase            childTransition.addListener(listener);
203faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        }
204faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        mCurrentListeners = mTransitions.size();
205faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase    }
206faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase
207faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase    /**
208faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase     * This listener is used to detect when all child transitions are done, at
209d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase     * which point this transition set is also done.
210faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase     */
211d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    static class TransitionSetListener extends TransitionListenerAdapter {
212d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase        TransitionSet mTransitionSet;
213d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase        TransitionSetListener(TransitionSet transitionSet) {
214d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase            mTransitionSet = transitionSet;
2156ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase        }
216faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        @Override
217faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        public void onTransitionStart(Transition transition) {
218d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase            if (!mTransitionSet.mStarted) {
219d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase                mTransitionSet.start();
220d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase                mTransitionSet.mStarted = true;
221faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase            }
222faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        }
223faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase
224faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        @Override
225faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        public void onTransitionEnd(Transition transition) {
226d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase            --mTransitionSet.mCurrentListeners;
227d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase            if (mTransitionSet.mCurrentListeners == 0) {
228faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase                // All child trans
229d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase                mTransitionSet.mStarted = false;
230d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase                mTransitionSet.end();
231faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase            }
232faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase            transition.removeListener(this);
233faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        }
2346ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase    }
235faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase
236faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase    /**
237faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase     * @hide
238faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase     */
239faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase    @Override
240d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    protected void createAnimators(ViewGroup sceneRoot, TransitionValuesMaps startValues,
2416ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase            TransitionValuesMaps endValues) {
242faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        for (Transition childTransition : mTransitions) {
243d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase            childTransition.createAnimators(sceneRoot, startValues, endValues);
244faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        }
245faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase    }
246faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase
247faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase    /**
248faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase     * @hide
249faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase     */
250faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase    @Override
251d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    protected void runAnimators() {
252faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        setupStartEndListeners();
253faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        if (!mPlayTogether) {
254faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase            // Setup sequence with listeners
255faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase            // TODO: Need to add listeners in such a way that we can remove them later if canceled
256faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase            for (int i = 1; i < mTransitions.size(); ++i) {
257faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase                Transition previousTransition = mTransitions.get(i - 1);
258faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase                final Transition nextTransition = mTransitions.get(i);
259faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase                previousTransition.addListener(new TransitionListenerAdapter() {
260faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase                    @Override
261faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase                    public void onTransitionEnd(Transition transition) {
262d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase                        nextTransition.runAnimators();
263faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase                        transition.removeListener(this);
264faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase                    }
265faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase                });
266faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase            }
267faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase            Transition firstTransition = mTransitions.get(0);
268faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase            if (firstTransition != null) {
269d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase                firstTransition.runAnimators();
270faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase            }
271faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        } else {
272faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase            for (Transition childTransition : mTransitions) {
273d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase                childTransition.runAnimators();
274faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase            }
275faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        }
276faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase    }
277faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase
278faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase    @Override
279d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    public void captureStartValues(TransitionValues transitionValues) {
280faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        int targetId = transitionValues.view.getId();
281ff58f92a0a77ad849ba714b5adac96790eca0048Chet Haase        if (isValidTarget(transitionValues.view, targetId)) {
282ff58f92a0a77ad849ba714b5adac96790eca0048Chet Haase            for (Transition childTransition : mTransitions) {
283ff58f92a0a77ad849ba714b5adac96790eca0048Chet Haase                if (childTransition.isValidTarget(transitionValues.view, targetId)) {
284ff58f92a0a77ad849ba714b5adac96790eca0048Chet Haase                    childTransition.captureStartValues(transitionValues);
285ff58f92a0a77ad849ba714b5adac96790eca0048Chet Haase                }
286d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase            }
287d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase        }
288d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    }
289d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase
290d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    @Override
291d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    public void captureEndValues(TransitionValues transitionValues) {
292d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase        int targetId = transitionValues.view.getId();
293ff58f92a0a77ad849ba714b5adac96790eca0048Chet Haase        if (isValidTarget(transitionValues.view, targetId)) {
294ff58f92a0a77ad849ba714b5adac96790eca0048Chet Haase            for (Transition childTransition : mTransitions) {
295ff58f92a0a77ad849ba714b5adac96790eca0048Chet Haase                if (childTransition.isValidTarget(transitionValues.view, targetId)) {
296ff58f92a0a77ad849ba714b5adac96790eca0048Chet Haase                    childTransition.captureEndValues(transitionValues);
297ff58f92a0a77ad849ba714b5adac96790eca0048Chet Haase                }
298faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase            }
299faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        }
300faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase    }
301faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase
302199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase    /** @hide */
303faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase    @Override
304199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase    public void pause() {
305199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase        super.pause();
306e9d32ea13ee14fc0eb4e45ca627ca77729d38bfeChet Haase        int numTransitions = mTransitions.size();
307e9d32ea13ee14fc0eb4e45ca627ca77729d38bfeChet Haase        for (int i = 0; i < numTransitions; ++i) {
308199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase            mTransitions.get(i).pause();
309199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase        }
310199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase    }
311199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase
312199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase    /** @hide */
313199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase    @Override
314199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase    public void resume() {
315199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase        super.resume();
316199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase        int numTransitions = mTransitions.size();
317199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase        for (int i = 0; i < numTransitions; ++i) {
318199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase            mTransitions.get(i).resume();
319199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase        }
320199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase    }
321199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase
322d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    /** @hide */
323199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase    @Override
324199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase    protected void cancel() {
325199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase        super.cancel();
326199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase        int numTransitions = mTransitions.size();
327199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase        for (int i = 0; i < numTransitions; ++i) {
328199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase            mTransitions.get(i).cancel();
329e9d32ea13ee14fc0eb4e45ca627ca77729d38bfeChet Haase        }
330e9d32ea13ee14fc0eb4e45ca627ca77729d38bfeChet Haase    }
331e9d32ea13ee14fc0eb4e45ca627ca77729d38bfeChet Haase
332e9d32ea13ee14fc0eb4e45ca627ca77729d38bfeChet Haase    @Override
333d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    TransitionSet setSceneRoot(ViewGroup sceneRoot) {
3346ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase        super.setSceneRoot(sceneRoot);
3356ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase        int numTransitions = mTransitions.size();
3366ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase        for (int i = 0; i < numTransitions; ++i) {
3376ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase            mTransitions.get(i).setSceneRoot(sceneRoot);
3386ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase        }
339d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase        return (TransitionSet) this;
3406ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase    }
3416ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase
3426ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase    @Override
343faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase    String toString(String indent) {
344faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        String result = super.toString(indent);
345faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        for (int i = 0; i < mTransitions.size(); ++i) {
346faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase            result += "\n" + mTransitions.get(i).toString(indent + "  ");
347faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        }
348faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        return result;
349faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase    }
350faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase
3516ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase    @Override
352d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    public TransitionSet clone() {
353d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase        TransitionSet clone = (TransitionSet) super.clone();
3546ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase        clone.mTransitions = new ArrayList<Transition>();
3556ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase        int numTransitions = mTransitions.size();
3566ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase        for (int i = 0; i < numTransitions; ++i) {
3576ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase            clone.mTransitions.add((Transition) mTransitions.get(i).clone());
3586ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase        }
3596ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase        return clone;
3606ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase    }
3616ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase
362faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase}
363