DO NOT MERGE Remove duplicated onBackStackChanged() call.

Bug 37433435

We were reporting onBackStackChanged() twice, once when the
operations are collected and once when the operations are
executed. This CL only reports the onBackStackChanged() after
the operations are executed.

Test: ran fragment tests
Change-Id: Idaf14cf8c64f87ba78ecd4f0a72a045a30ff9222
(cherry picked from commit ff3deb363de36fc9bab1ec6eb4f0f48e4c3556f4)
diff --git a/fragment/java/android/support/v4/app/FragmentManager.java b/fragment/java/android/support/v4/app/FragmentManager.java
index 34abf6d..5f618bb 100644
--- a/fragment/java/android/support/v4/app/FragmentManager.java
+++ b/fragment/java/android/support/v4/app/FragmentManager.java
@@ -2535,7 +2535,6 @@
             mBackStack = new ArrayList<BackStackRecord>();
         }
         mBackStack.add(state);
-        reportBackStackChanged();
     }
 
     @SuppressWarnings("unused")
diff --git a/fragment/tests/java/android/support/v4/app/FragmentTransactionTest.java b/fragment/tests/java/android/support/v4/app/FragmentTransactionTest.java
index 492fd14..60f93fd 100644
--- a/fragment/tests/java/android/support/v4/app/FragmentTransactionTest.java
+++ b/fragment/tests/java/android/support/v4/app/FragmentTransactionTest.java
@@ -40,6 +40,7 @@
 import android.view.View;
 import android.view.ViewGroup;
 
+import org.junit.After;
 import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
@@ -60,10 +61,28 @@
             new ActivityTestRule<>(FragmentTestActivity.class);
 
     private FragmentTestActivity mActivity;
+    private int mOnBackStackChangedTimes;
+    private FragmentManager.OnBackStackChangedListener mOnBackStackChangedListener;
 
     @Before
     public void setUp() {
         mActivity = mActivityRule.getActivity();
+        mOnBackStackChangedTimes = 0;
+        mOnBackStackChangedListener = new FragmentManager.OnBackStackChangedListener() {
+            @Override
+            public void onBackStackChanged() {
+                mOnBackStackChangedTimes++;
+            }
+        };
+        mActivity.getSupportFragmentManager()
+                .addOnBackStackChangedListener(mOnBackStackChangedListener);
+    }
+
+    @After
+    public void tearDown() {
+        mActivity.getSupportFragmentManager()
+                .removeOnBackStackChangedListener(mOnBackStackChangedListener);
+        mOnBackStackChangedListener = null;
     }
 
     @Test
@@ -77,6 +96,7 @@
                         .addToBackStack(null)
                         .commit();
                 mActivity.getSupportFragmentManager().executePendingTransactions();
+                assertEquals(1, mOnBackStackChangedTimes);
             }
         });
         InstrumentationRegistry.getInstrumentation().waitForIdleSync();
@@ -96,6 +116,7 @@
                             .addToBackStack(null)
                             .commit();
                     mActivity.getSupportFragmentManager().executePendingTransactions();
+                    assertEquals(1, mOnBackStackChangedTimes);
                 } catch (IllegalStateException e) {
                     exceptionThrown = true;
                 } finally {
@@ -120,6 +141,7 @@
                             .addToBackStack(null)
                             .commit();
                     mActivity.getSupportFragmentManager().executePendingTransactions();
+                    assertEquals(1, mOnBackStackChangedTimes);
                 } catch (IllegalStateException e) {
                     exceptionThrown = true;
                 } finally {
@@ -144,6 +166,7 @@
                             .addToBackStack(null)
                             .commit();
                     mActivity.getSupportFragmentManager().executePendingTransactions();
+                    assertEquals(1, mOnBackStackChangedTimes);
                 } catch (IllegalStateException e) {
                     exceptionThrown = true;
                 } finally {
@@ -216,6 +239,7 @@
                             .addToBackStack(null)
                             .commit();
                     mActivity.getSupportFragmentManager().executePendingTransactions();
+                    assertEquals(1, mOnBackStackChangedTimes);
                 } catch (IllegalStateException e) {
                     exceptionThrown = true;
                 } finally {
diff --git a/fragment/tests/java/android/support/v4/app/FragmentTransitionTest.java b/fragment/tests/java/android/support/v4/app/FragmentTransitionTest.java
index b255ee3..c5f1fe9 100644
--- a/fragment/tests/java/android/support/v4/app/FragmentTransitionTest.java
+++ b/fragment/tests/java/android/support/v4/app/FragmentTransitionTest.java
@@ -37,6 +37,7 @@
 import android.transition.TransitionSet;
 import android.view.View;
 
+import org.junit.After;
 import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
@@ -67,6 +68,8 @@
 
     private Instrumentation mInstrumentation;
     private FragmentManager mFragmentManager;
+    private int mOnBackStackChangedTimes;
+    private FragmentManager.OnBackStackChangedListener mOnBackStackChangedListener;
 
     public FragmentTransitionTest(final boolean optimize) {
         mOptimize = optimize;
@@ -77,6 +80,20 @@
         mInstrumentation = InstrumentationRegistry.getInstrumentation();
         mFragmentManager = mActivityRule.getActivity().getSupportFragmentManager();
         FragmentTestUtil.setContentView(mActivityRule, R.layout.simple_container);
+        mOnBackStackChangedTimes = 0;
+        mOnBackStackChangedListener = new FragmentManager.OnBackStackChangedListener() {
+            @Override
+            public void onBackStackChanged() {
+                mOnBackStackChangedTimes++;
+            }
+        };
+        mFragmentManager.addOnBackStackChangedListener(mOnBackStackChangedListener);
+    }
+
+    @After
+    public void teardown() throws Throwable {
+        mFragmentManager.removeOnBackStackChangedListener(mOnBackStackChangedListener);
+        mOnBackStackChangedListener = null;
     }
 
     // Test that normal view transitions (enter, exit, reenter, return) run with
@@ -98,6 +115,7 @@
         fragment.waitForTransition();
         verifyAndClearTransition(fragment.exitTransition, null, green, blue);
         verifyNoOtherTransitions(fragment);
+        assertEquals(2, mOnBackStackChangedTimes);
 
         // reenter transition
         FragmentTestUtil.popBackStackImmediate(mActivityRule);
@@ -106,12 +124,14 @@
         final View blue2 = findBlue();
         verifyAndClearTransition(fragment.reenterTransition, null, green2, blue2);
         verifyNoOtherTransitions(fragment);
+        assertEquals(3, mOnBackStackChangedTimes);
 
         // return transition
         FragmentTestUtil.popBackStackImmediate(mActivityRule);
         fragment.waitForTransition();
         verifyAndClearTransition(fragment.returnTransition, null, green2, blue2);
         verifyNoOtherTransitions(fragment);
+        assertEquals(4, mOnBackStackChangedTimes);
     }
 
     // Test that shared elements transition from one fragment to the next
@@ -173,6 +193,7 @@
             }
         });
         FragmentTestUtil.waitForExecution(mActivityRule);
+        assertEquals(2, mOnBackStackChangedTimes);
 
         // should be a normal transition from fragment1 to fragment2
         fragment2.waitForTransition();
@@ -185,6 +206,7 @@
 
         // Pop should also do the same thing
         FragmentTestUtil.popBackStackImmediate(mActivityRule);
+        assertEquals(3, mOnBackStackChangedTimes);
 
         fragment1.waitForTransition();
         final View popBlue = findBlue();
@@ -210,6 +232,7 @@
                 .addToBackStack(null)
                 .commit();
         FragmentTestUtil.waitForExecution(mActivityRule);
+        assertEquals(1, mOnBackStackChangedTimes);
 
         fragment1.waitForTransition();
         final View greenSquare1 = findViewById(fragment1, R.id.greenSquare);
@@ -445,6 +468,7 @@
                 .setAllowOptimization(true)
                 .commit();
         FragmentTestUtil.waitForExecution(mActivityRule);
+        assertEquals(2, mOnBackStackChangedTimes);
 
         fragment1.waitForTransition();
         fragment2.waitForTransition();
@@ -460,6 +484,7 @@
 
         // Now see if it works when popped
         FragmentTestUtil.popBackStackImmediate(mActivityRule);
+        assertEquals(3, mOnBackStackChangedTimes);
 
         fragment1.waitForTransition();
         fragment2.waitForTransition();
@@ -774,6 +799,7 @@
                 .addToBackStack(null)
                 .commit();
         FragmentTestUtil.waitForExecution(mActivityRule);
+        assertEquals(1, mOnBackStackChangedTimes);
         fragment1.waitForTransition();
         final View blueSquare1 = findBlue();
         final View greenSquare1 = findGreen();
@@ -854,6 +880,7 @@
 
     private void verifyTransition(TransitionFragment from, TransitionFragment to,
             String sharedElementName) throws Throwable {
+        final int startOnBackStackChanged = mOnBackStackChangedTimes;
         final View startBlue = findBlue();
         final View startGreen = findGreen();
         final View startRed = findRed();
@@ -868,6 +895,7 @@
                 .commit();
 
         FragmentTestUtil.waitForExecution(mActivityRule);
+        assertEquals(startOnBackStackChanged + 1, mOnBackStackChangedTimes);
 
         to.waitForTransition();
         final View endGreen = findGreen();
@@ -893,6 +921,8 @@
 
     private void verifyCrossTransition(boolean swapSource,
             TransitionFragment from1, TransitionFragment from2) throws Throwable {
+        final int startNumOnBackStackChanged = mOnBackStackChangedTimes;
+        final int changesPerOperation = mOptimize ? 1 : 2;
 
         final TransitionFragment to1 = new TransitionFragment();
         to1.setLayoutId(R.layout.scene2);
@@ -929,6 +959,7 @@
             }
         });
         FragmentTestUtil.waitForExecution(mActivityRule);
+        assertEquals(startNumOnBackStackChanged + changesPerOperation, mOnBackStackChangedTimes);
 
         from1.waitForTransition();
         from2.waitForTransition();
@@ -964,6 +995,8 @@
             }
         });
         FragmentTestUtil.waitForExecution(mActivityRule);
+        assertEquals(startNumOnBackStackChanged + changesPerOperation + 1,
+                mOnBackStackChangedTimes);
 
         from1.waitForTransition();
         from2.waitForTransition();
@@ -991,6 +1024,7 @@
 
     private void verifyPopTransition(final int numPops, TransitionFragment from,
             TransitionFragment to, TransitionFragment... others) throws Throwable {
+        final int startOnBackStackChanged = mOnBackStackChangedTimes;
         final View startBlue = findBlue();
         final View startGreen = findGreen();
         final View startRed = findRed();
@@ -1005,6 +1039,7 @@
             }
         });
         FragmentTestUtil.waitForExecution(mActivityRule);
+        assertEquals(startOnBackStackChanged + 1, mOnBackStackChangedTimes);
 
         to.waitForTransition();
         final View endGreen = findGreen();