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.Animator;
20c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Arakiimport android.os.Build;
21cbba0a52f7d7b593dbb13a138515f066f75cce80Yuichi Arakiimport android.support.annotation.NonNull;
22cbba0a52f7d7b593dbb13a138515f066f75cce80Yuichi Arakiimport android.support.annotation.Nullable;
23c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Arakiimport android.view.ViewGroup;
24c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki
25c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki/**
26c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki * A TransitionSet is a parent of child transitions (including other
27c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki * TransitionSets). Using TransitionSets enables more complex
28c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki * choreography of transitions, where some sets play {@link #ORDERING_TOGETHER} and
29c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki * others play {@link #ORDERING_SEQUENTIAL}. For example, {@link AutoTransition}
30c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki * uses a TransitionSet to sequentially play a Fade(Fade.OUT), followed by
31c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki * a {@link ChangeBounds}, followed by a Fade(Fade.OUT) transition.
32c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki *
33c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki * <p>Unlike the platform version, this does not support declaration by XML resources.</p>
34c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki */
35c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Arakipublic class TransitionSet extends Transition {
36c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki
37c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki    /**
38c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     * A flag used to indicate that the child transitions of this set
39c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     * should all start at the same time.
40c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     */
41c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki    public static final int ORDERING_TOGETHER = 0;
42c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki
43c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki    /**
44c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     * A flag used to indicate that the child transitions of this set should
45c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     * play in sequence; when one child transition ends, the next child
46c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     * transition begins. Note that a transition does not end until all
47c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     * instances of it (which are playing on all applicable targets of the
48c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     * transition) end.
49c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     */
50c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki    public static final int ORDERING_SEQUENTIAL = 1;
51c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki
52c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki    /**
53c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     * Constructs an empty transition set. Add child transitions to the
54c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     * set by calling {@link #addTransition(Transition)} )}. By default,
55c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     * child transitions will play {@link #ORDERING_TOGETHER together}.
56c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     */
57c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki    public TransitionSet() {
58c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki        super(true);
59c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki        if (Build.VERSION.SDK_INT < 19) {
60c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki            mImpl = new TransitionSetIcs(this);
61c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki        } else {
62c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki            mImpl = new TransitionSetKitKat(this);
63c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki        }
64c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki    }
65c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki
66c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki    /**
67c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     * Returns the ordering of this TransitionSet. By default, the value is
68c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     * {@link #ORDERING_TOGETHER}.
69c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     *
70c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     * @return {@link #ORDERING_TOGETHER} if child transitions will play at the same
71c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     * time, {@link #ORDERING_SEQUENTIAL} if they will play in sequence.
72c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     * @see #setOrdering(int)
73c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     */
74c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki    public int getOrdering() {
75c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki        return ((TransitionSetImpl) mImpl).getOrdering();
76c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki    }
77c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki
78c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki    /**
79c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     * Sets the play order of this set's child transitions.
80c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     *
81c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     * @param ordering {@link #ORDERING_TOGETHER} to play this set's child
82c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     *                 transitions together, {@link #ORDERING_SEQUENTIAL} to play the child
83c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     *                 transitions in sequence.
84c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     * @return This transitionSet object.
85c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     */
86cbba0a52f7d7b593dbb13a138515f066f75cce80Yuichi Araki    @NonNull
87c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki    public TransitionSet setOrdering(int ordering) {
88c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki        ((TransitionSetImpl) mImpl).setOrdering(ordering);
89c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki        return this;
90c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki    }
91c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki
92c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki    /**
93c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     * Adds child transition to this set. The order in which this child transition
94c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     * is added relative to other child transitions that are added, in addition to
95c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     * the {@link #getOrdering() ordering} property, determines the
96c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     * order in which the transitions are started.
97c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     *
98c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     * <p>If this transitionSet has a {@link #getDuration() duration} set on it, the
99c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     * child transition will inherit that duration. Transitions are assumed to have
100c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     * a maximum of one transitionSet parent.</p>
101c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     *
102c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     * @param transition A non-null child transition to be added to this set.
103c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     * @return This transitionSet object.
104c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     */
105cbba0a52f7d7b593dbb13a138515f066f75cce80Yuichi Araki    @NonNull
106cbba0a52f7d7b593dbb13a138515f066f75cce80Yuichi Araki    public TransitionSet addTransition(@NonNull Transition transition) {
107c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki        ((TransitionSetImpl) mImpl).addTransition(transition.mImpl);
108c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki        return this;
109c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki    }
110c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki
111c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki    /**
112c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     * Removes the specified child transition from this set.
113c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     *
114c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     * @param transition The transition to be removed.
115c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     * @return This transitionSet object.
116c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     */
117cbba0a52f7d7b593dbb13a138515f066f75cce80Yuichi Araki    @NonNull
118cbba0a52f7d7b593dbb13a138515f066f75cce80Yuichi Araki    public TransitionSet removeTransition(@NonNull Transition transition) {
119c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki        ((TransitionSetImpl) mImpl).removeTransition(transition.mImpl);
120c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki        return this;
121c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki    }
122c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki
123c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki    @Override
124cbba0a52f7d7b593dbb13a138515f066f75cce80Yuichi Araki    public void captureEndValues(@NonNull TransitionValues transitionValues) {
125c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki        mImpl.captureEndValues(transitionValues);
126c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki    }
127c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki
128c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki    @Override
129cbba0a52f7d7b593dbb13a138515f066f75cce80Yuichi Araki    public void captureStartValues(@NonNull TransitionValues transitionValues) {
130c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki        mImpl.captureStartValues(transitionValues);
131c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki    }
132c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki
133c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki    @Override
134cbba0a52f7d7b593dbb13a138515f066f75cce80Yuichi Araki    @Nullable
135cbba0a52f7d7b593dbb13a138515f066f75cce80Yuichi Araki    public Animator createAnimator(@NonNull ViewGroup sceneRoot,
136cbba0a52f7d7b593dbb13a138515f066f75cce80Yuichi Araki            @NonNull TransitionValues startValues, @NonNull TransitionValues endValues) {
137c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki        return mImpl.createAnimator(sceneRoot, startValues, endValues);
138c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki    }
139c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki
140c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki}
141