14c904b38c763179727b9b5ea7a80454630545663Yuichi Araki/*
24c904b38c763179727b9b5ea7a80454630545663Yuichi Araki * Copyright (C) 2017 The Android Open Source Project
34c904b38c763179727b9b5ea7a80454630545663Yuichi Araki *
44c904b38c763179727b9b5ea7a80454630545663Yuichi Araki * Licensed under the Apache License, Version 2.0 (the "License");
54c904b38c763179727b9b5ea7a80454630545663Yuichi Araki * you may not use this file except in compliance with the License.
64c904b38c763179727b9b5ea7a80454630545663Yuichi Araki * You may obtain a copy of the License at
74c904b38c763179727b9b5ea7a80454630545663Yuichi Araki *
84c904b38c763179727b9b5ea7a80454630545663Yuichi Araki *      http://www.apache.org/licenses/LICENSE-2.0
94c904b38c763179727b9b5ea7a80454630545663Yuichi Araki *
104c904b38c763179727b9b5ea7a80454630545663Yuichi Araki * Unless required by applicable law or agreed to in writing, software
114c904b38c763179727b9b5ea7a80454630545663Yuichi Araki * distributed under the License is distributed on an "AS IS" BASIS,
124c904b38c763179727b9b5ea7a80454630545663Yuichi Araki * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
134c904b38c763179727b9b5ea7a80454630545663Yuichi Araki * See the License for the specific language governing permissions and
144c904b38c763179727b9b5ea7a80454630545663Yuichi Araki * limitations under the License.
154c904b38c763179727b9b5ea7a80454630545663Yuichi Araki */
164c904b38c763179727b9b5ea7a80454630545663Yuichi Araki
17ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikaspackage androidx.transition;
184c904b38c763179727b9b5ea7a80454630545663Yuichi Araki
19b83b084834029a274192cfb24022f0edd73e03ceYuichi Arakiimport static org.hamcrest.CoreMatchers.is;
20b83b084834029a274192cfb24022f0edd73e03ceYuichi Arakiimport static org.hamcrest.Matchers.greaterThan;
21b83b084834029a274192cfb24022f0edd73e03ceYuichi Arakiimport static org.hamcrest.Matchers.lessThan;
224c904b38c763179727b9b5ea7a80454630545663Yuichi Arakiimport static org.junit.Assert.assertEquals;
23b83b084834029a274192cfb24022f0edd73e03ceYuichi Arakiimport static org.junit.Assert.assertThat;
244c904b38c763179727b9b5ea7a80454630545663Yuichi Arakiimport static org.mockito.Matchers.any;
254c904b38c763179727b9b5ea7a80454630545663Yuichi Arakiimport static org.mockito.Mockito.never;
264c904b38c763179727b9b5ea7a80454630545663Yuichi Arakiimport static org.mockito.Mockito.verify;
274c904b38c763179727b9b5ea7a80454630545663Yuichi Araki
284c904b38c763179727b9b5ea7a80454630545663Yuichi Arakiimport android.os.SystemClock;
294c904b38c763179727b9b5ea7a80454630545663Yuichi Arakiimport android.support.test.InstrumentationRegistry;
304c904b38c763179727b9b5ea7a80454630545663Yuichi Arakiimport android.support.test.filters.MediumTest;
314c904b38c763179727b9b5ea7a80454630545663Yuichi Arakiimport android.view.View;
324c904b38c763179727b9b5ea7a80454630545663Yuichi Araki
334d1d6a17310a57807dabb3f404715cfe43a90ed0Aurimas Liutikasimport androidx.transition.test.R;
344d1d6a17310a57807dabb3f404715cfe43a90ed0Aurimas Liutikas
354c904b38c763179727b9b5ea7a80454630545663Yuichi Arakiimport org.junit.Test;
364c904b38c763179727b9b5ea7a80454630545663Yuichi Araki
374c904b38c763179727b9b5ea7a80454630545663Yuichi Araki@MediumTest
384c904b38c763179727b9b5ea7a80454630545663Yuichi Arakipublic class ExplodeTest extends BaseTransitionTest {
394c904b38c763179727b9b5ea7a80454630545663Yuichi Araki
404c904b38c763179727b9b5ea7a80454630545663Yuichi Araki    @Override
414c904b38c763179727b9b5ea7a80454630545663Yuichi Araki    Transition createTransition() {
424c904b38c763179727b9b5ea7a80454630545663Yuichi Araki        return new Explode();
434c904b38c763179727b9b5ea7a80454630545663Yuichi Araki    }
444c904b38c763179727b9b5ea7a80454630545663Yuichi Araki
454c904b38c763179727b9b5ea7a80454630545663Yuichi Araki    @Test
464c904b38c763179727b9b5ea7a80454630545663Yuichi Araki    public void testExplode() throws Throwable {
474c904b38c763179727b9b5ea7a80454630545663Yuichi Araki        enterScene(R.layout.scene10);
484c904b38c763179727b9b5ea7a80454630545663Yuichi Araki        final View redSquare = rule.getActivity().findViewById(R.id.redSquare);
494c904b38c763179727b9b5ea7a80454630545663Yuichi Araki        final View greenSquare = rule.getActivity().findViewById(R.id.greenSquare);
504c904b38c763179727b9b5ea7a80454630545663Yuichi Araki        final View blueSquare = rule.getActivity().findViewById(R.id.blueSquare);
514c904b38c763179727b9b5ea7a80454630545663Yuichi Araki        final View yellowSquare = rule.getActivity().findViewById(R.id.yellowSquare);
524c904b38c763179727b9b5ea7a80454630545663Yuichi Araki
534c904b38c763179727b9b5ea7a80454630545663Yuichi Araki        rule.runOnUiThread(new Runnable() {
544c904b38c763179727b9b5ea7a80454630545663Yuichi Araki            @Override
554c904b38c763179727b9b5ea7a80454630545663Yuichi Araki            public void run() {
564c904b38c763179727b9b5ea7a80454630545663Yuichi Araki                TransitionManager.beginDelayedTransition(mRoot, mTransition);
574c904b38c763179727b9b5ea7a80454630545663Yuichi Araki                redSquare.setVisibility(View.INVISIBLE);
584c904b38c763179727b9b5ea7a80454630545663Yuichi Araki                greenSquare.setVisibility(View.INVISIBLE);
594c904b38c763179727b9b5ea7a80454630545663Yuichi Araki                blueSquare.setVisibility(View.INVISIBLE);
604c904b38c763179727b9b5ea7a80454630545663Yuichi Araki                yellowSquare.setVisibility(View.INVISIBLE);
614c904b38c763179727b9b5ea7a80454630545663Yuichi Araki            }
624c904b38c763179727b9b5ea7a80454630545663Yuichi Araki        });
634c904b38c763179727b9b5ea7a80454630545663Yuichi Araki        waitForStart();
644c904b38c763179727b9b5ea7a80454630545663Yuichi Araki        verify(mListener, never()).onTransitionEnd(any(Transition.class));
654c904b38c763179727b9b5ea7a80454630545663Yuichi Araki        assertEquals(View.VISIBLE, redSquare.getVisibility());
664c904b38c763179727b9b5ea7a80454630545663Yuichi Araki        assertEquals(View.VISIBLE, greenSquare.getVisibility());
674c904b38c763179727b9b5ea7a80454630545663Yuichi Araki        assertEquals(View.VISIBLE, blueSquare.getVisibility());
684c904b38c763179727b9b5ea7a80454630545663Yuichi Araki        assertEquals(View.VISIBLE, yellowSquare.getVisibility());
694c904b38c763179727b9b5ea7a80454630545663Yuichi Araki        float redStartX = redSquare.getTranslationX();
704c904b38c763179727b9b5ea7a80454630545663Yuichi Araki        float redStartY = redSquare.getTranslationY();
714c904b38c763179727b9b5ea7a80454630545663Yuichi Araki
724c904b38c763179727b9b5ea7a80454630545663Yuichi Araki        SystemClock.sleep(100);
734c904b38c763179727b9b5ea7a80454630545663Yuichi Araki        verifyTranslation(redSquare, true, true);
744c904b38c763179727b9b5ea7a80454630545663Yuichi Araki        verifyTranslation(greenSquare, false, true);
754c904b38c763179727b9b5ea7a80454630545663Yuichi Araki        verifyTranslation(blueSquare, false, false);
764c904b38c763179727b9b5ea7a80454630545663Yuichi Araki        verifyTranslation(yellowSquare, true, false);
77b83b084834029a274192cfb24022f0edd73e03ceYuichi Araki        assertThat(redStartX, is(greaterThan(redSquare.getTranslationX()))); // moving left
78b83b084834029a274192cfb24022f0edd73e03ceYuichi Araki        assertThat(redStartY, is(greaterThan(redSquare.getTranslationY()))); // moving up
794c904b38c763179727b9b5ea7a80454630545663Yuichi Araki        waitForEnd();
804c904b38c763179727b9b5ea7a80454630545663Yuichi Araki
814c904b38c763179727b9b5ea7a80454630545663Yuichi Araki        verifyNoTranslation(redSquare);
824c904b38c763179727b9b5ea7a80454630545663Yuichi Araki        verifyNoTranslation(greenSquare);
834c904b38c763179727b9b5ea7a80454630545663Yuichi Araki        verifyNoTranslation(blueSquare);
844c904b38c763179727b9b5ea7a80454630545663Yuichi Araki        verifyNoTranslation(yellowSquare);
854c904b38c763179727b9b5ea7a80454630545663Yuichi Araki        assertEquals(View.INVISIBLE, redSquare.getVisibility());
864c904b38c763179727b9b5ea7a80454630545663Yuichi Araki        assertEquals(View.INVISIBLE, greenSquare.getVisibility());
874c904b38c763179727b9b5ea7a80454630545663Yuichi Araki        assertEquals(View.INVISIBLE, blueSquare.getVisibility());
884c904b38c763179727b9b5ea7a80454630545663Yuichi Araki        assertEquals(View.INVISIBLE, yellowSquare.getVisibility());
894c904b38c763179727b9b5ea7a80454630545663Yuichi Araki    }
904c904b38c763179727b9b5ea7a80454630545663Yuichi Araki
914c904b38c763179727b9b5ea7a80454630545663Yuichi Araki    @Test
924c904b38c763179727b9b5ea7a80454630545663Yuichi Araki    public void testImplode() throws Throwable {
934c904b38c763179727b9b5ea7a80454630545663Yuichi Araki        enterScene(R.layout.scene10);
944c904b38c763179727b9b5ea7a80454630545663Yuichi Araki        final View redSquare = rule.getActivity().findViewById(R.id.redSquare);
954c904b38c763179727b9b5ea7a80454630545663Yuichi Araki        final View greenSquare = rule.getActivity().findViewById(R.id.greenSquare);
964c904b38c763179727b9b5ea7a80454630545663Yuichi Araki        final View blueSquare = rule.getActivity().findViewById(R.id.blueSquare);
974c904b38c763179727b9b5ea7a80454630545663Yuichi Araki        final View yellowSquare = rule.getActivity().findViewById(R.id.yellowSquare);
984c904b38c763179727b9b5ea7a80454630545663Yuichi Araki
994c904b38c763179727b9b5ea7a80454630545663Yuichi Araki        rule.runOnUiThread(new Runnable() {
1004c904b38c763179727b9b5ea7a80454630545663Yuichi Araki            @Override
1014c904b38c763179727b9b5ea7a80454630545663Yuichi Araki            public void run() {
1024c904b38c763179727b9b5ea7a80454630545663Yuichi Araki                redSquare.setVisibility(View.INVISIBLE);
1034c904b38c763179727b9b5ea7a80454630545663Yuichi Araki                greenSquare.setVisibility(View.INVISIBLE);
1044c904b38c763179727b9b5ea7a80454630545663Yuichi Araki                blueSquare.setVisibility(View.INVISIBLE);
1054c904b38c763179727b9b5ea7a80454630545663Yuichi Araki                yellowSquare.setVisibility(View.INVISIBLE);
1064c904b38c763179727b9b5ea7a80454630545663Yuichi Araki            }
1074c904b38c763179727b9b5ea7a80454630545663Yuichi Araki        });
1084c904b38c763179727b9b5ea7a80454630545663Yuichi Araki        InstrumentationRegistry.getInstrumentation().waitForIdleSync();
1094c904b38c763179727b9b5ea7a80454630545663Yuichi Araki
1104c904b38c763179727b9b5ea7a80454630545663Yuichi Araki        rule.runOnUiThread(new Runnable() {
1114c904b38c763179727b9b5ea7a80454630545663Yuichi Araki            @Override
1124c904b38c763179727b9b5ea7a80454630545663Yuichi Araki            public void run() {
1134c904b38c763179727b9b5ea7a80454630545663Yuichi Araki                TransitionManager.beginDelayedTransition(mRoot, mTransition);
1144c904b38c763179727b9b5ea7a80454630545663Yuichi Araki                redSquare.setVisibility(View.VISIBLE);
1154c904b38c763179727b9b5ea7a80454630545663Yuichi Araki                greenSquare.setVisibility(View.VISIBLE);
1164c904b38c763179727b9b5ea7a80454630545663Yuichi Araki                blueSquare.setVisibility(View.VISIBLE);
1174c904b38c763179727b9b5ea7a80454630545663Yuichi Araki                yellowSquare.setVisibility(View.VISIBLE);
1184c904b38c763179727b9b5ea7a80454630545663Yuichi Araki            }
1194c904b38c763179727b9b5ea7a80454630545663Yuichi Araki        });
1204c904b38c763179727b9b5ea7a80454630545663Yuichi Araki        waitForStart();
1214c904b38c763179727b9b5ea7a80454630545663Yuichi Araki
1224c904b38c763179727b9b5ea7a80454630545663Yuichi Araki        assertEquals(View.VISIBLE, redSquare.getVisibility());
1234c904b38c763179727b9b5ea7a80454630545663Yuichi Araki        assertEquals(View.VISIBLE, greenSquare.getVisibility());
1244c904b38c763179727b9b5ea7a80454630545663Yuichi Araki        assertEquals(View.VISIBLE, blueSquare.getVisibility());
1254c904b38c763179727b9b5ea7a80454630545663Yuichi Araki        assertEquals(View.VISIBLE, yellowSquare.getVisibility());
1264c904b38c763179727b9b5ea7a80454630545663Yuichi Araki        float redStartX = redSquare.getTranslationX();
1274c904b38c763179727b9b5ea7a80454630545663Yuichi Araki        float redStartY = redSquare.getTranslationY();
1284c904b38c763179727b9b5ea7a80454630545663Yuichi Araki
1294c904b38c763179727b9b5ea7a80454630545663Yuichi Araki        SystemClock.sleep(100);
1304c904b38c763179727b9b5ea7a80454630545663Yuichi Araki        verifyTranslation(redSquare, true, true);
1314c904b38c763179727b9b5ea7a80454630545663Yuichi Araki        verifyTranslation(greenSquare, false, true);
1324c904b38c763179727b9b5ea7a80454630545663Yuichi Araki        verifyTranslation(blueSquare, false, false);
1334c904b38c763179727b9b5ea7a80454630545663Yuichi Araki        verifyTranslation(yellowSquare, true, false);
134b83b084834029a274192cfb24022f0edd73e03ceYuichi Araki        assertThat(redStartX, is(lessThan(redSquare.getTranslationX()))); // moving right
135b83b084834029a274192cfb24022f0edd73e03ceYuichi Araki        assertThat(redStartY, is(lessThan(redSquare.getTranslationY()))); // moving down
1364c904b38c763179727b9b5ea7a80454630545663Yuichi Araki        waitForEnd();
1374c904b38c763179727b9b5ea7a80454630545663Yuichi Araki
1384c904b38c763179727b9b5ea7a80454630545663Yuichi Araki        verifyNoTranslation(redSquare);
1394c904b38c763179727b9b5ea7a80454630545663Yuichi Araki        verifyNoTranslation(greenSquare);
1404c904b38c763179727b9b5ea7a80454630545663Yuichi Araki        verifyNoTranslation(blueSquare);
1414c904b38c763179727b9b5ea7a80454630545663Yuichi Araki        verifyNoTranslation(yellowSquare);
1424c904b38c763179727b9b5ea7a80454630545663Yuichi Araki        assertEquals(View.VISIBLE, redSquare.getVisibility());
1434c904b38c763179727b9b5ea7a80454630545663Yuichi Araki        assertEquals(View.VISIBLE, greenSquare.getVisibility());
1444c904b38c763179727b9b5ea7a80454630545663Yuichi Araki        assertEquals(View.VISIBLE, blueSquare.getVisibility());
1454c904b38c763179727b9b5ea7a80454630545663Yuichi Araki        assertEquals(View.VISIBLE, yellowSquare.getVisibility());
1464c904b38c763179727b9b5ea7a80454630545663Yuichi Araki    }
1474c904b38c763179727b9b5ea7a80454630545663Yuichi Araki
1484c904b38c763179727b9b5ea7a80454630545663Yuichi Araki    private void verifyTranslation(View view, boolean goLeft, boolean goUp) {
1494c904b38c763179727b9b5ea7a80454630545663Yuichi Araki        float translationX = view.getTranslationX();
1504c904b38c763179727b9b5ea7a80454630545663Yuichi Araki        float translationY = view.getTranslationY();
1514c904b38c763179727b9b5ea7a80454630545663Yuichi Araki
1524c904b38c763179727b9b5ea7a80454630545663Yuichi Araki        if (goLeft) {
153b83b084834029a274192cfb24022f0edd73e03ceYuichi Araki            assertThat(translationX, is(lessThan(0.f)));
1544c904b38c763179727b9b5ea7a80454630545663Yuichi Araki        } else {
155b83b084834029a274192cfb24022f0edd73e03ceYuichi Araki            assertThat(translationX, is(greaterThan(0.f)));
1564c904b38c763179727b9b5ea7a80454630545663Yuichi Araki        }
1574c904b38c763179727b9b5ea7a80454630545663Yuichi Araki
1584c904b38c763179727b9b5ea7a80454630545663Yuichi Araki        if (goUp) {
159b83b084834029a274192cfb24022f0edd73e03ceYuichi Araki            assertThat(translationY, is(lessThan(0.f)));
1604c904b38c763179727b9b5ea7a80454630545663Yuichi Araki        } else {
161b83b084834029a274192cfb24022f0edd73e03ceYuichi Araki            assertThat(translationY, is(greaterThan(0.f)));
1624c904b38c763179727b9b5ea7a80454630545663Yuichi Araki        }
1634c904b38c763179727b9b5ea7a80454630545663Yuichi Araki    }
1644c904b38c763179727b9b5ea7a80454630545663Yuichi Araki
1654c904b38c763179727b9b5ea7a80454630545663Yuichi Araki    private void verifyNoTranslation(View view) {
1664c904b38c763179727b9b5ea7a80454630545663Yuichi Araki        assertEquals(0f, view.getTranslationX(), 0.0f);
1674c904b38c763179727b9b5ea7a80454630545663Yuichi Araki        assertEquals(0f, view.getTranslationY(), 0.0f);
1684c904b38c763179727b9b5ea7a80454630545663Yuichi Araki    }
1694c904b38c763179727b9b5ea7a80454630545663Yuichi Araki
1704c904b38c763179727b9b5ea7a80454630545663Yuichi Araki}
171