1f137a45c77ee2e753262dc3c5f691fdcfd75053bYuichi Araki/*
2f137a45c77ee2e753262dc3c5f691fdcfd75053bYuichi Araki * Copyright (C) 2017 The Android Open Source Project
3f137a45c77ee2e753262dc3c5f691fdcfd75053bYuichi Araki *
4f137a45c77ee2e753262dc3c5f691fdcfd75053bYuichi Araki * Licensed under the Apache License, Version 2.0 (the "License");
5f137a45c77ee2e753262dc3c5f691fdcfd75053bYuichi Araki * you may not use this file except in compliance with the License.
6f137a45c77ee2e753262dc3c5f691fdcfd75053bYuichi Araki * You may obtain a copy of the License at
7f137a45c77ee2e753262dc3c5f691fdcfd75053bYuichi Araki *
8f137a45c77ee2e753262dc3c5f691fdcfd75053bYuichi Araki *      http://www.apache.org/licenses/LICENSE-2.0
9f137a45c77ee2e753262dc3c5f691fdcfd75053bYuichi Araki *
10f137a45c77ee2e753262dc3c5f691fdcfd75053bYuichi Araki * Unless required by applicable law or agreed to in writing, software
11f137a45c77ee2e753262dc3c5f691fdcfd75053bYuichi Araki * distributed under the License is distributed on an "AS IS" BASIS,
12f137a45c77ee2e753262dc3c5f691fdcfd75053bYuichi Araki * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13f137a45c77ee2e753262dc3c5f691fdcfd75053bYuichi Araki * See the License for the specific language governing permissions and
14f137a45c77ee2e753262dc3c5f691fdcfd75053bYuichi Araki * limitations under the License.
15f137a45c77ee2e753262dc3c5f691fdcfd75053bYuichi Araki */
16f137a45c77ee2e753262dc3c5f691fdcfd75053bYuichi Araki
17f137a45c77ee2e753262dc3c5f691fdcfd75053bYuichi Arakipackage android.support.transition;
18f137a45c77ee2e753262dc3c5f691fdcfd75053bYuichi Araki
19f137a45c77ee2e753262dc3c5f691fdcfd75053bYuichi Arakiimport static org.junit.Assert.assertEquals;
20f137a45c77ee2e753262dc3c5f691fdcfd75053bYuichi Arakiimport static org.junit.Assert.assertNotNull;
21f137a45c77ee2e753262dc3c5f691fdcfd75053bYuichi Arakiimport static org.junit.Assert.assertNull;
22f137a45c77ee2e753262dc3c5f691fdcfd75053bYuichi Arakiimport static org.junit.Assert.assertTrue;
23f137a45c77ee2e753262dc3c5f691fdcfd75053bYuichi Araki
24f137a45c77ee2e753262dc3c5f691fdcfd75053bYuichi Arakiimport android.graphics.Rect;
25f137a45c77ee2e753262dc3c5f691fdcfd75053bYuichi Arakiimport android.support.test.filters.MediumTest;
26f137a45c77ee2e753262dc3c5f691fdcfd75053bYuichi Arakiimport android.support.test.filters.SdkSuppress;
27f137a45c77ee2e753262dc3c5f691fdcfd75053bYuichi Arakiimport android.support.transition.test.R;
28f137a45c77ee2e753262dc3c5f691fdcfd75053bYuichi Arakiimport android.support.v4.view.ViewCompat;
29f137a45c77ee2e753262dc3c5f691fdcfd75053bYuichi Arakiimport android.view.View;
30f137a45c77ee2e753262dc3c5f691fdcfd75053bYuichi Araki
31f137a45c77ee2e753262dc3c5f691fdcfd75053bYuichi Arakiimport org.junit.Test;
32f137a45c77ee2e753262dc3c5f691fdcfd75053bYuichi Araki
33f137a45c77ee2e753262dc3c5f691fdcfd75053bYuichi Araki@MediumTest
34f137a45c77ee2e753262dc3c5f691fdcfd75053bYuichi Arakipublic class ChangeClipBoundsTest extends BaseTransitionTest {
35f137a45c77ee2e753262dc3c5f691fdcfd75053bYuichi Araki
36f137a45c77ee2e753262dc3c5f691fdcfd75053bYuichi Araki    @Override
37f137a45c77ee2e753262dc3c5f691fdcfd75053bYuichi Araki    Transition createTransition() {
38f137a45c77ee2e753262dc3c5f691fdcfd75053bYuichi Araki        return new ChangeClipBounds();
39f137a45c77ee2e753262dc3c5f691fdcfd75053bYuichi Araki    }
40f137a45c77ee2e753262dc3c5f691fdcfd75053bYuichi Araki
41f137a45c77ee2e753262dc3c5f691fdcfd75053bYuichi Araki    @SdkSuppress(minSdkVersion = 18)
42f137a45c77ee2e753262dc3c5f691fdcfd75053bYuichi Araki    @Test
43f137a45c77ee2e753262dc3c5f691fdcfd75053bYuichi Araki    public void testChangeClipBounds() throws Throwable {
44f137a45c77ee2e753262dc3c5f691fdcfd75053bYuichi Araki        enterScene(R.layout.scene1);
45f137a45c77ee2e753262dc3c5f691fdcfd75053bYuichi Araki
46f137a45c77ee2e753262dc3c5f691fdcfd75053bYuichi Araki        final View redSquare = rule.getActivity().findViewById(R.id.redSquare);
47f137a45c77ee2e753262dc3c5f691fdcfd75053bYuichi Araki        final Rect newClip = new Rect(redSquare.getLeft() + 10, redSquare.getTop() + 10,
48f137a45c77ee2e753262dc3c5f691fdcfd75053bYuichi Araki                redSquare.getRight() - 10, redSquare.getBottom() - 10);
49f137a45c77ee2e753262dc3c5f691fdcfd75053bYuichi Araki
50f137a45c77ee2e753262dc3c5f691fdcfd75053bYuichi Araki        rule.runOnUiThread(new Runnable() {
51f137a45c77ee2e753262dc3c5f691fdcfd75053bYuichi Araki            @Override
52f137a45c77ee2e753262dc3c5f691fdcfd75053bYuichi Araki            public void run() {
53f137a45c77ee2e753262dc3c5f691fdcfd75053bYuichi Araki                assertNull(ViewCompat.getClipBounds(redSquare));
54f137a45c77ee2e753262dc3c5f691fdcfd75053bYuichi Araki                TransitionManager.beginDelayedTransition(mRoot, mTransition);
55f137a45c77ee2e753262dc3c5f691fdcfd75053bYuichi Araki                ViewCompat.setClipBounds(redSquare, newClip);
56f137a45c77ee2e753262dc3c5f691fdcfd75053bYuichi Araki            }
57f137a45c77ee2e753262dc3c5f691fdcfd75053bYuichi Araki        });
58f137a45c77ee2e753262dc3c5f691fdcfd75053bYuichi Araki        waitForStart();
59f137a45c77ee2e753262dc3c5f691fdcfd75053bYuichi Araki        Thread.sleep(150);
60f137a45c77ee2e753262dc3c5f691fdcfd75053bYuichi Araki        rule.runOnUiThread(new Runnable() {
61f137a45c77ee2e753262dc3c5f691fdcfd75053bYuichi Araki            @Override
62f137a45c77ee2e753262dc3c5f691fdcfd75053bYuichi Araki            public void run() {
63f137a45c77ee2e753262dc3c5f691fdcfd75053bYuichi Araki                Rect midClip = ViewCompat.getClipBounds(redSquare);
64f137a45c77ee2e753262dc3c5f691fdcfd75053bYuichi Araki                assertNotNull(midClip);
65f137a45c77ee2e753262dc3c5f691fdcfd75053bYuichi Araki                assertTrue(midClip.left > 0 && midClip.left < newClip.left);
66f137a45c77ee2e753262dc3c5f691fdcfd75053bYuichi Araki                assertTrue(midClip.top > 0 && midClip.top < newClip.top);
67f137a45c77ee2e753262dc3c5f691fdcfd75053bYuichi Araki                assertTrue(midClip.right < redSquare.getRight() && midClip.right > newClip.right);
68f137a45c77ee2e753262dc3c5f691fdcfd75053bYuichi Araki                assertTrue(midClip.bottom < redSquare.getBottom()
69f137a45c77ee2e753262dc3c5f691fdcfd75053bYuichi Araki                        && midClip.bottom > newClip.bottom);
70f137a45c77ee2e753262dc3c5f691fdcfd75053bYuichi Araki            }
71f137a45c77ee2e753262dc3c5f691fdcfd75053bYuichi Araki        });
72f137a45c77ee2e753262dc3c5f691fdcfd75053bYuichi Araki        waitForEnd();
73f137a45c77ee2e753262dc3c5f691fdcfd75053bYuichi Araki
74f137a45c77ee2e753262dc3c5f691fdcfd75053bYuichi Araki        rule.runOnUiThread(new Runnable() {
75f137a45c77ee2e753262dc3c5f691fdcfd75053bYuichi Araki            @Override
76f137a45c77ee2e753262dc3c5f691fdcfd75053bYuichi Araki            public void run() {
77f137a45c77ee2e753262dc3c5f691fdcfd75053bYuichi Araki                final Rect endRect = ViewCompat.getClipBounds(redSquare);
78f137a45c77ee2e753262dc3c5f691fdcfd75053bYuichi Araki                assertNotNull(endRect);
79f137a45c77ee2e753262dc3c5f691fdcfd75053bYuichi Araki                assertEquals(newClip, endRect);
80f137a45c77ee2e753262dc3c5f691fdcfd75053bYuichi Araki            }
81f137a45c77ee2e753262dc3c5f691fdcfd75053bYuichi Araki        });
82f137a45c77ee2e753262dc3c5f691fdcfd75053bYuichi Araki
83f137a45c77ee2e753262dc3c5f691fdcfd75053bYuichi Araki        resetListener();
84f137a45c77ee2e753262dc3c5f691fdcfd75053bYuichi Araki        rule.runOnUiThread(new Runnable() {
85f137a45c77ee2e753262dc3c5f691fdcfd75053bYuichi Araki            @Override
86f137a45c77ee2e753262dc3c5f691fdcfd75053bYuichi Araki            public void run() {
87f137a45c77ee2e753262dc3c5f691fdcfd75053bYuichi Araki                TransitionManager.beginDelayedTransition(mRoot, mTransition);
88f137a45c77ee2e753262dc3c5f691fdcfd75053bYuichi Araki                ViewCompat.setClipBounds(redSquare, null);
89f137a45c77ee2e753262dc3c5f691fdcfd75053bYuichi Araki            }
90f137a45c77ee2e753262dc3c5f691fdcfd75053bYuichi Araki        });
91f137a45c77ee2e753262dc3c5f691fdcfd75053bYuichi Araki        waitForStart();
92f137a45c77ee2e753262dc3c5f691fdcfd75053bYuichi Araki        Thread.sleep(150);
93f137a45c77ee2e753262dc3c5f691fdcfd75053bYuichi Araki        rule.runOnUiThread(new Runnable() {
94f137a45c77ee2e753262dc3c5f691fdcfd75053bYuichi Araki            @Override
95f137a45c77ee2e753262dc3c5f691fdcfd75053bYuichi Araki            public void run() {
96f137a45c77ee2e753262dc3c5f691fdcfd75053bYuichi Araki                Rect midClip = ViewCompat.getClipBounds(redSquare);
97f137a45c77ee2e753262dc3c5f691fdcfd75053bYuichi Araki                assertNotNull(midClip);
98f137a45c77ee2e753262dc3c5f691fdcfd75053bYuichi Araki                assertTrue(midClip.left > 0 && midClip.left < newClip.left);
99f137a45c77ee2e753262dc3c5f691fdcfd75053bYuichi Araki                assertTrue(midClip.top > 0 && midClip.top < newClip.top);
100f137a45c77ee2e753262dc3c5f691fdcfd75053bYuichi Araki                assertTrue(midClip.right < redSquare.getRight() && midClip.right > newClip.right);
101f137a45c77ee2e753262dc3c5f691fdcfd75053bYuichi Araki                assertTrue(midClip.bottom < redSquare.getBottom()
102f137a45c77ee2e753262dc3c5f691fdcfd75053bYuichi Araki                        && midClip.bottom > newClip.bottom);
103f137a45c77ee2e753262dc3c5f691fdcfd75053bYuichi Araki            }
104f137a45c77ee2e753262dc3c5f691fdcfd75053bYuichi Araki        });
105f137a45c77ee2e753262dc3c5f691fdcfd75053bYuichi Araki        waitForEnd();
106f137a45c77ee2e753262dc3c5f691fdcfd75053bYuichi Araki
107f137a45c77ee2e753262dc3c5f691fdcfd75053bYuichi Araki        rule.runOnUiThread(new Runnable() {
108f137a45c77ee2e753262dc3c5f691fdcfd75053bYuichi Araki            @Override
109f137a45c77ee2e753262dc3c5f691fdcfd75053bYuichi Araki            public void run() {
1105fab35f1819881c2c128775aa50797301c4a50ceYuichi Araki                assertNull(ViewCompat.getClipBounds(redSquare));
111f137a45c77ee2e753262dc3c5f691fdcfd75053bYuichi Araki            }
112f137a45c77ee2e753262dc3c5f691fdcfd75053bYuichi Araki        });
113f137a45c77ee2e753262dc3c5f691fdcfd75053bYuichi Araki
114f137a45c77ee2e753262dc3c5f691fdcfd75053bYuichi Araki    }
115f137a45c77ee2e753262dc3c5f691fdcfd75053bYuichi Araki
116f137a45c77ee2e753262dc3c5f691fdcfd75053bYuichi Araki    @Test
117f137a45c77ee2e753262dc3c5f691fdcfd75053bYuichi Araki    public void dummy() {
118f137a45c77ee2e753262dc3c5f691fdcfd75053bYuichi Araki        // Avoid "No tests found" on older devices
119f137a45c77ee2e753262dc3c5f691fdcfd75053bYuichi Araki    }
120f137a45c77ee2e753262dc3c5f691fdcfd75053bYuichi Araki
121f137a45c77ee2e753262dc3c5f691fdcfd75053bYuichi Araki}
122