Add tests to the ViewPager2 demo project

Adds a test for every demo activity, and adds several Espresso tools
that may be reused by devs.

Extended and simplified the build.gradle of the demo project.

Moved the demo project to viewpager2/integration-tests/testapp so the
apk of the demo is picked up and installed in our presubmit, so we can
pass our presubmit tests.

Bug: 122659289
Test: ./gradlew viewpager2-demos:connectedCheck
Change-Id: Ia94b813d6b6af620117b65186eb8a928e2cc5980
diff --git a/settings.gradle b/settings.gradle
index fbd60d7..5006b64 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -178,6 +178,7 @@
 includeProject(":vectordrawable-animated", "graphics/drawable/animated")
 includeProject(":viewpager", "viewpager")
 includeProject(":viewpager2", "viewpager2")
+includeProject(":viewpager2:integration-tests:testapp", "viewpager2/integration-tests/testapp")
 includeProject(":wear", "wear")
 includeProject(":webkit", "webkit")
 includeProject(":webkit:integration-tests:testapp", "webkit/integration-tests/testapp")
@@ -226,7 +227,6 @@
 includeProject(":support-v7-demos", new File(samplesRoot, "Support7Demos"))
 includeProject(":support-v13-demos", new File(samplesRoot, "Support13Demos"))
 includeProject(":support-wear-demos", new File(samplesRoot, "SupportWearDemos"))
-includeProject(":viewpager2-demos", new File(samplesRoot, "ViewPager2Demos"))
 
 /////////////////////////////
 //
@@ -274,4 +274,4 @@
 
 // dumb test project that has a test for each size to ensure that at least one test is run
 // for each size and test runner is happy when there is nothing to test.
-includeProject(":dumb-tests", "dumb-tests")
\ No newline at end of file
+includeProject(":dumb-tests", "dumb-tests")
diff --git a/samples/ViewPager2Demos/OWNERS b/viewpager2/integration-tests/testapp/OWNERS
similarity index 100%
rename from samples/ViewPager2Demos/OWNERS
rename to viewpager2/integration-tests/testapp/OWNERS
diff --git a/samples/ViewPager2Demos/build.gradle b/viewpager2/integration-tests/testapp/build.gradle
similarity index 66%
rename from samples/ViewPager2Demos/build.gradle
rename to viewpager2/integration-tests/testapp/build.gradle
index 902c3e6..2b3a756 100644
--- a/samples/ViewPager2Demos/build.gradle
+++ b/viewpager2/integration-tests/testapp/build.gradle
@@ -14,8 +14,12 @@
  * limitations under the License.
  */
 
+import static androidx.build.dependencies.DependenciesKt.ARCH_LIFECYCLE_EXTENSIONS
+import static androidx.build.dependencies.DependenciesKt.ESPRESSO_CORE
 import static androidx.build.dependencies.DependenciesKt.KOTLIN_STDLIB
 import static androidx.build.dependencies.DependenciesKt.SUPPORT_DESIGN
+import static androidx.build.dependencies.DependenciesKt.TEST_EXT_JUNIT
+import static androidx.build.dependencies.DependenciesKt.TEST_RULES
 
 plugins {
     id("AndroidXPlugin")
@@ -27,7 +31,11 @@
 dependencies {
     api(KOTLIN_STDLIB)
     implementation(project(":viewpager2"))
-    implementation(project(":lifecycle:lifecycle-extensions"))
-    implementation(SUPPORT_DESIGN, libs.exclude_for_material)
+    implementation(ARCH_LIFECYCLE_EXTENSIONS)
+    implementation(SUPPORT_DESIGN)
     implementation(project(":cardview"))
+
+    androidTestImplementation(TEST_RULES)
+    androidTestImplementation(TEST_EXT_JUNIT)
+    androidTestImplementation(ESPRESSO_CORE)
 }
diff --git a/viewpager2/integration-tests/testapp/src/androidTest/java/com/example/androidx/viewpager2/BaseTest.kt b/viewpager2/integration-tests/testapp/src/androidTest/java/com/example/androidx/viewpager2/BaseTest.kt
new file mode 100644
index 0000000..6d1ef0e
--- /dev/null
+++ b/viewpager2/integration-tests/testapp/src/androidTest/java/com/example/androidx/viewpager2/BaseTest.kt
@@ -0,0 +1,80 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.androidx.viewpager2
+
+import android.view.View
+import androidx.annotation.LayoutRes
+import androidx.fragment.app.FragmentActivity
+import androidx.test.espresso.Espresso.onIdle
+import androidx.test.espresso.assertion.ViewAssertions.matches
+import androidx.test.espresso.matcher.ViewMatchers.hasDescendant
+import androidx.test.espresso.matcher.ViewMatchers.withText
+import androidx.test.rule.ActivityTestRule
+import androidx.viewpager2.widget.ViewPager2
+import com.example.androidx.viewpager2.test.onCurrentPage
+import com.example.androidx.viewpager2.test.onViewPager
+import com.example.androidx.viewpager2.test.swipeNext
+import com.example.androidx.viewpager2.test.swipePrevious
+import com.example.androidx.viewpager2.test.ViewPagerIdleWatcher
+import org.hamcrest.Matcher
+import org.junit.After
+import org.junit.Before
+import org.junit.Rule
+
+abstract class BaseTest<T : FragmentActivity>(clazz: Class<T>) {
+    @Rule
+    @JvmField
+    var activityTestRule = ActivityTestRule(clazz)
+
+    @get:LayoutRes
+    abstract val layoutId: Int
+
+    lateinit var idleWatcher: ViewPagerIdleWatcher
+
+    @Before
+    open fun setUp() {
+        val viewPager = activityTestRule.activity.findViewById<ViewPager2>(layoutId)
+        idleWatcher = ViewPagerIdleWatcher.registerViewPagerIdlingResource(viewPager)
+    }
+
+    @After
+    open fun tearDown() {
+        idleWatcher.unregister()
+    }
+
+    fun swipeToNextPage(action: (() -> Unit)? = null) {
+        onViewPager().perform(swipeNext())
+        if (action != null) action()
+        idleWatcher.waitForIdle()
+        onIdle()
+    }
+
+    fun swipeToPreviousPage(action: (() -> Unit)? = null) {
+        onViewPager().perform(swipePrevious())
+        if (action != null) action()
+        idleWatcher.waitForIdle()
+        onIdle()
+    }
+
+    fun verifyCurrentPage(pageText: String) {
+        verifyCurrentPage(hasDescendant(withText(pageText)))
+    }
+
+    fun verifyCurrentPage(matcher: Matcher<View>) {
+        onCurrentPage().check(matches(matcher))
+    }
+}
diff --git a/viewpager2/integration-tests/testapp/src/androidTest/java/com/example/androidx/viewpager2/MutableCollectionBaseTest.kt b/viewpager2/integration-tests/testapp/src/androidTest/java/com/example/androidx/viewpager2/MutableCollectionBaseTest.kt
new file mode 100644
index 0000000..3dc1d78
--- /dev/null
+++ b/viewpager2/integration-tests/testapp/src/androidTest/java/com/example/androidx/viewpager2/MutableCollectionBaseTest.kt
@@ -0,0 +1,92 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.androidx.viewpager2
+
+import androidx.test.espresso.Espresso.onData
+import androidx.test.espresso.Espresso.onView
+import androidx.test.espresso.action.ViewActions.click
+import androidx.test.espresso.assertion.ViewAssertions.matches
+import androidx.test.espresso.matcher.ViewMatchers.hasDescendant
+import androidx.test.espresso.matcher.ViewMatchers.withId
+import androidx.test.espresso.matcher.ViewMatchers.withText
+import org.hamcrest.CoreMatchers.allOf
+import org.hamcrest.CoreMatchers.equalTo
+import org.junit.Test
+
+abstract class MutableCollectionBaseTest<T : MutableCollectionBaseActivity>(clazz: Class<T>) :
+    BaseTest<T>(clazz) {
+    override val layoutId get() = R.id.viewPager
+
+    @Test
+    fun testKeepsState() {
+        // increase count of page 1 to 1
+        verifyPage(1)
+        increaseCount()
+        verifyCount(1)
+
+        // increase count of page 8 to 3
+        repeat(7) { swipeToNextPage() }
+        verifyPage(8)
+        repeat(3) { increaseCount() }
+        verifyCount(3)
+
+        // insert page at the beginning
+        choosePage(1)
+        insertPageBefore()
+        // check that we're now looking at the page before page 8
+        verifyPage(7)
+        verifyCount(0)
+        // swipe back to page 8
+        swipeToNextPage()
+        verifyPage(8)
+        verifyCount(3)
+
+        // swipe back to page 1
+        repeat(7) { swipeToPreviousPage() }
+        verifyPage(1)
+        verifyCount(1)
+
+        // check the newly inserted page
+        swipeToPreviousPage()
+        verifyPage(10)
+        verifyCount(0)
+    }
+
+    private fun increaseCount() {
+        onView(withId(R.id.buttonCountIncrease)).perform(click())
+    }
+
+    private fun verifyCount(count: Int) {
+        onView(withId(R.id.textViewCount)).check(matches(withText("$count")))
+    }
+
+    private fun verifyPage(page: Int) {
+        verifyCurrentPage(hasDescendant(allOf(
+            withId(R.id.textViewItemText),
+            withText("item#$page")
+        )))
+    }
+
+    private fun choosePage(page: Int) {
+        onView(withId(R.id.itemSpinner)).perform(click())
+        onData(equalTo("item#$page")).perform(click())
+    }
+
+    private fun insertPageBefore() {
+        onView(withId(R.id.buttonAddBefore)).perform(click())
+    }
+}
diff --git a/viewpager2/integration-tests/testapp/src/androidTest/java/com/example/androidx/viewpager2/MutableCollectionFragmentTest.kt b/viewpager2/integration-tests/testapp/src/androidTest/java/com/example/androidx/viewpager2/MutableCollectionFragmentTest.kt
new file mode 100644
index 0000000..a78db21
--- /dev/null
+++ b/viewpager2/integration-tests/testapp/src/androidTest/java/com/example/androidx/viewpager2/MutableCollectionFragmentTest.kt
@@ -0,0 +1,28 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.androidx.viewpager2
+
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.LargeTest
+import org.junit.runner.RunWith
+
+@LargeTest
+@RunWith(AndroidJUnit4::class)
+class MutableCollectionFragmentTest :
+    MutableCollectionBaseTest<MutableCollectionFragmentActivity>(
+        MutableCollectionFragmentActivity::class.java
+    )
diff --git a/viewpager2/integration-tests/testapp/src/androidTest/java/com/example/androidx/viewpager2/MutableCollectionViewTest.kt b/viewpager2/integration-tests/testapp/src/androidTest/java/com/example/androidx/viewpager2/MutableCollectionViewTest.kt
new file mode 100644
index 0000000..4bc13e1
--- /dev/null
+++ b/viewpager2/integration-tests/testapp/src/androidTest/java/com/example/androidx/viewpager2/MutableCollectionViewTest.kt
@@ -0,0 +1,28 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.androidx.viewpager2
+
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.LargeTest
+import org.junit.runner.RunWith
+
+@LargeTest
+@RunWith(AndroidJUnit4::class)
+class MutableCollectionViewTest :
+    MutableCollectionBaseTest<MutableCollectionViewActivity>(
+        MutableCollectionViewActivity::class.java
+    )
diff --git a/viewpager2/integration-tests/testapp/src/androidTest/java/com/example/androidx/viewpager2/TabLayoutTest.kt b/viewpager2/integration-tests/testapp/src/androidTest/java/com/example/androidx/viewpager2/TabLayoutTest.kt
new file mode 100644
index 0000000..b02ea70
--- /dev/null
+++ b/viewpager2/integration-tests/testapp/src/androidTest/java/com/example/androidx/viewpager2/TabLayoutTest.kt
@@ -0,0 +1,62 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.androidx.viewpager2
+
+import androidx.test.espresso.Espresso.onIdle
+import androidx.test.espresso.action.ViewActions.click
+import androidx.test.espresso.action.ViewActions.scrollTo
+import androidx.test.espresso.assertion.ViewAssertions.matches
+import androidx.test.espresso.matcher.ViewMatchers.isSelected
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.LargeTest
+import com.example.androidx.viewpager2.test.onTab
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@LargeTest
+@RunWith(AndroidJUnit4::class)
+class TabLayoutTest : BaseTest<CardViewTabLayoutActivity>(CardViewTabLayoutActivity::class.java) {
+    private val nineOfHeartsTab = "9 ♥"
+    private val tenOfHeartsTab = "10 ♥"
+    private val nineOfHeartsPage = "9\n♥"
+    private val tenOfHeartsPage = "10\n♥"
+
+    override val layoutId get() = R.id.view_pager
+
+    @Test
+    fun testTabLayoutIntegration() {
+        // test if ViewPager2 follows TabLayout when clicking a tab
+        selectTab(tenOfHeartsTab)
+        verifySelectedTab(tenOfHeartsTab)
+        verifyCurrentPage(tenOfHeartsPage)
+
+        // test if TabLayout follows ViewPager2 when swiping to a page
+        swipeToPreviousPage()
+        verifySelectedTab(nineOfHeartsTab)
+        verifyCurrentPage(nineOfHeartsPage)
+    }
+
+    private fun selectTab(text: String) {
+        onTab(text).perform(scrollTo(), click())
+        idleWatcher.waitForIdle()
+        onIdle()
+    }
+
+    private fun verifySelectedTab(text: String) {
+        onTab(text).check(matches(isSelected()))
+    }
+}
diff --git a/viewpager2/integration-tests/testapp/src/androidTest/java/com/example/androidx/viewpager2/ViewPagerBaseTest.kt b/viewpager2/integration-tests/testapp/src/androidTest/java/com/example/androidx/viewpager2/ViewPagerBaseTest.kt
new file mode 100644
index 0000000..2f4d61e
--- /dev/null
+++ b/viewpager2/integration-tests/testapp/src/androidTest/java/com/example/androidx/viewpager2/ViewPagerBaseTest.kt
@@ -0,0 +1,114 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.androidx.viewpager2
+
+import android.view.View
+import androidx.test.espresso.Espresso.onData
+import androidx.test.espresso.Espresso.onView
+import androidx.test.espresso.action.ViewActions.click
+import androidx.test.espresso.assertion.ViewAssertions.matches
+import androidx.test.espresso.matcher.ViewMatchers.isNotChecked
+import androidx.test.espresso.matcher.ViewMatchers.withId
+import androidx.viewpager2.widget.ViewPager2
+import androidx.viewpager2.widget.ViewPager2.ORIENTATION_HORIZONTAL
+import androidx.viewpager2.widget.ViewPager2.ORIENTATION_VERTICAL
+import com.example.androidx.viewpager2.test.onCurrentPage
+import com.example.androidx.viewpager2.test.withRotation
+import com.example.androidx.viewpager2.test.withScale
+import com.example.androidx.viewpager2.test.withTranslation
+import org.hamcrest.CoreMatchers.allOf
+import org.hamcrest.CoreMatchers.equalTo
+import org.hamcrest.Matcher
+import org.junit.Before
+import org.junit.Test
+import org.junit.runners.Parameterized
+
+abstract class ViewPagerBaseTest<T : BaseCardActivity>(
+    clazz: Class<T>,
+    private val config: TestConfig
+) : BaseTest<T>(clazz) {
+    data class TestConfig(
+        @ViewPager2.Orientation val orientation: Int,
+        val animateRotate: Boolean,
+        val animateTranslate: Boolean,
+        val animateScale: Boolean
+    )
+
+    companion object {
+        @JvmStatic
+        @Parameterized.Parameters(name = "{0}")
+        fun spec(): List<TestConfig> {
+            return listOf(ORIENTATION_HORIZONTAL, ORIENTATION_VERTICAL).flatMap { orientation ->
+                listOf(false, true).flatMap { rotate ->
+                    listOf(false, true).flatMap { translate ->
+                        listOf(false, true).map { scale ->
+                            TestConfig(orientation, rotate, translate, scale)
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    override val layoutId get() = R.id.view_pager
+
+    private val twoOfSpades = "2\n♣"
+    private val threeOfSpades = "3\n♣"
+
+    @Before
+    override fun setUp() {
+        super.setUp()
+        selectOrientation()
+        if (config.animateRotate) check(R.id.rotate_checkbox)
+        if (config.animateTranslate) check(R.id.translate_checkbox)
+        if (config.animateScale) check(R.id.scale_checkbox)
+    }
+
+    @Test
+    fun testSwipe() {
+        // Swipe to page 2
+        swipeToNextPage { verifyAnimation() }
+        verifyCurrentPage(threeOfSpades)
+
+        // Swipe back to page 1
+        swipeToPreviousPage { verifyAnimation() }
+        verifyCurrentPage(twoOfSpades)
+    }
+
+    private fun selectOrientation() {
+        onView(withId(R.id.orientation_spinner)).perform(click())
+        onData(equalTo(
+            when (config.orientation) {
+                ORIENTATION_HORIZONTAL -> "horizontal"
+                ORIENTATION_VERTICAL -> "vertical"
+                else -> "unknown"
+            }
+        )).perform(click())
+    }
+
+    private fun check(id: Int) {
+        onView(allOf(withId(id), isNotChecked())).perform(click())
+    }
+
+    private fun verifyAnimation() {
+        val animationVerifiers = mutableListOf<Matcher<View>>()
+        if (config.animateRotate) animationVerifiers.add(withRotation())
+        if (config.animateTranslate) animationVerifiers.add(withTranslation())
+        if (config.animateScale) animationVerifiers.add(withScale())
+        onCurrentPage().check(matches(allOf(animationVerifiers)))
+    }
+}
diff --git a/viewpager2/integration-tests/testapp/src/androidTest/java/com/example/androidx/viewpager2/ViewPagerFragmentTest.kt b/viewpager2/integration-tests/testapp/src/androidTest/java/com/example/androidx/viewpager2/ViewPagerFragmentTest.kt
new file mode 100644
index 0000000..f772201
--- /dev/null
+++ b/viewpager2/integration-tests/testapp/src/androidTest/java/com/example/androidx/viewpager2/ViewPagerFragmentTest.kt
@@ -0,0 +1,26 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.androidx.viewpager2
+
+import androidx.test.filters.LargeTest
+import org.junit.runner.RunWith
+import org.junit.runners.Parameterized
+
+@LargeTest
+@RunWith(Parameterized::class)
+class ViewPagerFragmentTest(config: ViewPagerBaseTest.TestConfig) :
+    ViewPagerBaseTest<CardFragmentActivity>(CardFragmentActivity::class.java, config)
diff --git a/viewpager2/integration-tests/testapp/src/androidTest/java/com/example/androidx/viewpager2/ViewPagerViewTest.kt b/viewpager2/integration-tests/testapp/src/androidTest/java/com/example/androidx/viewpager2/ViewPagerViewTest.kt
new file mode 100644
index 0000000..a48ee69
--- /dev/null
+++ b/viewpager2/integration-tests/testapp/src/androidTest/java/com/example/androidx/viewpager2/ViewPagerViewTest.kt
@@ -0,0 +1,26 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.androidx.viewpager2
+
+import androidx.test.filters.LargeTest
+import org.junit.runner.RunWith
+import org.junit.runners.Parameterized
+
+@LargeTest
+@RunWith(Parameterized::class)
+class ViewPagerViewTest(config: ViewPagerBaseTest.TestConfig) :
+    ViewPagerBaseTest<CardViewActivity>(CardViewActivity::class.java, config)
diff --git a/viewpager2/integration-tests/testapp/src/androidTest/java/com/example/androidx/viewpager2/test/ViewInteractions.kt b/viewpager2/integration-tests/testapp/src/androidTest/java/com/example/androidx/viewpager2/test/ViewInteractions.kt
new file mode 100644
index 0000000..52b23f2
--- /dev/null
+++ b/viewpager2/integration-tests/testapp/src/androidTest/java/com/example/androidx/viewpager2/test/ViewInteractions.kt
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.androidx.viewpager2.test
+
+import androidx.test.espresso.Espresso.onView
+import androidx.test.espresso.ViewInteraction
+import androidx.test.espresso.matcher.ViewMatchers.isAssignableFrom
+import androidx.test.espresso.matcher.ViewMatchers.isDescendantOfA
+import androidx.test.espresso.matcher.ViewMatchers.isDisplayingAtLeast
+import androidx.test.espresso.matcher.ViewMatchers.withChild
+import androidx.test.espresso.matcher.ViewMatchers.withParent
+import androidx.test.espresso.matcher.ViewMatchers.withText
+import androidx.viewpager2.widget.ViewPager2
+import com.google.android.material.tabs.TabLayout
+import org.hamcrest.CoreMatchers.allOf
+
+fun onViewPager(): ViewInteraction {
+    return onView(isAssignableFrom(ViewPager2::class.java))
+}
+
+fun onCurrentPage(): ViewInteraction {
+    return onView(allOf(
+        withParent(withParent(isAssignableFrom(ViewPager2::class.java))),
+        isDisplayingAtLeast(50)
+    ))
+}
+
+fun onTab(withText: String): ViewInteraction {
+    return onView(
+        allOf(
+            isDescendantOfA(isAssignableFrom(TabLayout::class.java)),
+            withChild(withText(withText))
+        )
+    )
+}
diff --git a/viewpager2/integration-tests/testapp/src/androidTest/java/com/example/androidx/viewpager2/test/ViewMatchers.kt b/viewpager2/integration-tests/testapp/src/androidTest/java/com/example/androidx/viewpager2/test/ViewMatchers.kt
new file mode 100644
index 0000000..5bb9c46
--- /dev/null
+++ b/viewpager2/integration-tests/testapp/src/androidTest/java/com/example/androidx/viewpager2/test/ViewMatchers.kt
@@ -0,0 +1,74 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.androidx.viewpager2.test
+
+import android.view.View
+import androidx.test.espresso.matcher.BoundedMatcher
+import org.hamcrest.CoreMatchers.not
+import org.hamcrest.Description
+import org.hamcrest.Matcher
+
+fun withRotation(): Matcher<View> {
+    return WithRotationMatcher(not(0f))
+}
+
+fun withTranslation(): Matcher<View> {
+    return WithTranslationMatcher(not(0f))
+}
+
+fun withScale(): Matcher<View> {
+    return WithScaleMatcher(not(0f))
+}
+
+private class WithRotationMatcher(private val rotation: Matcher<Float>) :
+    BoundedMatcher<View, View>(View::class.java) {
+    override fun describeTo(description: Description) {
+        description.appendText("with rotation: ")
+        rotation.describeTo(description)
+    }
+
+    override fun matchesSafely(item: View): Boolean {
+        return rotation.matches(item.rotation)
+    }
+}
+
+private class WithTranslationMatcher(private val translation: Matcher<Float>) :
+    BoundedMatcher<View, View>(View::class.java) {
+    override fun describeTo(description: Description) {
+        description.appendText("with translation: ")
+        translation.describeTo(description)
+    }
+
+    override fun matchesSafely(item: View): Boolean {
+        return translation.matches(item.translationX) ||
+                translation.matches(item.translationY) ||
+                translation.matches(item.translationZ)
+    }
+}
+
+private class WithScaleMatcher(private val scale: Matcher<Float>) :
+    BoundedMatcher<View, View>(View::class.java) {
+    override fun describeTo(description: Description) {
+        description.appendText("with scale: ")
+        scale.describeTo(description)
+    }
+
+    override fun matchesSafely(item: View): Boolean {
+        return scale.matches(item.scaleX) ||
+                scale.matches(item.scaleY)
+    }
+}
diff --git a/viewpager2/integration-tests/testapp/src/androidTest/java/com/example/androidx/viewpager2/test/ViewPagerActions.kt b/viewpager2/integration-tests/testapp/src/androidTest/java/com/example/androidx/viewpager2/test/ViewPagerActions.kt
new file mode 100644
index 0000000..6ea1f00
--- /dev/null
+++ b/viewpager2/integration-tests/testapp/src/androidTest/java/com/example/androidx/viewpager2/test/ViewPagerActions.kt
@@ -0,0 +1,69 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.androidx.viewpager2.test
+
+import android.view.View
+import androidx.core.view.ViewCompat
+import androidx.test.espresso.UiController
+import androidx.test.espresso.ViewAction
+import androidx.test.espresso.action.ViewActions.swipeDown
+import androidx.test.espresso.action.ViewActions.swipeLeft
+import androidx.test.espresso.action.ViewActions.swipeRight
+import androidx.test.espresso.action.ViewActions.swipeUp
+import androidx.test.espresso.matcher.ViewMatchers.isAssignableFrom
+import androidx.test.espresso.matcher.ViewMatchers.isDisplayingAtLeast
+import androidx.viewpager2.widget.ViewPager2
+import com.example.androidx.viewpager2.test.SwipeAction.Direction.BACKWARD
+import com.example.androidx.viewpager2.test.SwipeAction.Direction.FORWARD
+import org.hamcrest.CoreMatchers.allOf
+import org.hamcrest.Matcher
+
+fun swipeNext(): ViewAction {
+    return SwipeAction(FORWARD)
+}
+
+fun swipePrevious(): ViewAction {
+    return SwipeAction(BACKWARD)
+}
+
+private class SwipeAction(val direction: Direction) : ViewAction {
+    enum class Direction {
+        FORWARD,
+        BACKWARD
+    }
+
+    override fun getDescription(): String = "Swiping $direction"
+
+    override fun getConstraints(): Matcher<View> =
+        allOf(isAssignableFrom(ViewPager2::class.java), isDisplayingAtLeast(90))
+
+    override fun perform(uiController: UiController, view: View) {
+        val vp = view as ViewPager2
+        val isForward = direction == FORWARD
+        val swipeAction: ViewAction
+        if (vp.orientation == ViewPager2.ORIENTATION_HORIZONTAL) {
+            swipeAction = if (isForward == vp.isRtl()) swipeRight() else swipeLeft()
+        } else {
+            swipeAction = if (isForward) swipeUp() else swipeDown()
+        }
+        swipeAction.perform(uiController, view)
+    }
+
+    private fun ViewPager2.isRtl(): Boolean {
+        return ViewCompat.getLayoutDirection(this) == ViewCompat.LAYOUT_DIRECTION_RTL
+    }
+}
diff --git a/viewpager2/integration-tests/testapp/src/androidTest/java/com/example/androidx/viewpager2/test/ViewPagerIdleWatcher.kt b/viewpager2/integration-tests/testapp/src/androidTest/java/com/example/androidx/viewpager2/test/ViewPagerIdleWatcher.kt
new file mode 100644
index 0000000..f9d7165
--- /dev/null
+++ b/viewpager2/integration-tests/testapp/src/androidTest/java/com/example/androidx/viewpager2/test/ViewPagerIdleWatcher.kt
@@ -0,0 +1,61 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.androidx.viewpager2.test
+
+import androidx.test.espresso.IdlingRegistry
+import androidx.test.espresso.idling.CountingIdlingResource
+import androidx.viewpager2.widget.ViewPager2
+
+class ViewPagerIdleWatcher(private val counter: CountingIdlingResource) :
+    ViewPager2.OnPageChangeCallback() {
+    private var state = ViewPager2.SCROLL_STATE_IDLE
+    private var waitingForIdle = false
+    private val lock = Object()
+
+    override fun onPageScrollStateChanged(state: Int) {
+        synchronized(lock) {
+            this.state = state
+            if (waitingForIdle && state == ViewPager2.SCROLL_STATE_IDLE) {
+                counter.decrement()
+                waitingForIdle = false
+            }
+        }
+    }
+
+    fun waitForIdle() {
+        synchronized(lock) {
+            if (!waitingForIdle && state != ViewPager2.SCROLL_STATE_IDLE) {
+                waitingForIdle = true
+                counter.increment()
+            }
+        }
+    }
+
+    fun unregister() {
+        IdlingRegistry.getInstance().unregister(counter)
+    }
+
+    companion object {
+        fun registerViewPagerIdlingResource(viewPager: ViewPager2): ViewPagerIdleWatcher {
+            val counter = CountingIdlingResource("Idle when $this is not scrolling")
+            IdlingRegistry.getInstance().register(counter)
+            val idleWatcher = ViewPagerIdleWatcher(counter)
+            viewPager.registerOnPageChangeCallback(idleWatcher)
+            return idleWatcher
+        }
+    }
+}
\ No newline at end of file
diff --git a/samples/ViewPager2Demos/src/main/AndroidManifest.xml b/viewpager2/integration-tests/testapp/src/main/AndroidManifest.xml
similarity index 100%
rename from samples/ViewPager2Demos/src/main/AndroidManifest.xml
rename to viewpager2/integration-tests/testapp/src/main/AndroidManifest.xml
diff --git a/samples/ViewPager2Demos/src/main/java/com/example/androidx/viewpager2/BaseCardActivity.kt b/viewpager2/integration-tests/testapp/src/main/java/com/example/androidx/viewpager2/BaseCardActivity.kt
similarity index 100%
rename from samples/ViewPager2Demos/src/main/java/com/example/androidx/viewpager2/BaseCardActivity.kt
rename to viewpager2/integration-tests/testapp/src/main/java/com/example/androidx/viewpager2/BaseCardActivity.kt
diff --git a/samples/ViewPager2Demos/src/main/java/com/example/androidx/viewpager2/BrowseActivity.kt b/viewpager2/integration-tests/testapp/src/main/java/com/example/androidx/viewpager2/BrowseActivity.kt
similarity index 96%
rename from samples/ViewPager2Demos/src/main/java/com/example/androidx/viewpager2/BrowseActivity.kt
rename to viewpager2/integration-tests/testapp/src/main/java/com/example/androidx/viewpager2/BrowseActivity.kt
index 759db00..ca544d3 100644
--- a/samples/ViewPager2Demos/src/main/java/com/example/androidx/viewpager2/BrowseActivity.kt
+++ b/viewpager2/integration-tests/testapp/src/main/java/com/example/androidx/viewpager2/BrowseActivity.kt
@@ -57,7 +57,7 @@
             Intent(Intent.ACTION_VIEW).setClassName(this.packageName, activity)
 
     override fun onListItemClick(listView: ListView, view: View, position: Int, id: Long) {
-        val map = listView.getItemAtPosition(position) as Map<String, Any>
+        val map = listView.getItemAtPosition(position) as Map<*, *>
 
         val intent = Intent(map["intent"] as Intent)
         intent.addCategory(Intent.CATEGORY_SAMPLE_CODE)
diff --git a/samples/ViewPager2Demos/src/main/java/com/example/androidx/viewpager2/CardFragmentActivity.kt b/viewpager2/integration-tests/testapp/src/main/java/com/example/androidx/viewpager2/CardFragmentActivity.kt
similarity index 100%
rename from samples/ViewPager2Demos/src/main/java/com/example/androidx/viewpager2/CardFragmentActivity.kt
rename to viewpager2/integration-tests/testapp/src/main/java/com/example/androidx/viewpager2/CardFragmentActivity.kt
diff --git a/samples/ViewPager2Demos/src/main/java/com/example/androidx/viewpager2/CardViewActivity.kt b/viewpager2/integration-tests/testapp/src/main/java/com/example/androidx/viewpager2/CardViewActivity.kt
similarity index 100%
rename from samples/ViewPager2Demos/src/main/java/com/example/androidx/viewpager2/CardViewActivity.kt
rename to viewpager2/integration-tests/testapp/src/main/java/com/example/androidx/viewpager2/CardViewActivity.kt
diff --git a/samples/ViewPager2Demos/src/main/java/com/example/androidx/viewpager2/CardViewTabLayoutActivity.kt b/viewpager2/integration-tests/testapp/src/main/java/com/example/androidx/viewpager2/CardViewTabLayoutActivity.kt
similarity index 100%
rename from samples/ViewPager2Demos/src/main/java/com/example/androidx/viewpager2/CardViewTabLayoutActivity.kt
rename to viewpager2/integration-tests/testapp/src/main/java/com/example/androidx/viewpager2/CardViewTabLayoutActivity.kt
diff --git a/samples/ViewPager2Demos/src/main/java/com/example/androidx/viewpager2/MutableCollectionBaseActivity.kt b/viewpager2/integration-tests/testapp/src/main/java/com/example/androidx/viewpager2/MutableCollectionBaseActivity.kt
similarity index 100%
rename from samples/ViewPager2Demos/src/main/java/com/example/androidx/viewpager2/MutableCollectionBaseActivity.kt
rename to viewpager2/integration-tests/testapp/src/main/java/com/example/androidx/viewpager2/MutableCollectionBaseActivity.kt
diff --git a/samples/ViewPager2Demos/src/main/java/com/example/androidx/viewpager2/MutableCollectionFragmentActivity.kt b/viewpager2/integration-tests/testapp/src/main/java/com/example/androidx/viewpager2/MutableCollectionFragmentActivity.kt
similarity index 100%
rename from samples/ViewPager2Demos/src/main/java/com/example/androidx/viewpager2/MutableCollectionFragmentActivity.kt
rename to viewpager2/integration-tests/testapp/src/main/java/com/example/androidx/viewpager2/MutableCollectionFragmentActivity.kt
diff --git a/samples/ViewPager2Demos/src/main/java/com/example/androidx/viewpager2/MutableCollectionViewActivity.kt b/viewpager2/integration-tests/testapp/src/main/java/com/example/androidx/viewpager2/MutableCollectionViewActivity.kt
similarity index 100%
rename from samples/ViewPager2Demos/src/main/java/com/example/androidx/viewpager2/MutableCollectionViewActivity.kt
rename to viewpager2/integration-tests/testapp/src/main/java/com/example/androidx/viewpager2/MutableCollectionViewActivity.kt
diff --git a/samples/ViewPager2Demos/src/main/java/com/example/androidx/viewpager2/TabLayoutMediator.java b/viewpager2/integration-tests/testapp/src/main/java/com/example/androidx/viewpager2/TabLayoutMediator.java
similarity index 100%
rename from samples/ViewPager2Demos/src/main/java/com/example/androidx/viewpager2/TabLayoutMediator.java
rename to viewpager2/integration-tests/testapp/src/main/java/com/example/androidx/viewpager2/TabLayoutMediator.java
diff --git a/samples/ViewPager2Demos/src/main/java/com/example/androidx/viewpager2/cards/Card.kt b/viewpager2/integration-tests/testapp/src/main/java/com/example/androidx/viewpager2/cards/Card.kt
similarity index 93%
rename from samples/ViewPager2Demos/src/main/java/com/example/androidx/viewpager2/cards/Card.kt
rename to viewpager2/integration-tests/testapp/src/main/java/com/example/androidx/viewpager2/cards/Card.kt
index 5458f7c..0499751 100644
--- a/samples/ViewPager2Demos/src/main/java/com/example/androidx/viewpager2/cards/Card.kt
+++ b/viewpager2/integration-tests/testapp/src/main/java/com/example/androidx/viewpager2/cards/Card.kt
@@ -38,7 +38,7 @@
     }
 
     companion object {
-        private val ARGS_BUNDLE = Card::class.java.name + ":Bundle"
+        internal val ARGS_BUNDLE = Card::class.java.name + ":Bundle"
 
         val SUITS = setOf("♣" /* clubs*/, "♦" /* diamonds*/, "♥" /* hearts*/, "♠" /*spades*/)
         val VALUES = setOf("2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A")
@@ -49,7 +49,7 @@
         /** Use in conjunction with [Card.toBundle]  */
         fun fromBundle(bundle: Bundle): Card {
             val spec = bundle.getStringArray(ARGS_BUNDLE)
-            return Card(spec[0], spec[1])
+            return Card(spec!![0], spec[1])
         }
     }
 }
diff --git a/samples/ViewPager2Demos/src/main/java/com/example/androidx/viewpager2/cards/CardView.kt b/viewpager2/integration-tests/testapp/src/main/java/com/example/androidx/viewpager2/cards/CardView.kt
similarity index 100%
rename from samples/ViewPager2Demos/src/main/java/com/example/androidx/viewpager2/cards/CardView.kt
rename to viewpager2/integration-tests/testapp/src/main/java/com/example/androidx/viewpager2/cards/CardView.kt
diff --git a/samples/ViewPager2Demos/src/main/res/drawable-hdpi/app_sample_code.png b/viewpager2/integration-tests/testapp/src/main/res/drawable-hdpi/app_sample_code.png
similarity index 100%
rename from samples/ViewPager2Demos/src/main/res/drawable-hdpi/app_sample_code.png
rename to viewpager2/integration-tests/testapp/src/main/res/drawable-hdpi/app_sample_code.png
Binary files differ
diff --git a/samples/ViewPager2Demos/src/main/res/drawable-mdpi/app_sample_code.png b/viewpager2/integration-tests/testapp/src/main/res/drawable-mdpi/app_sample_code.png
similarity index 100%
rename from samples/ViewPager2Demos/src/main/res/drawable-mdpi/app_sample_code.png
rename to viewpager2/integration-tests/testapp/src/main/res/drawable-mdpi/app_sample_code.png
Binary files differ
diff --git a/samples/ViewPager2Demos/src/main/res/drawable/border.xml b/viewpager2/integration-tests/testapp/src/main/res/drawable/border.xml
similarity index 100%
rename from samples/ViewPager2Demos/src/main/res/drawable/border.xml
rename to viewpager2/integration-tests/testapp/src/main/res/drawable/border.xml
diff --git a/samples/ViewPager2Demos/src/main/res/layout-land/activity_no_tablayout.xml b/viewpager2/integration-tests/testapp/src/main/res/layout-land/activity_no_tablayout.xml
similarity index 100%
rename from samples/ViewPager2Demos/src/main/res/layout-land/activity_no_tablayout.xml
rename to viewpager2/integration-tests/testapp/src/main/res/layout-land/activity_no_tablayout.xml
diff --git a/samples/ViewPager2Demos/src/main/res/layout-land/activity_tablayout.xml b/viewpager2/integration-tests/testapp/src/main/res/layout-land/activity_tablayout.xml
similarity index 100%
rename from samples/ViewPager2Demos/src/main/res/layout-land/activity_tablayout.xml
rename to viewpager2/integration-tests/testapp/src/main/res/layout-land/activity_tablayout.xml
diff --git a/samples/ViewPager2Demos/src/main/res/layout-land/controls.xml b/viewpager2/integration-tests/testapp/src/main/res/layout-land/controls.xml
similarity index 100%
rename from samples/ViewPager2Demos/src/main/res/layout-land/controls.xml
rename to viewpager2/integration-tests/testapp/src/main/res/layout-land/controls.xml
diff --git a/samples/ViewPager2Demos/src/main/res/layout/activity_mutable_collection.xml b/viewpager2/integration-tests/testapp/src/main/res/layout/activity_mutable_collection.xml
similarity index 100%
rename from samples/ViewPager2Demos/src/main/res/layout/activity_mutable_collection.xml
rename to viewpager2/integration-tests/testapp/src/main/res/layout/activity_mutable_collection.xml
diff --git a/samples/ViewPager2Demos/src/main/res/layout/activity_no_tablayout.xml b/viewpager2/integration-tests/testapp/src/main/res/layout/activity_no_tablayout.xml
similarity index 100%
rename from samples/ViewPager2Demos/src/main/res/layout/activity_no_tablayout.xml
rename to viewpager2/integration-tests/testapp/src/main/res/layout/activity_no_tablayout.xml
diff --git a/samples/ViewPager2Demos/src/main/res/layout/activity_tablayout.xml b/viewpager2/integration-tests/testapp/src/main/res/layout/activity_tablayout.xml
similarity index 100%
rename from samples/ViewPager2Demos/src/main/res/layout/activity_tablayout.xml
rename to viewpager2/integration-tests/testapp/src/main/res/layout/activity_tablayout.xml
diff --git a/samples/ViewPager2Demos/src/main/res/layout/controls.xml b/viewpager2/integration-tests/testapp/src/main/res/layout/controls.xml
similarity index 100%
rename from samples/ViewPager2Demos/src/main/res/layout/controls.xml
rename to viewpager2/integration-tests/testapp/src/main/res/layout/controls.xml
diff --git a/samples/ViewPager2Demos/src/main/res/layout/item_card_layout.xml b/viewpager2/integration-tests/testapp/src/main/res/layout/item_card_layout.xml
similarity index 100%
rename from samples/ViewPager2Demos/src/main/res/layout/item_card_layout.xml
rename to viewpager2/integration-tests/testapp/src/main/res/layout/item_card_layout.xml
diff --git a/samples/ViewPager2Demos/src/main/res/layout/item_mutable_collection.xml b/viewpager2/integration-tests/testapp/src/main/res/layout/item_mutable_collection.xml
similarity index 100%
rename from samples/ViewPager2Demos/src/main/res/layout/item_mutable_collection.xml
rename to viewpager2/integration-tests/testapp/src/main/res/layout/item_mutable_collection.xml
diff --git a/samples/ViewPager2Demos/src/main/res/values-land/dimens.xml b/viewpager2/integration-tests/testapp/src/main/res/values-land/dimens.xml
similarity index 100%
rename from samples/ViewPager2Demos/src/main/res/values-land/dimens.xml
rename to viewpager2/integration-tests/testapp/src/main/res/values-land/dimens.xml
diff --git a/samples/ViewPager2Demos/src/main/res/values/colors.xml b/viewpager2/integration-tests/testapp/src/main/res/values/colors.xml
similarity index 100%
rename from samples/ViewPager2Demos/src/main/res/values/colors.xml
rename to viewpager2/integration-tests/testapp/src/main/res/values/colors.xml
diff --git a/samples/ViewPager2Demos/src/main/res/values/dimens.xml b/viewpager2/integration-tests/testapp/src/main/res/values/dimens.xml
similarity index 100%
rename from samples/ViewPager2Demos/src/main/res/values/dimens.xml
rename to viewpager2/integration-tests/testapp/src/main/res/values/dimens.xml
diff --git a/samples/ViewPager2Demos/src/main/res/values/strings.xml b/viewpager2/integration-tests/testapp/src/main/res/values/strings.xml
similarity index 100%
rename from samples/ViewPager2Demos/src/main/res/values/strings.xml
rename to viewpager2/integration-tests/testapp/src/main/res/values/strings.xml