14500be62dea3895a98336122a2944cc4ab024bc5George Mount/*
2ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikas * Copyright 2018 The Android Open Source Project
34500be62dea3895a98336122a2944cc4ab024bc5George Mount *
44500be62dea3895a98336122a2944cc4ab024bc5George Mount * Licensed under the Apache License, Version 2.0 (the "License");
54500be62dea3895a98336122a2944cc4ab024bc5George Mount * you may not use this file except in compliance with the License.
64500be62dea3895a98336122a2944cc4ab024bc5George Mount * You may obtain a copy of the License at
74500be62dea3895a98336122a2944cc4ab024bc5George Mount *
84500be62dea3895a98336122a2944cc4ab024bc5George Mount *      http://www.apache.org/licenses/LICENSE-2.0
94500be62dea3895a98336122a2944cc4ab024bc5George Mount *
104500be62dea3895a98336122a2944cc4ab024bc5George Mount * Unless required by applicable law or agreed to in writing, software
114500be62dea3895a98336122a2944cc4ab024bc5George Mount * distributed under the License is distributed on an "AS IS" BASIS,
124500be62dea3895a98336122a2944cc4ab024bc5George Mount * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
134500be62dea3895a98336122a2944cc4ab024bc5George Mount * See the License for the specific language governing permissions and
144500be62dea3895a98336122a2944cc4ab024bc5George Mount * limitations under the License.
154500be62dea3895a98336122a2944cc4ab024bc5George Mount */
164500be62dea3895a98336122a2944cc4ab024bc5George Mount
17ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikaspackage androidx.fragment.app;
184500be62dea3895a98336122a2944cc4ab024bc5George Mount
199f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mountimport android.graphics.Rect;
209f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mountimport android.transition.Transition;
219f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mountimport android.transition.TransitionManager;
229f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mountimport android.transition.TransitionSet;
234500be62dea3895a98336122a2944cc4ab024bc5George Mountimport android.view.View;
244500be62dea3895a98336122a2944cc4ab024bc5George Mountimport android.view.ViewGroup;
254500be62dea3895a98336122a2944cc4ab024bc5George Mount
26320113721c2e14bbc2403809046fa2959a665c11Aurimas Liutikasimport androidx.annotation.RequiresApi;
27320113721c2e14bbc2403809046fa2959a665c11Aurimas Liutikas
284500be62dea3895a98336122a2944cc4ab024bc5George Mountimport java.util.ArrayList;
29c766ad5a6e0c115f08b933ede22375c7070a3391George Mountimport java.util.List;
304500be62dea3895a98336122a2944cc4ab024bc5George Mount
318f886fe8c7e23fe6ccb8734167c960c2ed3429c3Alan Viverette@RequiresApi(21)
323f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Arakiclass FragmentTransitionCompat21 extends FragmentTransitionImpl {
334500be62dea3895a98336122a2944cc4ab024bc5George Mount
343f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki    @Override
353f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki    public boolean canHandle(Object transition) {
363f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki        return transition instanceof Transition;
373f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki    }
383f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki
393f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki    @Override
403f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki    public Object cloneTransition(Object transition) {
41990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        Transition copy = null;
420f5ae57910484f1d873fdad90966b6244a633bd4George Mount        if (transition != null) {
43990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount            copy = ((Transition) transition).clone();
444500be62dea3895a98336122a2944cc4ab024bc5George Mount        }
45990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        return copy;
464500be62dea3895a98336122a2944cc4ab024bc5George Mount    }
474500be62dea3895a98336122a2944cc4ab024bc5George Mount
483f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki    @Override
493f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki    public Object wrapTransitionInSet(Object transition) {
50c33885b865c99ce9ae96214f0e9d7bd1ca12cb93George Mount        if (transition == null) {
51c33885b865c99ce9ae96214f0e9d7bd1ca12cb93George Mount            return null;
52c33885b865c99ce9ae96214f0e9d7bd1ca12cb93George Mount        }
53c33885b865c99ce9ae96214f0e9d7bd1ca12cb93George Mount        TransitionSet transitionSet = new TransitionSet();
54990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        transitionSet.addTransition((Transition) transition);
55c33885b865c99ce9ae96214f0e9d7bd1ca12cb93George Mount        return transitionSet;
56c33885b865c99ce9ae96214f0e9d7bd1ca12cb93George Mount    }
57c33885b865c99ce9ae96214f0e9d7bd1ca12cb93George Mount
583f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki    @Override
593f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki    public void setSharedElementTargets(Object transitionObj,
60990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount            View nonExistentView, ArrayList<View> sharedViews) {
61c33885b865c99ce9ae96214f0e9d7bd1ca12cb93George Mount        TransitionSet transition = (TransitionSet) transitionObj;
62c33885b865c99ce9ae96214f0e9d7bd1ca12cb93George Mount        final List<View> views = transition.getTargets();
63c33885b865c99ce9ae96214f0e9d7bd1ca12cb93George Mount        views.clear();
64990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        final int count = sharedViews.size();
65c33885b865c99ce9ae96214f0e9d7bd1ca12cb93George Mount        for (int i = 0; i < count; i++) {
66990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount            final View view = sharedViews.get(i);
67c33885b865c99ce9ae96214f0e9d7bd1ca12cb93George Mount            bfsAddViewChildren(views, view);
68c33885b865c99ce9ae96214f0e9d7bd1ca12cb93George Mount        }
69990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        views.add(nonExistentView);
70990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        sharedViews.add(nonExistentView);
71990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        addTargets(transition, sharedViews);
72c33885b865c99ce9ae96214f0e9d7bd1ca12cb93George Mount    }
739f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount
743f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki    @Override
753f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki    public void setEpicenter(Object transitionObj, View view) {
76990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        if (view != null) {
77990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount            Transition transition = (Transition) transitionObj;
78990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount            final Rect epicenter = new Rect();
79990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount            getBoundsOnScreen(view, epicenter);
800f5ae57910484f1d873fdad90966b6244a633bd4George Mount
81990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount            transition.setEpicenterCallback(new Transition.EpicenterCallback() {
820f5ae57910484f1d873fdad90966b6244a633bd4George Mount                @Override
830f5ae57910484f1d873fdad90966b6244a633bd4George Mount                public Rect onGetEpicenter(Transition transition) {
84990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                    return epicenter;
854500be62dea3895a98336122a2944cc4ab024bc5George Mount                }
860f5ae57910484f1d873fdad90966b6244a633bd4George Mount            });
870f5ae57910484f1d873fdad90966b6244a633bd4George Mount        }
884500be62dea3895a98336122a2944cc4ab024bc5George Mount    }
894500be62dea3895a98336122a2944cc4ab024bc5George Mount
903f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki    @Override
913f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki    public void addTargets(Object transitionObj, ArrayList<View> views) {
92990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        Transition transition = (Transition) transitionObj;
93990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        if (transition == null) {
94990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount            return;
95990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        }
96990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        if (transition instanceof TransitionSet) {
97990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount            TransitionSet set = (TransitionSet) transition;
98990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount            int numTransitions = set.getTransitionCount();
99990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount            for (int i = 0; i < numTransitions; i++) {
100990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                Transition child = set.getTransitionAt(i);
101990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                addTargets(child, views);
102990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount            }
103990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        } else if (!hasSimpleTarget(transition)) {
104990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount            List<View> targets = transition.getTargets();
105990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount            if (isNullOrEmpty(targets)) {
106990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                // We can just add the target views
107990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                int numViews = views.size();
108990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                for (int i = 0; i < numViews; i++) {
109990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                    transition.addTarget(views.get(i));
110990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                }
111990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount            }
112990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        }
113990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    }
114990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
115990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    /**
116990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount     * Returns true if there are any targets based on ID, transition or type.
117990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount     */
118990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    private static boolean hasSimpleTarget(Transition transition) {
119990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        return !isNullOrEmpty(transition.getTargetIds())
120990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                || !isNullOrEmpty(transition.getTargetNames())
121990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                || !isNullOrEmpty(transition.getTargetTypes());
122990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    }
123990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
1243f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki    @Override
1253f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki    public Object mergeTransitionsTogether(Object transition1, Object transition2,
126990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount            Object transition3) {
127990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        TransitionSet transitionSet = new TransitionSet();
128990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        if (transition1 != null) {
129990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount            transitionSet.addTransition((Transition) transition1);
130990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        }
131990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        if (transition2 != null) {
132990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount            transitionSet.addTransition((Transition) transition2);
133990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        }
134990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        if (transition3 != null) {
135990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount            transitionSet.addTransition((Transition) transition3);
136990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        }
137990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        return transitionSet;
138990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    }
139990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
1403f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki    @Override
1413f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki    public void scheduleHideFragmentView(Object exitTransitionObj, final View fragmentView,
142667ec4150c78bf295b3db1fa4d546def9ade9d20George Mount            final ArrayList<View> exitingViews) {
143667ec4150c78bf295b3db1fa4d546def9ade9d20George Mount        Transition exitTransition = (Transition) exitTransitionObj;
144667ec4150c78bf295b3db1fa4d546def9ade9d20George Mount        exitTransition.addListener(new Transition.TransitionListener() {
145667ec4150c78bf295b3db1fa4d546def9ade9d20George Mount            @Override
146667ec4150c78bf295b3db1fa4d546def9ade9d20George Mount            public void onTransitionStart(Transition transition) {
147667ec4150c78bf295b3db1fa4d546def9ade9d20George Mount            }
148667ec4150c78bf295b3db1fa4d546def9ade9d20George Mount
149667ec4150c78bf295b3db1fa4d546def9ade9d20George Mount            @Override
150667ec4150c78bf295b3db1fa4d546def9ade9d20George Mount            public void onTransitionEnd(Transition transition) {
151667ec4150c78bf295b3db1fa4d546def9ade9d20George Mount                transition.removeListener(this);
152667ec4150c78bf295b3db1fa4d546def9ade9d20George Mount                fragmentView.setVisibility(View.GONE);
153667ec4150c78bf295b3db1fa4d546def9ade9d20George Mount                final int numViews = exitingViews.size();
154667ec4150c78bf295b3db1fa4d546def9ade9d20George Mount                for (int i = 0; i < numViews; i++) {
155667ec4150c78bf295b3db1fa4d546def9ade9d20George Mount                    exitingViews.get(i).setVisibility(View.VISIBLE);
156667ec4150c78bf295b3db1fa4d546def9ade9d20George Mount                }
157667ec4150c78bf295b3db1fa4d546def9ade9d20George Mount            }
158667ec4150c78bf295b3db1fa4d546def9ade9d20George Mount
159667ec4150c78bf295b3db1fa4d546def9ade9d20George Mount            @Override
160667ec4150c78bf295b3db1fa4d546def9ade9d20George Mount            public void onTransitionCancel(Transition transition) {
161667ec4150c78bf295b3db1fa4d546def9ade9d20George Mount            }
162667ec4150c78bf295b3db1fa4d546def9ade9d20George Mount
163667ec4150c78bf295b3db1fa4d546def9ade9d20George Mount            @Override
164667ec4150c78bf295b3db1fa4d546def9ade9d20George Mount            public void onTransitionPause(Transition transition) {
165667ec4150c78bf295b3db1fa4d546def9ade9d20George Mount            }
166667ec4150c78bf295b3db1fa4d546def9ade9d20George Mount
167667ec4150c78bf295b3db1fa4d546def9ade9d20George Mount            @Override
168667ec4150c78bf295b3db1fa4d546def9ade9d20George Mount            public void onTransitionResume(Transition transition) {
169667ec4150c78bf295b3db1fa4d546def9ade9d20George Mount            }
170667ec4150c78bf295b3db1fa4d546def9ade9d20George Mount        });
171667ec4150c78bf295b3db1fa4d546def9ade9d20George Mount    }
172667ec4150c78bf295b3db1fa4d546def9ade9d20George Mount
1733f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki    @Override
1743f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki    public Object mergeTransitionsInSequence(Object exitTransitionObj,
175990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount            Object enterTransitionObj, Object sharedElementTransitionObj) {
176990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        // First do exit, then enter, but allow shared element transition to happen
177990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        // during both.
178990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        Transition staggered = null;
179990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        final Transition exitTransition = (Transition) exitTransitionObj;
180990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        final Transition enterTransition = (Transition) enterTransitionObj;
181990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        final Transition sharedElementTransition = (Transition) sharedElementTransitionObj;
182990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        if (exitTransition != null && enterTransition != null) {
183990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount            staggered = new TransitionSet()
184990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                    .addTransition(exitTransition)
185990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                    .addTransition(enterTransition)
186990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                    .setOrdering(TransitionSet.ORDERING_SEQUENTIAL);
187990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        } else if (exitTransition != null) {
188990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount            staggered = exitTransition;
189990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        } else if (enterTransition != null) {
190990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount            staggered = enterTransition;
191990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        }
192990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        if (sharedElementTransition != null) {
193990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount            TransitionSet together = new TransitionSet();
194990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount            if (staggered != null) {
195990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                together.addTransition(staggered);
196990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount            }
197990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount            together.addTransition(sharedElementTransition);
198990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount            return together;
199990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        } else {
200990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount            return staggered;
201990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        }
202990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    }
203990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
2043f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki    @Override
2053f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki    public void beginDelayedTransition(ViewGroup sceneRoot, Object transition) {
206990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        TransitionManager.beginDelayedTransition(sceneRoot, (Transition) transition);
207990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    }
208990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
2093f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki    @Override
2103f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki    public void scheduleRemoveTargets(final Object overallTransitionObj,
211990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount            final Object enterTransition, final ArrayList<View> enteringViews,
212990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount            final Object exitTransition, final ArrayList<View> exitingViews,
213990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount            final Object sharedElementTransition, final ArrayList<View> sharedElementsIn) {
214990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        final Transition overallTransition = (Transition) overallTransitionObj;
215990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        overallTransition.addListener(new Transition.TransitionListener() {
216990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount            @Override
217990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount            public void onTransitionStart(Transition transition) {
218990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                if (enterTransition != null) {
219990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                    replaceTargets(enterTransition, enteringViews, null);
220990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                }
221990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                if (exitTransition != null) {
222990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                    replaceTargets(exitTransition, exitingViews, null);
223990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                }
224990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                if (sharedElementTransition != null) {
225990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                    replaceTargets(sharedElementTransition, sharedElementsIn, null);
226c766ad5a6e0c115f08b933ede22375c7070a3391George Mount                }
227c766ad5a6e0c115f08b933ede22375c7070a3391George Mount            }
228990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
229990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount            @Override
230990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount            public void onTransitionEnd(Transition transition) {
231990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount            }
232990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
233990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount            @Override
234990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount            public void onTransitionCancel(Transition transition) {
235990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount            }
236990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
237990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount            @Override
238990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount            public void onTransitionPause(Transition transition) {
239990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount            }
240990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
241990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount            @Override
242990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount            public void onTransitionResume(Transition transition) {
243990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount            }
244990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        });
245990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    }
246990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
2473f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki    @Override
2483f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki    public void swapSharedElementTargets(Object sharedElementTransitionObj,
249990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount            ArrayList<View> sharedElementsOut, ArrayList<View> sharedElementsIn) {
250990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        TransitionSet sharedElementTransition = (TransitionSet) sharedElementTransitionObj;
251990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        if (sharedElementTransition != null) {
252990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount            sharedElementTransition.getTargets().clear();
253990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount            sharedElementTransition.getTargets().addAll(sharedElementsIn);
254990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount            replaceTargets(sharedElementTransition, sharedElementsOut, sharedElementsIn);
2554500be62dea3895a98336122a2944cc4ab024bc5George Mount        }
2560f5ae57910484f1d873fdad90966b6244a633bd4George Mount    }
2579f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount
2583f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki    @Override
2593f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki    public void replaceTargets(Object transitionObj, ArrayList<View> oldTargets,
260990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount            ArrayList<View> newTargets) {
261990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        Transition transition = (Transition) transitionObj;
262c766ad5a6e0c115f08b933ede22375c7070a3391George Mount        if (transition instanceof TransitionSet) {
263c766ad5a6e0c115f08b933ede22375c7070a3391George Mount            TransitionSet set = (TransitionSet) transition;
264c766ad5a6e0c115f08b933ede22375c7070a3391George Mount            int numTransitions = set.getTransitionCount();
265c766ad5a6e0c115f08b933ede22375c7070a3391George Mount            for (int i = 0; i < numTransitions; i++) {
266c766ad5a6e0c115f08b933ede22375c7070a3391George Mount                Transition child = set.getTransitionAt(i);
267990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                replaceTargets(child, oldTargets, newTargets);
268c766ad5a6e0c115f08b933ede22375c7070a3391George Mount            }
269c766ad5a6e0c115f08b933ede22375c7070a3391George Mount        } else if (!hasSimpleTarget(transition)) {
270c766ad5a6e0c115f08b933ede22375c7070a3391George Mount            List<View> targets = transition.getTargets();
271990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount            if (targets != null && targets.size() == oldTargets.size()
272990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                    && targets.containsAll(oldTargets)) {
273990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                // We have an exact match. We must have added these earlier in addTargets
274990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                final int targetCount = newTargets == null ? 0 : newTargets.size();
275990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                for (int i = 0; i < targetCount; i++) {
276990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                    transition.addTarget(newTargets.get(i));
277990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                }
278990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                for (int i = oldTargets.size() - 1; i >= 0; i--) {
279990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                    transition.removeTarget(oldTargets.get(i));
280c766ad5a6e0c115f08b933ede22375c7070a3391George Mount                }
281c766ad5a6e0c115f08b933ede22375c7070a3391George Mount            }
2829f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount        }
2839f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount    }
2849f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount
2853f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki    @Override
2863f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki    public void addTarget(Object transitionObj, View view) {
287990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        if (transitionObj != null) {
288990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount            Transition transition = (Transition) transitionObj;
289990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount            transition.addTarget(view);
290990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        }
291c766ad5a6e0c115f08b933ede22375c7070a3391George Mount    }
292c766ad5a6e0c115f08b933ede22375c7070a3391George Mount
2933f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki    @Override
2943f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki    public void removeTarget(Object transitionObj, View view) {
295990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        if (transitionObj != null) {
296990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount            Transition transition = (Transition) transitionObj;
297990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount            transition.removeTarget(view);
298990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        }
299c766ad5a6e0c115f08b933ede22375c7070a3391George Mount    }
300c766ad5a6e0c115f08b933ede22375c7070a3391George Mount
3013f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki    @Override
3023f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki    public void setEpicenter(Object transitionObj, final Rect epicenter) {
303990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        if (transitionObj != null) {
304990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount            Transition transition = (Transition) transitionObj;
305990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount            transition.setEpicenterCallback(new Transition.EpicenterCallback() {
306990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                @Override
307990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                public Rect onGetEpicenter(Transition transition) {
308990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                    if (epicenter == null || epicenter.isEmpty()) {
309990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                        return null;
310990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                    }
311990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                    return epicenter;
312990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount                }
313990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount            });
314990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        }
3159f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount    }
3169f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount
3174500be62dea3895a98336122a2944cc4ab024bc5George Mount}
318