1c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki/*
2c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki * Copyright (C) 2016 The Android Open Source Project
3c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki *
4c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki * Licensed under the Apache License, Version 2.0 (the "License");
5c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki * you may not use this file except in compliance with the License.
6c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki * You may obtain a copy of the License at
7c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki *
8c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki *      http://www.apache.org/licenses/LICENSE-2.0
9c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki *
10c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki * Unless required by applicable law or agreed to in writing, software
11c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki * distributed under the License is distributed on an "AS IS" BASIS,
12c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki * See the License for the specific language governing permissions and
14c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki * limitations under the License.
15c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki */
16c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki
17c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Arakipackage android.support.transition;
18c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki
194e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Arakiimport static android.support.annotation.RestrictTo.Scope.LIBRARY_GROUP;
204e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki
214e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Arakiimport android.animation.TimeInterpolator;
228158051cdfef95fc1f22b56bba93b9c610f5ecb1Yuichi Arakiimport android.content.Context;
238158051cdfef95fc1f22b56bba93b9c610f5ecb1Yuichi Arakiimport android.content.res.TypedArray;
248158051cdfef95fc1f22b56bba93b9c610f5ecb1Yuichi Arakiimport android.content.res.XmlResourceParser;
254e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Arakiimport android.support.annotation.IdRes;
26cbba0a52f7d7b593dbb13a138515f066f75cce80Yuichi Arakiimport android.support.annotation.NonNull;
27cbba0a52f7d7b593dbb13a138515f066f75cce80Yuichi Arakiimport android.support.annotation.Nullable;
284e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Arakiimport android.support.annotation.RestrictTo;
298158051cdfef95fc1f22b56bba93b9c610f5ecb1Yuichi Arakiimport android.support.v4.content.res.TypedArrayUtils;
304e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Arakiimport android.util.AndroidRuntimeException;
318158051cdfef95fc1f22b56bba93b9c610f5ecb1Yuichi Arakiimport android.util.AttributeSet;
324e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Arakiimport android.view.View;
33c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Arakiimport android.view.ViewGroup;
34c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki
354e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Arakiimport java.util.ArrayList;
364e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki
37c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki/**
38c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki * A TransitionSet is a parent of child transitions (including other
39c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki * TransitionSets). Using TransitionSets enables more complex
40c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki * choreography of transitions, where some sets play {@link #ORDERING_TOGETHER} and
41c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki * others play {@link #ORDERING_SEQUENTIAL}. For example, {@link AutoTransition}
42c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki * uses a TransitionSet to sequentially play a Fade(Fade.OUT), followed by
43c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki * a {@link ChangeBounds}, followed by a Fade(Fade.OUT) transition.
44c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki *
458158051cdfef95fc1f22b56bba93b9c610f5ecb1Yuichi Araki * <p>A TransitionSet can be described in a resource file by using the
468158051cdfef95fc1f22b56bba93b9c610f5ecb1Yuichi Araki * tag <code>transitionSet</code>, along with the standard
478158051cdfef95fc1f22b56bba93b9c610f5ecb1Yuichi Araki * attributes of {@code TransitionSet} and {@link Transition}. Child transitions of the
488158051cdfef95fc1f22b56bba93b9c610f5ecb1Yuichi Araki * TransitionSet object can be loaded by adding those child tags inside the
498158051cdfef95fc1f22b56bba93b9c610f5ecb1Yuichi Araki * enclosing <code>transitionSet</code> tag. For example, the following xml
508158051cdfef95fc1f22b56bba93b9c610f5ecb1Yuichi Araki * describes a TransitionSet that plays a Fade and then a ChangeBounds
518158051cdfef95fc1f22b56bba93b9c610f5ecb1Yuichi Araki * transition on the affected view targets:</p>
528158051cdfef95fc1f22b56bba93b9c610f5ecb1Yuichi Araki * <pre>
538158051cdfef95fc1f22b56bba93b9c610f5ecb1Yuichi Araki *     &lt;transitionSet xmlns:android="http://schemas.android.com/apk/res/android"
548158051cdfef95fc1f22b56bba93b9c610f5ecb1Yuichi Araki *             android:ordering="sequential"&gt;
558158051cdfef95fc1f22b56bba93b9c610f5ecb1Yuichi Araki *         &lt;fade/&gt;
568158051cdfef95fc1f22b56bba93b9c610f5ecb1Yuichi Araki *         &lt;changeBounds/&gt;
578158051cdfef95fc1f22b56bba93b9c610f5ecb1Yuichi Araki *     &lt;/transitionSet&gt;
588158051cdfef95fc1f22b56bba93b9c610f5ecb1Yuichi Araki * </pre>
59c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki */
60c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Arakipublic class TransitionSet extends Transition {
61c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki
624e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki    private ArrayList<Transition> mTransitions = new ArrayList<>();
634e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki    private boolean mPlayTogether = true;
644e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki    private int mCurrentListeners;
654e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki    private boolean mStarted = false;
664e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki
67c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki    /**
68c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     * A flag used to indicate that the child transitions of this set
69c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     * should all start at the same time.
70c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     */
71c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki    public static final int ORDERING_TOGETHER = 0;
72c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki
73c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki    /**
74c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     * A flag used to indicate that the child transitions of this set should
75c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     * play in sequence; when one child transition ends, the next child
76c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     * transition begins. Note that a transition does not end until all
77c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     * instances of it (which are playing on all applicable targets of the
78c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     * transition) end.
79c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     */
80c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki    public static final int ORDERING_SEQUENTIAL = 1;
81c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki
82c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki    /**
83c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     * Constructs an empty transition set. Add child transitions to the
84c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     * set by calling {@link #addTransition(Transition)} )}. By default,
85c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     * child transitions will play {@link #ORDERING_TOGETHER together}.
86c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     */
87c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki    public TransitionSet() {
88c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki    }
89c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki
908158051cdfef95fc1f22b56bba93b9c610f5ecb1Yuichi Araki    public TransitionSet(Context context, AttributeSet attrs) {
918158051cdfef95fc1f22b56bba93b9c610f5ecb1Yuichi Araki        super(context, attrs);
928158051cdfef95fc1f22b56bba93b9c610f5ecb1Yuichi Araki        TypedArray a = context.obtainStyledAttributes(attrs, Styleable.TRANSITION_SET);
938158051cdfef95fc1f22b56bba93b9c610f5ecb1Yuichi Araki        int ordering = TypedArrayUtils.getNamedInt(a, (XmlResourceParser) attrs,
948158051cdfef95fc1f22b56bba93b9c610f5ecb1Yuichi Araki                "transitionOrdering", Styleable.TransitionSet.TRANSITION_ORDERING,
958158051cdfef95fc1f22b56bba93b9c610f5ecb1Yuichi Araki                TransitionSet.ORDERING_TOGETHER);
968158051cdfef95fc1f22b56bba93b9c610f5ecb1Yuichi Araki        setOrdering(ordering);
978158051cdfef95fc1f22b56bba93b9c610f5ecb1Yuichi Araki        a.recycle();
988158051cdfef95fc1f22b56bba93b9c610f5ecb1Yuichi Araki    }
998158051cdfef95fc1f22b56bba93b9c610f5ecb1Yuichi Araki
100c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki    /**
101c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     * Sets the play order of this set's child transitions.
102c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     *
103c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     * @param ordering {@link #ORDERING_TOGETHER} to play this set's child
104c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     *                 transitions together, {@link #ORDERING_SEQUENTIAL} to play the child
105c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     *                 transitions in sequence.
106c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     * @return This transitionSet object.
107c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     */
108cbba0a52f7d7b593dbb13a138515f066f75cce80Yuichi Araki    @NonNull
109c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki    public TransitionSet setOrdering(int ordering) {
1104e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki        switch (ordering) {
1114e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki            case ORDERING_SEQUENTIAL:
1124e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki                mPlayTogether = false;
1134e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki                break;
1144e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki            case ORDERING_TOGETHER:
1154e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki                mPlayTogether = true;
1164e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki                break;
1174e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki            default:
1184e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki                throw new AndroidRuntimeException("Invalid parameter for TransitionSet "
1194e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki                        + "ordering: " + ordering);
1204e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki        }
121c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki        return this;
122c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki    }
123c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki
124c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki    /**
1254e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki     * Returns the ordering of this TransitionSet. By default, the value is
1264e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki     * {@link #ORDERING_TOGETHER}.
1274e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki     *
1284e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki     * @return {@link #ORDERING_TOGETHER} if child transitions will play at the same
1294e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki     * time, {@link #ORDERING_SEQUENTIAL} if they will play in sequence.
1304e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki     * @see #setOrdering(int)
1314e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki     */
1324e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki    public int getOrdering() {
1334e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki        return mPlayTogether ? ORDERING_TOGETHER : ORDERING_SEQUENTIAL;
1344e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki    }
1354e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki
1364e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki    /**
137c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     * Adds child transition to this set. The order in which this child transition
138c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     * is added relative to other child transitions that are added, in addition to
139c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     * the {@link #getOrdering() ordering} property, determines the
140c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     * order in which the transitions are started.
141c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     *
142c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     * <p>If this transitionSet has a {@link #getDuration() duration} set on it, the
143c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     * child transition will inherit that duration. Transitions are assumed to have
144c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     * a maximum of one transitionSet parent.</p>
145c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     *
146c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     * @param transition A non-null child transition to be added to this set.
147c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     * @return This transitionSet object.
148c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     */
149cbba0a52f7d7b593dbb13a138515f066f75cce80Yuichi Araki    @NonNull
150cbba0a52f7d7b593dbb13a138515f066f75cce80Yuichi Araki    public TransitionSet addTransition(@NonNull Transition transition) {
1514e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki        mTransitions.add(transition);
1524e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki        transition.mParent = this;
1534e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki        if (mDuration >= 0) {
1544e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki            transition.setDuration(mDuration);
1554e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki        }
1564e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki        return this;
1574e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki    }
1584e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki
1594e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki    /**
160622113c7a43b14b2bee02665a647b012dd0e1a1bYuichi Araki     * Returns the number of child transitions in the TransitionSet.
161622113c7a43b14b2bee02665a647b012dd0e1a1bYuichi Araki     *
162622113c7a43b14b2bee02665a647b012dd0e1a1bYuichi Araki     * @return The number of child transitions in the TransitionSet.
163622113c7a43b14b2bee02665a647b012dd0e1a1bYuichi Araki     * @see #addTransition(Transition)
164622113c7a43b14b2bee02665a647b012dd0e1a1bYuichi Araki     * @see #getTransitionAt(int)
165622113c7a43b14b2bee02665a647b012dd0e1a1bYuichi Araki     */
166622113c7a43b14b2bee02665a647b012dd0e1a1bYuichi Araki    public int getTransitionCount() {
167622113c7a43b14b2bee02665a647b012dd0e1a1bYuichi Araki        return mTransitions.size();
168622113c7a43b14b2bee02665a647b012dd0e1a1bYuichi Araki    }
169622113c7a43b14b2bee02665a647b012dd0e1a1bYuichi Araki
170622113c7a43b14b2bee02665a647b012dd0e1a1bYuichi Araki    /**
171622113c7a43b14b2bee02665a647b012dd0e1a1bYuichi Araki     * Returns the child Transition at the specified position in the TransitionSet.
172622113c7a43b14b2bee02665a647b012dd0e1a1bYuichi Araki     *
173622113c7a43b14b2bee02665a647b012dd0e1a1bYuichi Araki     * @param index The position of the Transition to retrieve.
174622113c7a43b14b2bee02665a647b012dd0e1a1bYuichi Araki     * @see #addTransition(Transition)
175622113c7a43b14b2bee02665a647b012dd0e1a1bYuichi Araki     * @see #getTransitionCount()
176622113c7a43b14b2bee02665a647b012dd0e1a1bYuichi Araki     */
177622113c7a43b14b2bee02665a647b012dd0e1a1bYuichi Araki    public Transition getTransitionAt(int index) {
178622113c7a43b14b2bee02665a647b012dd0e1a1bYuichi Araki        if (index < 0 || index >= mTransitions.size()) {
179622113c7a43b14b2bee02665a647b012dd0e1a1bYuichi Araki            return null;
180622113c7a43b14b2bee02665a647b012dd0e1a1bYuichi Araki        }
181622113c7a43b14b2bee02665a647b012dd0e1a1bYuichi Araki        return mTransitions.get(index);
182622113c7a43b14b2bee02665a647b012dd0e1a1bYuichi Araki    }
183622113c7a43b14b2bee02665a647b012dd0e1a1bYuichi Araki
184622113c7a43b14b2bee02665a647b012dd0e1a1bYuichi Araki    /**
1854e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki     * Setting a non-negative duration on a TransitionSet causes all of the child
1864e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki     * transitions (current and future) to inherit this duration.
1874e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki     *
1884e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki     * @param duration The length of the animation, in milliseconds.
1894e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki     * @return This transitionSet object.
1904e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki     */
1914e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki    @NonNull
1924e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki    @Override
1934e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki    public TransitionSet setDuration(long duration) {
1944e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki        super.setDuration(duration);
1954e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki        if (mDuration >= 0) {
1964e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki            int numTransitions = mTransitions.size();
1974e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki            for (int i = 0; i < numTransitions; ++i) {
1984e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki                mTransitions.get(i).setDuration(duration);
1994e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki            }
2004e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki        }
201c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki        return this;
202c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki    }
203c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki
2044e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki    @NonNull
2054e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki    @Override
2064e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki    public TransitionSet setStartDelay(long startDelay) {
2074e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki        return (TransitionSet) super.setStartDelay(startDelay);
2084e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki    }
2094e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki
2104e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki    @NonNull
2114e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki    @Override
2124e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki    public TransitionSet setInterpolator(@Nullable TimeInterpolator interpolator) {
2134e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki        return (TransitionSet) super.setInterpolator(interpolator);
2144e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki    }
2154e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki
2164e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki    @NonNull
2174e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki    @Override
2184e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki    public TransitionSet addTarget(@NonNull View target) {
2194e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki        for (int i = 0; i < mTransitions.size(); i++) {
2204e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki            mTransitions.get(i).addTarget(target);
2214e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki        }
2224e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki        return (TransitionSet) super.addTarget(target);
2234e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki    }
2244e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki
2254e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki    @NonNull
2264e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki    @Override
2274e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki    public TransitionSet addTarget(@IdRes int targetId) {
2284e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki        for (int i = 0; i < mTransitions.size(); i++) {
2294e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki            mTransitions.get(i).addTarget(targetId);
2304e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki        }
2314e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki        return (TransitionSet) super.addTarget(targetId);
2324e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki    }
2334e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki
2344e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki    @NonNull
2354e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki    @Override
236622113c7a43b14b2bee02665a647b012dd0e1a1bYuichi Araki    public TransitionSet addTarget(@NonNull String targetName) {
237622113c7a43b14b2bee02665a647b012dd0e1a1bYuichi Araki        for (int i = 0; i < mTransitions.size(); i++) {
238622113c7a43b14b2bee02665a647b012dd0e1a1bYuichi Araki            mTransitions.get(i).addTarget(targetName);
239622113c7a43b14b2bee02665a647b012dd0e1a1bYuichi Araki        }
240622113c7a43b14b2bee02665a647b012dd0e1a1bYuichi Araki        return (TransitionSet) super.addTarget(targetName);
241622113c7a43b14b2bee02665a647b012dd0e1a1bYuichi Araki    }
242622113c7a43b14b2bee02665a647b012dd0e1a1bYuichi Araki
243622113c7a43b14b2bee02665a647b012dd0e1a1bYuichi Araki    @NonNull
244622113c7a43b14b2bee02665a647b012dd0e1a1bYuichi Araki    @Override
245622113c7a43b14b2bee02665a647b012dd0e1a1bYuichi Araki    public TransitionSet addTarget(@NonNull Class targetType) {
246622113c7a43b14b2bee02665a647b012dd0e1a1bYuichi Araki        for (int i = 0; i < mTransitions.size(); i++) {
247622113c7a43b14b2bee02665a647b012dd0e1a1bYuichi Araki            mTransitions.get(i).addTarget(targetType);
248622113c7a43b14b2bee02665a647b012dd0e1a1bYuichi Araki        }
249622113c7a43b14b2bee02665a647b012dd0e1a1bYuichi Araki        return (TransitionSet) super.addTarget(targetType);
250622113c7a43b14b2bee02665a647b012dd0e1a1bYuichi Araki    }
251622113c7a43b14b2bee02665a647b012dd0e1a1bYuichi Araki
252622113c7a43b14b2bee02665a647b012dd0e1a1bYuichi Araki    @NonNull
253622113c7a43b14b2bee02665a647b012dd0e1a1bYuichi Araki    @Override
2544e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki    public TransitionSet addListener(@NonNull TransitionListener listener) {
2554e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki        return (TransitionSet) super.addListener(listener);
2564e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki    }
2574e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki
2584e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki    @NonNull
2594e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki    @Override
2604e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki    public TransitionSet removeTarget(@IdRes int targetId) {
2614e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki        for (int i = 0; i < mTransitions.size(); i++) {
2624e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki            mTransitions.get(i).removeTarget(targetId);
2634e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki        }
2644e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki        return (TransitionSet) super.removeTarget(targetId);
2654e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki    }
2664e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki
2674e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki    @NonNull
2684e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki    @Override
2694e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki    public TransitionSet removeTarget(@NonNull View target) {
2704e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki        for (int i = 0; i < mTransitions.size(); i++) {
2714e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki            mTransitions.get(i).removeTarget(target);
2724e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki        }
2734e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki        return (TransitionSet) super.removeTarget(target);
2744e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki    }
2754e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki
2764e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki    @NonNull
2774e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki    @Override
278622113c7a43b14b2bee02665a647b012dd0e1a1bYuichi Araki    public TransitionSet removeTarget(@NonNull Class target) {
279622113c7a43b14b2bee02665a647b012dd0e1a1bYuichi Araki        for (int i = 0; i < mTransitions.size(); i++) {
280622113c7a43b14b2bee02665a647b012dd0e1a1bYuichi Araki            mTransitions.get(i).removeTarget(target);
281622113c7a43b14b2bee02665a647b012dd0e1a1bYuichi Araki        }
282622113c7a43b14b2bee02665a647b012dd0e1a1bYuichi Araki        return (TransitionSet) super.removeTarget(target);
283622113c7a43b14b2bee02665a647b012dd0e1a1bYuichi Araki    }
284622113c7a43b14b2bee02665a647b012dd0e1a1bYuichi Araki
285622113c7a43b14b2bee02665a647b012dd0e1a1bYuichi Araki    @NonNull
286622113c7a43b14b2bee02665a647b012dd0e1a1bYuichi Araki    @Override
287622113c7a43b14b2bee02665a647b012dd0e1a1bYuichi Araki    public TransitionSet removeTarget(@NonNull String target) {
288622113c7a43b14b2bee02665a647b012dd0e1a1bYuichi Araki        for (int i = 0; i < mTransitions.size(); i++) {
289622113c7a43b14b2bee02665a647b012dd0e1a1bYuichi Araki            mTransitions.get(i).removeTarget(target);
290622113c7a43b14b2bee02665a647b012dd0e1a1bYuichi Araki        }
291622113c7a43b14b2bee02665a647b012dd0e1a1bYuichi Araki        return (TransitionSet) super.removeTarget(target);
292622113c7a43b14b2bee02665a647b012dd0e1a1bYuichi Araki    }
293622113c7a43b14b2bee02665a647b012dd0e1a1bYuichi Araki
294622113c7a43b14b2bee02665a647b012dd0e1a1bYuichi Araki    @NonNull
295622113c7a43b14b2bee02665a647b012dd0e1a1bYuichi Araki    @Override
296622113c7a43b14b2bee02665a647b012dd0e1a1bYuichi Araki    public Transition excludeTarget(@NonNull View target, boolean exclude) {
297622113c7a43b14b2bee02665a647b012dd0e1a1bYuichi Araki        for (int i = 0; i < mTransitions.size(); i++) {
298622113c7a43b14b2bee02665a647b012dd0e1a1bYuichi Araki            mTransitions.get(i).excludeTarget(target, exclude);
299622113c7a43b14b2bee02665a647b012dd0e1a1bYuichi Araki        }
300622113c7a43b14b2bee02665a647b012dd0e1a1bYuichi Araki        return super.excludeTarget(target, exclude);
301622113c7a43b14b2bee02665a647b012dd0e1a1bYuichi Araki    }
302622113c7a43b14b2bee02665a647b012dd0e1a1bYuichi Araki
303622113c7a43b14b2bee02665a647b012dd0e1a1bYuichi Araki    @NonNull
304622113c7a43b14b2bee02665a647b012dd0e1a1bYuichi Araki    @Override
305622113c7a43b14b2bee02665a647b012dd0e1a1bYuichi Araki    public Transition excludeTarget(@NonNull String targetName, boolean exclude) {
306622113c7a43b14b2bee02665a647b012dd0e1a1bYuichi Araki        for (int i = 0; i < mTransitions.size(); i++) {
307622113c7a43b14b2bee02665a647b012dd0e1a1bYuichi Araki            mTransitions.get(i).excludeTarget(targetName, exclude);
308622113c7a43b14b2bee02665a647b012dd0e1a1bYuichi Araki        }
309622113c7a43b14b2bee02665a647b012dd0e1a1bYuichi Araki        return super.excludeTarget(targetName, exclude);
310622113c7a43b14b2bee02665a647b012dd0e1a1bYuichi Araki    }
311622113c7a43b14b2bee02665a647b012dd0e1a1bYuichi Araki
312622113c7a43b14b2bee02665a647b012dd0e1a1bYuichi Araki    @NonNull
313622113c7a43b14b2bee02665a647b012dd0e1a1bYuichi Araki    @Override
314622113c7a43b14b2bee02665a647b012dd0e1a1bYuichi Araki    public Transition excludeTarget(int targetId, boolean exclude) {
315622113c7a43b14b2bee02665a647b012dd0e1a1bYuichi Araki        for (int i = 0; i < mTransitions.size(); i++) {
316622113c7a43b14b2bee02665a647b012dd0e1a1bYuichi Araki            mTransitions.get(i).excludeTarget(targetId, exclude);
317622113c7a43b14b2bee02665a647b012dd0e1a1bYuichi Araki        }
318622113c7a43b14b2bee02665a647b012dd0e1a1bYuichi Araki        return super.excludeTarget(targetId, exclude);
319622113c7a43b14b2bee02665a647b012dd0e1a1bYuichi Araki    }
320622113c7a43b14b2bee02665a647b012dd0e1a1bYuichi Araki
321622113c7a43b14b2bee02665a647b012dd0e1a1bYuichi Araki    @NonNull
322622113c7a43b14b2bee02665a647b012dd0e1a1bYuichi Araki    @Override
323622113c7a43b14b2bee02665a647b012dd0e1a1bYuichi Araki    public Transition excludeTarget(@NonNull Class type, boolean exclude) {
324622113c7a43b14b2bee02665a647b012dd0e1a1bYuichi Araki        for (int i = 0; i < mTransitions.size(); i++) {
325622113c7a43b14b2bee02665a647b012dd0e1a1bYuichi Araki            mTransitions.get(i).excludeTarget(type, exclude);
326622113c7a43b14b2bee02665a647b012dd0e1a1bYuichi Araki        }
327622113c7a43b14b2bee02665a647b012dd0e1a1bYuichi Araki        return super.excludeTarget(type, exclude);
328622113c7a43b14b2bee02665a647b012dd0e1a1bYuichi Araki    }
329622113c7a43b14b2bee02665a647b012dd0e1a1bYuichi Araki
330622113c7a43b14b2bee02665a647b012dd0e1a1bYuichi Araki    @NonNull
331622113c7a43b14b2bee02665a647b012dd0e1a1bYuichi Araki    @Override
3324e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki    public TransitionSet removeListener(@NonNull TransitionListener listener) {
3334e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki        return (TransitionSet) super.removeListener(listener);
3344e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki    }
3354e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki
336317d4bb802dbd80c9ddf1382e037769e58dff919Yuichi Araki    @Override
337317d4bb802dbd80c9ddf1382e037769e58dff919Yuichi Araki    public void setPathMotion(PathMotion pathMotion) {
338317d4bb802dbd80c9ddf1382e037769e58dff919Yuichi Araki        super.setPathMotion(pathMotion);
339317d4bb802dbd80c9ddf1382e037769e58dff919Yuichi Araki        for (int i = 0; i < mTransitions.size(); i++) {
340317d4bb802dbd80c9ddf1382e037769e58dff919Yuichi Araki            mTransitions.get(i).setPathMotion(pathMotion);
341317d4bb802dbd80c9ddf1382e037769e58dff919Yuichi Araki        }
342317d4bb802dbd80c9ddf1382e037769e58dff919Yuichi Araki    }
343317d4bb802dbd80c9ddf1382e037769e58dff919Yuichi Araki
344c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki    /**
345c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     * Removes the specified child transition from this set.
346c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     *
347c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     * @param transition The transition to be removed.
348c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     * @return This transitionSet object.
349c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     */
350cbba0a52f7d7b593dbb13a138515f066f75cce80Yuichi Araki    @NonNull
351cbba0a52f7d7b593dbb13a138515f066f75cce80Yuichi Araki    public TransitionSet removeTransition(@NonNull Transition transition) {
3524e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki        mTransitions.remove(transition);
3534e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki        transition.mParent = null;
354c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki        return this;
355c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki    }
356c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki
3574e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki    /**
3584e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki     * Sets up listeners for each of the child transitions. This is used to
3594e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki     * determine when this transition set is finished (all child transitions
3604e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki     * must finish first).
3614e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki     */
3624e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki    private void setupStartEndListeners() {
3634e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki        TransitionSetListener listener = new TransitionSetListener(this);
3644e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki        for (Transition childTransition : mTransitions) {
3654e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki            childTransition.addListener(listener);
3664e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki        }
3674e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki        mCurrentListeners = mTransitions.size();
3684e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki    }
3694e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki
3704e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki    /**
3714e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki     * This listener is used to detect when all child transitions are done, at
3724e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki     * which point this transition set is also done.
3734e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki     */
3744e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki    static class TransitionSetListener extends TransitionListenerAdapter {
3754e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki
3764e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki        TransitionSet mTransitionSet;
3774e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki
3784e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki        TransitionSetListener(TransitionSet transitionSet) {
3794e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki            mTransitionSet = transitionSet;
3804e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki        }
3814e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki
3824e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki        @Override
3834e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki        public void onTransitionStart(@NonNull Transition transition) {
3844e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki            if (!mTransitionSet.mStarted) {
3854e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki                mTransitionSet.start();
3864e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki                mTransitionSet.mStarted = true;
3874e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki            }
3884e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki        }
3894e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki
3904e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki        @Override
3914e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki        public void onTransitionEnd(@NonNull Transition transition) {
3924e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki            --mTransitionSet.mCurrentListeners;
3934e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki            if (mTransitionSet.mCurrentListeners == 0) {
3944e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki                // All child trans
3954e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki                mTransitionSet.mStarted = false;
3964e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki                mTransitionSet.end();
3974e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki            }
3984e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki            transition.removeListener(this);
3994e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki        }
4004e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki
4014e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki    }
4024e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki
4034e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki    /**
4044e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki     * @hide
4054e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki     */
4064e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki    @RestrictTo(LIBRARY_GROUP)
407c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki    @Override
4084e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki    protected void createAnimators(ViewGroup sceneRoot, TransitionValuesMaps startValues,
409756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki            TransitionValuesMaps endValues, ArrayList<TransitionValues> startValuesList,
410756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki            ArrayList<TransitionValues> endValuesList) {
411756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki        long startDelay = getStartDelay();
412756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki        int numTransitions = mTransitions.size();
413756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki        for (int i = 0; i < numTransitions; i++) {
414756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki            Transition childTransition = mTransitions.get(i);
415756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki            // We only set the start delay on the first transition if we are playing
416756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki            // the transitions sequentially.
417756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki            if (startDelay > 0 && (mPlayTogether || i == 0)) {
418756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki                long childStartDelay = childTransition.getStartDelay();
419756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki                if (childStartDelay > 0) {
420756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki                    childTransition.setStartDelay(startDelay + childStartDelay);
421756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki                } else {
422756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki                    childTransition.setStartDelay(startDelay);
423756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki                }
424756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki            }
425756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki            childTransition.createAnimators(sceneRoot, startValues, endValues, startValuesList,
426756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki                    endValuesList);
4274e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki        }
4284e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki    }
4294e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki
4304e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki    /**
4314e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki     * @hide
4324e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki     */
4334e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki    @RestrictTo(LIBRARY_GROUP)
4344e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki    @Override
4354e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki    protected void runAnimators() {
4364e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki        if (mTransitions.isEmpty()) {
4374e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki            start();
4384e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki            end();
4394e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki            return;
4404e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki        }
4414e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki        setupStartEndListeners();
4424e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki        if (!mPlayTogether) {
4434e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki            // Setup sequence with listeners
4444e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki            // TODO: Need to add listeners in such a way that we can remove them later if canceled
4454e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki            for (int i = 1; i < mTransitions.size(); ++i) {
4464e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki                Transition previousTransition = mTransitions.get(i - 1);
4474e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki                final Transition nextTransition = mTransitions.get(i);
4484e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki                previousTransition.addListener(new TransitionListenerAdapter() {
4494e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki                    @Override
4504e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki                    public void onTransitionEnd(@NonNull Transition transition) {
4514e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki                        nextTransition.runAnimators();
4524e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki                        transition.removeListener(this);
4534e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki                    }
4544e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki                });
4554e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki            }
4564e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki            Transition firstTransition = mTransitions.get(0);
4574e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki            if (firstTransition != null) {
4584e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki                firstTransition.runAnimators();
4594e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki            }
4604e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki        } else {
4614e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki            for (Transition childTransition : mTransitions) {
4624e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki                childTransition.runAnimators();
4634e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki            }
4644e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki        }
465c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki    }
466c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki
467c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki    @Override
468cbba0a52f7d7b593dbb13a138515f066f75cce80Yuichi Araki    public void captureStartValues(@NonNull TransitionValues transitionValues) {
469756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki        if (isValidTarget(transitionValues.view)) {
4704e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki            for (Transition childTransition : mTransitions) {
471756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki                if (childTransition.isValidTarget(transitionValues.view)) {
4724e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki                    childTransition.captureStartValues(transitionValues);
473756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki                    transitionValues.mTargetedTransitions.add(childTransition);
4744e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki                }
4754e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki            }
4764e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki        }
4774e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki    }
4784e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki
4794e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki    @Override
4804e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki    public void captureEndValues(@NonNull TransitionValues transitionValues) {
481756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki        if (isValidTarget(transitionValues.view)) {
4824e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki            for (Transition childTransition : mTransitions) {
483756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki                if (childTransition.isValidTarget(transitionValues.view)) {
4844e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki                    childTransition.captureEndValues(transitionValues);
485756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki                    transitionValues.mTargetedTransitions.add(childTransition);
4864e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki                }
4874e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki            }
4884e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki        }
4894e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki    }
4904e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki
4914c904b38c763179727b9b5ea7a80454630545663Yuichi Araki    @Override
4924c904b38c763179727b9b5ea7a80454630545663Yuichi Araki    void capturePropagationValues(TransitionValues transitionValues) {
4934c904b38c763179727b9b5ea7a80454630545663Yuichi Araki        super.capturePropagationValues(transitionValues);
4944c904b38c763179727b9b5ea7a80454630545663Yuichi Araki        int numTransitions = mTransitions.size();
4954c904b38c763179727b9b5ea7a80454630545663Yuichi Araki        for (int i = 0; i < numTransitions; ++i) {
4964c904b38c763179727b9b5ea7a80454630545663Yuichi Araki            mTransitions.get(i).capturePropagationValues(transitionValues);
4974c904b38c763179727b9b5ea7a80454630545663Yuichi Araki        }
4984c904b38c763179727b9b5ea7a80454630545663Yuichi Araki    }
4994c904b38c763179727b9b5ea7a80454630545663Yuichi Araki
5004e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki    /** @hide */
5014e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki    @RestrictTo(LIBRARY_GROUP)
5024e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki    @Override
5034e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki    public void pause(View sceneRoot) {
5044e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki        super.pause(sceneRoot);
5054e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki        int numTransitions = mTransitions.size();
5064e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki        for (int i = 0; i < numTransitions; ++i) {
5074e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki            mTransitions.get(i).pause(sceneRoot);
5084e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki        }
5094e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki    }
5104e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki
5114e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki    /** @hide */
5124e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki    @RestrictTo(LIBRARY_GROUP)
5134e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki    @Override
5144e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki    public void resume(View sceneRoot) {
5154e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki        super.resume(sceneRoot);
5164e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki        int numTransitions = mTransitions.size();
5174e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki        for (int i = 0; i < numTransitions; ++i) {
5184e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki            mTransitions.get(i).resume(sceneRoot);
5194e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki        }
5204e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki    }
5214e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki
5224e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki    /** @hide */
5234e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki    @RestrictTo(LIBRARY_GROUP)
5244e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki    @Override
5254e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki    protected void cancel() {
5264e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki        super.cancel();
5274e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki        int numTransitions = mTransitions.size();
5284e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki        for (int i = 0; i < numTransitions; ++i) {
5294e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki            mTransitions.get(i).cancel();
5304e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki        }
531c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki    }
532c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki
5334ad129858d830ad78de60665fc32d8785e57d541Yuichi Araki    /** @hide */
5344ad129858d830ad78de60665fc32d8785e57d541Yuichi Araki    @RestrictTo(LIBRARY_GROUP)
5354ad129858d830ad78de60665fc32d8785e57d541Yuichi Araki    @Override
5364ad129858d830ad78de60665fc32d8785e57d541Yuichi Araki    void forceToEnd(ViewGroup sceneRoot) {
5374ad129858d830ad78de60665fc32d8785e57d541Yuichi Araki        super.forceToEnd(sceneRoot);
5384ad129858d830ad78de60665fc32d8785e57d541Yuichi Araki        int numTransitions = mTransitions.size();
5394ad129858d830ad78de60665fc32d8785e57d541Yuichi Araki        for (int i = 0; i < numTransitions; ++i) {
5404ad129858d830ad78de60665fc32d8785e57d541Yuichi Araki            mTransitions.get(i).forceToEnd(sceneRoot);
5414ad129858d830ad78de60665fc32d8785e57d541Yuichi Araki        }
5424ad129858d830ad78de60665fc32d8785e57d541Yuichi Araki    }
5434ad129858d830ad78de60665fc32d8785e57d541Yuichi Araki
544c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki    @Override
5454e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki    TransitionSet setSceneRoot(ViewGroup sceneRoot) {
5464e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki        super.setSceneRoot(sceneRoot);
5474e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki        int numTransitions = mTransitions.size();
5484e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki        for (int i = 0; i < numTransitions; ++i) {
5494e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki            mTransitions.get(i).setSceneRoot(sceneRoot);
5504e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki        }
5514e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki        return this;
5524e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki    }
5534e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki
5544e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki    @Override
5554e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki    void setCanRemoveViews(boolean canRemoveViews) {
5564e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki        super.setCanRemoveViews(canRemoveViews);
5574e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki        int numTransitions = mTransitions.size();
5584e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki        for (int i = 0; i < numTransitions; ++i) {
5594e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki            mTransitions.get(i).setCanRemoveViews(canRemoveViews);
5604e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki        }
5614e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki    }
5624e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki
5634e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki    @Override
5644c904b38c763179727b9b5ea7a80454630545663Yuichi Araki    public void setEpicenterCallback(EpicenterCallback epicenterCallback) {
5654c904b38c763179727b9b5ea7a80454630545663Yuichi Araki        super.setEpicenterCallback(epicenterCallback);
5664c904b38c763179727b9b5ea7a80454630545663Yuichi Araki        int numTransitions = mTransitions.size();
5674c904b38c763179727b9b5ea7a80454630545663Yuichi Araki        for (int i = 0; i < numTransitions; ++i) {
5684c904b38c763179727b9b5ea7a80454630545663Yuichi Araki            mTransitions.get(i).setEpicenterCallback(epicenterCallback);
5694c904b38c763179727b9b5ea7a80454630545663Yuichi Araki        }
5704c904b38c763179727b9b5ea7a80454630545663Yuichi Araki    }
5714c904b38c763179727b9b5ea7a80454630545663Yuichi Araki
5724c904b38c763179727b9b5ea7a80454630545663Yuichi Araki    @Override
5734e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki    String toString(String indent) {
5744e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki        String result = super.toString(indent);
5754e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki        for (int i = 0; i < mTransitions.size(); ++i) {
5764e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki            result += "\n" + mTransitions.get(i).toString(indent + "  ");
5774e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki        }
5784e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki        return result;
5794e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki    }
5804e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki
5814e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki    @Override
5824e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki    public Transition clone() {
5834e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki        TransitionSet clone = (TransitionSet) super.clone();
5844e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki        clone.mTransitions = new ArrayList<>();
5854e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki        int numTransitions = mTransitions.size();
5864e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki        for (int i = 0; i < numTransitions; ++i) {
5874e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki            clone.addTransition(mTransitions.get(i).clone());
5884e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki        }
5894e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki        return clone;
590c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki    }
591c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki
592c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki}
593