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