Execute non-optimized add operations one at a time.
am: f284a0dc76
Change-Id: I2be86e8628b1415f6329f346e39d8d26e4bf2add
diff --git a/fragment/java/android/support/v4/app/FragmentManager.java b/fragment/java/android/support/v4/app/FragmentManager.java
index bf1c371..071239a 100644
--- a/fragment/java/android/support/v4/app/FragmentManager.java
+++ b/fragment/java/android/support/v4/app/FragmentManager.java
@@ -2086,11 +2086,13 @@
if (startIndex != recordNum) {
executeOpsTogether(records, isRecordPop, startIndex, recordNum);
}
- // execute all unoptimized together
- int optimizeEnd;
- for (optimizeEnd = recordNum + 1; optimizeEnd < numRecords; optimizeEnd++) {
- if (records.get(optimizeEnd).mAllowOptimization) {
- break;
+ // execute all unoptimized pop operations together or one add operation
+ int optimizeEnd = recordNum + 1;
+ if (isRecordPop.get(recordNum)) {
+ while (optimizeEnd < numRecords
+ && isRecordPop.get(optimizeEnd)
+ && !records.get(optimizeEnd).mAllowOptimization) {
+ optimizeEnd++;
}
}
executeOpsTogether(records, isRecordPop, recordNum, optimizeEnd);
diff --git a/fragment/tests/java/android/support/v4/app/FragmentViewTests.java b/fragment/tests/java/android/support/v4/app/FragmentViewTests.java
index 98c9d40..296c3f8 100644
--- a/fragment/tests/java/android/support/v4/app/FragmentViewTests.java
+++ b/fragment/tests/java/android/support/v4/app/FragmentViewTests.java
@@ -939,6 +939,40 @@
FragmentTestUtil.assertChildren(container, fragment3);
}
+ // Ensure that non-optimized transactions are executed individually rather than together.
+ // This forces references from one fragment to another that should be executed earlier
+ // to work.
+ public void nonOptimizeTogether() throws Throwable {
+ FragmentTestUtil.setContentView(mActivityRule, R.layout.simple_container);
+ ViewGroup container = (ViewGroup)
+ mActivityRule.getActivity().findViewById(R.id.fragmentContainer);
+ final FragmentManager fm = mActivityRule.getActivity().getSupportFragmentManager();
+
+ final StrictViewFragment fragment1 = new StrictViewFragment();
+ fragment1.setLayoutId(R.layout.scene1);
+ final StrictViewFragment fragment2 = new StrictViewFragment();
+ fragment2.setLayoutId(R.layout.fragment_a);
+
+ mActivityRule.runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ fm.beginTransaction()
+ .add(R.id.fragmentContainer, fragment1)
+ .setAllowOptimization(false)
+ .addToBackStack(null)
+ .commit();
+ fm.beginTransaction()
+ .add(R.id.squareContainer, fragment2)
+ .setAllowOptimization(false)
+ .addToBackStack(null)
+ .commit();
+ fm.executePendingTransactions();
+ }
+ });
+ FragmentTestUtil.assertChildren(container, fragment1);
+ assertNotNull(findViewById(R.id.textA));
+ }
+
private View findViewById(int viewId) {
return mActivityRule.getActivity().findViewById(viewId);
}