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 19756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki 20756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Arakiimport static org.hamcrest.CoreMatchers.equalTo; 21c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Arakiimport static org.hamcrest.CoreMatchers.is; 22c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Arakiimport static org.hamcrest.CoreMatchers.not; 234c904b38c763179727b9b5ea7a80454630545663Yuichi Arakiimport static org.hamcrest.CoreMatchers.nullValue; 24c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Arakiimport static org.hamcrest.MatcherAssert.assertThat; 25c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Arakiimport static org.hamcrest.Matchers.hasItem; 26c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Arakiimport static org.hamcrest.Matchers.sameInstance; 27756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Arakiimport static org.junit.Assert.assertNotNull; 28756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Arakiimport static org.junit.Assert.fail; 29c0b47830d3deb764027d8fbadc2a44e83eedd543Yuichi Arakiimport static org.mockito.Matchers.any; 30c0b47830d3deb764027d8fbadc2a44e83eedd543Yuichi Arakiimport static org.mockito.Mockito.mock; 31c0b47830d3deb764027d8fbadc2a44e83eedd543Yuichi Arakiimport static org.mockito.Mockito.never; 32c0b47830d3deb764027d8fbadc2a44e83eedd543Yuichi Arakiimport static org.mockito.Mockito.verify; 33c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki 34c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Arakiimport android.animation.Animator; 35c0b47830d3deb764027d8fbadc2a44e83eedd543Yuichi Arakiimport android.animation.ObjectAnimator; 36c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Arakiimport android.animation.TimeInterpolator; 374c904b38c763179727b9b5ea7a80454630545663Yuichi Arakiimport android.graphics.Rect; 384e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Arakiimport android.support.annotation.NonNull; 39756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Arakiimport android.support.annotation.Nullable; 40c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Arakiimport android.support.test.annotation.UiThreadTest; 41754cb29c50f09a83251dd4bb633ba445b2411adbAurimas Liutikasimport android.support.test.filters.MediumTest; 42c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Arakiimport android.support.transition.test.R; 43756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Arakiimport android.support.v4.view.ViewCompat; 44c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Arakiimport android.view.LayoutInflater; 45c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Arakiimport android.view.View; 46c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Arakiimport android.view.ViewGroup; 47c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Arakiimport android.view.animation.LinearInterpolator; 48756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Arakiimport android.widget.Button; 49756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Arakiimport android.widget.FrameLayout; 50756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Arakiimport android.widget.ImageView; 51c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki 52756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Arakiimport org.junit.Before; 53c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Arakiimport org.junit.Test; 54c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki 55c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Arakiimport java.util.List; 56c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki 5724797374d6c3370ab857f254e8e58248c41c3dd9Aurimas Liutikas@MediumTest 58c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Arakipublic class TransitionTest extends BaseTest { 59c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki 60756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki private Scene[] mScenes = new Scene[2]; 61c0b47830d3deb764027d8fbadc2a44e83eedd543Yuichi Araki private View[] mViews = new View[3]; 62756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki 63756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki @Before 64756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki public void prepareScenes() { 65756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki TransitionActivity activity = rule.getActivity(); 66756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki ViewGroup root = activity.getRoot(); 67da7f2526bb3d29c8233418496ae5d740d0665b27Yuichi Araki mScenes[0] = Scene.getSceneForLayout(root, R.layout.support_scene0, activity); 68da7f2526bb3d29c8233418496ae5d740d0665b27Yuichi Araki mScenes[1] = Scene.getSceneForLayout(root, R.layout.support_scene1, activity); 69756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki } 70756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki 71756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki @Test 72756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki public void testName() { 73756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki Transition transition = new EmptyTransition(); 74756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki assertThat(transition.getName(), 75756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki is(equalTo("android.support.transition.TransitionTest$EmptyTransition"))); 76756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki } 77756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki 78c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki @Test 79c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki public void testDuration() { 80c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki Transition transition = new EmptyTransition(); 81c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki long duration = 12345; 82c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki assertThat(transition.setDuration(duration), is(sameInstance(transition))); 83c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki assertThat(transition.getDuration(), is(duration)); 84c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki } 85c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki 86c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki @Test 87c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki public void testInterpolator() { 88c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki Transition transition = new EmptyTransition(); 89c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki TimeInterpolator interpolator = new LinearInterpolator(); 90c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki assertThat(transition.setInterpolator(interpolator), is(sameInstance(transition))); 91c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki assertThat(transition.getInterpolator(), is(interpolator)); 92c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki } 93c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki 94c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki @Test 95c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki public void testStartDelay() { 96c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki Transition transition = new EmptyTransition(); 97c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki long startDelay = 12345; 98c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki assertThat(transition.setStartDelay(startDelay), is(sameInstance(transition))); 99c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki assertThat(transition.getStartDelay(), is(startDelay)); 100c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki } 101c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki 102c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki @Test 103c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki public void testTargetIds() { 104c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki Transition transition = new EmptyTransition(); 105c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki assertThat(transition.addTarget(R.id.view0), is(sameInstance(transition))); 106c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki assertThat(transition.addTarget(R.id.view1), is(sameInstance(transition))); 107c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki List<Integer> targetIds = transition.getTargetIds(); 108c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki assertThat(targetIds.size(), is(2)); 109c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki assertThat(targetIds, hasItem(R.id.view0)); 110c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki assertThat(targetIds, hasItem(R.id.view1)); 111c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki assertThat(transition.removeTarget(R.id.view0), is(sameInstance(transition))); 112c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki targetIds = transition.getTargetIds(); 113c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki assertThat(targetIds.size(), is(1)); 114c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki assertThat(targetIds, not(hasItem(R.id.view0))); 115c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki assertThat(targetIds, hasItem(R.id.view1)); 116c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki } 117c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki 118c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki @Test 119c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki @UiThreadTest 120756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki public void testTargetView() { 121c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki // Set up views 122c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki TransitionActivity activity = rule.getActivity(); 123c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki ViewGroup root = activity.getRoot(); 124da7f2526bb3d29c8233418496ae5d740d0665b27Yuichi Araki View container = LayoutInflater.from(activity) 125da7f2526bb3d29c8233418496ae5d740d0665b27Yuichi Araki .inflate(R.layout.support_scene0, root, false); 126c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki root.addView(container); 127c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki View view0 = container.findViewById(R.id.view0); 128c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki View view1 = container.findViewById(R.id.view1); 129c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki // Test transition targets 130c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki Transition transition = new EmptyTransition(); 131c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki assertThat(transition.addTarget(view0), is(sameInstance(transition))); 132c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki assertThat(transition.addTarget(view1), is(sameInstance(transition))); 133c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki List<View> targets = transition.getTargets(); 134c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki assertThat(targets.size(), is(2)); 135c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki assertThat(targets, hasItem(sameInstance(view0))); 136c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki assertThat(targets, hasItem(sameInstance(view1))); 137c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki assertThat(transition.removeTarget(view0), is(sameInstance(transition))); 138c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki targets = transition.getTargets(); 139c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki assertThat(targets.size(), is(1)); 140c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki assertThat(targets, not(hasItem(sameInstance(view0)))); 141c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki assertThat(targets, hasItem(sameInstance(view1))); 142c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki } 143c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki 144c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki @Test 145756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki public void testTargetName() { 146756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki Transition transition = new EmptyTransition(); 147756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki assertThat(transition.addTarget("a"), is(sameInstance(transition))); 148756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki assertThat(transition.addTarget("b"), is(sameInstance(transition))); 149756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki List<String> targetNames = transition.getTargetNames(); 150756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki assertNotNull(targetNames); 151756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki assertThat(targetNames.size(), is(2)); 152756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki assertThat(targetNames, hasItem("a")); 153756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki assertThat(targetNames, hasItem("b")); 154756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki transition.removeTarget("a"); 155756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki assertThat(targetNames.size(), is(1)); 156756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki assertThat(targetNames, not(hasItem("a"))); 157756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki assertThat(targetNames, hasItem("b")); 158756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki } 159756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki 160756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki @Test 161756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki public void testTargetType() { 162756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki Transition transition = new EmptyTransition(); 163756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki assertThat(transition.addTarget(Button.class), is(sameInstance(transition))); 164756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki assertThat(transition.addTarget(ImageView.class), is(sameInstance(transition))); 165756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki List<Class> targetTypes = transition.getTargetTypes(); 166756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki assertNotNull(targetTypes); 167756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki assertThat(targetTypes.size(), is(2)); 168756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki assertThat(targetTypes, hasItem(Button.class)); 169756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki assertThat(targetTypes, hasItem(ImageView.class)); 170756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki transition.removeTarget(Button.class); 171756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki assertThat(targetTypes.size(), is(1)); 172756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki assertThat(targetTypes, not(hasItem(Button.class))); 173756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki assertThat(targetTypes, hasItem(ImageView.class)); 174756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki } 175756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki 176756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki @Test 177756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki public void testExcludeTargetId() throws Throwable { 178756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki showInitialScene(); 179756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki Transition transition = new EmptyTransition(); 180756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki transition.addTarget(R.id.view0); 181756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki transition.addTarget(R.id.view1); 182756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki View view0 = rule.getActivity().findViewById(R.id.view0); 183756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki View view1 = rule.getActivity().findViewById(R.id.view1); 184756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki assertThat(transition.isValidTarget(view0), is(true)); 185756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki assertThat(transition.isValidTarget(view1), is(true)); 186756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki transition.excludeTarget(R.id.view0, true); 187756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki assertThat(transition.isValidTarget(view0), is(false)); 188756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki assertThat(transition.isValidTarget(view1), is(true)); 189756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki } 190756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki 191756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki @Test 192756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki public void testExcludeTargetView() throws Throwable { 193756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki showInitialScene(); 194756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki Transition transition = new EmptyTransition(); 195756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki View view0 = rule.getActivity().findViewById(R.id.view0); 196756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki View view1 = rule.getActivity().findViewById(R.id.view1); 197756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki transition.addTarget(view0); 198756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki transition.addTarget(view1); 199756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki assertThat(transition.isValidTarget(view0), is(true)); 200756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki assertThat(transition.isValidTarget(view1), is(true)); 201756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki transition.excludeTarget(view0, true); 202756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki assertThat(transition.isValidTarget(view0), is(false)); 203756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki assertThat(transition.isValidTarget(view1), is(true)); 204756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki } 205756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki 206756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki @Test 207756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki public void testExcludeTargetName() throws Throwable { 208756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki showInitialScene(); 209756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki Transition transition = new EmptyTransition(); 210756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki View view0 = rule.getActivity().findViewById(R.id.view0); 211756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki View view1 = rule.getActivity().findViewById(R.id.view1); 212756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki ViewCompat.setTransitionName(view0, "zero"); 213756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki ViewCompat.setTransitionName(view1, "one"); 214756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki transition.addTarget("zero"); 215756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki transition.addTarget("one"); 216756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki assertThat(transition.isValidTarget(view0), is(true)); 217756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki assertThat(transition.isValidTarget(view1), is(true)); 218756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki transition.excludeTarget("zero", true); 219756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki assertThat(transition.isValidTarget(view0), is(false)); 220756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki assertThat(transition.isValidTarget(view1), is(true)); 221756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki } 222756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki 223756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki @Test 224756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki public void testExcludeTargetType() throws Throwable { 225756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki showInitialScene(); 226756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki Transition transition = new EmptyTransition(); 227756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki FrameLayout container = (FrameLayout) rule.getActivity().findViewById(R.id.container); 228756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki View view0 = rule.getActivity().findViewById(R.id.view0); 229756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki transition.addTarget(View.class); 230756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki assertThat(transition.isValidTarget(container), is(true)); 231756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki assertThat(transition.isValidTarget(view0), is(true)); 232756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki transition.excludeTarget(FrameLayout.class, true); 233756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki assertThat(transition.isValidTarget(container), is(false)); 234756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki assertThat(transition.isValidTarget(view0), is(true)); 235756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki } 236756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki 237756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki @Test 238c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki public void testListener() { 239c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki Transition transition = new EmptyTransition(); 240c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki Transition.TransitionListener listener = new EmptyTransitionListener(); 241c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki assertThat(transition.addListener(listener), is(sameInstance(transition))); 242c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki assertThat(transition.removeListener(listener), is(sameInstance(transition))); 243c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki } 244c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki 245756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki @Test 246756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki public void testMatchOrder() throws Throwable { 247756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki showInitialScene(); 248756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki final Transition transition = new ChangeBounds() { 249756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki @Nullable 250756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki @Override 251756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki public Animator createAnimator(@NonNull ViewGroup sceneRoot, 252756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki @Nullable TransitionValues startValues, @Nullable TransitionValues endValues) { 253756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki if (startValues != null && endValues != null) { 254756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki fail("Match by View ID should be prevented"); 255756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki } 256756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki return super.createAnimator(sceneRoot, startValues, endValues); 257756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki } 258756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki }; 259756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki transition.setDuration(0); 260756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki // This prevents matches between start and end scenes because they have different set of 261756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki // View instances. They will be regarded as independent views even though they share the 262756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki // same View IDs. 263756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki transition.setMatchOrder(Transition.MATCH_INSTANCE); 264756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki SyncRunnable enter1 = new SyncRunnable(); 265756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki mScenes[1].setEnterAction(enter1); 266756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki goToScene(mScenes[1], transition); 267756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki if (!enter1.await()) { 268756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki fail("Timed out while waiting for scene change"); 269756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki } 270756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki } 271756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki 272c0b47830d3deb764027d8fbadc2a44e83eedd543Yuichi Araki @Test 273c0b47830d3deb764027d8fbadc2a44e83eedd543Yuichi Araki public void testExcludedTransitionAnimator() throws Throwable { 274c0b47830d3deb764027d8fbadc2a44e83eedd543Yuichi Araki showInitialScene(); 275c0b47830d3deb764027d8fbadc2a44e83eedd543Yuichi Araki final Animator.AnimatorListener animatorListener = mock(Animator.AnimatorListener.class); 276c0b47830d3deb764027d8fbadc2a44e83eedd543Yuichi Araki final DummyTransition transition = new DummyTransition(animatorListener); 277c0b47830d3deb764027d8fbadc2a44e83eedd543Yuichi Araki final SyncTransitionListener transitionListener = new SyncTransitionListener( 278c0b47830d3deb764027d8fbadc2a44e83eedd543Yuichi Araki SyncTransitionListener.EVENT_END); 279c0b47830d3deb764027d8fbadc2a44e83eedd543Yuichi Araki transition.addListener(transitionListener); 280c0b47830d3deb764027d8fbadc2a44e83eedd543Yuichi Araki transition.addTarget(mViews[0]); 281c0b47830d3deb764027d8fbadc2a44e83eedd543Yuichi Araki transition.excludeTarget(mViews[0], true); 282c0b47830d3deb764027d8fbadc2a44e83eedd543Yuichi Araki rule.runOnUiThread(new Runnable() { 283c0b47830d3deb764027d8fbadc2a44e83eedd543Yuichi Araki @Override 284c0b47830d3deb764027d8fbadc2a44e83eedd543Yuichi Araki public void run() { 285c0b47830d3deb764027d8fbadc2a44e83eedd543Yuichi Araki TransitionManager.beginDelayedTransition(rule.getActivity().getRoot(), transition); 286c0b47830d3deb764027d8fbadc2a44e83eedd543Yuichi Araki mViews[0].setTranslationX(3.f); 287c0b47830d3deb764027d8fbadc2a44e83eedd543Yuichi Araki } 288c0b47830d3deb764027d8fbadc2a44e83eedd543Yuichi Araki }); 289c0b47830d3deb764027d8fbadc2a44e83eedd543Yuichi Araki if (!transitionListener.await()) { 290c0b47830d3deb764027d8fbadc2a44e83eedd543Yuichi Araki fail("Timed out waiting for the TransitionListener"); 291c0b47830d3deb764027d8fbadc2a44e83eedd543Yuichi Araki } 292c0b47830d3deb764027d8fbadc2a44e83eedd543Yuichi Araki verify(animatorListener, never()).onAnimationStart(any(Animator.class)); 293c0b47830d3deb764027d8fbadc2a44e83eedd543Yuichi Araki } 294c0b47830d3deb764027d8fbadc2a44e83eedd543Yuichi Araki 2954c904b38c763179727b9b5ea7a80454630545663Yuichi Araki @Test 2964c904b38c763179727b9b5ea7a80454630545663Yuichi Araki public void testEpicenter() throws Throwable { 2974c904b38c763179727b9b5ea7a80454630545663Yuichi Araki final Transition transition = new EmptyTransition(); 2984c904b38c763179727b9b5ea7a80454630545663Yuichi Araki final Transition.EpicenterCallback epicenterCallback = new Transition.EpicenterCallback() { 2994c904b38c763179727b9b5ea7a80454630545663Yuichi Araki private Rect mRect = new Rect(); 3004c904b38c763179727b9b5ea7a80454630545663Yuichi Araki 3014c904b38c763179727b9b5ea7a80454630545663Yuichi Araki @Override 3027f117eb86f61d5f764085a82129600542ba05712Yuichi Araki public Rect onGetEpicenter(@NonNull Transition t) { 3034c904b38c763179727b9b5ea7a80454630545663Yuichi Araki assertThat(t, is(sameInstance(transition))); 3044c904b38c763179727b9b5ea7a80454630545663Yuichi Araki mRect.set(1, 2, 3, 4); 3054c904b38c763179727b9b5ea7a80454630545663Yuichi Araki return mRect; 3064c904b38c763179727b9b5ea7a80454630545663Yuichi Araki } 3074c904b38c763179727b9b5ea7a80454630545663Yuichi Araki }; 3084c904b38c763179727b9b5ea7a80454630545663Yuichi Araki transition.setEpicenterCallback(epicenterCallback); 3094c904b38c763179727b9b5ea7a80454630545663Yuichi Araki assertThat(transition.getEpicenterCallback(), 3104c904b38c763179727b9b5ea7a80454630545663Yuichi Araki is(sameInstance(transition.getEpicenterCallback()))); 3114c904b38c763179727b9b5ea7a80454630545663Yuichi Araki Rect rect = transition.getEpicenter(); 3124c904b38c763179727b9b5ea7a80454630545663Yuichi Araki assertNotNull(rect); 3134c904b38c763179727b9b5ea7a80454630545663Yuichi Araki assertThat(rect.left, is(1)); 3144c904b38c763179727b9b5ea7a80454630545663Yuichi Araki assertThat(rect.top, is(2)); 3154c904b38c763179727b9b5ea7a80454630545663Yuichi Araki assertThat(rect.right, is(3)); 3164c904b38c763179727b9b5ea7a80454630545663Yuichi Araki assertThat(rect.bottom, is(4)); 3174c904b38c763179727b9b5ea7a80454630545663Yuichi Araki } 3184c904b38c763179727b9b5ea7a80454630545663Yuichi Araki 3194c904b38c763179727b9b5ea7a80454630545663Yuichi Araki @Test 3204c904b38c763179727b9b5ea7a80454630545663Yuichi Araki public void testSetPropagation() throws Throwable { 3214c904b38c763179727b9b5ea7a80454630545663Yuichi Araki final Transition transition = new EmptyTransition(); 3224c904b38c763179727b9b5ea7a80454630545663Yuichi Araki assertThat(transition.getPropagation(), is(nullValue())); 3234c904b38c763179727b9b5ea7a80454630545663Yuichi Araki final TransitionPropagation propagation = new CircularPropagation(); 3244c904b38c763179727b9b5ea7a80454630545663Yuichi Araki transition.setPropagation(propagation); 3254c904b38c763179727b9b5ea7a80454630545663Yuichi Araki assertThat(propagation, is(sameInstance(propagation))); 3264c904b38c763179727b9b5ea7a80454630545663Yuichi Araki } 3274c904b38c763179727b9b5ea7a80454630545663Yuichi Araki 328dfbc6c9b02b6eba0f537185aaa4e00b2f31f1a74Yuichi Araki @Test 329dfbc6c9b02b6eba0f537185aaa4e00b2f31f1a74Yuichi Araki public void testIsTransitionRequired() throws Throwable { 330dfbc6c9b02b6eba0f537185aaa4e00b2f31f1a74Yuichi Araki final EmptyTransition transition = new EmptyTransition(); 331dfbc6c9b02b6eba0f537185aaa4e00b2f31f1a74Yuichi Araki assertThat(transition.isTransitionRequired(null, null), is(false)); 332dfbc6c9b02b6eba0f537185aaa4e00b2f31f1a74Yuichi Araki final TransitionValues start = new TransitionValues(); 333dfbc6c9b02b6eba0f537185aaa4e00b2f31f1a74Yuichi Araki final String propname = "android:transition:dummy"; 334dfbc6c9b02b6eba0f537185aaa4e00b2f31f1a74Yuichi Araki start.values.put(propname, 1); 335dfbc6c9b02b6eba0f537185aaa4e00b2f31f1a74Yuichi Araki final TransitionValues end = new TransitionValues(); 336dfbc6c9b02b6eba0f537185aaa4e00b2f31f1a74Yuichi Araki end.values.put(propname, 1); 337dfbc6c9b02b6eba0f537185aaa4e00b2f31f1a74Yuichi Araki assertThat(transition.isTransitionRequired(start, end), is(false)); 338dfbc6c9b02b6eba0f537185aaa4e00b2f31f1a74Yuichi Araki end.values.put(propname, 2); 339dfbc6c9b02b6eba0f537185aaa4e00b2f31f1a74Yuichi Araki assertThat(transition.isTransitionRequired(start, end), is(true)); 340dfbc6c9b02b6eba0f537185aaa4e00b2f31f1a74Yuichi Araki } 341dfbc6c9b02b6eba0f537185aaa4e00b2f31f1a74Yuichi Araki 342756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki private void showInitialScene() throws Throwable { 343756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki SyncRunnable enter0 = new SyncRunnable(); 344756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki mScenes[0].setEnterAction(enter0); 345756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki AutoTransition transition1 = new AutoTransition(); 346756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki transition1.setDuration(0); 347756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki goToScene(mScenes[0], transition1); 348756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki if (!enter0.await()) { 349756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki fail("Timed out while waiting for scene change"); 350756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki } 351c0b47830d3deb764027d8fbadc2a44e83eedd543Yuichi Araki mViews[0] = rule.getActivity().findViewById(R.id.view0); 352c0b47830d3deb764027d8fbadc2a44e83eedd543Yuichi Araki mViews[1] = rule.getActivity().findViewById(R.id.view1); 353c0b47830d3deb764027d8fbadc2a44e83eedd543Yuichi Araki mViews[2] = rule.getActivity().findViewById(R.id.view2); 354756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki } 355756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki 356756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki private void goToScene(final Scene scene, final Transition transition) throws Throwable { 357756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki rule.runOnUiThread(new Runnable() { 358756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki @Override 359756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki public void run() { 360756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki TransitionManager.go(scene, transition); 361756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki } 362756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki }); 363756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki } 364756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki 365c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki public static class EmptyTransition extends Transition { 366c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki 367e2104f4b5c8e3ad63570306a25e61502dfe4c418Aurimas Liutikas @Override 3684e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki public void captureEndValues(@NonNull TransitionValues transitionValues) { 369c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki } 370c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki 371e2104f4b5c8e3ad63570306a25e61502dfe4c418Aurimas Liutikas @Override 3724e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki public void captureStartValues(@NonNull TransitionValues transitionValues) { 373c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki } 374c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki 375e2104f4b5c8e3ad63570306a25e61502dfe4c418Aurimas Liutikas @Override 376756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki public Animator createAnimator(@NonNull ViewGroup sceneRoot, 377756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki @Nullable TransitionValues startValues, 378756a17bb7580d5bdbb4826e81b074ca5fedba1f5Yuichi Araki @Nullable TransitionValues endValues) { 379c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki return null; 380c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki } 381c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki 382c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki } 383c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki 384c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki public static class EmptyTransitionListener implements Transition.TransitionListener { 385c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki 386e2104f4b5c8e3ad63570306a25e61502dfe4c418Aurimas Liutikas @Override 3874e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki public void onTransitionStart(@NonNull Transition transition) { 388c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki } 389c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki 390e2104f4b5c8e3ad63570306a25e61502dfe4c418Aurimas Liutikas @Override 3914e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki public void onTransitionEnd(@NonNull Transition transition) { 392c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki } 393c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki 394e2104f4b5c8e3ad63570306a25e61502dfe4c418Aurimas Liutikas @Override 3954e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki public void onTransitionCancel(@NonNull Transition transition) { 396c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki } 397c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki 398e2104f4b5c8e3ad63570306a25e61502dfe4c418Aurimas Liutikas @Override 3994e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki public void onTransitionPause(@NonNull Transition transition) { 400c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki } 401c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki 402e2104f4b5c8e3ad63570306a25e61502dfe4c418Aurimas Liutikas @Override 4034e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki public void onTransitionResume(@NonNull Transition transition) { 404c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki } 405c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki 406c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki } 407c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki 408c0b47830d3deb764027d8fbadc2a44e83eedd543Yuichi Araki /** 409c0b47830d3deb764027d8fbadc2a44e83eedd543Yuichi Araki * A dummy transition for monitoring use of its animator by the Transition framework. 410c0b47830d3deb764027d8fbadc2a44e83eedd543Yuichi Araki */ 411c0b47830d3deb764027d8fbadc2a44e83eedd543Yuichi Araki private static class DummyTransition extends Transition { 412c0b47830d3deb764027d8fbadc2a44e83eedd543Yuichi Araki 413c0b47830d3deb764027d8fbadc2a44e83eedd543Yuichi Araki private final Animator.AnimatorListener mListener; 414c0b47830d3deb764027d8fbadc2a44e83eedd543Yuichi Araki 415c0b47830d3deb764027d8fbadc2a44e83eedd543Yuichi Araki DummyTransition(Animator.AnimatorListener listener) { 416c0b47830d3deb764027d8fbadc2a44e83eedd543Yuichi Araki mListener = listener; 417c0b47830d3deb764027d8fbadc2a44e83eedd543Yuichi Araki } 418c0b47830d3deb764027d8fbadc2a44e83eedd543Yuichi Araki 419c0b47830d3deb764027d8fbadc2a44e83eedd543Yuichi Araki @Override 420c0b47830d3deb764027d8fbadc2a44e83eedd543Yuichi Araki public void captureStartValues(@NonNull TransitionValues transitionValues) { 421c0b47830d3deb764027d8fbadc2a44e83eedd543Yuichi Araki transitionValues.values.put("state", 1); 422c0b47830d3deb764027d8fbadc2a44e83eedd543Yuichi Araki } 423c0b47830d3deb764027d8fbadc2a44e83eedd543Yuichi Araki 424c0b47830d3deb764027d8fbadc2a44e83eedd543Yuichi Araki @Override 425c0b47830d3deb764027d8fbadc2a44e83eedd543Yuichi Araki public void captureEndValues(@NonNull TransitionValues transitionValues) { 426c0b47830d3deb764027d8fbadc2a44e83eedd543Yuichi Araki transitionValues.values.put("state", 2); 427c0b47830d3deb764027d8fbadc2a44e83eedd543Yuichi Araki } 428c0b47830d3deb764027d8fbadc2a44e83eedd543Yuichi Araki 429c0b47830d3deb764027d8fbadc2a44e83eedd543Yuichi Araki @Override 430c0b47830d3deb764027d8fbadc2a44e83eedd543Yuichi Araki public Animator createAnimator(@NonNull ViewGroup sceneRoot, TransitionValues startValues, 431c0b47830d3deb764027d8fbadc2a44e83eedd543Yuichi Araki TransitionValues endValues) { 432c0b47830d3deb764027d8fbadc2a44e83eedd543Yuichi Araki if (startValues == null || endValues == null) { 433c0b47830d3deb764027d8fbadc2a44e83eedd543Yuichi Araki return null; 434c0b47830d3deb764027d8fbadc2a44e83eedd543Yuichi Araki } 435c0b47830d3deb764027d8fbadc2a44e83eedd543Yuichi Araki final ObjectAnimator animator = ObjectAnimator 436c0b47830d3deb764027d8fbadc2a44e83eedd543Yuichi Araki .ofFloat(startValues.view, "translationX", 1.f, 2.f); 437c0b47830d3deb764027d8fbadc2a44e83eedd543Yuichi Araki animator.addListener(mListener); 438c0b47830d3deb764027d8fbadc2a44e83eedd543Yuichi Araki return animator; 439c0b47830d3deb764027d8fbadc2a44e83eedd543Yuichi Araki } 440c0b47830d3deb764027d8fbadc2a44e83eedd543Yuichi Araki 441c0b47830d3deb764027d8fbadc2a44e83eedd543Yuichi Araki } 442c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki} 443