TransitionSet.java revision ecd857be3946283ebb4306e2c03ae70f5c5bb152
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
19ecd857be3946283ebb4306e2c03ae70f5c5bb152George Mountimport com.android.internal.R;
20ecd857be3946283ebb4306e2c03ae70f5c5bb152George Mount
21d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haaseimport android.animation.TimeInterpolator;
22ecd857be3946283ebb4306e2c03ae70f5c5bb152George Mountimport android.content.Context;
23ecd857be3946283ebb4306e2c03ae70f5c5bb152George Mountimport android.content.res.TypedArray;
24faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haaseimport android.util.AndroidRuntimeException;
25ecd857be3946283ebb4306e2c03ae70f5c5bb152George Mountimport android.util.AttributeSet;
26d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haaseimport android.view.View;
27faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haaseimport android.view.ViewGroup;
28faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase
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"
49aafc91c05acfb2d5a95f46f27e1deb2dfaa15c32Chet Haase *             android:ordering="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    /**
154d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase     * Setting a non-negative duration on a TransitionSet causes all of the child
155867a86613d4152a93423300f83597300e6ebeebeChet Haase     * transitions (current and future) to inherit this duration.
156867a86613d4152a93423300f83597300e6ebeebeChet Haase     *
157867a86613d4152a93423300f83597300e6ebeebeChet Haase     * @param duration The length of the animation, in milliseconds.
158d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase     * @return This transitionSet object.
159867a86613d4152a93423300f83597300e6ebeebeChet Haase     */
160867a86613d4152a93423300f83597300e6ebeebeChet Haase    @Override
161d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    public TransitionSet setDuration(long duration) {
162867a86613d4152a93423300f83597300e6ebeebeChet Haase        super.setDuration(duration);
163867a86613d4152a93423300f83597300e6ebeebeChet Haase        if (mDuration >= 0) {
164867a86613d4152a93423300f83597300e6ebeebeChet Haase            int numTransitions = mTransitions.size();
165867a86613d4152a93423300f83597300e6ebeebeChet Haase            for (int i = 0; i < numTransitions; ++i) {
166867a86613d4152a93423300f83597300e6ebeebeChet Haase                mTransitions.get(i).setDuration(duration);
167867a86613d4152a93423300f83597300e6ebeebeChet Haase            }
168867a86613d4152a93423300f83597300e6ebeebeChet Haase        }
169867a86613d4152a93423300f83597300e6ebeebeChet Haase        return this;
170867a86613d4152a93423300f83597300e6ebeebeChet Haase    }
171867a86613d4152a93423300f83597300e6ebeebeChet Haase
172d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    @Override
173d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    public TransitionSet setStartDelay(long startDelay) {
174d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase        return (TransitionSet) super.setStartDelay(startDelay);
175d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    }
176d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase
177d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    @Override
178d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    public TransitionSet setInterpolator(TimeInterpolator interpolator) {
179d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase        return (TransitionSet) super.setInterpolator(interpolator);
180d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    }
181d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase
182d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    @Override
183d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    public TransitionSet addTarget(View target) {
184d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount        for (int i = 0; i < mTransitions.size(); i++) {
185d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount            mTransitions.get(i).addTarget(target);
186d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount        }
187d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase        return (TransitionSet) super.addTarget(target);
188d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    }
189d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase
190d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    @Override
191ff58f92a0a77ad849ba714b5adac96790eca0048Chet Haase    public TransitionSet addTarget(int targetId) {
192d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount        for (int i = 0; i < mTransitions.size(); i++) {
193d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount            mTransitions.get(i).addTarget(targetId);
194d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount        }
195ff58f92a0a77ad849ba714b5adac96790eca0048Chet Haase        return (TransitionSet) super.addTarget(targetId);
196d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    }
197d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase
198d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    @Override
199d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount    public TransitionSet addTarget(String targetName) {
200d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount        for (int i = 0; i < mTransitions.size(); i++) {
201d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount            mTransitions.get(i).addTarget(targetName);
202d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount        }
203d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount        return (TransitionSet) super.addTarget(targetName);
204d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount    }
205d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount
206d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount    @Override
207d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount    public TransitionSet addTarget(Class targetType) {
208d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount        for (int i = 0; i < mTransitions.size(); i++) {
209d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount            mTransitions.get(i).addTarget(targetType);
210d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount        }
211d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount        return (TransitionSet) super.addTarget(targetType);
212d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount    }
213d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount
214d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount    @Override
215d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    public TransitionSet addListener(TransitionListener listener) {
216d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase        return (TransitionSet) super.addListener(listener);
217d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    }
218d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase
219d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    @Override
220ff58f92a0a77ad849ba714b5adac96790eca0048Chet Haase    public TransitionSet removeTarget(int targetId) {
221d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount        for (int i = 0; i < mTransitions.size(); i++) {
222d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount            mTransitions.get(i).removeTarget(targetId);
223d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount        }
224ff58f92a0a77ad849ba714b5adac96790eca0048Chet Haase        return (TransitionSet) super.removeTarget(targetId);
225d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    }
226d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase
227d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    @Override
228d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    public TransitionSet removeTarget(View target) {
229d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount        for (int i = 0; i < mTransitions.size(); i++) {
230d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount            mTransitions.get(i).removeTarget(target);
231d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount        }
232d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount        return (TransitionSet) super.removeTarget(target);
233d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount    }
234d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount
235d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount    @Override
236d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount    public TransitionSet removeTarget(Class target) {
237d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount        for (int i = 0; i < mTransitions.size(); i++) {
238d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount            mTransitions.get(i).removeTarget(target);
239d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount        }
240d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount        return (TransitionSet) super.removeTarget(target);
241d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount    }
242d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount
243d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount    @Override
244d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount    public TransitionSet removeTarget(String target) {
245d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount        for (int i = 0; i < mTransitions.size(); i++) {
246d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount            mTransitions.get(i).removeTarget(target);
247d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount        }
248d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase        return (TransitionSet) super.removeTarget(target);
249d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    }
250d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase
251d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    @Override
252d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount    public Transition excludeTarget(View target, boolean exclude) {
253d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount        for (int i = 0; i < mTransitions.size(); i++) {
254d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount            mTransitions.get(i).excludeTarget(target, exclude);
255d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount        }
256d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount        return super.excludeTarget(target, exclude);
257d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount    }
258d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount
259d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount    @Override
2600a2ae002e60f7ea9b6bea282086b5eb0ae3c6e51George Mount    public Transition excludeTarget(String targetName, boolean exclude) {
261d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount        for (int i = 0; i < mTransitions.size(); i++) {
2620a2ae002e60f7ea9b6bea282086b5eb0ae3c6e51George Mount            mTransitions.get(i).excludeTarget(targetName, exclude);
263d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount        }
2640a2ae002e60f7ea9b6bea282086b5eb0ae3c6e51George Mount        return super.excludeTarget(targetName, exclude);
265d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount    }
266d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount
267d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount    @Override
268d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount    public Transition excludeTarget(int targetId, boolean exclude) {
269d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount        for (int i = 0; i < mTransitions.size(); i++) {
270d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount            mTransitions.get(i).excludeTarget(targetId, exclude);
271d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount        }
272d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount        return super.excludeTarget(targetId, exclude);
273d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount    }
274d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount
275d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount    @Override
276d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount    public Transition excludeTarget(Class type, boolean exclude) {
277d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount        for (int i = 0; i < mTransitions.size(); i++) {
278d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount            mTransitions.get(i).excludeTarget(type, exclude);
279d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount        }
280d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount        return super.excludeTarget(type, exclude);
281d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount    }
282d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount
283d4c3c91dd0757eec9703ef90ea4c5a7ee99f18caGeorge Mount    @Override
284d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    public TransitionSet removeListener(TransitionListener listener) {
285d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase        return (TransitionSet) super.removeListener(listener);
286d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    }
287d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase
288ecd857be3946283ebb4306e2c03ae70f5c5bb152George Mount    @Override
289ecd857be3946283ebb4306e2c03ae70f5c5bb152George Mount    public void setPathMotion(PathMotion pathMotion) {
290ecd857be3946283ebb4306e2c03ae70f5c5bb152George Mount        super.setPathMotion(pathMotion);
291ecd857be3946283ebb4306e2c03ae70f5c5bb152George Mount        for (int i = 0; i < mTransitions.size(); i++) {
292ecd857be3946283ebb4306e2c03ae70f5c5bb152George Mount            mTransitions.get(i).setPathMotion(pathMotion);
293ecd857be3946283ebb4306e2c03ae70f5c5bb152George Mount        }
294ecd857be3946283ebb4306e2c03ae70f5c5bb152George Mount    }
295ecd857be3946283ebb4306e2c03ae70f5c5bb152George Mount
296867a86613d4152a93423300f83597300e6ebeebeChet Haase    /**
297d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase     * Removes the specified child transition from this set.
298faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase     *
299faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase     * @param transition The transition to be removed.
300d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase     * @return This transitionSet object.
301faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase     */
302d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    public TransitionSet removeTransition(Transition transition) {
303faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        mTransitions.remove(transition);
3046ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase        transition.mParent = null;
305d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase        return this;
306faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase    }
307faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase
308faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase    /**
309faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase     * Sets up listeners for each of the child transitions. This is used to
310d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase     * determine when this transition set is finished (all child transitions
311faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase     * must finish first).
312faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase     */
313faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase    private void setupStartEndListeners() {
314d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase        TransitionSetListener listener = new TransitionSetListener(this);
315faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        for (Transition childTransition : mTransitions) {
3166ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase            childTransition.addListener(listener);
317faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        }
318faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        mCurrentListeners = mTransitions.size();
319faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase    }
320faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase
321faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase    /**
322faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase     * This listener is used to detect when all child transitions are done, at
323d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase     * which point this transition set is also done.
324faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase     */
325d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    static class TransitionSetListener extends TransitionListenerAdapter {
326d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase        TransitionSet mTransitionSet;
327d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase        TransitionSetListener(TransitionSet transitionSet) {
328d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase            mTransitionSet = transitionSet;
3296ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase        }
330faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        @Override
331faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        public void onTransitionStart(Transition transition) {
332d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase            if (!mTransitionSet.mStarted) {
333d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase                mTransitionSet.start();
334d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase                mTransitionSet.mStarted = true;
335faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase            }
336faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        }
337faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase
338faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        @Override
339faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        public void onTransitionEnd(Transition transition) {
340d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase            --mTransitionSet.mCurrentListeners;
341d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase            if (mTransitionSet.mCurrentListeners == 0) {
342faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase                // All child trans
343d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase                mTransitionSet.mStarted = false;
344d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase                mTransitionSet.end();
345faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase            }
346faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase            transition.removeListener(this);
347faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        }
3486ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase    }
349faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase
350faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase    /**
351faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase     * @hide
352faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase     */
353faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase    @Override
354d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    protected void createAnimators(ViewGroup sceneRoot, TransitionValuesMaps startValues,
3556ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase            TransitionValuesMaps endValues) {
3568c0ceb34c3de5153dad162be719e2933c56886aeGeorge Mount        startValues = removeExcludes(startValues);
3578c0ceb34c3de5153dad162be719e2933c56886aeGeorge Mount        endValues = removeExcludes(endValues);
358faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        for (Transition childTransition : mTransitions) {
359d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase            childTransition.createAnimators(sceneRoot, startValues, endValues);
360faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        }
361faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase    }
362faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase
3638c0ceb34c3de5153dad162be719e2933c56886aeGeorge Mount    private TransitionValuesMaps removeExcludes(TransitionValuesMaps values) {
3648c0ceb34c3de5153dad162be719e2933c56886aeGeorge Mount        if (mTargetIds.isEmpty() && mTargetIdExcludes == null && mTargetTypeExcludes == null
3658c0ceb34c3de5153dad162be719e2933c56886aeGeorge Mount                && mTargets.isEmpty()) {
3668c0ceb34c3de5153dad162be719e2933c56886aeGeorge Mount            return values;
3678c0ceb34c3de5153dad162be719e2933c56886aeGeorge Mount        }
3688c0ceb34c3de5153dad162be719e2933c56886aeGeorge Mount        TransitionValuesMaps included = new TransitionValuesMaps();
3698c0ceb34c3de5153dad162be719e2933c56886aeGeorge Mount        int numValues = values.viewValues.size();
3708c0ceb34c3de5153dad162be719e2933c56886aeGeorge Mount        for (int i = 0; i < numValues; i++) {
3718c0ceb34c3de5153dad162be719e2933c56886aeGeorge Mount            View view = values.viewValues.keyAt(i);
37230da61d477bcb6cc7718f9516c444359352fe148George Mount            if (isValidTarget(view)) {
37330da61d477bcb6cc7718f9516c444359352fe148George Mount                addViewValues(included, view, values.viewValues.valueAt(i));
3748c0ceb34c3de5153dad162be719e2933c56886aeGeorge Mount            }
3758c0ceb34c3de5153dad162be719e2933c56886aeGeorge Mount        }
3768c0ceb34c3de5153dad162be719e2933c56886aeGeorge Mount        return included;
3778c0ceb34c3de5153dad162be719e2933c56886aeGeorge Mount    }
3788c0ceb34c3de5153dad162be719e2933c56886aeGeorge Mount
379faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase    /**
380faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase     * @hide
381faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase     */
382faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase    @Override
383d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    protected void runAnimators() {
384faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        setupStartEndListeners();
385faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        if (!mPlayTogether) {
386faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase            // Setup sequence with listeners
387faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase            // TODO: Need to add listeners in such a way that we can remove them later if canceled
388faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase            for (int i = 1; i < mTransitions.size(); ++i) {
389faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase                Transition previousTransition = mTransitions.get(i - 1);
390faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase                final Transition nextTransition = mTransitions.get(i);
391faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase                previousTransition.addListener(new TransitionListenerAdapter() {
392faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase                    @Override
393faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase                    public void onTransitionEnd(Transition transition) {
394d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase                        nextTransition.runAnimators();
395faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase                        transition.removeListener(this);
396faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase                    }
397faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase                });
398faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase            }
399faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase            Transition firstTransition = mTransitions.get(0);
400faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase            if (firstTransition != null) {
401d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase                firstTransition.runAnimators();
402faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase            }
403faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        } else {
404faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase            for (Transition childTransition : mTransitions) {
405d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase                childTransition.runAnimators();
406faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase            }
407faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        }
408faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase    }
409faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase
410faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase    @Override
411d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    public void captureStartValues(TransitionValues transitionValues) {
41230da61d477bcb6cc7718f9516c444359352fe148George Mount        if (isValidTarget(transitionValues.view)) {
413ff58f92a0a77ad849ba714b5adac96790eca0048Chet Haase            for (Transition childTransition : mTransitions) {
41430da61d477bcb6cc7718f9516c444359352fe148George Mount                if (childTransition.isValidTarget(transitionValues.view)) {
415ff58f92a0a77ad849ba714b5adac96790eca0048Chet Haase                    childTransition.captureStartValues(transitionValues);
416ff58f92a0a77ad849ba714b5adac96790eca0048Chet Haase                }
417d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase            }
418d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase        }
419d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    }
420d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase
421d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    @Override
422d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    public void captureEndValues(TransitionValues transitionValues) {
42330da61d477bcb6cc7718f9516c444359352fe148George Mount        if (isValidTarget(transitionValues.view)) {
424ff58f92a0a77ad849ba714b5adac96790eca0048Chet Haase            for (Transition childTransition : mTransitions) {
42530da61d477bcb6cc7718f9516c444359352fe148George Mount                if (childTransition.isValidTarget(transitionValues.view)) {
426ff58f92a0a77ad849ba714b5adac96790eca0048Chet Haase                    childTransition.captureEndValues(transitionValues);
427ff58f92a0a77ad849ba714b5adac96790eca0048Chet Haase                }
428faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase            }
429faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        }
430faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase    }
431faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase
432d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount    @Override
433d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount    void capturePropagationValues(TransitionValues transitionValues) {
434d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount        super.capturePropagationValues(transitionValues);
435d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount        int numTransitions = mTransitions.size();
436d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount        for (int i = 0; i < numTransitions; ++i) {
437d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount            mTransitions.get(i).capturePropagationValues(transitionValues);
438d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount        }
439d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount    }
440d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount
441199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase    /** @hide */
442faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase    @Override
443cf68aad3164303df59b2a669d186a94533c9c743George Mount    public void pause(View sceneRoot) {
444cf68aad3164303df59b2a669d186a94533c9c743George Mount        super.pause(sceneRoot);
445e9d32ea13ee14fc0eb4e45ca627ca77729d38bfeChet Haase        int numTransitions = mTransitions.size();
446e9d32ea13ee14fc0eb4e45ca627ca77729d38bfeChet Haase        for (int i = 0; i < numTransitions; ++i) {
447cf68aad3164303df59b2a669d186a94533c9c743George Mount            mTransitions.get(i).pause(sceneRoot);
448199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase        }
449199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase    }
450199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase
451199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase    /** @hide */
452199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase    @Override
453cf68aad3164303df59b2a669d186a94533c9c743George Mount    public void resume(View sceneRoot) {
454cf68aad3164303df59b2a669d186a94533c9c743George Mount        super.resume(sceneRoot);
455199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase        int numTransitions = mTransitions.size();
456199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase        for (int i = 0; i < numTransitions; ++i) {
457cf68aad3164303df59b2a669d186a94533c9c743George Mount            mTransitions.get(i).resume(sceneRoot);
458199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase        }
459199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase    }
460199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase
461d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    /** @hide */
462199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase    @Override
463199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase    protected void cancel() {
464199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase        super.cancel();
465199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase        int numTransitions = mTransitions.size();
466199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase        for (int i = 0; i < numTransitions; ++i) {
467199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase            mTransitions.get(i).cancel();
468e9d32ea13ee14fc0eb4e45ca627ca77729d38bfeChet Haase        }
469e9d32ea13ee14fc0eb4e45ca627ca77729d38bfeChet Haase    }
470e9d32ea13ee14fc0eb4e45ca627ca77729d38bfeChet Haase
471e9d32ea13ee14fc0eb4e45ca627ca77729d38bfeChet Haase    @Override
472d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    TransitionSet setSceneRoot(ViewGroup sceneRoot) {
4736ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase        super.setSceneRoot(sceneRoot);
4746ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase        int numTransitions = mTransitions.size();
4756ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase        for (int i = 0; i < numTransitions; ++i) {
4766ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase            mTransitions.get(i).setSceneRoot(sceneRoot);
4776ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase        }
478d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase        return (TransitionSet) this;
4796ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase    }
4806ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase
4816ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase    @Override
482b7a7fc9d233bad507ce893882352618b13647058Chet Haase    void setCanRemoveViews(boolean canRemoveViews) {
483b7a7fc9d233bad507ce893882352618b13647058Chet Haase        super.setCanRemoveViews(canRemoveViews);
484b7a7fc9d233bad507ce893882352618b13647058Chet Haase        int numTransitions = mTransitions.size();
485b7a7fc9d233bad507ce893882352618b13647058Chet Haase        for (int i = 0; i < numTransitions; ++i) {
486b7a7fc9d233bad507ce893882352618b13647058Chet Haase            mTransitions.get(i).setCanRemoveViews(canRemoveViews);
487b7a7fc9d233bad507ce893882352618b13647058Chet Haase        }
488b7a7fc9d233bad507ce893882352618b13647058Chet Haase    }
489b7a7fc9d233bad507ce893882352618b13647058Chet Haase
490b7a7fc9d233bad507ce893882352618b13647058Chet Haase    @Override
491d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount    public void setPropagation(TransitionPropagation propagation) {
492d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount        super.setPropagation(propagation);
493d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount        int numTransitions = mTransitions.size();
494d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount        for (int i = 0; i < numTransitions; ++i) {
495d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount            mTransitions.get(i).setPropagation(propagation);
496d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount        }
497d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount    }
498d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount
499d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount    @Override
500d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount    public void setEpicenterCallback(EpicenterCallback epicenterCallback) {
501d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount        super.setEpicenterCallback(epicenterCallback);
502d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount        int numTransitions = mTransitions.size();
503d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount        for (int i = 0; i < numTransitions; ++i) {
504d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount            mTransitions.get(i).setEpicenterCallback(epicenterCallback);
505d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount        }
506d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount    }
507d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount
508d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount    @Override
509faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase    String toString(String indent) {
510faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        String result = super.toString(indent);
511faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        for (int i = 0; i < mTransitions.size(); ++i) {
512faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase            result += "\n" + mTransitions.get(i).toString(indent + "  ");
513faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        }
514faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        return result;
515faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase    }
516faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase
5176ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase    @Override
518d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    public TransitionSet clone() {
519d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase        TransitionSet clone = (TransitionSet) super.clone();
5206ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase        clone.mTransitions = new ArrayList<Transition>();
5216ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase        int numTransitions = mTransitions.size();
5226ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase        for (int i = 0; i < numTransitions; ++i) {
523c46181a963be736186ae29101625a05b5c1f0ba8Chet Haase            clone.addTransition((Transition) mTransitions.get(i).clone());
5246ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase        }
5256ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase        return clone;
5266ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase    }
527faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase}
528