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

Commit 42930641 authored by Dianne Hackborn's avatar Dianne Hackborn Committed by Android (Google) Code Review
Browse files

Merge "Fix issues 5158104 and 4981556 (fragment problems)"

parents 476769b4 6c285977
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -3277,6 +3277,7 @@ package android.app {
    method public void setArguments(android.os.Bundle);
    method public void setHasOptionsMenu(boolean);
    method public void setInitialSavedState(android.app.Fragment.SavedState);
    method public void setMenuVisibility(boolean);
    method public void setRetainInstance(boolean);
    method public void setTargetFragment(android.app.Fragment, int);
    method public void startActivity(android.content.Intent);
@@ -3342,6 +3343,7 @@ package android.app {
    method public abstract java.lang.CharSequence getBreadCrumbTitle();
    method public abstract int getBreadCrumbTitleRes();
    method public abstract int getId();
    method public abstract java.lang.String getName();
  }
  public static abstract interface FragmentManager.OnBackStackChangedListener {
+0 −2
Original line number Diff line number Diff line
@@ -4206,7 +4206,6 @@ public class Activity extends ContextThemeWrapper
            fragment.mContainerId = containerId;
            fragment.mTag = tag;
            fragment.mInLayout = true;
            fragment.mImmediateActivity = this;
            fragment.mFragmentManager = mFragments;
            fragment.onInflate(this, attrs, fragment.mSavedFragmentState);
            mFragments.addFragment(fragment, true);
@@ -4222,7 +4221,6 @@ public class Activity extends ContextThemeWrapper
            // This fragment was retained from a previous instance; get it
            // going now.
            fragment.mInLayout = true;
            fragment.mImmediateActivity = this;
            // If this fragment is newly instantiated (either right now, or
            // from last saved state), then give it the attributes to
            // initialize itself.
+0 −29
Original line number Diff line number Diff line
@@ -344,10 +344,6 @@ final class BackStackRecord extends FragmentTransaction implements
    }

    private void doAddOp(int containerViewId, Fragment fragment, String tag, int opcmd) {
        if (fragment.mImmediateActivity != null) {
            throw new IllegalStateException("Fragment already added: " + fragment);
        }
        fragment.mImmediateActivity = mManager.mActivity;
        fragment.mFragmentManager = mManager;

        if (tag != null) {
@@ -388,11 +384,6 @@ final class BackStackRecord extends FragmentTransaction implements
    }

    public FragmentTransaction remove(Fragment fragment) {
        if (fragment.mImmediateActivity == null) {
            throw new IllegalStateException("Fragment not added: " + fragment);
        }
        fragment.mImmediateActivity = null;

        Op op = new Op();
        op.cmd = OP_REMOVE;
        op.fragment = fragment;
@@ -402,10 +393,6 @@ final class BackStackRecord extends FragmentTransaction implements
    }

    public FragmentTransaction hide(Fragment fragment) {
        if (fragment.mImmediateActivity == null) {
            throw new IllegalStateException("Fragment not added: " + fragment);
        }

        Op op = new Op();
        op.cmd = OP_HIDE;
        op.fragment = fragment;
@@ -415,10 +402,6 @@ final class BackStackRecord extends FragmentTransaction implements
    }

    public FragmentTransaction show(Fragment fragment) {
        if (fragment.mImmediateActivity == null) {
            throw new IllegalStateException("Fragment not added: " + fragment);
        }

        Op op = new Op();
        op.cmd = OP_SHOW;
        op.fragment = fragment;
@@ -428,10 +411,6 @@ final class BackStackRecord extends FragmentTransaction implements
    }

    public FragmentTransaction detach(Fragment fragment) {
        //if (fragment.mImmediateActivity == null) {
        //    throw new IllegalStateException("Fragment not added: " + fragment);
        //}

        Op op = new Op();
        op.cmd = OP_DETACH;
        op.fragment = fragment;
@@ -441,10 +420,6 @@ final class BackStackRecord extends FragmentTransaction implements
    }

    public FragmentTransaction attach(Fragment fragment) {
        //if (fragment.mImmediateActivity == null) {
        //    throw new IllegalStateException("Fragment not added: " + fragment);
        //}

        Op op = new Op();
        op.cmd = OP_ATTACH;
        op.fragment = fragment;
@@ -663,7 +638,6 @@ final class BackStackRecord extends FragmentTransaction implements
                case OP_ADD: {
                    Fragment f = op.fragment;
                    f.mNextAnim = op.popExitAnim;
                    f.mImmediateActivity = null;
                    mManager.removeFragment(f,
                            FragmentManagerImpl.reverseTransit(mTransition),
                            mTransitionStyle);
@@ -671,7 +645,6 @@ final class BackStackRecord extends FragmentTransaction implements
                case OP_REPLACE: {
                    Fragment f = op.fragment;
                    f.mNextAnim = op.popExitAnim;
                    f.mImmediateActivity = null;
                    mManager.removeFragment(f,
                            FragmentManagerImpl.reverseTransit(mTransition),
                            mTransitionStyle);
@@ -679,7 +652,6 @@ final class BackStackRecord extends FragmentTransaction implements
                        for (int i=0; i<op.removed.size(); i++) {
                            Fragment old = op.removed.get(i);
                            old.mNextAnim = op.popEnterAnim;
                            f.mImmediateActivity = mManager.mActivity;
                            mManager.addFragment(old, false);
                        }
                    }
@@ -687,7 +659,6 @@ final class BackStackRecord extends FragmentTransaction implements
                case OP_REMOVE: {
                    Fragment f = op.fragment;
                    f.mNextAnim = op.popEnterAnim;
                    f.mImmediateActivity = mManager.mActivity;
                    mManager.addFragment(f, false);
                } break;
                case OP_HIDE: {
+27 −13
Original line number Diff line number Diff line
@@ -402,10 +402,6 @@ public class Fragment implements ComponentCallbacks2, OnCreateContextMenuListene
    // from all transactions.
    FragmentManager mFragmentManager;

    // Set as soon as a fragment is added to a transaction (or removed),
    // to be able to do validation.
    Activity mImmediateActivity;
    
    // Activity this fragment is attached to.
    Activity mActivity;
    
@@ -439,6 +435,9 @@ public class Fragment implements ComponentCallbacks2, OnCreateContextMenuListene
    // If set this fragment has menu items to contribute.
    boolean mHasMenu;

    // Set to true to allow the fragment's menu to be shown.
    boolean mMenuVisible = true;

    // Used to verify that subclasses call through to super class.
    boolean mCalled;
    
@@ -889,6 +888,24 @@ public class Fragment implements ComponentCallbacks2, OnCreateContextMenuListene
        }
    }

    /**
     * Set a hint for whether this fragment's menu should be visible.  This
     * is useful if you know that a fragment has been placed in your view
     * hierarchy so that the user can not currently seen it, so any menu items
     * it has should also not be shown.
     *
     * @param menuVisible The default is true, meaning the fragment's menu will
     * be shown as usual.  If false, the user will not see the menu.
     */
    public void setMenuVisibility(boolean menuVisible) {
        if (mMenuVisible != menuVisible) {
            mMenuVisible = menuVisible;
            if (mHasMenu && isAdded() && !isHidden()) {
                mFragmentManager.invalidateOptionsMenu();
            }
        }
    }

    /**
     * Return the LoaderManager for this fragment, creating it if needed.
     */
@@ -1233,7 +1250,7 @@ public class Fragment implements ComponentCallbacks2, OnCreateContextMenuListene
        mRestored = false;
        mBackStackNesting = 0;
        mFragmentManager = null;
        mActivity = mImmediateActivity = null;
        mActivity = null;
        mFragmentId = 0;
        mContainerId = 0;
        mTag = null;
@@ -1421,17 +1438,14 @@ public class Fragment implements ComponentCallbacks2, OnCreateContextMenuListene
                writer.print(" mInLayout="); writer.println(mInLayout);
        writer.print(prefix); writer.print("mHidden="); writer.print(mHidden);
                writer.print(" mDetached="); writer.print(mDetached);
                writer.print(" mRetainInstance="); writer.print(mRetainInstance);
                writer.print(" mRetaining="); writer.print(mRetaining);
                writer.print(" mMenuVisible="); writer.print(mMenuVisible);
                writer.print(" mHasMenu="); writer.println(mHasMenu);
        writer.print(prefix); writer.print("mRetainInstance="); writer.print(mRetainInstance);
                writer.print(" mRetaining="); writer.println(mRetaining);
        if (mFragmentManager != null) {
            writer.print(prefix); writer.print("mFragmentManager=");
                    writer.println(mFragmentManager);
        }
        if (mImmediateActivity != null) {
            writer.print(prefix); writer.print("mImmediateActivity=");
                    writer.println(mImmediateActivity);
        }
        if (mActivity != null) {
            writer.print(prefix); writer.print("mActivity=");
                    writer.println(mActivity);
+17 −12
Original line number Diff line number Diff line
@@ -66,6 +66,13 @@ public abstract class FragmentManager {
         */
        public int getId();

        /**
         * Get the name that was supplied to
         * {@link FragmentTransaction#addToBackStack(String)
         * FragmentTransaction.addToBackStack(String)} when creating this entry.
         */
        public String getName();

        /**
         * Return the full bread crumb title resource identifier for the entry,
         * or 0 if it does not have one.
@@ -949,7 +956,6 @@ final class FragmentManagerImpl extends FragmentManager {
                            if (!f.mRetaining) {
                                makeInactive(f);
                            } else {
                                f.mImmediateActivity = null;
                                f.mActivity = null;
                                f.mFragmentManager = null;
                            }
@@ -1037,7 +1043,7 @@ final class FragmentManagerImpl extends FragmentManager {
            mAdded.add(fragment);
            fragment.mAdded = true;
            fragment.mRemoving = false;
            if (fragment.mHasMenu) {
            if (fragment.mHasMenu && fragment.mMenuVisible) {
                mNeedMenuInvalidate = true;
            }
            if (moveToStateNow) {
@@ -1051,7 +1057,7 @@ final class FragmentManagerImpl extends FragmentManager {
        final boolean inactive = !fragment.isInBackStack();
        if (!fragment.mDetached || inactive) {
            mAdded.remove(fragment);
            if (fragment.mHasMenu) {
            if (fragment.mHasMenu && fragment.mMenuVisible) {
                mNeedMenuInvalidate = true;
            }
            fragment.mAdded = false;
@@ -1086,7 +1092,7 @@ final class FragmentManagerImpl extends FragmentManager {
                    fragment.mView.setVisibility(View.GONE);
                }
            }
            if (fragment.mAdded && fragment.mHasMenu) {
            if (fragment.mAdded && fragment.mHasMenu && fragment.mMenuVisible) {
                mNeedMenuInvalidate = true;
            }
            fragment.onHiddenChanged(true);
@@ -1106,7 +1112,7 @@ final class FragmentManagerImpl extends FragmentManager {
                }
                fragment.mView.setVisibility(View.VISIBLE);
            }
            if (fragment.mAdded && fragment.mHasMenu) {
            if (fragment.mAdded && fragment.mHasMenu && fragment.mMenuVisible) {
                mNeedMenuInvalidate = true;
            }
            fragment.onHiddenChanged(false);
@@ -1120,7 +1126,7 @@ final class FragmentManagerImpl extends FragmentManager {
            if (fragment.mAdded) {
                // We are not already in back stack, so need to remove the fragment.
                mAdded.remove(fragment);
                if (fragment.mHasMenu) {
                if (fragment.mHasMenu && fragment.mMenuVisible) {
                    mNeedMenuInvalidate = true;
                }
                fragment.mAdded = false;
@@ -1136,7 +1142,7 @@ final class FragmentManagerImpl extends FragmentManager {
            if (!fragment.mAdded) {
                mAdded.add(fragment);
                fragment.mAdded = true;
                if (fragment.mHasMenu) {
                if (fragment.mHasMenu && fragment.mMenuVisible) {
                    mNeedMenuInvalidate = true;
                }
                moveToState(fragment, mCurState, transition, transitionStyle);
@@ -1640,7 +1646,6 @@ final class FragmentManagerImpl extends FragmentManager {
                            "No instantiated fragment for index #" + fms.mAdded[i]);
                }
                f.mAdded = true;
                f.mImmediateActivity = mActivity;
                if (DEBUG) Log.v(TAG, "restoreAllState: making added #" + i + ": " + f);
                mAdded.add(f);
            }
@@ -1748,7 +1753,7 @@ final class FragmentManagerImpl extends FragmentManager {
        if (mActive != null) {
            for (int i=0; i<mAdded.size(); i++) {
                Fragment f = mAdded.get(i);
                if (f != null && !f.mHidden && f.mHasMenu) {
                if (f != null && !f.mHidden && f.mHasMenu && f.mMenuVisible) {
                    show = true;
                    f.onCreateOptionsMenu(menu, inflater);
                    if (newMenus == null) {
@@ -1778,7 +1783,7 @@ final class FragmentManagerImpl extends FragmentManager {
        if (mActive != null) {
            for (int i=0; i<mAdded.size(); i++) {
                Fragment f = mAdded.get(i);
                if (f != null && !f.mHidden && f.mHasMenu) {
                if (f != null && !f.mHidden && f.mHasMenu && f.mMenuVisible) {
                    show = true;
                    f.onPrepareOptionsMenu(menu);
                }
@@ -1791,7 +1796,7 @@ final class FragmentManagerImpl extends FragmentManager {
        if (mActive != null) {
            for (int i=0; i<mAdded.size(); i++) {
                Fragment f = mAdded.get(i);
                if (f != null && !f.mHidden && f.mHasMenu) {
                if (f != null && !f.mHidden && f.mHasMenu && f.mMenuVisible) {
                    if (f.onOptionsItemSelected(item)) {
                        return true;
                    }
@@ -1819,7 +1824,7 @@ final class FragmentManagerImpl extends FragmentManager {
        if (mActive != null) {
            for (int i=0; i<mAdded.size(); i++) {
                Fragment f = mAdded.get(i);
                if (f != null && !f.mHidden && f.mHasMenu) {
                if (f != null && !f.mHidden && f.mHasMenu && f.mMenuVisible) {
                    f.onOptionsMenuClosed(menu);
                }
            }