From fe0ad1c290927ab37f338e7f67ad28780b533ab4 Mon Sep 17 00:00:00 2001 From: George Mount Date: Thu, 30 Mar 2017 12:34:42 -0700 Subject: [PATCH] Allow committing allowing state loss on detached FragmentManager. Bug 36702993 Instead of throwing an exception during commitAllowStateLoss() or commitNowAllowingStateLoss(), silently drop the transaction when the FragmentManager is detached. Test: I7093457c2b4936b95ab086dbe947571f0b525f63 Change-Id: I77641b69f2573fc895a27ec9da63c2d2ab6d7a4e --- core/java/android/app/FragmentManager.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/core/java/android/app/FragmentManager.java b/core/java/android/app/FragmentManager.java index 0c1be07ab231f..136e4ed8f25fe 100644 --- a/core/java/android/app/FragmentManager.java +++ b/core/java/android/app/FragmentManager.java @@ -1844,6 +1844,10 @@ final class FragmentManagerImpl extends FragmentManager implements LayoutInflate } synchronized (this) { if (mDestroyed || mHost == null) { + if (allowStateLoss) { + // This FragmentManager isn't attached, so drop the entire transaction. + return; + } throw new IllegalStateException("Activity has been destroyed"); } if (mPendingActions == null) { @@ -1960,6 +1964,10 @@ final class FragmentManagerImpl extends FragmentManager implements LayoutInflate } public void execSingleAction(OpGenerator action, boolean allowStateLoss) { + if (allowStateLoss && (mHost == null || mDestroyed)) { + // This FragmentManager isn't attached, so drop the entire transaction. + return; + } ensureExecReady(allowStateLoss); if (action.generateOps(mTmpRecords, mTmpIsPop)) { mExecutingActions = true;