Fix Fragment.onCreate() not being called in some cases.

Bug 62798751

When an application process has been killed with a retained instance
fragment on its back stack, and a configuration change causes
state save, the retained instance fragment was not calling onCreate()
when it was popped back into existence.

The cause of the problem is that the mRetaining flag was being set,
and when it was supposed to go through onCreate(), it was skipped.
This CL adds tests.

Test: ran fragment tests
Support Lib Change: Ia66a1f474d815f657b6962097139c796f7fa198b
Framework Change: Ia7878f4ac67ee8cfa05903ba6749ab9851f603ee

Change-Id: I512f8c174f557ee7ed18a9b9dc5c0c3e7a5843a5
diff --git a/tests/fragment/src/android/fragment/cts/FragmentLifecycleTest.java b/tests/fragment/src/android/fragment/cts/FragmentLifecycleTest.java
index 0662d2d..c1fd9d8 100644
--- a/tests/fragment/src/android/fragment/cts/FragmentLifecycleTest.java
+++ b/tests/fragment/src/android/fragment/cts/FragmentLifecycleTest.java
@@ -980,6 +980,89 @@
         });
     }
 
+
+    /**
+     * When a retained instance fragment is saved while in the back stack, it should go
+     * through onCreate() when it is popped back.
+     */
+    @Test
+    public void retainInstanceWithOnCreate() throws Throwable {
+        mActivityRule.runOnUiThread(() -> {
+            FragmentController fc = FragmentTestUtil.createController(mActivityRule);
+            FragmentTestUtil.resume(mActivityRule, fc, null);
+            FragmentManager fm = fc.getFragmentManager();
+
+            OnCreateFragment fragment1 = new OnCreateFragment();
+
+            fm.beginTransaction()
+                    .add(fragment1, "1")
+                    .commit();
+            fm.beginTransaction()
+                    .remove(fragment1)
+                    .addToBackStack(null)
+                    .commit();
+
+            Pair<Parcelable, FragmentManagerNonConfig> savedState =
+                    FragmentTestUtil.destroy(mActivityRule, fc);
+            Pair<Parcelable, FragmentManagerNonConfig> restartState =
+                    Pair.create(savedState.first, null);
+
+            fc = FragmentTestUtil.createController(mActivityRule);
+            FragmentTestUtil.resume(mActivityRule, fc, restartState);
+
+            // Save again, but keep the state
+            savedState = FragmentTestUtil.destroy(mActivityRule, fc);
+
+            fc = FragmentTestUtil.createController(mActivityRule);
+            FragmentTestUtil.resume(mActivityRule, fc, savedState);
+
+            fm = fc.getFragmentManager();
+
+            fm.popBackStackImmediate();
+            OnCreateFragment fragment2 = (OnCreateFragment) fm.findFragmentByTag("1");
+            assertTrue(fragment2.onCreateCalled);
+            fm.popBackStackImmediate();
+        });
+    }
+
+    /**
+     * A retained instance fragment should go through onCreate() once, even through save and
+     * restore.
+     */
+    @Test
+    public void retainInstanceOneOnCreate() throws Throwable {
+        mActivityRule.runOnUiThread(() -> {
+            FragmentController fc = FragmentTestUtil.createController(mActivityRule);
+            FragmentTestUtil.resume(mActivityRule, fc, null);
+            FragmentManager fm = fc.getFragmentManager();
+
+            OnCreateFragment fragment = new OnCreateFragment();
+
+            fm.beginTransaction()
+                    .add(fragment, "fragment")
+                    .commit();
+            fm.executePendingTransactions();
+
+            fm.beginTransaction()
+                    .remove(fragment)
+                    .addToBackStack(null)
+                    .commit();
+
+            assertTrue(fragment.onCreateCalled);
+            fragment.onCreateCalled = false;
+
+            Pair<Parcelable, FragmentManagerNonConfig> savedState =
+                    FragmentTestUtil.destroy(mActivityRule, fc);
+
+            fc = FragmentTestUtil.createController(mActivityRule);
+            FragmentTestUtil.resume(mActivityRule, fc, savedState);
+            fm = fc.getFragmentManager();
+
+            fm.popBackStackImmediate();
+            assertFalse(fragment.onCreateCalled);
+        });
+    }
+
     private void executePendingTransactions(final FragmentManager fm) throws Throwable {
         mActivityRule.runOnUiThread(new Runnable() {
             @Override
@@ -1201,4 +1284,18 @@
             super.onPrepareOptionsMenu(menu);
         }
     }
+
+    public static class OnCreateFragment extends Fragment {
+        public boolean onCreateCalled;
+
+        public OnCreateFragment() {
+            setRetainInstance(true);
+        }
+
+        @Override
+        public void onCreate(Bundle savedInstanceState) {
+            super.onCreate(savedInstanceState);
+            onCreateCalled = true;
+        }
+    }
 }