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

Commit fade5359 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Save FragmentManagerNonConfig during onSaveInstanceState()" into oc-dev

parents 93c2c94c f804d6ad
Loading
Loading
Loading
Loading
+40 −4
Original line number Diff line number Diff line
@@ -698,6 +698,9 @@ final class FragmentManagerImpl extends FragmentManager implements LayoutInflate
    // This is dangerous, but we want to keep from breaking old applications.
    boolean mAllowOldReentrantBehavior;

    // Saved FragmentManagerNonConfig during saveAllState() and cleared in noteStateNotSaved()
    FragmentManagerNonConfig mSavedNonConfig;

    Runnable mExecCommit = new Runnable() {
        @Override
        public void run() {
@@ -2521,6 +2524,35 @@ final class FragmentManagerImpl extends FragmentManager implements LayoutInflate
    }

    FragmentManagerNonConfig retainNonConfig() {
        setRetaining(mSavedNonConfig);
        return mSavedNonConfig;
    }

    /**
     * Recurse the FragmentManagerNonConfig fragments and set the mRetaining to true. This
     * was previously done while saving the non-config state, but that has been moved to
     * {@link #saveNonConfig()} called from {@link #saveAllState()}. If mRetaining is set too
     * early, the fragment won't be destroyed when the FragmentManager is destroyed.
     */
    private static void setRetaining(FragmentManagerNonConfig nonConfig) {
        if (nonConfig == null) {
            return;
        }
        List<Fragment> fragments = nonConfig.getFragments();
        if (fragments != null) {
            for (Fragment fragment : fragments) {
                fragment.mRetaining = true;
            }
        }
        List<FragmentManagerNonConfig> children = nonConfig.getChildNonConfigs();
        if (children != null) {
            for (FragmentManagerNonConfig child : children) {
                setRetaining(child);
            }
        }
    }

    void saveNonConfig() {
        ArrayList<Fragment> fragments = null;
        ArrayList<FragmentManagerNonConfig> childFragments = null;
        if (mActive != null) {
@@ -2532,13 +2564,13 @@ final class FragmentManagerImpl extends FragmentManager implements LayoutInflate
                            fragments = new ArrayList<>();
                        }
                        fragments.add(f);
                        f.mRetaining = true;
                        f.mTargetIndex = f.mTarget != null ? f.mTarget.mIndex : -1;
                        if (DEBUG) Log.v(TAG, "retainNonConfig: keeping retained " + f);
                    }
                    boolean addedChild = false;
                    if (f.mChildFragmentManager != null) {
                        FragmentManagerNonConfig child = f.mChildFragmentManager.retainNonConfig();
                        f.mChildFragmentManager.saveNonConfig();
                        FragmentManagerNonConfig child = f.mChildFragmentManager.mSavedNonConfig;
                        if (child != null) {
                            if (childFragments == null) {
                                childFragments = new ArrayList<>();
@@ -2557,9 +2589,10 @@ final class FragmentManagerImpl extends FragmentManager implements LayoutInflate
            }
        }
        if (fragments == null && childFragments == null) {
            return null;
            mSavedNonConfig = null;
        } else {
            mSavedNonConfig = new FragmentManagerNonConfig(fragments, childFragments);
        }
        return new FragmentManagerNonConfig(fragments, childFragments);
    }
    
    void saveFragmentViewState(Fragment f) {
@@ -2620,6 +2653,7 @@ final class FragmentManagerImpl extends FragmentManager implements LayoutInflate
        execPendingActions();

        mStateSaved = true;
        mSavedNonConfig = null;

        if (mActive == null || mActive.size() <= 0) {
            return null;
@@ -2720,6 +2754,7 @@ final class FragmentManagerImpl extends FragmentManager implements LayoutInflate
        if (mPrimaryNav != null) {
            fms.mPrimaryNavActiveIndex = mPrimaryNav.mIndex;
        }
        saveNonConfig();
        return fms;
    }
    
@@ -2895,6 +2930,7 @@ final class FragmentManagerImpl extends FragmentManager implements LayoutInflate
    }

    public void noteStateNotSaved() {
        mSavedNonConfig = null;
        mStateSaved = false;
        final int addedCount = mAdded == null ? 0 : mAdded.size();
        for (int i = 0; i < addedCount; i++) {