Merge "Fix flaky tests in Transition" into androidx-master-dev
diff --git a/transition/src/androidTest/java/androidx/transition/ChangeClipBoundsTest.java b/transition/src/androidTest/java/androidx/transition/ChangeClipBoundsTest.java
index 87b48c0..bd4f8d1 100644
--- a/transition/src/androidTest/java/androidx/transition/ChangeClipBoundsTest.java
+++ b/transition/src/androidTest/java/androidx/transition/ChangeClipBoundsTest.java
@@ -19,17 +19,22 @@
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
+import static org.mockito.ArgumentMatchers.argThat;
+import static org.mockito.Mockito.reset;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.timeout;
+import static org.mockito.Mockito.verify;
 
+import android.graphics.Color;
 import android.graphics.Rect;
 import android.view.View;
 
 import androidx.core.view.ViewCompat;
 import androidx.test.filters.MediumTest;
 import androidx.test.filters.SdkSuppress;
-import androidx.transition.test.R;
 
 import org.junit.Test;
+import org.mockito.ArgumentMatcher;
 
 @MediumTest
 public class ChangeClipBoundsTest extends BaseTransitionTest {
@@ -42,11 +47,16 @@
     @SdkSuppress(minSdkVersion = 18)
     @Test
     public void testChangeClipBounds() throws Throwable {
-        enterScene(R.layout.scene1);
+        final View redSquare = spy(new View(rule.getActivity()));
+        rule.runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                redSquare.setBackgroundColor(Color.RED);
+                mRoot.addView(redSquare, 100, 100);
+            }
+        });
 
-        final View redSquare = rule.getActivity().findViewById(R.id.redSquare);
-        final Rect newClip = new Rect(redSquare.getLeft() + 10, redSquare.getTop() + 10,
-                redSquare.getRight() - 10, redSquare.getBottom() - 10);
+        final Rect newClip = new Rect(40, 40, 60, 60);
 
         rule.runOnUiThread(new Runnable() {
             @Override
@@ -57,19 +67,8 @@
             }
         });
         waitForStart();
-        Thread.sleep(150);
-        rule.runOnUiThread(new Runnable() {
-            @Override
-            public void run() {
-                Rect midClip = ViewCompat.getClipBounds(redSquare);
-                assertNotNull(midClip);
-                assertTrue(midClip.left > 0 && midClip.left < newClip.left);
-                assertTrue(midClip.top > 0 && midClip.top < newClip.top);
-                assertTrue(midClip.right < redSquare.getRight() && midClip.right > newClip.right);
-                assertTrue(midClip.bottom < redSquare.getBottom()
-                        && midClip.bottom > newClip.bottom);
-            }
-        });
+        verify(redSquare, timeout(1000).atLeastOnce())
+                .setClipBounds(argThat(isRectContaining(newClip)));
         waitForEnd();
 
         rule.runOnUiThread(new Runnable() {
@@ -82,6 +81,7 @@
         });
 
         resetListener();
+        reset(redSquare);
         rule.runOnUiThread(new Runnable() {
             @Override
             public void run() {
@@ -90,19 +90,8 @@
             }
         });
         waitForStart();
-        Thread.sleep(150);
-        rule.runOnUiThread(new Runnable() {
-            @Override
-            public void run() {
-                Rect midClip = ViewCompat.getClipBounds(redSquare);
-                assertNotNull(midClip);
-                assertTrue(midClip.left > 0 && midClip.left < newClip.left);
-                assertTrue(midClip.top > 0 && midClip.top < newClip.top);
-                assertTrue(midClip.right < redSquare.getRight() && midClip.right > newClip.right);
-                assertTrue(midClip.bottom < redSquare.getBottom()
-                        && midClip.bottom > newClip.bottom);
-            }
-        });
+        verify(redSquare, timeout(1000).atLeastOnce())
+                .setClipBounds(argThat(isRectContainedIn(newClip)));
         waitForEnd();
 
         rule.runOnUiThread(new Runnable() {
@@ -114,6 +103,24 @@
 
     }
 
+    private ArgumentMatcher<Rect> isRectContaining(final Rect rect) {
+        return new ArgumentMatcher<Rect>() {
+            @Override
+            public boolean matches(Rect self) {
+                return rect != null && self != null && self.contains(rect);
+            }
+        };
+    }
+
+    private ArgumentMatcher<Rect> isRectContainedIn(final Rect rect) {
+        return new ArgumentMatcher<Rect>() {
+            @Override
+            public boolean matches(Rect self) {
+                return rect != null && self != null && rect.contains(self);
+            }
+        };
+    }
+
     @Test
     public void dummy() {
         // Avoid "No tests found" on older devices
diff --git a/transition/src/androidTest/java/androidx/transition/ChangeScrollTest.java b/transition/src/androidTest/java/androidx/transition/ChangeScrollTest.java
index 23420de..af0c6e0 100644
--- a/transition/src/androidTest/java/androidx/transition/ChangeScrollTest.java
+++ b/transition/src/androidTest/java/androidx/transition/ChangeScrollTest.java
@@ -16,15 +16,17 @@
 
 package androidx.transition;
 
-import static org.hamcrest.CoreMatchers.both;
-import static org.hamcrest.Matchers.greaterThan;
-import static org.hamcrest.Matchers.lessThan;
-import static org.hamcrest.core.Is.is;
 import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertThat;
+import static org.mockito.AdditionalMatchers.and;
+import static org.mockito.AdditionalMatchers.gt;
+import static org.mockito.AdditionalMatchers.lt;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.timeout;
+import static org.mockito.Mockito.verify;
 
-import android.view.View;
+import android.widget.TextView;
 
+import androidx.test.InstrumentationRegistry;
 import androidx.test.filters.MediumTest;
 import androidx.transition.test.R;
 
@@ -40,11 +42,18 @@
 
     @Test
     public void testChangeScroll() throws Throwable {
-        enterScene(R.layout.scene5);
+        final TextView view = spy(new TextView(rule.getActivity()));
+        InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() {
+            @Override
+            public void run() {
+                mRoot.addView(view, 100, 100);
+                view.setText(R.string.longText);
+            }
+        });
+
         rule.runOnUiThread(new Runnable() {
             @Override
             public void run() {
-                final View view = rule.getActivity().findViewById(R.id.text);
                 assertEquals(0, view.getScrollX());
                 assertEquals(0, view.getScrollY());
                 TransitionManager.beginDelayedTransition(mRoot, mTransition);
@@ -52,22 +61,14 @@
             }
         });
         waitForStart();
-        Thread.sleep(150);
-        rule.runOnUiThread(new Runnable() {
-            @Override
-            public void run() {
-                final View view = rule.getActivity().findViewById(R.id.text);
-                final int scrollX = view.getScrollX();
-                final int scrollY = view.getScrollY();
-                assertThat(scrollX, is(both(greaterThan(0)).and(lessThan(150))));
-                assertThat(scrollY, is(both(greaterThan(0)).and(lessThan(300))));
-            }
-        });
+
+        verify(view, timeout(1000).atLeastOnce()).setScrollX(and(gt(0), lt(150)));
+        verify(view, timeout(1000).atLeastOnce()).setScrollY(and(gt(0), lt(300)));
+
         waitForEnd();
         rule.runOnUiThread(new Runnable() {
             @Override
             public void run() {
-                final View view = rule.getActivity().findViewById(R.id.text);
                 assertEquals(150, view.getScrollX());
                 assertEquals(300, view.getScrollY());
             }
diff --git a/transition/src/androidTest/java/androidx/transition/ExplodeTest.java b/transition/src/androidTest/java/androidx/transition/ExplodeTest.java
index 6e93290..03f098f 100644
--- a/transition/src/androidTest/java/androidx/transition/ExplodeTest.java
+++ b/transition/src/androidTest/java/androidx/transition/ExplodeTest.java
@@ -16,93 +16,112 @@
 
 package androidx.transition;
 
-import static org.hamcrest.CoreMatchers.is;
-import static org.hamcrest.Matchers.greaterThan;
-import static org.hamcrest.Matchers.lessThan;
 import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertThat;
-import static org.mockito.Matchers.any;
-import static org.mockito.Mockito.never;
+import static org.mockito.AdditionalMatchers.and;
+import static org.mockito.AdditionalMatchers.gt;
+import static org.mockito.AdditionalMatchers.lt;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.timeout;
 import static org.mockito.Mockito.verify;
 
-import android.os.SystemClock;
+import android.graphics.Color;
+import android.view.Gravity;
 import android.view.View;
+import android.widget.FrameLayout;
+import android.widget.LinearLayout;
 
 import androidx.test.InstrumentationRegistry;
 import androidx.test.filters.MediumTest;
-import androidx.transition.test.R;
 
+import org.junit.Before;
 import org.junit.Test;
+import org.mockito.verification.VerificationMode;
 
 @MediumTest
 public class ExplodeTest extends BaseTransitionTest {
 
+    private View mRedSquare;
+    private View mGreenSquare;
+    private View mBlueSquare;
+    private View mYellowSquare;
+
     @Override
     Transition createTransition() {
         return new Explode();
     }
 
+    @Before
+    public void prepareViews() {
+        mRedSquare = spy(new View(rule.getActivity()));
+        mGreenSquare = spy(new View(rule.getActivity()));
+        mBlueSquare = spy(new View(rule.getActivity()));
+        mYellowSquare = spy(new View(rule.getActivity()));
+        InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() {
+            @Override
+            public void run() {
+                final FrameLayout frame = new FrameLayout(rule.getActivity());
+                mRedSquare.setBackgroundColor(Color.RED);
+                frame.addView(mRedSquare,
+                        new FrameLayout.LayoutParams(100, 100, Gravity.LEFT | Gravity.TOP));
+                mGreenSquare.setBackgroundColor(Color.GREEN);
+                frame.addView(mGreenSquare,
+                        new FrameLayout.LayoutParams(100, 100, Gravity.RIGHT | Gravity.TOP));
+                mBlueSquare.setBackgroundColor(Color.BLUE);
+                frame.addView(mBlueSquare,
+                        new FrameLayout.LayoutParams(100, 100, Gravity.RIGHT | Gravity.BOTTOM));
+                mYellowSquare.setBackgroundColor(Color.YELLOW);
+                frame.addView(mYellowSquare,
+                        new FrameLayout.LayoutParams(100, 100, Gravity.LEFT | Gravity.BOTTOM));
+                mRoot.addView(frame,
+                        LinearLayout.LayoutParams.MATCH_PARENT,
+                        LinearLayout.LayoutParams.MATCH_PARENT);
+            }
+        });
+    }
+
     @Test
     public void testExplode() throws Throwable {
-        enterScene(R.layout.scene10);
-        final View redSquare = rule.getActivity().findViewById(R.id.redSquare);
-        final View greenSquare = rule.getActivity().findViewById(R.id.greenSquare);
-        final View blueSquare = rule.getActivity().findViewById(R.id.blueSquare);
-        final View yellowSquare = rule.getActivity().findViewById(R.id.yellowSquare);
-
         rule.runOnUiThread(new Runnable() {
             @Override
             public void run() {
                 TransitionManager.beginDelayedTransition(mRoot, mTransition);
-                redSquare.setVisibility(View.INVISIBLE);
-                greenSquare.setVisibility(View.INVISIBLE);
-                blueSquare.setVisibility(View.INVISIBLE);
-                yellowSquare.setVisibility(View.INVISIBLE);
+                mRedSquare.setVisibility(View.INVISIBLE);
+                mGreenSquare.setVisibility(View.INVISIBLE);
+                mBlueSquare.setVisibility(View.INVISIBLE);
+                mYellowSquare.setVisibility(View.INVISIBLE);
             }
         });
         waitForStart();
-        verify(mListener, never()).onTransitionEnd(any(Transition.class));
-        assertEquals(View.VISIBLE, redSquare.getVisibility());
-        assertEquals(View.VISIBLE, greenSquare.getVisibility());
-        assertEquals(View.VISIBLE, blueSquare.getVisibility());
-        assertEquals(View.VISIBLE, yellowSquare.getVisibility());
-        float redStartX = redSquare.getTranslationX();
-        float redStartY = redSquare.getTranslationY();
+        assertEquals(View.VISIBLE, mRedSquare.getVisibility());
+        assertEquals(View.VISIBLE, mGreenSquare.getVisibility());
+        assertEquals(View.VISIBLE, mBlueSquare.getVisibility());
+        assertEquals(View.VISIBLE, mYellowSquare.getVisibility());
 
-        SystemClock.sleep(100);
-        verifyTranslation(redSquare, true, true);
-        verifyTranslation(greenSquare, false, true);
-        verifyTranslation(blueSquare, false, false);
-        verifyTranslation(yellowSquare, true, false);
-        assertThat(redStartX, is(greaterThan(redSquare.getTranslationX()))); // moving left
-        assertThat(redStartY, is(greaterThan(redSquare.getTranslationY()))); // moving up
+        verifyMovement(mRedSquare, Gravity.LEFT | Gravity.TOP, true);
+        verifyMovement(mGreenSquare, Gravity.RIGHT | Gravity.TOP, true);
+        verifyMovement(mBlueSquare, Gravity.RIGHT | Gravity.BOTTOM, true);
+        verifyMovement(mYellowSquare, Gravity.LEFT | Gravity.BOTTOM, true);
         waitForEnd();
 
-        verifyNoTranslation(redSquare);
-        verifyNoTranslation(greenSquare);
-        verifyNoTranslation(blueSquare);
-        verifyNoTranslation(yellowSquare);
-        assertEquals(View.INVISIBLE, redSquare.getVisibility());
-        assertEquals(View.INVISIBLE, greenSquare.getVisibility());
-        assertEquals(View.INVISIBLE, blueSquare.getVisibility());
-        assertEquals(View.INVISIBLE, yellowSquare.getVisibility());
+        verifyNoTranslation(mRedSquare);
+        verifyNoTranslation(mGreenSquare);
+        verifyNoTranslation(mBlueSquare);
+        verifyNoTranslation(mYellowSquare);
+        assertEquals(View.INVISIBLE, mRedSquare.getVisibility());
+        assertEquals(View.INVISIBLE, mGreenSquare.getVisibility());
+        assertEquals(View.INVISIBLE, mBlueSquare.getVisibility());
+        assertEquals(View.INVISIBLE, mYellowSquare.getVisibility());
     }
 
     @Test
     public void testImplode() throws Throwable {
-        enterScene(R.layout.scene10);
-        final View redSquare = rule.getActivity().findViewById(R.id.redSquare);
-        final View greenSquare = rule.getActivity().findViewById(R.id.greenSquare);
-        final View blueSquare = rule.getActivity().findViewById(R.id.blueSquare);
-        final View yellowSquare = rule.getActivity().findViewById(R.id.yellowSquare);
-
         rule.runOnUiThread(new Runnable() {
             @Override
             public void run() {
-                redSquare.setVisibility(View.INVISIBLE);
-                greenSquare.setVisibility(View.INVISIBLE);
-                blueSquare.setVisibility(View.INVISIBLE);
-                yellowSquare.setVisibility(View.INVISIBLE);
+                mRedSquare.setVisibility(View.INVISIBLE);
+                mGreenSquare.setVisibility(View.INVISIBLE);
+                mBlueSquare.setVisibility(View.INVISIBLE);
+                mYellowSquare.setVisibility(View.INVISIBLE);
             }
         });
         InstrumentationRegistry.getInstrumentation().waitForIdleSync();
@@ -111,54 +130,64 @@
             @Override
             public void run() {
                 TransitionManager.beginDelayedTransition(mRoot, mTransition);
-                redSquare.setVisibility(View.VISIBLE);
-                greenSquare.setVisibility(View.VISIBLE);
-                blueSquare.setVisibility(View.VISIBLE);
-                yellowSquare.setVisibility(View.VISIBLE);
+                mRedSquare.setVisibility(View.VISIBLE);
+                mGreenSquare.setVisibility(View.VISIBLE);
+                mBlueSquare.setVisibility(View.VISIBLE);
+                mYellowSquare.setVisibility(View.VISIBLE);
             }
         });
         waitForStart();
 
-        assertEquals(View.VISIBLE, redSquare.getVisibility());
-        assertEquals(View.VISIBLE, greenSquare.getVisibility());
-        assertEquals(View.VISIBLE, blueSquare.getVisibility());
-        assertEquals(View.VISIBLE, yellowSquare.getVisibility());
-        float redStartX = redSquare.getTranslationX();
-        float redStartY = redSquare.getTranslationY();
+        assertEquals(View.VISIBLE, mRedSquare.getVisibility());
+        assertEquals(View.VISIBLE, mGreenSquare.getVisibility());
+        assertEquals(View.VISIBLE, mBlueSquare.getVisibility());
+        assertEquals(View.VISIBLE, mYellowSquare.getVisibility());
 
-        SystemClock.sleep(100);
-        verifyTranslation(redSquare, true, true);
-        verifyTranslation(greenSquare, false, true);
-        verifyTranslation(blueSquare, false, false);
-        verifyTranslation(yellowSquare, true, false);
-        assertThat(redStartX, is(lessThan(redSquare.getTranslationX()))); // moving right
-        assertThat(redStartY, is(lessThan(redSquare.getTranslationY()))); // moving down
+        verifyMovement(mRedSquare, Gravity.LEFT | Gravity.TOP, false);
+        verifyMovement(mGreenSquare, Gravity.RIGHT | Gravity.TOP, false);
+        verifyMovement(mBlueSquare, Gravity.RIGHT | Gravity.BOTTOM, false);
+        verifyMovement(mYellowSquare, Gravity.LEFT | Gravity.BOTTOM, false);
         waitForEnd();
 
-        verifyNoTranslation(redSquare);
-        verifyNoTranslation(greenSquare);
-        verifyNoTranslation(blueSquare);
-        verifyNoTranslation(yellowSquare);
-        assertEquals(View.VISIBLE, redSquare.getVisibility());
-        assertEquals(View.VISIBLE, greenSquare.getVisibility());
-        assertEquals(View.VISIBLE, blueSquare.getVisibility());
-        assertEquals(View.VISIBLE, yellowSquare.getVisibility());
+        verifyNoTranslation(mRedSquare);
+        verifyNoTranslation(mGreenSquare);
+        verifyNoTranslation(mBlueSquare);
+        verifyNoTranslation(mYellowSquare);
+        assertEquals(View.VISIBLE, mRedSquare.getVisibility());
+        assertEquals(View.VISIBLE, mGreenSquare.getVisibility());
+        assertEquals(View.VISIBLE, mBlueSquare.getVisibility());
+        assertEquals(View.VISIBLE, mYellowSquare.getVisibility());
     }
 
-    private void verifyTranslation(View view, boolean goLeft, boolean goUp) {
-        float translationX = view.getTranslationX();
-        float translationY = view.getTranslationY();
-
-        if (goLeft) {
-            assertThat(translationX, is(lessThan(0.f)));
-        } else {
-            assertThat(translationX, is(greaterThan(0.f)));
+    private void verifyMovement(View v, int direction, boolean movingOut) {
+        final float startX = v.getTranslationX();
+        final float startY = v.getTranslationY();
+        final VerificationMode mode = timeout(1000).atLeastOnce();
+        if ((direction & Gravity.LEFT) == Gravity.LEFT) {
+            if (movingOut) {
+                verify(v, mode).setTranslationX(and(lt(0f), lt(startX)));
+            } else {
+                verify(v, mode).setTranslationX(and(lt(0f), gt(startX)));
+            }
+        } else if ((direction & Gravity.RIGHT) == Gravity.RIGHT) {
+            if (movingOut) {
+                verify(v, mode).setTranslationX(and(gt(0f), gt(startX)));
+            } else {
+                verify(v, mode).setTranslationX(and(gt(0f), lt(startX)));
+            }
         }
-
-        if (goUp) {
-            assertThat(translationY, is(lessThan(0.f)));
-        } else {
-            assertThat(translationY, is(greaterThan(0.f)));
+        if ((direction & Gravity.TOP) == Gravity.TOP) {
+            if (movingOut) {
+                verify(v, mode).setTranslationY(and(lt(0f), lt(startY)));
+            } else {
+                verify(v, mode).setTranslationY(and(lt(0f), gt(startY)));
+            }
+        } else if ((direction & Gravity.BOTTOM) == Gravity.BOTTOM) {
+            if (movingOut) {
+                verify(v, mode).setTranslationY(and(gt(0f), gt(startY)));
+            } else {
+                verify(v, mode).setTranslationY(and(gt(0f), lt(startY)));
+            }
         }
     }
 
diff --git a/transition/src/androidTest/java/androidx/transition/SlideEdgeTest.java b/transition/src/androidTest/java/androidx/transition/SlideEdgeTest.java
index 9d60d22..0e56fe7 100644
--- a/transition/src/androidTest/java/androidx/transition/SlideEdgeTest.java
+++ b/transition/src/androidTest/java/androidx/transition/SlideEdgeTest.java
@@ -17,41 +17,51 @@
 package androidx.transition;
 
 import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
+import static org.mockito.AdditionalMatchers.and;
+import static org.mockito.AdditionalMatchers.eq;
+import static org.mockito.AdditionalMatchers.gt;
+import static org.mockito.AdditionalMatchers.lt;
+import static org.mockito.AdditionalMatchers.not;
 import static org.mockito.Matchers.any;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.timeout;
 import static org.mockito.Mockito.verify;
 
+import android.graphics.Color;
 import android.view.Gravity;
 import android.view.View;
-import android.view.ViewGroup;
 
+import androidx.core.util.Pair;
 import androidx.test.InstrumentationRegistry;
 import androidx.test.filters.LargeTest;
 import androidx.test.filters.MediumTest;
-import androidx.transition.test.R;
 
 import org.junit.Test;
 
+import java.util.ArrayList;
+
 @MediumTest
 public class SlideEdgeTest extends BaseTransitionTest {
 
-    private static final Object[][] sSlideEdgeArray = {
-            {Gravity.START, "START"},
-            {Gravity.END, "END"},
-            {Gravity.LEFT, "LEFT"},
-            {Gravity.TOP, "TOP"},
-            {Gravity.RIGHT, "RIGHT"},
-            {Gravity.BOTTOM, "BOTTOM"},
-    };
+    private static final ArrayList<Pair<Integer, String>> SLIDE_EDGES = new ArrayList<>();
+
+    static {
+        SLIDE_EDGES.add(new Pair<>(Gravity.START, "START"));
+        SLIDE_EDGES.add(new Pair<>(Gravity.END, "END"));
+        SLIDE_EDGES.add(new Pair<>(Gravity.LEFT, "LEFT"));
+        SLIDE_EDGES.add(new Pair<>(Gravity.TOP, "TOP"));
+        SLIDE_EDGES.add(new Pair<>(Gravity.RIGHT, "RIGHT"));
+        SLIDE_EDGES.add(new Pair<>(Gravity.BOTTOM, "BOTTOM"));
+    }
 
     @Test
-    public void testSetSide() throws Throwable {
-        for (int i = 0; i < sSlideEdgeArray.length; i++) {
-            int slideEdge = (Integer) (sSlideEdgeArray[i][0]);
-            String edgeName = (String) (sSlideEdgeArray[i][1]);
+    public void testSetSide() {
+        for (int i = 0, size = SLIDE_EDGES.size(); i < size; i++) {
+            final Pair<Integer, String> pair = SLIDE_EDGES.get(i);
+            int slideEdge = pair.first;
+            String edgeName = pair.second;
             Slide slide = new Slide(slideEdge);
             assertEquals("Edge not set properly in constructor " + edgeName,
                     slideEdge, slide.getSlideEdge());
@@ -66,203 +76,138 @@
     @LargeTest
     @Test
     public void testSlideOut() throws Throwable {
-        for (int i = 0; i < sSlideEdgeArray.length; i++) {
-            final int slideEdge = (Integer) (sSlideEdgeArray[i][0]);
+        for (int i = 0, size = SLIDE_EDGES.size(); i < size; i++) {
+            int slideEdge = SLIDE_EDGES.get(i).first;
             final Slide slide = new Slide(slideEdge);
             final Transition.TransitionListener listener =
                     mock(Transition.TransitionListener.class);
             slide.addListener(listener);
 
-            rule.runOnUiThread(new Runnable() {
+            final View redSquare = spy(new View(rule.getActivity()));
+            InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() {
                 @Override
                 public void run() {
-                    rule.getActivity().setContentView(R.layout.scene1);
+                    redSquare.setBackgroundColor(Color.RED);
+                    mRoot.addView(redSquare, 100, 100);
                 }
             });
-            InstrumentationRegistry.getInstrumentation().waitForIdleSync();
-
-            final View redSquare = rule.getActivity().findViewById(R.id.redSquare);
-            final View greenSquare = rule.getActivity().findViewById(R.id.greenSquare);
-            final View hello = rule.getActivity().findViewById(R.id.hello);
-            final ViewGroup sceneRoot = (ViewGroup) rule.getActivity().findViewById(R.id.holder);
 
             rule.runOnUiThread(new Runnable() {
                 @Override
                 public void run() {
-                    TransitionManager.beginDelayedTransition(sceneRoot, slide);
+                    TransitionManager.beginDelayedTransition(mRoot, slide);
                     redSquare.setVisibility(View.INVISIBLE);
-                    greenSquare.setVisibility(View.INVISIBLE);
-                    hello.setVisibility(View.INVISIBLE);
                 }
             });
             verify(listener, timeout(1000)).onTransitionStart(any(Transition.class));
-            verify(listener, never()).onTransitionEnd(any(Transition.class));
             assertEquals(View.VISIBLE, redSquare.getVisibility());
-            assertEquals(View.VISIBLE, greenSquare.getVisibility());
-            assertEquals(View.VISIBLE, hello.getVisibility());
 
             float redStartX = redSquare.getTranslationX();
             float redStartY = redSquare.getTranslationY();
 
-            Thread.sleep(200);
-            verifyTranslation(slideEdge, redSquare);
-            verifyTranslation(slideEdge, greenSquare);
-            verifyTranslation(slideEdge, hello);
-
-            final float redMidX = redSquare.getTranslationX();
-            final float redMidY = redSquare.getTranslationY();
-
             switch (slideEdge) {
                 case Gravity.LEFT:
                 case Gravity.START:
-                    assertTrue(
-                            "isn't sliding out to left. Expecting " + redStartX + " > " + redMidX,
-                            redStartX > redMidX);
+                    verify(redSquare, timeout(1000).atLeastOnce())
+                            .setTranslationX(and(lt(0.f), lt(redStartX)));
+                    verify(redSquare, never()).setTranslationY(not(eq(0f, 0.01f)));
                     break;
                 case Gravity.RIGHT:
                 case Gravity.END:
-                    assertTrue(
-                            "isn't sliding out to right. Expecting " + redStartX + " < " + redMidX,
-                            redStartX < redMidX);
+                    verify(redSquare, timeout(1000).atLeastOnce())
+                            .setTranslationX(and(gt(0.f), gt(redStartX)));
+                    verify(redSquare, never()).setTranslationY(not(eq(0f, 0.01f)));
                     break;
                 case Gravity.TOP:
-                    assertTrue("isn't sliding out to top. Expecting " + redStartY + " > " + redMidY,
-                            redStartY > redSquare.getTranslationY());
+                    verify(redSquare, timeout(1000).atLeastOnce())
+                            .setTranslationY(and(lt(0.f), lt(redStartY)));
+                    verify(redSquare, never()).setTranslationX(not(eq(0f, 0.01f)));
                     break;
                 case Gravity.BOTTOM:
-                    assertTrue(
-                            "isn't sliding out to bottom. Expecting " + redStartY + " < " + redMidY,
-                            redStartY < redSquare.getTranslationY());
+                    verify(redSquare, timeout(1000).atLeastOnce())
+                            .setTranslationY(and(gt(0.f), gt(redStartY)));
+                    verify(redSquare, never()).setTranslationX(not(eq(0f, 0.01f)));
                     break;
+                default:
+                    throw new IllegalArgumentException("Incorrect slideEdge");
             }
+
             verify(listener, timeout(1000)).onTransitionEnd(any(Transition.class));
             InstrumentationRegistry.getInstrumentation().waitForIdleSync();
 
             verifyNoTranslation(redSquare);
-            verifyNoTranslation(greenSquare);
-            verifyNoTranslation(hello);
             assertEquals(View.INVISIBLE, redSquare.getVisibility());
-            assertEquals(View.INVISIBLE, greenSquare.getVisibility());
-            assertEquals(View.INVISIBLE, hello.getVisibility());
         }
     }
 
     @LargeTest
     @Test
     public void testSlideIn() throws Throwable {
-        for (int i = 0; i < sSlideEdgeArray.length; i++) {
-            final int slideEdge = (Integer) (sSlideEdgeArray[i][0]);
+        for (int i = 0, size = SLIDE_EDGES.size(); i < size; i++) {
+            final Pair<Integer, String> pair = SLIDE_EDGES.get(i);
+            int slideEdge = pair.first;
             final Slide slide = new Slide(slideEdge);
             final Transition.TransitionListener listener =
                     mock(Transition.TransitionListener.class);
             slide.addListener(listener);
 
-            rule.runOnUiThread(new Runnable() {
+
+            final View redSquare = spy(new View(rule.getActivity()));
+            InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() {
                 @Override
                 public void run() {
-                    rule.getActivity().setContentView(R.layout.scene1);
-                }
-            });
-            InstrumentationRegistry.getInstrumentation().waitForIdleSync();
-
-            final View redSquare = rule.getActivity().findViewById(R.id.redSquare);
-            final View greenSquare = rule.getActivity().findViewById(R.id.greenSquare);
-            final View hello = rule.getActivity().findViewById(R.id.hello);
-            final ViewGroup sceneRoot = (ViewGroup) rule.getActivity().findViewById(R.id.holder);
-
-            rule.runOnUiThread(new Runnable() {
-                @Override
-                public void run() {
+                    redSquare.setBackgroundColor(Color.RED);
+                    mRoot.addView(redSquare, 100, 100);
                     redSquare.setVisibility(View.INVISIBLE);
-                    greenSquare.setVisibility(View.INVISIBLE);
-                    hello.setVisibility(View.INVISIBLE);
                 }
             });
-            InstrumentationRegistry.getInstrumentation().waitForIdleSync();
 
             // now slide in
             rule.runOnUiThread(new Runnable() {
                 @Override
                 public void run() {
-                    TransitionManager.beginDelayedTransition(sceneRoot, slide);
+                    TransitionManager.beginDelayedTransition(mRoot, slide);
                     redSquare.setVisibility(View.VISIBLE);
-                    greenSquare.setVisibility(View.VISIBLE);
-                    hello.setVisibility(View.VISIBLE);
                 }
             });
-            verify(listener, timeout(1000)).onTransitionStart(any(Transition.class));
 
-            verify(listener, never()).onTransitionEnd(any(Transition.class));
+            verify(listener, timeout(1000)).onTransitionStart(any(Transition.class));
             assertEquals(View.VISIBLE, redSquare.getVisibility());
-            assertEquals(View.VISIBLE, greenSquare.getVisibility());
-            assertEquals(View.VISIBLE, hello.getVisibility());
 
             final float redStartX = redSquare.getTranslationX();
             final float redStartY = redSquare.getTranslationY();
 
-            Thread.sleep(200);
-            verifyTranslation(slideEdge, redSquare);
-            verifyTranslation(slideEdge, greenSquare);
-            verifyTranslation(slideEdge, hello);
-            final float redMidX = redSquare.getTranslationX();
-            final float redMidY = redSquare.getTranslationY();
-
             switch (slideEdge) {
                 case Gravity.LEFT:
                 case Gravity.START:
-                    assertTrue(
-                            "isn't sliding in from left. Expecting " + redStartX + " < " + redMidX,
-                            redStartX < redMidX);
+                    verify(redSquare, timeout(1000).atLeastOnce())
+                            .setTranslationX(and(gt(redStartX), lt(0.f)));
+                    verify(redSquare, never()).setTranslationY(not(eq(0f, 0.01f)));
                     break;
                 case Gravity.RIGHT:
                 case Gravity.END:
-                    assertTrue(
-                            "isn't sliding in from right. Expecting " + redStartX + " > " + redMidX,
-                            redStartX > redMidX);
+                    verify(redSquare, timeout(1000).atLeastOnce())
+                            .setTranslationX(and(gt(0.f), lt(redStartX)));
+                    verify(redSquare, never()).setTranslationY(not(eq(0f, 0.01f)));
                     break;
                 case Gravity.TOP:
-                    assertTrue(
-                            "isn't sliding in from top. Expecting " + redStartY + " < " + redMidY,
-                            redStartY < redSquare.getTranslationY());
+                    verify(redSquare, timeout(1000).atLeastOnce())
+                            .setTranslationY(and(gt(redStartY), lt(0.f)));
+                    verify(redSquare, never()).setTranslationX(not(eq(0f, 0.01f)));
                     break;
                 case Gravity.BOTTOM:
-                    assertTrue("isn't sliding in from bottom. Expecting " + redStartY + " > "
-                                    + redMidY,
-                            redStartY > redSquare.getTranslationY());
+                    verify(redSquare, timeout(1000).atLeastOnce())
+                            .setTranslationY(and(gt(0.f), lt(redStartY)));
+                    verify(redSquare, never()).setTranslationX(not(eq(0f, 0.01f)));
                     break;
+                default:
+                    throw new IllegalArgumentException("Incorrect slideEdge");
             }
             verify(listener, timeout(1000)).onTransitionEnd(any(Transition.class));
             InstrumentationRegistry.getInstrumentation().waitForIdleSync();
 
             verifyNoTranslation(redSquare);
-            verifyNoTranslation(greenSquare);
-            verifyNoTranslation(hello);
             assertEquals(View.VISIBLE, redSquare.getVisibility());
-            assertEquals(View.VISIBLE, greenSquare.getVisibility());
-            assertEquals(View.VISIBLE, hello.getVisibility());
-        }
-    }
-
-    private void verifyTranslation(int slideEdge, View view) {
-        switch (slideEdge) {
-            case Gravity.LEFT:
-            case Gravity.START:
-                assertTrue(view.getTranslationX() < 0);
-                assertEquals(0f, view.getTranslationY(), 0.01f);
-                break;
-            case Gravity.RIGHT:
-            case Gravity.END:
-                assertTrue(view.getTranslationX() > 0);
-                assertEquals(0f, view.getTranslationY(), 0.01f);
-                break;
-            case Gravity.TOP:
-                assertTrue(view.getTranslationY() < 0);
-                assertEquals(0f, view.getTranslationX(), 0.01f);
-                break;
-            case Gravity.BOTTOM:
-                assertTrue(view.getTranslationY() > 0);
-                assertEquals(0f, view.getTranslationX(), 0.01f);
-                break;
         }
     }
 
diff --git a/transition/src/androidTest/java/androidx/transition/TransitionActivity.java b/transition/src/androidTest/java/androidx/transition/TransitionActivity.java
index a155a65..6fa1fe1 100644
--- a/transition/src/androidTest/java/androidx/transition/TransitionActivity.java
+++ b/transition/src/androidTest/java/androidx/transition/TransitionActivity.java
@@ -18,6 +18,7 @@
 
 import android.os.Bundle;
 import android.view.ViewGroup;
+import android.view.WindowManager;
 import android.widget.LinearLayout;
 
 import androidx.fragment.app.FragmentActivity;
@@ -30,6 +31,8 @@
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
+        getWindow().addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
+                | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);
         setContentView(R.layout.activity_transition);
         mRoot = findViewById(R.id.root);
     }