Clear FragmentStore savedState on resume

Currently savedState survives resume and the stale state gets stored. When resumed, the stale state is restored.

Now we ensure stale states are cleared upon resume.

Test: ./graldew fragment:fragment:cC
Bug: 246289075
Relnote: "Fixed an issue where the saved state stored when the activity was stopped but not destroyed would be incorrectly cached even after the fragment instance was moved back to the RESUMED state. This would cause that cached state to be reused if that fragment instance was on the back stack when using the multiple back stacks API to save and restore that fragment."
Change-Id: I712884633ae73e0784ba0a7fe50bb5a1046e2275
diff --git a/fragment/CHANGELOG.md b/fragment/CHANGELOG.md
index 0ea055d..b14a2c3 100644
--- a/fragment/CHANGELOG.md
+++ b/fragment/CHANGELOG.md
@@ -16,7 +16,13 @@
 
 # Unreleased
 
+### Bug Fixes
+- Fixed an issue where the saved state stored when the activity was stopped but not destroyed
+  would be incorrectly cached even after the fragment instance was moved back to the RESUMED state.
+  This would cause that cached state to be reused if that fragment instance was on the back stack
+  when using the multiple back stacks API to save and restore that fragment.
+
 ### Dependency Updates
 
-* Changed dependency of Activity library from version 1.5.1 to version 1.7.1.
+- Changed dependency of Activity library from version 1.5.1 to version 1.7.1.
 
diff --git a/fragment/fragment/src/androidTest/java/androidx/fragment/app/SaveRestoreBackStackTest.kt b/fragment/fragment/src/androidTest/java/androidx/fragment/app/SaveRestoreBackStackTest.kt
index 413ec73..5781007 100644
--- a/fragment/fragment/src/androidTest/java/androidx/fragment/app/SaveRestoreBackStackTest.kt
+++ b/fragment/fragment/src/androidTest/java/androidx/fragment/app/SaveRestoreBackStackTest.kt
@@ -764,4 +764,55 @@
             assertThat(fm.backStackEntryCount).isEqualTo(0)
         }
     }
+
+    @Test
+    fun resumeClearsFragmentStoreSavedState() {
+        withUse(ActivityScenario.launch(FragmentTestActivity::class.java)) {
+            val fm = withActivity {
+                supportFragmentManager
+            }
+            val fragmentBase = StrictViewFragment()
+            val fragmentReplacement = StateSaveFragment()
+            val fragmentReplacementChild = StateSaveFragment()
+
+            fm.beginTransaction()
+                .add(R.id.content, fragmentBase)
+                .commit()
+            executePendingTransactions()
+
+            fm.beginTransaction()
+                .setReorderingAllowed(true)
+                .replace(R.id.content, fragmentReplacement)
+                .addToBackStack("replacement")
+                .commit()
+            executePendingTransactions()
+
+            fragmentReplacement.childFragmentManager.beginTransaction()
+                .add(fragmentReplacementChild, "replacementChild")
+                .commit()
+            executePendingTransactions(fragmentReplacement.childFragmentManager)
+
+            // stop activity and save fragments
+            moveToState(Lifecycle.State.CREATED)
+            executePendingTransactions()
+
+            // states should be stored in fragmentStore
+            assertThat(fm.fragmentStore.getSavedState(fragmentReplacement.mWho))
+                .isNotNull()
+            assertThat(fragmentReplacement.childFragmentManager.fragmentStore
+                .getSavedState(fragmentReplacementChild.mWho)
+            ).isNotNull()
+
+            // resume activity and restore fragments
+            moveToState(Lifecycle.State.RESUMED)
+            executePendingTransactions()
+
+            // states should be cleared from fragmentStore
+            assertThat(fm.fragmentStore.getSavedState(fragmentReplacement.mWho))
+                .isNull()
+            assertThat(fragmentReplacement.childFragmentManager.fragmentStore
+                .getSavedState(fragmentReplacementChild.mWho)
+            ).isNull()
+        }
+    }
 }
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 3732759..68154fb 100644
--- a/fragment/fragment/src/main/java/androidx/fragment/app/FragmentStateManager.java
+++ b/fragment/fragment/src/main/java/androidx/fragment/app/FragmentStateManager.java
@@ -652,6 +652,7 @@
         mFragment.setFocusedView(null);
         mFragment.performResume();
         mDispatcher.dispatchOnFragmentResumed(mFragment, false);
+        mFragmentStore.setSavedState(mFragment.mWho, null);
         mFragment.mSavedFragmentState = null;
         mFragment.mSavedViewState = null;
         mFragment.mSavedViewRegistryState = null;