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 * <transitionSet xmlns:android="http://schemas.android.com/apk/res/android" 548158051cdfef95fc1f22b56bba93b9c610f5ecb1Yuichi Araki * android:ordering="sequential"> 558158051cdfef95fc1f22b56bba93b9c610f5ecb1Yuichi Araki * <fade/> 568158051cdfef95fc1f22b56bba93b9c610f5ecb1Yuichi Araki * <changeBounds/> 578158051cdfef95fc1f22b56bba93b9c610f5ecb1Yuichi Araki * </transitionSet> 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