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