summaryrefslogtreecommitdiffstats
path: root/tests/fragment
diff options
context:
space:
mode:
authorGeorge Mount <mount@google.com>2017-07-19 10:48:33 -0700
committerGeorge Mount <mount@google.com>2017-07-19 10:48:33 -0700
commitf49e45157f0f8fea93343e199dd83e928260fb3d (patch)
tree45b4695d0bb57401ab467179b161d39f92d0f84e /tests/fragment
parentee8b506e855c000a8c5a010c80a5ec714c9826af (diff)
downloadplatform_cts-f49e45157f0f8fea93343e199dd83e928260fb3d.tar.gz
platform_cts-f49e45157f0f8fea93343e199dd83e928260fb3d.tar.bz2
platform_cts-f49e45157f0f8fea93343e199dd83e928260fb3d.zip
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
Diffstat (limited to 'tests/fragment')
-rw-r--r--tests/fragment/src/android/fragment/cts/FragmentLifecycleTest.java97
1 files changed, 97 insertions, 0 deletions
diff --git a/tests/fragment/src/android/fragment/cts/FragmentLifecycleTest.java b/tests/fragment/src/android/fragment/cts/FragmentLifecycleTest.java
index 0662d2d5bd9..c1fd9d8e675 100644
--- a/tests/fragment/src/android/fragment/cts/FragmentLifecycleTest.java
+++ b/tests/fragment/src/android/fragment/cts/FragmentLifecycleTest.java
@@ -980,6 +980,89 @@ public class FragmentLifecycleTest {
});
}
+
+ /**
+ * 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 @@ public class FragmentLifecycleTest {
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;
+ }
+ }
}