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

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

Ensure that fragments are created in added order.

Bug 26894030

Change-Id: I522cc56ee1902eb01b21301dc32e6807217d6906
parent 415dd94a
Loading
Loading
Loading
Loading
+23 −27
Original line number Diff line number Diff line
@@ -16,8 +16,6 @@

package android.app;

import com.android.internal.util.FastPrintWriter;

import android.graphics.Rect;
import android.os.Parcel;
import android.os.Parcelable;
@@ -33,6 +31,8 @@ import android.view.View;
import android.view.ViewGroup;
import android.view.ViewTreeObserver;

import com.android.internal.util.FastPrintWriter;

import java.io.FileDescriptor;
import java.io.PrintWriter;
import java.util.ArrayList;
@@ -713,10 +713,12 @@ final class BackStackRecord extends FragmentTransaction implements

        bumpBackStackNesting(1);

        if (mManager.mCurState >= Fragment.CREATED) {
            SparseArray<Fragment> firstOutFragments = new SparseArray<Fragment>();
            SparseArray<Fragment> lastInFragments = new SparseArray<Fragment>();
            calculateFragments(firstOutFragments, lastInFragments);
            beginTransition(firstOutFragments, lastInFragments, false);
        }

        Op op = mHead;
        while (op != null) {
@@ -838,6 +840,14 @@ final class BackStackRecord extends FragmentTransaction implements
                    firstOutFragments.remove(containerId);
                }
            }
            /**
             * Ensure that fragments that are entering are at least at the CREATED state
             * so that they may load Transitions using TransitionInflater.
             */
            if (fragment.mState < Fragment.CREATED && mManager.mCurState >= Fragment.CREATED) {
                mManager.makeActive(fragment);
                mManager.moveToState(fragment, Fragment.CREATED, 0, 0, false);
            }
        }
    }

@@ -982,7 +992,6 @@ final class BackStackRecord extends FragmentTransaction implements
     */
    private TransitionState beginTransition(SparseArray<Fragment> firstOutFragments,
            SparseArray<Fragment> lastInFragments, boolean isBack) {
        ensureFragmentsAreInitialized(lastInFragments);
        TransitionState state = new TransitionState();

        // Adding a non-existent target view makes sure that the transitions don't target
@@ -1008,21 +1017,6 @@ final class BackStackRecord extends FragmentTransaction implements
        return state;
    }

    /**
     * Ensure that fragments that are entering are at least at the CREATED state
     * so that they may load Transitions using TransitionInflater.
     */
    private void ensureFragmentsAreInitialized(SparseArray<Fragment> lastInFragments) {
        final int count = lastInFragments.size();
        for (int i = 0; i < count; i++) {
            final Fragment fragment = lastInFragments.valueAt(i);
            if (fragment.mState < Fragment.CREATED) {
                mManager.makeActive(fragment);
                mManager.moveToState(fragment, Fragment.CREATED, 0, 0, false);
            }
        }
    }

    private static Transition cloneTransition(Transition transition) {
        if (transition != null) {
            transition = transition.clone();
@@ -1659,6 +1653,7 @@ final class BackStackRecord extends FragmentTransaction implements
            pw.flush();
        }

        if (mManager.mCurState >= Fragment.CREATED) {
            if (state == null) {
                if (firstOutFragments.size() != 0 || lastInFragments.size() != 0) {
                    state = beginTransition(firstOutFragments, lastInFragments, true);
@@ -1666,6 +1661,7 @@ final class BackStackRecord extends FragmentTransaction implements
            } else if (!doStateMove) {
                setNameOverrides(state, mSharedElementTargetNames, mSharedElementSourceNames);
            }
        }

        bumpBackStackNesting(-1);

+7 −3
Original line number Diff line number Diff line
@@ -1612,7 +1612,9 @@ final class FragmentManagerImpl extends FragmentManager implements LayoutInflate
            final BackStackRecord bss = mBackStack.remove(last);
            SparseArray<Fragment> firstOutFragments = new SparseArray<Fragment>();
            SparseArray<Fragment> lastInFragments = new SparseArray<Fragment>();
            if (mCurState >= Fragment.CREATED) {
                bss.calculateBackFragments(firstOutFragments, lastInFragments);
            }
            bss.popFromBackStack(true, null, firstOutFragments, lastInFragments);
            reportBackStackChanged();
        } else {
@@ -1659,9 +1661,11 @@ final class FragmentManagerImpl extends FragmentManager implements LayoutInflate
            final int LAST = states.size()-1;
            SparseArray<Fragment> firstOutFragments = new SparseArray<Fragment>();
            SparseArray<Fragment> lastInFragments = new SparseArray<Fragment>();
            if (mCurState >= Fragment.CREATED) {
                for (int i = 0; i <= LAST; i++) {
                    states.get(i).calculateBackFragments(firstOutFragments, lastInFragments);
                }
            }
            BackStackRecord.TransitionState state = null;
            for (int i=0; i<=LAST; i++) {
                if (DEBUG) Log.v(TAG, "Popping back stack state: " + states.get(i));