TransitionSet.java revision d4c3c91dd0757eec9703ef90ea4c5a7ee99f18ca
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;
20d6107a3170df61d9e776fcd5666acfc9135c6f16George Mountimport android.graphics.Rect;
21faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haaseimport android.util.AndroidRuntimeException;
22d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haaseimport android.view.View;
23faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haaseimport android.view.ViewGroup;
24faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase
25faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haaseimport java.util.ArrayList;
26faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase
27faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase/**
28d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase * A TransitionSet is a parent of child transitions (including other
29d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase * TransitionSets). Using TransitionSets enables more complex
30d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase * choreography of transitions, where some sets play {@link #ORDERING_TOGETHER} and
31d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase * others play {@link #ORDERING_SEQUENTIAL}. For example, {@link AutoTransition}
32d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase * uses a TransitionSet to sequentially play a Fade(Fade.OUT), followed by
33d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase * a {@link ChangeBounds}, followed by a Fade(Fade.OUT) transition.
34aafc91c05acfb2d5a95f46f27e1deb2dfaa15c32Chet Haase *
35aafc91c05acfb2d5a95f46f27e1deb2dfaa15c32Chet Haase * <p>A TransitionSet can be described in a resource file by using the
36aafc91c05acfb2d5a95f46f27e1deb2dfaa15c32Chet Haase * tag <code>transitionSet</code>, along with the standard
37aafc91c05acfb2d5a95f46f27e1deb2dfaa15c32Chet Haase * attributes of {@link android.R.styleable#TransitionSet} and
38aafc91c05acfb2d5a95f46f27e1deb2dfaa15c32Chet Haase * {@link android.R.styleable#Transition}. Child transitions of the
39aafc91c05acfb2d5a95f46f27e1deb2dfaa15c32Chet Haase * TransitionSet object can be loaded by adding those child tags inside the
40aafc91c05acfb2d5a95f46f27e1deb2dfaa15c32Chet Haase * enclosing <code>transitionSet</code> tag. For example, the following xml
41aafc91c05acfb2d5a95f46f27e1deb2dfaa15c32Chet Haase * describes a TransitionSet that plays a Fade and then a ChangeBounds
42aafc91c05acfb2d5a95f46f27e1deb2dfaa15c32Chet Haase * transition on the affected view targets:</p>
43aafc91c05acfb2d5a95f46f27e1deb2dfaa15c32Chet Haase * <pre>
44aafc91c05acfb2d5a95f46f27e1deb2dfaa15c32Chet Haase *     &lt;transitionSet xmlns:android="http://schemas.android.com/apk/res/android"
45aafc91c05acfb2d5a95f46f27e1deb2dfaa15c32Chet Haase *             android:ordering="sequential"&gt;
46aafc91c05acfb2d5a95f46f27e1deb2dfaa15c32Chet Haase *         &lt;fade/&gt;
47aafc91c05acfb2d5a95f46f27e1deb2dfaa15c32Chet Haase *         &lt;changeBounds/&gt;
48aafc91c05acfb2d5a95f46f27e1deb2dfaa15c32Chet Haase *     &lt;/transitionSet&gt;
49aafc91c05acfb2d5a95f46f27e1deb2dfaa15c32Chet Haase * </pre>
50faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase */
51d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haasepublic class TransitionSet extends Transition {
52faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase
53faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase    ArrayList<Transition> mTransitions = new ArrayList<Transition>();
54faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase    private boolean mPlayTogether = true;
55faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase    int mCurrentListeners;
56faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase    boolean mStarted = false;
57faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase
58faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase    /**
59d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase     * A flag used to indicate that the child transitions of this set
60faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase     * should all start at the same time.
61faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase     */
62d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    public static final int ORDERING_TOGETHER = 0;
63faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase    /**
64d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase     * A flag used to indicate that the child transitions of this set should
65faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase     * play in sequence; when one child transition ends, the next child
66faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase     * transition begins. Note that a transition does not end until all
67faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase     * instances of it (which are playing on all applicable targets of the
68faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase     * transition) end.
69faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase     */
70d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    public static final int ORDERING_SEQUENTIAL = 1;
71faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase
72faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase    /**
73d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase     * Constructs an empty transition set. Add child transitions to the
74d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase     * set by calling {@link #addTransition(Transition)} )}. By default,
75d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase     * child transitions will play {@link #ORDERING_TOGETHER together}.
76faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase     */
77d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    public TransitionSet() {
78faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase    }
79faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase
80faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase    /**
81d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase     * Sets the play order of this set's child transitions.
82faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase     *
83d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase     * @param ordering {@link #ORDERING_TOGETHER} to play this set's child
84d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase     * transitions together, {@link #ORDERING_SEQUENTIAL} to play the child
85faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase     * transitions in sequence.
86d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase     * @return This transitionSet object.
87faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase     */
88d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    public TransitionSet setOrdering(int ordering) {
89faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        switch (ordering) {
90d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase            case ORDERING_SEQUENTIAL:
91faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase                mPlayTogether = false;
92faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase                break;
93d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase            case ORDERING_TOGETHER:
94faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase                mPlayTogether = true;
95faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase                break;
96faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase            default:
97d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase                throw new AndroidRuntimeException("Invalid parameter for TransitionSet " +
98faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase                        "ordering: " + ordering);
99faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        }
100d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase        return this;
101faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase    }
102faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase
103faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase    /**
104d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase     * Returns the ordering of this TransitionSet. By default, the value is
105d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase     * {@link #ORDERING_TOGETHER}.
106d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase     *
107d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase     * @return {@link #ORDERING_TOGETHER} if child transitions will play at the same
108d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase     * time, {@link #ORDERING_SEQUENTIAL} if they will play in sequence.
109faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase     *
110d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase     * @see #setOrdering(int)
111faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase     */
112d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    public int getOrdering() {
113d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase        return mPlayTogether ? ORDERING_TOGETHER : ORDERING_SEQUENTIAL;
114d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    }
115d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase
116d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    /**
117d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase     * Adds child transition to this set. The order in which this child transition
118d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase     * is added relative to other child transitions that are added, in addition to
119d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase     * the {@link #getOrdering() ordering} property, determines the
120d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase     * order in which the transitions are started.
121d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase     *
122d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase     * <p>If this transitionSet has a {@link #getDuration() duration} set on it, the
123d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase     * child transition will inherit that duration. Transitions are assumed to have
124d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase     * a maximum of one transitionSet parent.</p>
125d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase     *
126d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase     * @param transition A non-null child transition to be added to this set.
127d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase     * @return This transitionSet object.
128d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase     */
129d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    public TransitionSet addTransition(Transition transition) {
130d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase        if (transition != null) {
131d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase            mTransitions.add(transition);
132d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase            transition.mParent = this;
133d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase            if (mDuration >= 0) {
134d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase                transition.setDuration(mDuration);
135faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase            }
136faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        }
137d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase        return this;
138faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase    }
139faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase
140faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase    /**
141d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase     * Setting a non-negative duration on a TransitionSet causes all of the child
142867a86613d4152a93423300f83597300e6ebeebeChet Haase     * transitions (current and future) to inherit this duration.
143867a86613d4152a93423300f83597300e6ebeebeChet Haase     *
144867a86613d4152a93423300f83597300e6ebeebeChet Haase     * @param duration The length of the animation, in milliseconds.
145d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase     * @return This transitionSet object.
146867a86613d4152a93423300f83597300e6ebeebeChet Haase     */
147867a86613d4152a93423300f83597300e6ebeebeChet Haase    @Override
148d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    public TransitionSet setDuration(long duration) {
149867a86613d4152a93423300f83597300e6ebeebeChet Haase        super.setDuration(duration);
150867a86613d4152a93423300f83597300e6ebeebeChet Haase        if (mDuration >= 0) {
151867a86613d4152a93423300f83597300e6ebeebeChet Haase            int numTransitions = mTransitions.size();
152867a86613d4152a93423300f83597300e6ebeebeChet Haase            for (int i = 0; i < numTransitions; ++i) {
153867a86613d4152a93423300f83597300e6ebeebeChet Haase                mTransitions.get(i).setDuration(duration);
154867a86613d4152a93423300f83597300e6ebeebeChet Haase            }
155867a86613d4152a93423300f83597300e6ebeebeChet Haase        }
156867a86613d4152a93423300f83597300e6ebeebeChet Haase        return this;
157867a86613d4152a93423300f83597300e6ebeebeChet Haase    }
158867a86613d4152a93423300f83597300e6ebeebeChet Haase
159d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    @Override
160d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    public TransitionSet setStartDelay(long startDelay) {
161d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase        return (TransitionSet) super.setStartDelay(startDelay);
162d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    }
163d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase
164d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    @Override
165d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    public TransitionSet setInterpolator(TimeInterpolator interpolator) {
166d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase        return (TransitionSet) super.setInterpolator(interpolator);
167d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    }
168d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase
169d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    @Override
170d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    public TransitionSet addTarget(View target) {
171d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount        for (int i = 0; i < mTransitions.size(); i++) {
172d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount            mTransitions.get(i).addTarget(target);
173d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount        }
174d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase        return (TransitionSet) super.addTarget(target);
175d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    }
176d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase
177d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    @Override
178ff58f92a0a77ad849ba714b5adac96790eca0048Chet Haase    public TransitionSet addTarget(int targetId) {
179d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount        for (int i = 0; i < mTransitions.size(); i++) {
180d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount            mTransitions.get(i).addTarget(targetId);
181d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount        }
182ff58f92a0a77ad849ba714b5adac96790eca0048Chet Haase        return (TransitionSet) super.addTarget(targetId);
183d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    }
184d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase
185d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    @Override
186d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount    public TransitionSet addTarget(String targetName) {
187d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount        for (int i = 0; i < mTransitions.size(); i++) {
188d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount            mTransitions.get(i).addTarget(targetName);
189d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount        }
190d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount        return (TransitionSet) super.addTarget(targetName);
191d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount    }
192d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount
193d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount    @Override
194d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount    public TransitionSet addTarget(Class targetType) {
195d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount        for (int i = 0; i < mTransitions.size(); i++) {
196d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount            mTransitions.get(i).addTarget(targetType);
197d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount        }
198d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount        return (TransitionSet) super.addTarget(targetType);
199d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount    }
200d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount
201d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount    @Override
202d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    public TransitionSet addListener(TransitionListener listener) {
203d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase        return (TransitionSet) super.addListener(listener);
204d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    }
205d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase
206d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    @Override
207ff58f92a0a77ad849ba714b5adac96790eca0048Chet Haase    public TransitionSet removeTarget(int targetId) {
208d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount        for (int i = 0; i < mTransitions.size(); i++) {
209d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount            mTransitions.get(i).removeTarget(targetId);
210d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount        }
211ff58f92a0a77ad849ba714b5adac96790eca0048Chet Haase        return (TransitionSet) super.removeTarget(targetId);
212d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    }
213d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase
214d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    @Override
215d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    public TransitionSet removeTarget(View target) {
216d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount        for (int i = 0; i < mTransitions.size(); i++) {
217d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount            mTransitions.get(i).removeTarget(target);
218d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount        }
219d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount        return (TransitionSet) super.removeTarget(target);
220d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount    }
221d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount
222d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount    @Override
223d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount    public TransitionSet removeTarget(Class target) {
224d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount        for (int i = 0; i < mTransitions.size(); i++) {
225d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount            mTransitions.get(i).removeTarget(target);
226d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount        }
227d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount        return (TransitionSet) super.removeTarget(target);
228d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount    }
229d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount
230d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount    @Override
231d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount    public TransitionSet removeTarget(String target) {
232d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount        for (int i = 0; i < mTransitions.size(); i++) {
233d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount            mTransitions.get(i).removeTarget(target);
234d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount        }
235d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase        return (TransitionSet) super.removeTarget(target);
236d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    }
237d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase
238d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    @Override
239d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount    public Transition excludeTarget(View target, boolean exclude) {
240d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount        for (int i = 0; i < mTransitions.size(); i++) {
241d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount            mTransitions.get(i).excludeTarget(target, exclude);
242d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount        }
243d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount        return super.excludeTarget(target, exclude);
244d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount    }
245d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount
246d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount    @Override
247d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount    public Transition excludeTarget(String targetViewName, boolean exclude) {
248d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount        for (int i = 0; i < mTransitions.size(); i++) {
249d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount            mTransitions.get(i).excludeTarget(targetViewName, exclude);
250d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount        }
251d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount        return super.excludeTarget(targetViewName, exclude);
252d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount    }
253d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount
254d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount    @Override
255d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount    public Transition excludeTarget(int targetId, boolean exclude) {
256d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount        for (int i = 0; i < mTransitions.size(); i++) {
257d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount            mTransitions.get(i).excludeTarget(targetId, exclude);
258d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount        }
259d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount        return super.excludeTarget(targetId, exclude);
260d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount    }
261d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount
262d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount    @Override
263d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount    public Transition excludeTarget(Class type, boolean exclude) {
264d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount        for (int i = 0; i < mTransitions.size(); i++) {
265d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount            mTransitions.get(i).excludeTarget(type, exclude);
266d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount        }
267d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount        return super.excludeTarget(type, exclude);
268d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount    }
269d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount
270d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount    @Override
271d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    public TransitionSet removeListener(TransitionListener listener) {
272d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase        return (TransitionSet) super.removeListener(listener);
273d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    }
274d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase
275867a86613d4152a93423300f83597300e6ebeebeChet Haase    /**
276d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase     * Removes the specified child transition from this set.
277faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase     *
278faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase     * @param transition The transition to be removed.
279d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase     * @return This transitionSet object.
280faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase     */
281d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    public TransitionSet removeTransition(Transition transition) {
282faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        mTransitions.remove(transition);
2836ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase        transition.mParent = null;
284d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase        return this;
285faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase    }
286faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase
287faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase    /**
288faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase     * Sets up listeners for each of the child transitions. This is used to
289d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase     * determine when this transition set is finished (all child transitions
290faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase     * must finish first).
291faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase     */
292faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase    private void setupStartEndListeners() {
293d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase        TransitionSetListener listener = new TransitionSetListener(this);
294faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        for (Transition childTransition : mTransitions) {
2956ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase            childTransition.addListener(listener);
296faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        }
297faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        mCurrentListeners = mTransitions.size();
298faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase    }
299faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase
300faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase    /**
301faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase     * This listener is used to detect when all child transitions are done, at
302d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase     * which point this transition set is also done.
303faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase     */
304d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    static class TransitionSetListener extends TransitionListenerAdapter {
305d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase        TransitionSet mTransitionSet;
306d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase        TransitionSetListener(TransitionSet transitionSet) {
307d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase            mTransitionSet = transitionSet;
3086ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase        }
309faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        @Override
310faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        public void onTransitionStart(Transition transition) {
311d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase            if (!mTransitionSet.mStarted) {
312d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase                mTransitionSet.start();
313d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase                mTransitionSet.mStarted = true;
314faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase            }
315faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        }
316faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase
317faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        @Override
318faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        public void onTransitionEnd(Transition transition) {
319d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase            --mTransitionSet.mCurrentListeners;
320d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase            if (mTransitionSet.mCurrentListeners == 0) {
321faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase                // All child trans
322d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase                mTransitionSet.mStarted = false;
323d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase                mTransitionSet.end();
324faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase            }
325faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase            transition.removeListener(this);
326faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        }
3276ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase    }
328faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase
329faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase    /**
330faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase     * @hide
331faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase     */
332faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase    @Override
333d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    protected void createAnimators(ViewGroup sceneRoot, TransitionValuesMaps startValues,
3346ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase            TransitionValuesMaps endValues) {
3358c0ceb34c3de5153dad162be719e2933c56886aeGeorge Mount        startValues = removeExcludes(startValues);
3368c0ceb34c3de5153dad162be719e2933c56886aeGeorge Mount        endValues = removeExcludes(endValues);
337faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        for (Transition childTransition : mTransitions) {
338d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase            childTransition.createAnimators(sceneRoot, startValues, endValues);
339faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        }
340faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase    }
341faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase
3428c0ceb34c3de5153dad162be719e2933c56886aeGeorge Mount    private TransitionValuesMaps removeExcludes(TransitionValuesMaps values) {
3438c0ceb34c3de5153dad162be719e2933c56886aeGeorge Mount        if (mTargetIds.isEmpty() && mTargetIdExcludes == null && mTargetTypeExcludes == null
3448c0ceb34c3de5153dad162be719e2933c56886aeGeorge Mount                && mTargets.isEmpty()) {
3458c0ceb34c3de5153dad162be719e2933c56886aeGeorge Mount            return values;
3468c0ceb34c3de5153dad162be719e2933c56886aeGeorge Mount        }
3478c0ceb34c3de5153dad162be719e2933c56886aeGeorge Mount        TransitionValuesMaps included = new TransitionValuesMaps();
3488c0ceb34c3de5153dad162be719e2933c56886aeGeorge Mount        int numValues = values.viewValues.size();
3498c0ceb34c3de5153dad162be719e2933c56886aeGeorge Mount        for (int i = 0; i < numValues; i++) {
3508c0ceb34c3de5153dad162be719e2933c56886aeGeorge Mount            View view = values.viewValues.keyAt(i);
35130da61d477bcb6cc7718f9516c444359352fe148George Mount            if (isValidTarget(view)) {
35230da61d477bcb6cc7718f9516c444359352fe148George Mount                addViewValues(included, view, values.viewValues.valueAt(i));
3538c0ceb34c3de5153dad162be719e2933c56886aeGeorge Mount            }
3548c0ceb34c3de5153dad162be719e2933c56886aeGeorge Mount        }
3558c0ceb34c3de5153dad162be719e2933c56886aeGeorge Mount        return included;
3568c0ceb34c3de5153dad162be719e2933c56886aeGeorge Mount    }
3578c0ceb34c3de5153dad162be719e2933c56886aeGeorge Mount
358faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase    /**
359faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase     * @hide
360faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase     */
361faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase    @Override
362d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    protected void runAnimators() {
363faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        setupStartEndListeners();
364faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        if (!mPlayTogether) {
365faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase            // Setup sequence with listeners
366faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase            // TODO: Need to add listeners in such a way that we can remove them later if canceled
367faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase            for (int i = 1; i < mTransitions.size(); ++i) {
368faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase                Transition previousTransition = mTransitions.get(i - 1);
369faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase                final Transition nextTransition = mTransitions.get(i);
370faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase                previousTransition.addListener(new TransitionListenerAdapter() {
371faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase                    @Override
372faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase                    public void onTransitionEnd(Transition transition) {
373d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase                        nextTransition.runAnimators();
374faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase                        transition.removeListener(this);
375faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase                    }
376faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase                });
377faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase            }
378faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase            Transition firstTransition = mTransitions.get(0);
379faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase            if (firstTransition != null) {
380d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase                firstTransition.runAnimators();
381faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase            }
382faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        } else {
383faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase            for (Transition childTransition : mTransitions) {
384d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase                childTransition.runAnimators();
385faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase            }
386faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        }
387faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase    }
388faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase
389faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase    @Override
390d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    public void captureStartValues(TransitionValues transitionValues) {
39130da61d477bcb6cc7718f9516c444359352fe148George Mount        if (isValidTarget(transitionValues.view)) {
392ff58f92a0a77ad849ba714b5adac96790eca0048Chet Haase            for (Transition childTransition : mTransitions) {
39330da61d477bcb6cc7718f9516c444359352fe148George Mount                if (childTransition.isValidTarget(transitionValues.view)) {
394ff58f92a0a77ad849ba714b5adac96790eca0048Chet Haase                    childTransition.captureStartValues(transitionValues);
395ff58f92a0a77ad849ba714b5adac96790eca0048Chet Haase                }
396d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase            }
397d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase        }
398d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    }
399d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase
400d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    @Override
401d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    public void captureEndValues(TransitionValues transitionValues) {
40230da61d477bcb6cc7718f9516c444359352fe148George Mount        if (isValidTarget(transitionValues.view)) {
403ff58f92a0a77ad849ba714b5adac96790eca0048Chet Haase            for (Transition childTransition : mTransitions) {
40430da61d477bcb6cc7718f9516c444359352fe148George Mount                if (childTransition.isValidTarget(transitionValues.view)) {
405ff58f92a0a77ad849ba714b5adac96790eca0048Chet Haase                    childTransition.captureEndValues(transitionValues);
406ff58f92a0a77ad849ba714b5adac96790eca0048Chet Haase                }
407faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase            }
408faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        }
409faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase    }
410faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase
411d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount    @Override
412d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount    void capturePropagationValues(TransitionValues transitionValues) {
413d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount        super.capturePropagationValues(transitionValues);
414d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount        int numTransitions = mTransitions.size();
415d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount        for (int i = 0; i < numTransitions; ++i) {
416d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount            mTransitions.get(i).capturePropagationValues(transitionValues);
417d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount        }
418d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount    }
419d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount
420199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase    /** @hide */
421faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase    @Override
422cf68aad3164303df59b2a669d186a94533c9c743George Mount    public void pause(View sceneRoot) {
423cf68aad3164303df59b2a669d186a94533c9c743George Mount        super.pause(sceneRoot);
424e9d32ea13ee14fc0eb4e45ca627ca77729d38bfeChet Haase        int numTransitions = mTransitions.size();
425e9d32ea13ee14fc0eb4e45ca627ca77729d38bfeChet Haase        for (int i = 0; i < numTransitions; ++i) {
426cf68aad3164303df59b2a669d186a94533c9c743George Mount            mTransitions.get(i).pause(sceneRoot);
427199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase        }
428199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase    }
429199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase
430199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase    /** @hide */
431199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase    @Override
432cf68aad3164303df59b2a669d186a94533c9c743George Mount    public void resume(View sceneRoot) {
433cf68aad3164303df59b2a669d186a94533c9c743George Mount        super.resume(sceneRoot);
434199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase        int numTransitions = mTransitions.size();
435199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase        for (int i = 0; i < numTransitions; ++i) {
436cf68aad3164303df59b2a669d186a94533c9c743George Mount            mTransitions.get(i).resume(sceneRoot);
437199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase        }
438199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase    }
439199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase
440d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    /** @hide */
441199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase    @Override
442199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase    protected void cancel() {
443199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase        super.cancel();
444199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase        int numTransitions = mTransitions.size();
445199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase        for (int i = 0; i < numTransitions; ++i) {
446199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase            mTransitions.get(i).cancel();
447e9d32ea13ee14fc0eb4e45ca627ca77729d38bfeChet Haase        }
448e9d32ea13ee14fc0eb4e45ca627ca77729d38bfeChet Haase    }
449e9d32ea13ee14fc0eb4e45ca627ca77729d38bfeChet Haase
450e9d32ea13ee14fc0eb4e45ca627ca77729d38bfeChet Haase    @Override
451d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    TransitionSet setSceneRoot(ViewGroup sceneRoot) {
4526ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase        super.setSceneRoot(sceneRoot);
4536ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase        int numTransitions = mTransitions.size();
4546ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase        for (int i = 0; i < numTransitions; ++i) {
4556ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase            mTransitions.get(i).setSceneRoot(sceneRoot);
4566ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase        }
457d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase        return (TransitionSet) this;
4586ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase    }
4596ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase
4606ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase    @Override
461b7a7fc9d233bad507ce893882352618b13647058Chet Haase    void setCanRemoveViews(boolean canRemoveViews) {
462b7a7fc9d233bad507ce893882352618b13647058Chet Haase        super.setCanRemoveViews(canRemoveViews);
463b7a7fc9d233bad507ce893882352618b13647058Chet Haase        int numTransitions = mTransitions.size();
464b7a7fc9d233bad507ce893882352618b13647058Chet Haase        for (int i = 0; i < numTransitions; ++i) {
465b7a7fc9d233bad507ce893882352618b13647058Chet Haase            mTransitions.get(i).setCanRemoveViews(canRemoveViews);
466b7a7fc9d233bad507ce893882352618b13647058Chet Haase        }
467b7a7fc9d233bad507ce893882352618b13647058Chet Haase    }
468b7a7fc9d233bad507ce893882352618b13647058Chet Haase
469b7a7fc9d233bad507ce893882352618b13647058Chet Haase    @Override
470d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount    public void setPropagation(TransitionPropagation propagation) {
471d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount        super.setPropagation(propagation);
472d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount        int numTransitions = mTransitions.size();
473d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount        for (int i = 0; i < numTransitions; ++i) {
474d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount            mTransitions.get(i).setPropagation(propagation);
475d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount        }
476d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount    }
477d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount
478d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount    @Override
479d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount    public void setEpicenterCallback(EpicenterCallback epicenterCallback) {
480d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount        super.setEpicenterCallback(epicenterCallback);
481d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount        int numTransitions = mTransitions.size();
482d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount        for (int i = 0; i < numTransitions; ++i) {
483d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount            mTransitions.get(i).setEpicenterCallback(epicenterCallback);
484d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount        }
485d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount    }
486d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount
487d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount    @Override
488faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase    String toString(String indent) {
489faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        String result = super.toString(indent);
490faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        for (int i = 0; i < mTransitions.size(); ++i) {
491faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase            result += "\n" + mTransitions.get(i).toString(indent + "  ");
492faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        }
493faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        return result;
494faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase    }
495faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase
4966ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase    @Override
497d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    public TransitionSet clone() {
498d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase        TransitionSet clone = (TransitionSet) super.clone();
4996ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase        clone.mTransitions = new ArrayList<Transition>();
5006ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase        int numTransitions = mTransitions.size();
5016ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase        for (int i = 0; i < numTransitions; ++i) {
502c46181a963be736186ae29101625a05b5c1f0ba8Chet Haase            clone.addTransition((Transition) mTransitions.get(i).clone());
5036ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase        }
5046ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase        return clone;
5056ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase    }
506faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase}
507