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

Commit 27b0dc02 authored by George Mount's avatar George Mount
Browse files

Expose isStateSaved() in FragmentManager.

Bug 35594367

Protect the FragmentManager during onBackPressed() from
changing the state after the state was saved.

Test: I15891a70699308eddda4e55fa0eb96064ffa7b17
Change-Id: I10f823801e85ca200351a64b14975c4421b9068b
parent 34e8f75b
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -4737,6 +4737,7 @@ package android.app {
    method public abstract android.app.Fragment getPrimaryNavigationFragment();
    method public void invalidateOptionsMenu();
    method public abstract boolean isDestroyed();
    method public abstract boolean isStateSaved();
    method public abstract void popBackStack();
    method public abstract void popBackStack(java.lang.String, int);
    method public abstract void popBackStack(int, int);
+1 −0
Original line number Diff line number Diff line
@@ -4898,6 +4898,7 @@ package android.app {
    method public abstract android.app.Fragment getPrimaryNavigationFragment();
    method public void invalidateOptionsMenu();
    method public abstract boolean isDestroyed();
    method public abstract boolean isStateSaved();
    method public abstract void popBackStack();
    method public abstract void popBackStack(java.lang.String, int);
    method public abstract void popBackStack(int, int);
+1 −0
Original line number Diff line number Diff line
@@ -4747,6 +4747,7 @@ package android.app {
    method public abstract android.app.Fragment getPrimaryNavigationFragment();
    method public void invalidateOptionsMenu();
    method public abstract boolean isDestroyed();
    method public abstract boolean isStateSaved();
    method public abstract void popBackStack();
    method public abstract void popBackStack(java.lang.String, int);
    method public abstract void popBackStack(int, int);
+3 −1
Original line number Diff line number Diff line
@@ -2820,7 +2820,9 @@ public class Activity extends ContextThemeWrapper
            return;
        }

        if (!mFragments.getFragmentManager().popBackStackImmediate()) {
        FragmentManager fragmentManager = mFragments.getFragmentManager();

        if (fragmentManager.isStateSaved() || !fragmentManager.popBackStackImmediate()) {
            finishAfterTransition();
        }
    }
+14 −0
Original line number Diff line number Diff line
@@ -396,6 +396,19 @@ public abstract class FragmentManager {
     */
    public void invalidateOptionsMenu() { }

    /**
     * Returns {@code true} if the FragmentManager's state has already been saved
     * by its host. Any operations that would change saved state should not be performed
     * if this method returns true. For example, any popBackStack() method, such as
     * {@link #popBackStackImmediate()} or any FragmentTransaction using
     * {@link FragmentTransaction#commit()} instead of
     * {@link FragmentTransaction#commitAllowingStateLoss()} will change
     * the state and will result in an error.
     *
     * @return true if this FragmentManager's state has already been saved by its host
     */
    public abstract boolean isStateSaved();

    /**
     * Callback interface for listening to fragment state changes that happen
     * within a given FragmentManager.
@@ -1787,6 +1800,7 @@ final class FragmentManagerImpl extends FragmentManager implements LayoutInflate
        }
    }

    @Override
    public boolean isStateSaved() {
        return mStateSaved;
    }