[go: nahoru, domu]

Merge "Fix FragmentAnimatorTest occasional timeout" into androidx-master-dev
diff --git a/fragment/fragment/src/androidTest/java/androidx/fragment/app/UserVisibleHintTest.kt b/fragment/fragment/src/androidTest/java/androidx/fragment/app/UserVisibleHintTest.kt
index c73932ec..7108710 100644
--- a/fragment/fragment/src/androidTest/java/androidx/fragment/app/UserVisibleHintTest.kt
+++ b/fragment/fragment/src/androidTest/java/androidx/fragment/app/UserVisibleHintTest.kt
@@ -19,7 +19,7 @@
 import androidx.fragment.app.test.FragmentTestActivity
 import androidx.test.annotation.UiThreadTest
 import androidx.test.ext.junit.runners.AndroidJUnit4
-import androidx.test.filters.LargeTest
+import androidx.test.filters.MediumTest
 import androidx.test.rule.ActivityTestRule
 import androidx.testutils.runOnUiThreadRethrow
 import com.google.common.truth.Truth.assertWithMessage
@@ -29,7 +29,7 @@
 
 @Suppress("DEPRECATION")
 @RunWith(AndroidJUnit4::class)
-@LargeTest
+@MediumTest
 class UserVisibleHintTest {
 
     @get:Rule
@@ -62,6 +62,7 @@
             .isSameInstanceAs(fragment)
     }
 
+    @UiThreadTest
     @Test
     fun startOrderingAfterSave() {
         var firstStartedFragment: Fragment? = null
diff --git a/fragment/fragment/src/main/java/androidx/fragment/app/FragmentManager.java b/fragment/fragment/src/main/java/androidx/fragment/app/FragmentManager.java
index 03e02ce..36ddaac 100644
--- a/fragment/fragment/src/main/java/androidx/fragment/app/FragmentManager.java
+++ b/fragment/fragment/src/main/java/androidx/fragment/app/FragmentManager.java
@@ -1248,31 +1248,9 @@
 
     @SuppressWarnings("ReferenceEquality")
     void moveToState(Fragment f, int newState) {
-        // Fragments that are not currently added will sit in the onCreate() state.
-        if (!f.mAdded) {
-            newState = Math.min(newState, Fragment.CREATED);
-        }
         FragmentStateManager fragmentStateManager = mActive.get(f.mWho);
-        if (f.mRemoving) {
-            if (f.isInBackStack()) {
-                // Fragments on the back stack shouldn't go higher than CREATED
-                newState = Math.min(newState, Fragment.CREATED);
-            } else {
-                // While removing a fragment, we always move to INITIALIZING
-                newState = Fragment.INITIALIZING;
-            }
-        }
-        // Defer start if requested; don't allow it to move to STARTED or higher
-        // if it's not already started.
-        if (f.mDeferStart && f.mState < Fragment.STARTED && newState > Fragment.ACTIVITY_CREATED) {
-            newState = Fragment.ACTIVITY_CREATED;
-        }
-        // Don't allow the Fragment to go above its max lifecycle state
-        // Ensure that Fragments are capped at CREATED instead of ACTIVITY_CREATED.
-        if (f.mMaxState == Lifecycle.State.CREATED) {
-            newState = Math.min(newState, Fragment.CREATED);
-        } else {
-            newState = Math.min(newState, f.mMaxState.ordinal());
+        if (fragmentStateManager != null) {
+            newState = Math.min(newState, fragmentStateManager.computeMaxState());
         }
         if (f.mState <= newState) {
             // For fragments that are created from a layout, when restoring from
diff --git a/fragment/fragment/src/main/java/androidx/fragment/app/FragmentStateManager.java b/fragment/fragment/src/main/java/androidx/fragment/app/FragmentStateManager.java
index 8566589..4c67c79 100644
--- a/fragment/fragment/src/main/java/androidx/fragment/app/FragmentStateManager.java
+++ b/fragment/fragment/src/main/java/androidx/fragment/app/FragmentStateManager.java
@@ -126,6 +126,44 @@
         return mFragment;
     }
 
+    /**
+     * Compute the maximum state that the Fragment should be in given the internal
+     * state of the Fragment.
+     *
+     * @return the maximum state that the Fragment should be in
+     */
+    int computeMaxState() {
+        // Assume the Fragment can go all the way to resumed by default
+        int maxState = Fragment.RESUMED;
+
+        // Fragments that are not currently added will sit in the CREATED state.
+        if (!mFragment.mAdded) {
+            maxState = Math.min(maxState, Fragment.CREATED);
+        }
+        if (mFragment.mRemoving) {
+            if (mFragment.isInBackStack()) {
+                // Fragments on the back stack shouldn't go higher than CREATED
+                maxState = Math.min(maxState, Fragment.CREATED);
+            } else {
+                // While removing a fragment, we always move to INITIALIZING
+                maxState = Math.min(maxState, Fragment.INITIALIZING);
+            }
+        }
+        // Defer start if requested; don't allow it to move to STARTED or higher
+        // if it's not already started.
+        if (mFragment.mDeferStart && mFragment.mState < Fragment.STARTED) {
+            maxState = Math.min(maxState, Fragment.ACTIVITY_CREATED);
+        }
+        // Don't allow the Fragment to go above its max lifecycle state
+        // Ensure that Fragments are capped at CREATED instead of ACTIVITY_CREATED.
+        if (mFragment.mMaxState == Lifecycle.State.CREATED) {
+            maxState = Math.min(maxState, Fragment.CREATED);
+        } else {
+            maxState = Math.min(maxState, mFragment.mMaxState.ordinal());
+        }
+        return maxState;
+    }
+
     void ensureInflatedView() {
         if (mFragment.mFromLayout && !mFragment.mPerformedCreateView) {
             mFragment.performCreateView(mFragment.performGetLayoutInflater(