1bf7c3b4fa6d971201ab3fce162611639b857b810George Mount/*
2bf7c3b4fa6d971201ab3fce162611639b857b810George Mount * Copyright (C) 2016 The Android Open Source Project
3bf7c3b4fa6d971201ab3fce162611639b857b810George Mount *
4bf7c3b4fa6d971201ab3fce162611639b857b810George Mount * Licensed under the Apache License, Version 2.0 (the "License");
5bf7c3b4fa6d971201ab3fce162611639b857b810George Mount * you may not use this file except in compliance with the License.
6bf7c3b4fa6d971201ab3fce162611639b857b810George Mount * You may obtain a copy of the License at
7bf7c3b4fa6d971201ab3fce162611639b857b810George Mount *
8bf7c3b4fa6d971201ab3fce162611639b857b810George Mount *      http://www.apache.org/licenses/LICENSE-2.0
9bf7c3b4fa6d971201ab3fce162611639b857b810George Mount *
10bf7c3b4fa6d971201ab3fce162611639b857b810George Mount * Unless required by applicable law or agreed to in writing, software
11bf7c3b4fa6d971201ab3fce162611639b857b810George Mount * distributed under the License is distributed on an "AS IS" BASIS,
12bf7c3b4fa6d971201ab3fce162611639b857b810George Mount * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13bf7c3b4fa6d971201ab3fce162611639b857b810George Mount * See the License for the specific language governing permissions and
14bf7c3b4fa6d971201ab3fce162611639b857b810George Mount * limitations under the License.
15bf7c3b4fa6d971201ab3fce162611639b857b810George Mount */
16bf7c3b4fa6d971201ab3fce162611639b857b810George Mount
17bf7c3b4fa6d971201ab3fce162611639b857b810George Mountpackage android.transition;
18bf7c3b4fa6d971201ab3fce162611639b857b810George Mount
19bf7c3b4fa6d971201ab3fce162611639b857b810George Mountimport android.animation.AnimatorSetActivity;
20bf7c3b4fa6d971201ab3fce162611639b857b810George Mountimport android.app.Activity;
21bf7c3b4fa6d971201ab3fce162611639b857b810George Mountimport android.graphics.Rect;
22bdbde55592792efe350acd6a46733f439f6a3f3dAurimas Liutikasimport android.support.test.filters.LargeTest;
23bf7c3b4fa6d971201ab3fce162611639b857b810George Mountimport android.test.ActivityInstrumentationTestCase2;
24bf7c3b4fa6d971201ab3fce162611639b857b810George Mountimport android.transition.Transition.EpicenterCallback;
25bf7c3b4fa6d971201ab3fce162611639b857b810George Mountimport android.util.ArrayMap;
26bf7c3b4fa6d971201ab3fce162611639b857b810George Mountimport android.view.View;
27bf7c3b4fa6d971201ab3fce162611639b857b810George Mountimport android.view.animation.AccelerateInterpolator;
28bf7c3b4fa6d971201ab3fce162611639b857b810George Mountimport android.widget.TextView;
29bf7c3b4fa6d971201ab3fce162611639b857b810George Mount
30bf7c3b4fa6d971201ab3fce162611639b857b810George Mountimport com.android.frameworks.coretests.R;
31bf7c3b4fa6d971201ab3fce162611639b857b810George Mount
323f81c33a35e69fcfcb6e1f3d486bc1f01015615bGeorge Mountimport java.lang.reflect.Field;
333f81c33a35e69fcfcb6e1f3d486bc1f01015615bGeorge Mount
34bdbde55592792efe350acd6a46733f439f6a3f3dAurimas Liutikas@LargeTest
35bf7c3b4fa6d971201ab3fce162611639b857b810George Mountpublic class TransitionTest extends ActivityInstrumentationTestCase2<AnimatorSetActivity> {
36bf7c3b4fa6d971201ab3fce162611639b857b810George Mount    Activity mActivity;
37bf7c3b4fa6d971201ab3fce162611639b857b810George Mount    public TransitionTest() {
38bf7c3b4fa6d971201ab3fce162611639b857b810George Mount        super(AnimatorSetActivity.class);
39bf7c3b4fa6d971201ab3fce162611639b857b810George Mount    }
40bf7c3b4fa6d971201ab3fce162611639b857b810George Mount
41bf7c3b4fa6d971201ab3fce162611639b857b810George Mount    @Override
42bf7c3b4fa6d971201ab3fce162611639b857b810George Mount    protected void setUp() throws Exception {
43bf7c3b4fa6d971201ab3fce162611639b857b810George Mount        mActivity = getActivity();
44bf7c3b4fa6d971201ab3fce162611639b857b810George Mount    }
45bf7c3b4fa6d971201ab3fce162611639b857b810George Mount
46bf7c3b4fa6d971201ab3fce162611639b857b810George Mount    public void testClone() throws Throwable {
47bf7c3b4fa6d971201ab3fce162611639b857b810George Mount        View square1 = mActivity.findViewById(R.id.square1);
48bf7c3b4fa6d971201ab3fce162611639b857b810George Mount        View square2 = mActivity.findViewById(R.id.square2);
49bf7c3b4fa6d971201ab3fce162611639b857b810George Mount        View square3 = mActivity.findViewById(R.id.square3);
50bf7c3b4fa6d971201ab3fce162611639b857b810George Mount        Fade fade = new Fade();
51bf7c3b4fa6d971201ab3fce162611639b857b810George Mount        fade.setStartDelay(1000);
52bf7c3b4fa6d971201ab3fce162611639b857b810George Mount        fade.setDuration(1001);
53bf7c3b4fa6d971201ab3fce162611639b857b810George Mount
54bf7c3b4fa6d971201ab3fce162611639b857b810George Mount        fade.addTarget(square1);
55bf7c3b4fa6d971201ab3fce162611639b857b810George Mount        fade.excludeTarget(square2, true);
56bf7c3b4fa6d971201ab3fce162611639b857b810George Mount        fade.excludeChildren(square3, true);
57bf7c3b4fa6d971201ab3fce162611639b857b810George Mount
58bf7c3b4fa6d971201ab3fce162611639b857b810George Mount        fade.addTarget(R.id.square4);
59bf7c3b4fa6d971201ab3fce162611639b857b810George Mount        fade.excludeTarget(R.id.square3, true);
60bf7c3b4fa6d971201ab3fce162611639b857b810George Mount        fade.excludeChildren(R.id.square2, true);
61bf7c3b4fa6d971201ab3fce162611639b857b810George Mount
62bf7c3b4fa6d971201ab3fce162611639b857b810George Mount        fade.addTarget("hello");
63bf7c3b4fa6d971201ab3fce162611639b857b810George Mount        fade.excludeTarget("world", true);
64bf7c3b4fa6d971201ab3fce162611639b857b810George Mount
65bf7c3b4fa6d971201ab3fce162611639b857b810George Mount        fade.addTarget(View.class);
66bf7c3b4fa6d971201ab3fce162611639b857b810George Mount        fade.excludeTarget(TextView.class, true);
67bf7c3b4fa6d971201ab3fce162611639b857b810George Mount
68bf7c3b4fa6d971201ab3fce162611639b857b810George Mount        fade.setMatchOrder(Transition.MATCH_ID);
69bf7c3b4fa6d971201ab3fce162611639b857b810George Mount        fade.setPropagation(new CircularPropagation());
70bf7c3b4fa6d971201ab3fce162611639b857b810George Mount        fade.setPathMotion(new ArcMotion());
71bf7c3b4fa6d971201ab3fce162611639b857b810George Mount        fade.setInterpolator(new AccelerateInterpolator());
72bf7c3b4fa6d971201ab3fce162611639b857b810George Mount        fade.setNameOverrides(new ArrayMap<>());
73bf7c3b4fa6d971201ab3fce162611639b857b810George Mount
74bf7c3b4fa6d971201ab3fce162611639b857b810George Mount        EpicenterCallback epicenterCallback = new EpicenterCallback() {
75bf7c3b4fa6d971201ab3fce162611639b857b810George Mount            @Override
76bf7c3b4fa6d971201ab3fce162611639b857b810George Mount            public Rect onGetEpicenter(Transition transition) {
77bf7c3b4fa6d971201ab3fce162611639b857b810George Mount                return null;
78bf7c3b4fa6d971201ab3fce162611639b857b810George Mount            }
79bf7c3b4fa6d971201ab3fce162611639b857b810George Mount        };
80bf7c3b4fa6d971201ab3fce162611639b857b810George Mount
81bf7c3b4fa6d971201ab3fce162611639b857b810George Mount        fade.setEpicenterCallback(epicenterCallback);
82bf7c3b4fa6d971201ab3fce162611639b857b810George Mount
83bf7c3b4fa6d971201ab3fce162611639b857b810George Mount        Fade clone = (Fade) fade.clone();
843f81c33a35e69fcfcb6e1f3d486bc1f01015615bGeorge Mount        assertFieldEquals(fade, clone, "mStartDelay");
853f81c33a35e69fcfcb6e1f3d486bc1f01015615bGeorge Mount        assertFieldEquals(fade, clone, "mDuration");
863f81c33a35e69fcfcb6e1f3d486bc1f01015615bGeorge Mount        assertFieldEquals(fade, clone, "mInterpolator");
873f81c33a35e69fcfcb6e1f3d486bc1f01015615bGeorge Mount        assertFieldEquals(fade, clone, "mPropagation");
88bf7c3b4fa6d971201ab3fce162611639b857b810George Mount        assertEquals(fade.getPathMotion(), clone.getPathMotion());
89bf7c3b4fa6d971201ab3fce162611639b857b810George Mount        assertEquals(fade.getEpicenterCallback(), clone.getEpicenterCallback());
903f81c33a35e69fcfcb6e1f3d486bc1f01015615bGeorge Mount        assertFieldEquals(fade, clone, "mNameOverrides");
913f81c33a35e69fcfcb6e1f3d486bc1f01015615bGeorge Mount        assertFieldEquals(fade, clone, "mMatchOrder");
923f81c33a35e69fcfcb6e1f3d486bc1f01015615bGeorge Mount
933f81c33a35e69fcfcb6e1f3d486bc1f01015615bGeorge Mount        assertFieldEquals(fade, clone, "mTargets");
943f81c33a35e69fcfcb6e1f3d486bc1f01015615bGeorge Mount        assertFieldEquals(fade, clone, "mTargetExcludes");
953f81c33a35e69fcfcb6e1f3d486bc1f01015615bGeorge Mount        assertFieldEquals(fade, clone, "mTargetChildExcludes");
963f81c33a35e69fcfcb6e1f3d486bc1f01015615bGeorge Mount
973f81c33a35e69fcfcb6e1f3d486bc1f01015615bGeorge Mount        assertFieldEquals(fade, clone, "mTargetIds");
983f81c33a35e69fcfcb6e1f3d486bc1f01015615bGeorge Mount        assertFieldEquals(fade, clone, "mTargetIdExcludes");
993f81c33a35e69fcfcb6e1f3d486bc1f01015615bGeorge Mount        assertFieldEquals(fade, clone, "mTargetIdChildExcludes");
100bf7c3b4fa6d971201ab3fce162611639b857b810George Mount
1013f81c33a35e69fcfcb6e1f3d486bc1f01015615bGeorge Mount        assertFieldEquals(fade, clone, "mTargetNames");
1023f81c33a35e69fcfcb6e1f3d486bc1f01015615bGeorge Mount        assertFieldEquals(fade, clone, "mTargetNameExcludes");
103bf7c3b4fa6d971201ab3fce162611639b857b810George Mount
1043f81c33a35e69fcfcb6e1f3d486bc1f01015615bGeorge Mount        assertFieldEquals(fade, clone, "mTargetTypes");
1053f81c33a35e69fcfcb6e1f3d486bc1f01015615bGeorge Mount        assertFieldEquals(fade, clone, "mTargetTypeExcludes");
1063f81c33a35e69fcfcb6e1f3d486bc1f01015615bGeorge Mount    }
107bf7c3b4fa6d971201ab3fce162611639b857b810George Mount
1083f81c33a35e69fcfcb6e1f3d486bc1f01015615bGeorge Mount    private static void assertFieldEquals(Fade fade1, Fade fade2, String fieldName)
1093f81c33a35e69fcfcb6e1f3d486bc1f01015615bGeorge Mount            throws NoSuchFieldException, IllegalAccessException {
1103f81c33a35e69fcfcb6e1f3d486bc1f01015615bGeorge Mount        Field field = findField(Fade.class, fieldName);
1113f81c33a35e69fcfcb6e1f3d486bc1f01015615bGeorge Mount        field.setAccessible(true);
1123f81c33a35e69fcfcb6e1f3d486bc1f01015615bGeorge Mount        assertEquals("Field '" + fieldName + "' value mismatch", field.get(fade1),
1133f81c33a35e69fcfcb6e1f3d486bc1f01015615bGeorge Mount                field.get(fade2));
1143f81c33a35e69fcfcb6e1f3d486bc1f01015615bGeorge Mount    }
115bf7c3b4fa6d971201ab3fce162611639b857b810George Mount
1163f81c33a35e69fcfcb6e1f3d486bc1f01015615bGeorge Mount    private static Field findField(Class<?> type, String fieldName) throws NoSuchFieldException {
1173f81c33a35e69fcfcb6e1f3d486bc1f01015615bGeorge Mount        while (type != null) {
1183f81c33a35e69fcfcb6e1f3d486bc1f01015615bGeorge Mount            try {
1193f81c33a35e69fcfcb6e1f3d486bc1f01015615bGeorge Mount                return type.getDeclaredField(fieldName);
1203f81c33a35e69fcfcb6e1f3d486bc1f01015615bGeorge Mount            } catch (NoSuchFieldException e) {
1213f81c33a35e69fcfcb6e1f3d486bc1f01015615bGeorge Mount                // try the parent
1223f81c33a35e69fcfcb6e1f3d486bc1f01015615bGeorge Mount                type = type.getSuperclass();
1233f81c33a35e69fcfcb6e1f3d486bc1f01015615bGeorge Mount            }
1243f81c33a35e69fcfcb6e1f3d486bc1f01015615bGeorge Mount        }
1253f81c33a35e69fcfcb6e1f3d486bc1f01015615bGeorge Mount        throw new NoSuchFieldException(fieldName);
126bf7c3b4fa6d971201ab3fce162611639b857b810George Mount    }
127bf7c3b4fa6d971201ab3fce162611639b857b810George Mount}
128