Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a42f8e41 authored by George Mount's avatar George Mount
Browse files

Delay changing state of added fragments until all executed.

Bug 34963118

When popping multiple transactions, all added fragments
should wait until all transactions are executed before
moving their states to the final state.

This CL brings back the behavior of executing all operations
first before changing the state of added fragments. This means
that intermediate fragments won't be created when popping.

Test: I11da5229bc7104ddc683e1d7d8d929c9db3f5686
Change-Id: I472860cfe94a33db42e9a1d3727213ab5d5075e7
parent f9a55d42
Loading
Loading
Loading
Loading
+5 −2
Original line number Diff line number Diff line
@@ -813,8 +813,11 @@ final class BackStackRecord extends FragmentTransaction implements
    /**
     * Reverses the execution of the operations within this transaction. The Fragment states will
     * only be modified if optimizations are not allowed.
     *
     * @param moveToState {@code true} if added fragments should be moved to their final state
     *                    in unoptimized transactions
     */
    void executePopOps() {
    void executePopOps(boolean moveToState) {
        for (int opNum = mOps.size() - 1; opNum >= 0; opNum--) {
            final Op op = mOps.get(opNum);
            Fragment f = op.fragment;
@@ -860,7 +863,7 @@ final class BackStackRecord extends FragmentTransaction implements
                mManager.moveFragmentToExpectedState(f);
            }
        }
        if (!mAllowOptimization) {
        if (!mAllowOptimization && moveToState) {
            mManager.moveToState(mManager.mCurState, true);
        }
    }
+5 −2
Original line number Diff line number Diff line
@@ -2170,7 +2170,7 @@ final class FragmentManagerImpl extends FragmentManager implements LayoutInflate
                if (isPop) {
                    record.executeOps();
                } else {
                    record.executePopOps();
                    record.executePopOps(false);
                }

                // move to the end
@@ -2280,7 +2280,10 @@ final class FragmentManagerImpl extends FragmentManager implements LayoutInflate
            final boolean isPop = isRecordPop.get(i);
            if (isPop) {
                record.bumpBackStackNesting(-1);
                record.executePopOps();
                // Only execute the add operations at the end of
                // all transactions.
                boolean moveToState = i == (endIndex - 1);
                record.executePopOps(moveToState);
            } else {
                record.bumpBackStackNesting(1);
                record.executeOps();