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

This commit is contained in:
TreeHugger Robot
2017-04-06 01:13:06 +00:00
committed by Android (Google) Code Review

View File

@@ -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++) {