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