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(