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 19c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Arakiimport android.animation.TimeInterpolator; 20c39d9c75590eca86a5e7e32a8824ba04a0d42e9bAlan Viveretteimport android.support.annotation.RestrictTo; 21c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Arakiimport android.util.AndroidRuntimeException; 22c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Arakiimport android.view.View; 23c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Arakiimport android.view.ViewGroup; 24c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki 25c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Arakiimport java.util.ArrayList; 26c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki 27c39d9c75590eca86a5e7e32a8824ba04a0d42e9bAlan Viveretteimport static android.support.annotation.RestrictTo.Scope.GROUP_ID; 28c39d9c75590eca86a5e7e32a8824ba04a0d42e9bAlan Viverette 29c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Arakiclass TransitionSetPort extends TransitionPort { 30c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki 31c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki /** 32c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki * A flag used to indicate that the child transitions of this set 33c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki * should all start at the same time. 34c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki */ 35c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki public static final int ORDERING_TOGETHER = 0; 36c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki 37c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki /** 38c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki * A flag used to indicate that the child transitions of this set should 39c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki * play in sequence; when one child transition ends, the next child 40c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki * transition begins. Note that a transition does not end until all 41c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki * instances of it (which are playing on all applicable targets of the 42c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki * transition) end. 43c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki */ 44c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki public static final int ORDERING_SEQUENTIAL = 1; 45c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki 46c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki ArrayList<TransitionPort> mTransitions = new ArrayList<TransitionPort>(); 47c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki 48c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki int mCurrentListeners; 49c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki 50c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki boolean mStarted = false; 51c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki 52c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki private boolean mPlayTogether = true; 53c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki 54c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki public TransitionSetPort() { 55c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki } 56c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki 57c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki public int getOrdering() { 58c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki return mPlayTogether ? ORDERING_TOGETHER : ORDERING_SEQUENTIAL; 59c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki } 60c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki 61c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki public TransitionSetPort setOrdering(int ordering) { 62c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki switch (ordering) { 63c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki case ORDERING_SEQUENTIAL: 64c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki mPlayTogether = false; 65c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki break; 66c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki case ORDERING_TOGETHER: 67c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki mPlayTogether = true; 68c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki break; 69c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki default: 70c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki throw new AndroidRuntimeException("Invalid parameter for TransitionSet " + 71c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki "ordering: " + ordering); 72c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki } 73c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki return this; 74c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki } 75c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki 76c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki public TransitionSetPort addTransition(TransitionPort transition) { 77c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki if (transition != null) { 78c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki mTransitions.add(transition); 79c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki transition.mParent = this; 80c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki if (mDuration >= 0) { 81c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki transition.setDuration(mDuration); 82c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki } 83c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki } 84c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki return this; 85c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki } 86c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki 87c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki /** 88c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki * Setting a non-negative duration on a TransitionSet causes all of the child 89c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki * transitions (current and future) to inherit this duration. 90c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki * 91c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki * @param duration The length of the animation, in milliseconds. 92c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki * @return This transitionSet object. 93c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki */ 94c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki @Override 95c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki public TransitionSetPort setDuration(long duration) { 96c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki super.setDuration(duration); 97c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki if (mDuration >= 0) { 98c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki int numTransitions = mTransitions.size(); 99c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki for (int i = 0; i < numTransitions; ++i) { 100c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki mTransitions.get(i).setDuration(duration); 101c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki } 102c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki } 103c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki return this; 104c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki } 105c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki 106c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki @Override 107c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki public TransitionSetPort setStartDelay(long startDelay) { 108c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki return (TransitionSetPort) super.setStartDelay(startDelay); 109c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki } 110c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki 111c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki @Override 112c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki public TransitionSetPort setInterpolator(TimeInterpolator interpolator) { 113c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki return (TransitionSetPort) super.setInterpolator(interpolator); 114c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki } 115c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki 116c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki @Override 117c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki public TransitionSetPort addTarget(View target) { 118c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki return (TransitionSetPort) super.addTarget(target); 119c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki } 120c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki 121c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki @Override 122c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki public TransitionSetPort addTarget(int targetId) { 123c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki return (TransitionSetPort) super.addTarget(targetId); 124c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki } 125c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki 126c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki @Override 127c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki public TransitionSetPort addListener(TransitionListener listener) { 128c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki return (TransitionSetPort) super.addListener(listener); 129c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki } 130c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki 131c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki @Override 132c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki public TransitionSetPort removeTarget(int targetId) { 133c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki return (TransitionSetPort) super.removeTarget(targetId); 134c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki } 135c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki 136c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki @Override 137c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki public TransitionSetPort removeTarget(View target) { 138c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki return (TransitionSetPort) super.removeTarget(target); 139c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki } 140c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki 141c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki @Override 142c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki public TransitionSetPort removeListener(TransitionListener listener) { 143c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki return (TransitionSetPort) super.removeListener(listener); 144c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki } 145c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki 146c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki public TransitionSetPort removeTransition(TransitionPort transition) { 147c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki mTransitions.remove(transition); 148c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki transition.mParent = null; 149c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki return this; 150c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki } 151c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki 152c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki /** 153c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki * Sets up listeners for each of the child transitions. This is used to 154c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki * determine when this transition set is finished (all child transitions 155c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki * must finish first). 156c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki */ 157c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki private void setupStartEndListeners() { 158c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki TransitionSetListener listener = new TransitionSetListener(this); 159c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki for (TransitionPort childTransition : mTransitions) { 160c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki childTransition.addListener(listener); 161c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki } 162c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki mCurrentListeners = mTransitions.size(); 163c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki } 164c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki 165c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki /** 166c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki * @hide 167c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki */ 168c39d9c75590eca86a5e7e32a8824ba04a0d42e9bAlan Viverette @RestrictTo(GROUP_ID) 169c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki @Override 170c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki protected void createAnimators(ViewGroup sceneRoot, TransitionValuesMaps startValues, 171c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki TransitionValuesMaps endValues) { 172c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki for (TransitionPort childTransition : mTransitions) { 173c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki childTransition.createAnimators(sceneRoot, startValues, endValues); 174c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki } 175c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki } 176c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki 177c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki /** 178c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki * @hide 179c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki */ 180c39d9c75590eca86a5e7e32a8824ba04a0d42e9bAlan Viverette @RestrictTo(GROUP_ID) 181c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki @Override 182c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki protected void runAnimators() { 183c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki if (mTransitions.isEmpty()) { 184c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki start(); 185c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki end(); 186c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki return; 187c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki } 188c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki setupStartEndListeners(); 189c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki if (!mPlayTogether) { 190c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki // Setup sequence with listeners 191c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki // TODO: Need to add listeners in such a way that we can remove them later if canceled 192c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki for (int i = 1; i < mTransitions.size(); ++i) { 193c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki TransitionPort previousTransition = mTransitions.get(i - 1); 194c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki final TransitionPort nextTransition = mTransitions.get(i); 195c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki previousTransition.addListener(new TransitionListenerAdapter() { 196c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki @Override 197c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki public void onTransitionEnd(TransitionPort transition) { 198c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki nextTransition.runAnimators(); 199c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki transition.removeListener(this); 200c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki } 201c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki }); 202c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki } 203c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki TransitionPort firstTransition = mTransitions.get(0); 204c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki if (firstTransition != null) { 205c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki firstTransition.runAnimators(); 206c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki } 207c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki } else { 208c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki for (TransitionPort childTransition : mTransitions) { 209c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki childTransition.runAnimators(); 210c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki } 211c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki } 212c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki } 213c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki 214c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki @Override 215c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki public void captureStartValues(TransitionValues transitionValues) { 216c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki int targetId = transitionValues.view.getId(); 217c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki if (isValidTarget(transitionValues.view, targetId)) { 218c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki for (TransitionPort childTransition : mTransitions) { 219c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki if (childTransition.isValidTarget(transitionValues.view, targetId)) { 220c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki childTransition.captureStartValues(transitionValues); 221c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki } 222c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki } 223c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki } 224c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki } 225c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki 226c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki @Override 227c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki public void captureEndValues(TransitionValues transitionValues) { 228c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki int targetId = transitionValues.view.getId(); 229c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki if (isValidTarget(transitionValues.view, targetId)) { 230c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki for (TransitionPort childTransition : mTransitions) { 231c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki if (childTransition.isValidTarget(transitionValues.view, targetId)) { 232c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki childTransition.captureEndValues(transitionValues); 233c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki } 234c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki } 235c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki } 236c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki } 237c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki 238c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki /** @hide */ 239c39d9c75590eca86a5e7e32a8824ba04a0d42e9bAlan Viverette @RestrictTo(GROUP_ID) 240c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki @Override 241feda490114a23e64dba591f1e2589723a1a12660Yuichi Araki public void pause(View sceneRoot) { 242feda490114a23e64dba591f1e2589723a1a12660Yuichi Araki super.pause(sceneRoot); 243c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki int numTransitions = mTransitions.size(); 244c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki for (int i = 0; i < numTransitions; ++i) { 245feda490114a23e64dba591f1e2589723a1a12660Yuichi Araki mTransitions.get(i).pause(sceneRoot); 246c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki } 247c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki } 248c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki 249c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki /** @hide */ 250c39d9c75590eca86a5e7e32a8824ba04a0d42e9bAlan Viverette @RestrictTo(GROUP_ID) 251c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki @Override 252feda490114a23e64dba591f1e2589723a1a12660Yuichi Araki public void resume(View sceneRoot) { 253feda490114a23e64dba591f1e2589723a1a12660Yuichi Araki super.resume(sceneRoot); 254c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki int numTransitions = mTransitions.size(); 255c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki for (int i = 0; i < numTransitions; ++i) { 256feda490114a23e64dba591f1e2589723a1a12660Yuichi Araki mTransitions.get(i).resume(sceneRoot); 257c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki } 258c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki } 259c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki 260c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki /** @hide */ 261c39d9c75590eca86a5e7e32a8824ba04a0d42e9bAlan Viverette @RestrictTo(GROUP_ID) 262c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki @Override 263c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki protected void cancel() { 264c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki super.cancel(); 265c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki int numTransitions = mTransitions.size(); 266c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki for (int i = 0; i < numTransitions; ++i) { 267c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki mTransitions.get(i).cancel(); 268c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki } 269c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki } 270c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki 271c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki @Override 272c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki TransitionSetPort setSceneRoot(ViewGroup sceneRoot) { 273c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki super.setSceneRoot(sceneRoot); 274c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki int numTransitions = mTransitions.size(); 275c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki for (int i = 0; i < numTransitions; ++i) { 276c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki mTransitions.get(i).setSceneRoot(sceneRoot); 277c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki } 278c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki return (TransitionSetPort) this; 279c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki } 280c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki 281c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki @Override 282c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki void setCanRemoveViews(boolean canRemoveViews) { 283c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki super.setCanRemoveViews(canRemoveViews); 284c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki int numTransitions = mTransitions.size(); 285c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki for (int i = 0; i < numTransitions; ++i) { 286c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki mTransitions.get(i).setCanRemoveViews(canRemoveViews); 287c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki } 288c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki } 289c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki 290c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki @Override 291c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki String toString(String indent) { 292c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki String result = super.toString(indent); 293c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki for (int i = 0; i < mTransitions.size(); ++i) { 294c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki result += "\n" + mTransitions.get(i).toString(indent + " "); 295c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki } 296c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki return result; 297c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki } 298c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki 299c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki @Override 300c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki public TransitionSetPort clone() { 301c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki TransitionSetPort clone = (TransitionSetPort) super.clone(); 302c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki clone.mTransitions = new ArrayList<TransitionPort>(); 303c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki int numTransitions = mTransitions.size(); 304c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki for (int i = 0; i < numTransitions; ++i) { 305c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki clone.addTransition((TransitionPort) mTransitions.get(i).clone()); 306c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki } 307c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki return clone; 308c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki } 309c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki 310c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki /** 311c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki * This listener is used to detect when all child transitions are done, at 312c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki * which point this transition set is also done. 313c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki */ 314c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki static class TransitionSetListener extends TransitionListenerAdapter { 315c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki 316c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki TransitionSetPort mTransitionSet; 317c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki 318c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki TransitionSetListener(TransitionSetPort transitionSet) { 319c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki mTransitionSet = transitionSet; 320c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki } 321c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki 322c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki @Override 323c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki public void onTransitionStart(TransitionPort transition) { 324c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki if (!mTransitionSet.mStarted) { 325c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki mTransitionSet.start(); 326c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki mTransitionSet.mStarted = true; 327c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki } 328c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki } 329c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki 330c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki @Override 331c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki public void onTransitionEnd(TransitionPort transition) { 332c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki --mTransitionSet.mCurrentListeners; 333c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki if (mTransitionSet.mCurrentListeners == 0) { 334c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki // All child trans 335c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki mTransitionSet.mStarted = false; 336c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki mTransitionSet.end(); 337c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki } 338c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki transition.removeListener(this); 339c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki } 340c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki } 341c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki 342c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki} 343