Merge "Fixes preference-ktx test flakes / failures" into androidx-master-dev
diff --git a/preference/ktx/src/androidTest/AndroidManifest.xml b/preference/ktx/src/androidTest/AndroidManifest.xml
index fa8fd40..8cbbccf9 100644
--- a/preference/ktx/src/androidTest/AndroidManifest.xml
+++ b/preference/ktx/src/androidTest/AndroidManifest.xml
@@ -18,6 +18,8 @@
           package="androidx.preference.ktx.test">
     <uses-sdk android:targetSdkVersion="${target-sdk-version}"/>
     <application>
-        <activity android:name="androidx.preference.TestPreferenceActivity"/>
+        <activity
+            android:name="androidx.preference.PreferenceTestHelperActivity"
+            android:theme="@style/Theme.AppCompat.NoActionBar"/>
     </application>
 </manifest>
diff --git a/preference/ktx/src/androidTest/java/androidx/preference/PreferenceGroupTest.kt b/preference/ktx/src/androidTest/java/androidx/preference/PreferenceGroupTest.kt
index 90413c74..2246db6 100644
--- a/preference/ktx/src/androidTest/java/androidx/preference/PreferenceGroupTest.kt
+++ b/preference/ktx/src/androidTest/java/androidx/preference/PreferenceGroupTest.kt
@@ -16,6 +16,8 @@
 
 package androidx.preference
 
+import androidx.preference.ktx.test.R
+import androidx.test.annotation.UiThreadTest
 import androidx.test.core.app.ApplicationProvider
 import androidx.test.filters.LargeTest
 import androidx.test.rule.ActivityTestRule
@@ -35,19 +37,20 @@
 
     @JvmField
     @Rule
-    val rule = ActivityTestRule(TestPreferenceActivity::class.java)
+    val rule = ActivityTestRule(PreferenceTestHelperActivity::class.java)
     private val context = ApplicationProvider.getApplicationContext() as android.content.Context
     private lateinit var preferenceGroup: PreferenceGroup
 
-    @Before fun setup() {
-        preferenceGroup = (rule
-                .activity
-                .supportFragmentManager
-                .findFragmentByTag(
-                        TestPreferenceActivity.TAG) as PreferenceFragmentCompat).preferenceScreen
+    @Before
+    @UiThreadTest
+    fun setup() {
+        preferenceGroup =
+                rule.activity.setupPreferenceHierarchy(R.xml.test_preferencegroup).preferenceScreen
     }
 
-    @Test fun get() {
+    @UiThreadTest
+    @Test
+    fun get() {
         val key = "key"
         val preference = Preference(context)
         preference.key = key
@@ -56,7 +59,9 @@
         assertSame(preference, preferenceGroup[0])
     }
 
-    @Test fun contains() {
+    @UiThreadTest
+    @Test
+    fun contains() {
         val preference = Preference(context)
         assertFalse(preference in preferenceGroup)
         assertTrue(preference !in preferenceGroup)
@@ -68,7 +73,9 @@
         assertTrue(preference !in preferenceGroup)
     }
 
-    @Test fun plusAssign() {
+    @UiThreadTest
+    @Test
+    fun plusAssign() {
         assertEquals(0, preferenceGroup.preferenceCount)
 
         val preference1 = Preference(context)
@@ -82,7 +89,9 @@
         assertSame(preference2, preferenceGroup.getPreference(1))
     }
 
-    @Test fun minusAssign() {
+    @UiThreadTest
+    @Test
+    fun minusAssign() {
         val preference1 = Preference(context)
         preferenceGroup.addPreference(preference1)
         val preference2 = Preference(context)
@@ -98,7 +107,9 @@
         assertEquals(0, preferenceGroup.preferenceCount)
     }
 
-    @Test fun size() {
+    @UiThreadTest
+    @Test
+    fun size() {
         assertEquals(0, preferenceGroup.size)
 
         val preference = Preference(context)
@@ -109,20 +120,24 @@
         assertEquals(0, preferenceGroup.size)
     }
 
-    @Test fun isEmpty() {
+    @UiThreadTest
+    @Test
+    fun isEmpty() {
         assertTrue(preferenceGroup.isEmpty())
         preferenceGroup.addPreference(Preference(context))
         assertFalse(preferenceGroup.isEmpty())
     }
 
-    @Test fun isNotEmpty() {
+    @UiThreadTest
+    @Test
+    fun isNotEmpty() {
         assertFalse(preferenceGroup.isNotEmpty())
         preferenceGroup.addPreference(Preference(context))
         assertTrue(preferenceGroup.isNotEmpty())
     }
 
-    // Temporarily disabled due to b/113042342
-    // @Test
+    @UiThreadTest
+    @Test
     fun forEach() {
         preferenceGroup.forEach {
             fail("Empty preference group should not invoke lambda")
@@ -140,7 +155,9 @@
         assertThat(preferences).containsExactly(preference1, preference2)
     }
 
-    @Test fun forEachIndexed() {
+    @UiThreadTest
+    @Test
+    fun forEachIndexed() {
         preferenceGroup.forEach {
             fail("Empty preference group should not invoke lambda")
         }
@@ -158,7 +175,9 @@
         assertThat(preferences).containsExactly(preference1, preference2)
     }
 
-    @Test fun iterator() {
+    @UiThreadTest
+    @Test
+    fun iterator() {
         val preference1 = Preference(context)
         preferenceGroup.addPreference(preference1)
         val preference2 = Preference(context)
@@ -175,7 +194,9 @@
         }
     }
 
-    @Test fun children() {
+    @UiThreadTest
+    @Test
+    fun children() {
         val preferences = listOf(Preference(context), Preference(context), Preference(context))
         preferences.forEach { preferenceGroup.addPreference(it) }
 
diff --git a/preference/ktx/src/androidTest/java/androidx/preference/PreferenceTestHelperActivity.kt b/preference/ktx/src/androidTest/java/androidx/preference/PreferenceTestHelperActivity.kt
new file mode 100644
index 0000000..e0cadd0
--- /dev/null
+++ b/preference/ktx/src/androidTest/java/androidx/preference/PreferenceTestHelperActivity.kt
@@ -0,0 +1,50 @@
+/*
+ * Copyright (C) 2018 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 androidx.preference
+
+import android.os.Bundle
+import androidx.annotation.LayoutRes
+import androidx.appcompat.app.AppCompatActivity
+
+/**
+ * Helper activity that inflates a preference hierarchy defined in a given XML resource with a
+ * [PreferenceFragmentCompat] to aid testing.
+ */
+class PreferenceTestHelperActivity : AppCompatActivity() {
+
+    /**
+     * Inflates the given XML resource and returns the created PreferenceFragmentCompat.
+     *
+     * @param preferenceLayoutId The XML resource ID to inflate
+     * @return The PreferenceFragmentCompat that contains the inflated hierarchy
+     */
+    fun setupPreferenceHierarchy(@LayoutRes preferenceLayoutId: Int): PreferenceFragmentCompat {
+        val fragment = TestFragment(preferenceLayoutId)
+        supportFragmentManager
+            .beginTransaction()
+            .replace(android.R.id.content, fragment)
+            .commitNow()
+        return fragment
+    }
+
+    class TestFragment internal constructor(private val mPreferenceLayoutId: Int) :
+        PreferenceFragmentCompat() {
+        override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
+            setPreferencesFromResource(mPreferenceLayoutId, rootKey)
+        }
+    }
+}
diff --git a/preference/ktx/src/androidTest/java/androidx/preference/TestPreferenceActivity.kt b/preference/ktx/src/androidTest/java/androidx/preference/TestPreferenceActivity.kt
deleted file mode 100644
index e58a16b..0000000
--- a/preference/ktx/src/androidTest/java/androidx/preference/TestPreferenceActivity.kt
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright (C) 2018 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 androidx.preference
-
-import android.os.Bundle
-import androidx.fragment.app.FragmentActivity
-import androidx.preference.ktx.test.R
-
-class TestPreferenceActivity : FragmentActivity() {
-
-    companion object {
-        const val TAG = "TestPreferenceActivity"
-    }
-
-    override fun onCreate(savedInstanceState: Bundle?) {
-        super.onCreate(savedInstanceState)
-        supportFragmentManager.beginTransaction()
-                .add(android.R.id.content, TestPreferenceFragment(), TAG)
-                .commitNow()
-    }
-
-    class TestPreferenceFragment : PreferenceFragmentCompat() {
-        override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
-            addPreferencesFromResource(R.xml.preferences)
-        }
-    }
-}
diff --git a/preference/ktx/src/androidTest/res/xml/preferences.xml b/preference/ktx/src/androidTest/res/xml/test_preferencegroup.xml
similarity index 100%
rename from preference/ktx/src/androidTest/res/xml/preferences.xml
rename to preference/ktx/src/androidTest/res/xml/test_preferencegroup.xml
diff --git a/preference/src/androidTest/java/androidx/preference/tests/PreferenceVisibilityTest.java b/preference/src/androidTest/java/androidx/preference/tests/PreferenceVisibilityTest.java
index fc43eec..f96d68c 100644
--- a/preference/src/androidTest/java/androidx/preference/tests/PreferenceVisibilityTest.java
+++ b/preference/src/androidTest/java/androidx/preference/tests/PreferenceVisibilityTest.java
@@ -222,7 +222,7 @@
     }
 
     /**
-     * A {@link OnHierarchyChangeListener that will count down a provided {@link CountDownLatch}
+     * A {@link OnHierarchyChangeListener} that will count down a provided {@link CountDownLatch}
      * to allow tests to wait for the view hierarchy to be updated, and fail the test if the
      * hierarchy is updated when it shouldn't be.
      */