FragmentManager.java revision 2707d6026240bcca6f0e35e2e1138958882e90ce
12dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn/*
22dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn * Copyright (C) 2010 The Android Open Source Project
32dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn *
42dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn * Licensed under the Apache License, Version 2.0 (the "License");
52dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn * you may not use this file except in compliance with the License.
62dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn * You may obtain a copy of the License at
72dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn *
82dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn *      http://www.apache.org/licenses/LICENSE-2.0
92dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn *
102dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn * Unless required by applicable law or agreed to in writing, software
112dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn * distributed under the License is distributed on an "AS IS" BASIS,
122dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
132dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn * See the License for the specific language governing permissions and
142dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn * limitations under the License.
152dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn */
162dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn
172dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackbornpackage android.app;
182dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn
19f121be737c59390d97e21a92be8e166001534c7dDianne Hackbornimport android.content.res.TypedArray;
202dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackbornimport android.os.Bundle;
21ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackbornimport android.os.Handler;
22b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackbornimport android.os.Parcel;
23b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackbornimport android.os.Parcelable;
245ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackbornimport android.util.Log;
25b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackbornimport android.util.SparseArray;
26b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackbornimport android.view.Menu;
27b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackbornimport android.view.MenuInflater;
28b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackbornimport android.view.MenuItem;
295ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackbornimport android.view.View;
302dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackbornimport android.view.ViewGroup;
31f121be737c59390d97e21a92be8e166001534c7dDianne Hackbornimport android.view.animation.Animation;
32f121be737c59390d97e21a92be8e166001534c7dDianne Hackbornimport android.view.animation.AnimationUtils;
332dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn
342dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackbornimport java.util.ArrayList;
352dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn
36b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackbornfinal class FragmentManagerState implements Parcelable {
376e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn    FragmentState[] mActive;
38b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    int[] mAdded;
39b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    BackStackState[] mBackStack;
40b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
41b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    public FragmentManagerState() {
42b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    }
43b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
44b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    public FragmentManagerState(Parcel in) {
456e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        mActive = in.createTypedArray(FragmentState.CREATOR);
46b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        mAdded = in.createIntArray();
47b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        mBackStack = in.createTypedArray(BackStackState.CREATOR);
48b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    }
49b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
50b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    public int describeContents() {
51b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        return 0;
52b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    }
53b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
54b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    public void writeToParcel(Parcel dest, int flags) {
556e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        dest.writeTypedArray(mActive, flags);
56b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        dest.writeIntArray(mAdded);
57b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        dest.writeTypedArray(mBackStack, flags);
58b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    }
59b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
60b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    public static final Parcelable.Creator<FragmentManagerState> CREATOR
61b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            = new Parcelable.Creator<FragmentManagerState>() {
62b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        public FragmentManagerState createFromParcel(Parcel in) {
63b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            return new FragmentManagerState(in);
64b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        }
65b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
66b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        public FragmentManagerState[] newArray(int size) {
67b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            return new FragmentManagerState[size];
68b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        }
69b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    };
70ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn}
71ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn
722dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn/**
73f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn * @hide
742dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn * Container for fragments associated with an activity.
752dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn */
76f121be737c59390d97e21a92be8e166001534c7dDianne Hackbornpublic class FragmentManager {
775ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn    static final boolean DEBUG = true;
785ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn    static final String TAG = "FragmentManager";
795ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn
80445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn    ArrayList<Runnable> mPendingActions;
81445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn    Runnable[] mTmpActions;
82445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn    boolean mExecutingActions;
83445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn
846e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn    ArrayList<Fragment> mActive;
856e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn    ArrayList<Fragment> mAdded;
866e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn    ArrayList<Integer> mAvailIndices;
87b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    ArrayList<BackStackEntry> mBackStack;
882dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn
892dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    int mCurState = Fragment.INITIALIZING;
902dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    Activity mActivity;
912dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn
92b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn    boolean mNeedMenuInvalidate;
93b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn
94b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    // Temporary vars for state save and restore.
95b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    Bundle mStateBundle = null;
96b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    SparseArray<Parcelable> mStateArray = null;
97b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
98445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn    Runnable mExecCommit = new Runnable() {
99445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn        @Override
100445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn        public void run() {
101445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn            execPendingActions();
102445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn        }
103445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn    };
104445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn
105f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn    Animation loadAnimation(Fragment fragment, int transit, boolean enter,
106f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            int transitionStyle) {
1075ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn        Animation animObj = fragment.onCreateAnimation(transitionStyle, enter,
1085ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn                fragment.mNextAnim);
109f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn        if (animObj != null) {
110f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            return animObj;
111f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn        }
112f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn
1135ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn        if (fragment.mNextAnim != 0) {
1145ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn            Animation anim = AnimationUtils.loadAnimation(mActivity, fragment.mNextAnim);
1155ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn            if (anim != null) {
1165ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn                return anim;
1175ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn            }
1185ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn        }
1195ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn
120f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn        if (transit == 0) {
121f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            return null;
122f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn        }
123f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn
124f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn        int styleIndex = transitToStyleIndex(transit, enter);
125f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn        if (styleIndex < 0) {
126f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            return null;
127f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn        }
128f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn
129f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn        if (transitionStyle == 0 && mActivity.getWindow() != null) {
130f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            transitionStyle = mActivity.getWindow().getAttributes().windowAnimations;
131f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn        }
132f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn        if (transitionStyle == 0) {
133f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            return null;
134f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn        }
135f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn
136f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn        TypedArray attrs = mActivity.obtainStyledAttributes(transitionStyle,
137f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                com.android.internal.R.styleable.WindowAnimation);
138f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn        int anim = attrs.getResourceId(styleIndex, 0);
139f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn        attrs.recycle();
140f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn
141f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn        if (anim == 0) {
142f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            return null;
143f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn        }
144f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn
145f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn        return AnimationUtils.loadAnimation(mActivity, anim);
146f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn    }
147f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn
148f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn    void moveToState(Fragment f, int newState, int transit, int transitionStyle) {
1496e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        // Fragments that are not currently added will sit in the onCreate() state.
1506e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        if (!f.mAdded && newState > Fragment.CREATED) {
1516e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn            newState = Fragment.CREATED;
1526e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        }
1536e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn
1542dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn        if (f.mState < newState) {
1552dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn            switch (f.mState) {
1562dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                case Fragment.INITIALIZING:
1575ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn                    if (DEBUG) Log.v(TAG, "moveto CREATED: " + f);
1582dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                    f.mActivity = mActivity;
1592dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                    f.mCalled = false;
1602dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                    f.onAttach(mActivity);
1612dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                    if (!f.mCalled) {
1622dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                        throw new SuperNotCalledException("Fragment " + f
1632dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                                + " did not call through to super.onAttach()");
1642dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                    }
165c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn                    mActivity.onAttachFragment(f);
1662dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn
167b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                    if (!f.mRetaining) {
168b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                        f.mCalled = false;
169b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                        f.onCreate(f.mSavedFragmentState);
170b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                        if (!f.mCalled) {
171b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                            throw new SuperNotCalledException("Fragment " + f
172b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                                    + " did not call through to super.onCreate()");
1732dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                        }
1742dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                    }
175b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                    f.mRetaining = false;
176b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                    if (f.mFromLayout) {
177b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                        // For fragments that are part of the content view
178b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                        // layout, we need to instantiate the view immediately
179b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                        // and the inflater will take care of adding it.
180b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                        f.mView = f.onCreateView(mActivity.getLayoutInflater(),
181b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                                null, f.mSavedFragmentState);
1826e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                        if (f.mView != null) {
1836e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                            f.mView.setSaveFromParentEnabled(false);
1846e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                            f.restoreViewState();
1855ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn                            if (f.mHidden) f.mView.setVisibility(View.GONE);
1866e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                        }
187b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                    }
1886e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                case Fragment.CREATED:
1896e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                    if (newState > Fragment.CREATED) {
1905ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn                        if (DEBUG) Log.v(TAG, "moveto CONTENT: " + f);
191b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                        if (!f.mFromLayout) {
192b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                            ViewGroup container = null;
193b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                            if (f.mContainerId != 0) {
194b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                                container = (ViewGroup)mActivity.findViewById(f.mContainerId);
195b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                                if (container == null) {
196b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                                    throw new IllegalArgumentException("New view found for id 0x"
197b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                                            + Integer.toHexString(f.mContainerId)
198b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                                            + " for fragment " + f);
199b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                                }
200b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                            }
201b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                            f.mContainer = container;
202b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                            f.mView = f.onCreateView(mActivity.getLayoutInflater(),
203b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                                    container, f.mSavedFragmentState);
204b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                            if (f.mView != null) {
205b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                                f.mView.setSaveFromParentEnabled(false);
206b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                                if (container != null) {
207b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                                    Animation anim = loadAnimation(f, transit, true,
208b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                                            transitionStyle);
209b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                                    if (anim != null) {
210b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                                        f.mView.setAnimation(anim);
211b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                                    }
212b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                                    container.addView(f.mView);
213b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                                    f.restoreViewState();
214b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                                }
2155ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn                                if (f.mHidden) f.mView.setVisibility(View.GONE);
216b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                            }
217b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                        }
218b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
219b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                        f.mCalled = false;
220c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn                        f.onActivityCreated(f.mSavedFragmentState);
221b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                        if (!f.mCalled) {
222b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                            throw new SuperNotCalledException("Fragment " + f
223b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                                    + " did not call through to super.onReady()");
224f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                        }
225b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                        f.mSavedFragmentState = null;
2262dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                    }
227c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn                case Fragment.ACTIVITY_CREATED:
228c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn                    if (newState > Fragment.ACTIVITY_CREATED) {
2295ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn                        if (DEBUG) Log.v(TAG, "moveto STARTED: " + f);
2302dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                        f.mCalled = false;
2312dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                        f.onStart();
2322dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                        if (!f.mCalled) {
2332dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                            throw new SuperNotCalledException("Fragment " + f
2342dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                                    + " did not call through to super.onStart()");
2352dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                        }
2362dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                    }
2372dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                case Fragment.STARTED:
2382dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                    if (newState > Fragment.STARTED) {
2395ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn                        if (DEBUG) Log.v(TAG, "moveto RESUMED: " + f);
2402dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                        f.mCalled = false;
2412707d6026240bcca6f0e35e2e1138958882e90ceDianne Hackborn                        f.mResumed = true;
2422dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                        f.onResume();
2432dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                        if (!f.mCalled) {
2442dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                            throw new SuperNotCalledException("Fragment " + f
2452dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                                    + " did not call through to super.onResume()");
2462dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                        }
2472dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                    }
2482dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn            }
2492dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn        } else if (f.mState > newState) {
2502dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn            switch (f.mState) {
2512dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                case Fragment.RESUMED:
2522dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                    if (newState < Fragment.RESUMED) {
2535ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn                        if (DEBUG) Log.v(TAG, "movefrom RESUMED: " + f);
2542dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                        f.mCalled = false;
2552dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                        f.onPause();
2562dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                        if (!f.mCalled) {
2572dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                            throw new SuperNotCalledException("Fragment " + f
2582dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                                    + " did not call through to super.onPause()");
2592dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                        }
2602707d6026240bcca6f0e35e2e1138958882e90ceDianne Hackborn                        f.mResumed = false;
2612dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                    }
2622dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                case Fragment.STARTED:
2632dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                    if (newState < Fragment.STARTED) {
2645ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn                        if (DEBUG) Log.v(TAG, "movefrom STARTED: " + f);
2652dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                        f.mCalled = false;
2662707d6026240bcca6f0e35e2e1138958882e90ceDianne Hackborn                        f.performStop();
2672dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                        if (!f.mCalled) {
2682dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                            throw new SuperNotCalledException("Fragment " + f
2692dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                                    + " did not call through to super.onStop()");
2702dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                        }
2712dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                    }
272c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn                case Fragment.ACTIVITY_CREATED:
273c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn                    if (newState < Fragment.ACTIVITY_CREATED) {
2745ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn                        if (DEBUG) Log.v(TAG, "movefrom CONTENT: " + f);
275b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                        if (f.mView != null) {
2765ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn                            f.mCalled = false;
2775ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn                            f.onDestroyView();
2785ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn                            if (!f.mCalled) {
2795ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn                                throw new SuperNotCalledException("Fragment " + f
2805ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn                                        + " did not call through to super.onDestroyedView()");
2815ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn                            }
282b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                            // Need to save the current view state if not
283b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                            // done already.
2846e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                            if (!mActivity.isFinishing() && f.mSavedFragmentState == null) {
285b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                                saveFragmentViewState(f);
286b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                            }
287b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                            if (f.mContainer != null) {
288b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                                if (mCurState > Fragment.INITIALIZING) {
289b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                                    Animation anim = loadAnimation(f, transit, false,
290b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                                            transitionStyle);
291b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                                    if (anim != null) {
292b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                                        f.mView.setAnimation(anim);
293b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                                    }
294b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                                }
295b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                                f.mContainer.removeView(f.mView);
296f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                            }
2972dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                        }
2982dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                        f.mContainer = null;
2992dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                        f.mView = null;
300b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                    }
301b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                case Fragment.CREATED:
302b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                    if (newState < Fragment.CREATED) {
3035ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn                        if (DEBUG) Log.v(TAG, "movefrom CREATED: " + f);
304b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                        if (!f.mRetaining) {
305b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                            f.mCalled = false;
306b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                            f.onDestroy();
307b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                            if (!f.mCalled) {
308b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                                throw new SuperNotCalledException("Fragment " + f
309b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                                        + " did not call through to super.onDestroy()");
310b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                            }
3112dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                        }
312b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
3132dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                        f.mCalled = false;
3142dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                        f.onDetach();
3152dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                        if (!f.mCalled) {
3162dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                            throw new SuperNotCalledException("Fragment " + f
3172dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                                    + " did not call through to super.onDetach()");
3182dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                        }
3192dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                        f.mActivity = null;
3202dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                    }
3212dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn            }
3222dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn        }
3232dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn
3242dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn        f.mState = newState;
3252dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    }
3262dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn
327ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn    void moveToState(int newState, boolean always) {
328f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn        moveToState(newState, 0, 0, always);
329f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn    }
330f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn
331f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn    void moveToState(int newState, int transit, int transitStyle, boolean always) {
3322dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn        if (mActivity == null && newState != Fragment.INITIALIZING) {
3332dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn            throw new IllegalStateException("No activity");
3342dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn        }
3352dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn
336ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn        if (!always && mCurState == newState) {
337ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn            return;
338ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn        }
339ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn
3402dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn        mCurState = newState;
3416e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        if (mActive != null) {
3426e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn            for (int i=0; i<mActive.size(); i++) {
3436e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                Fragment f = mActive.get(i);
3446e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                if (f != null) {
3456e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                    moveToState(f, newState, transit, transitStyle);
3466e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                }
3476e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn            }
3486e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        }
3496e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn    }
3506e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn
3516e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn    void makeActive(Fragment f) {
3526e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        if (f.mIndex >= 0) {
3536e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn            return;
3546e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        }
3556e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn
3566e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        if (mAvailIndices == null || mAvailIndices.size() <= 0) {
3576e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn            if (mActive == null) {
3586e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                mActive = new ArrayList<Fragment>();
359ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn            }
3606e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn            f.setIndex(mActive.size());
3616e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn            mActive.add(f);
3626e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn
3636e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        } else {
3646e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn            f.setIndex(mAvailIndices.remove(mAvailIndices.size()-1));
3656e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn            mActive.set(f.mIndex, f);
3662dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn        }
3672dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    }
3682dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn
3696e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn    void makeInactive(Fragment f) {
3706e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        if (f.mIndex < 0) {
3716e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn            return;
3726e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        }
3736e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn
3746e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        mActive.set(f.mIndex, null);
3756e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        if (mAvailIndices == null) {
3766e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn            mAvailIndices = new ArrayList<Integer>();
3776e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        }
3786e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        mAvailIndices.add(f.mIndex);
3796e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        f.clearIndex();
3806e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn    }
3816e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn
382ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn    public void addFragment(Fragment fragment, boolean moveToStateNow) {
3835ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn        if (DEBUG) Log.v(TAG, "add: " + fragment);
3846e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        if (mAdded == null) {
3856e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn            mAdded = new ArrayList<Fragment>();
386ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn        }
3876e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        mAdded.add(fragment);
3886e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        makeActive(fragment);
3896e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        fragment.mAdded = true;
390b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn        if (fragment.mHasMenu) {
391b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn            mNeedMenuInvalidate = true;
392b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn        }
393ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn        if (moveToStateNow) {
394f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            moveToState(fragment, mCurState, 0, 0);
395ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn        }
3962dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    }
3972dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn
398f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn    public void removeFragment(Fragment fragment, int transition, int transitionStyle) {
3995ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn        if (DEBUG) Log.v(TAG, "remove: " + fragment);
4006e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        mAdded.remove(fragment);
4016e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        final boolean inactive = fragment.mBackStackNesting <= 0;
4026e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        if (inactive) {
4036e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn            makeInactive(fragment);
4046e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        }
405b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn        if (fragment.mHasMenu) {
406b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn            mNeedMenuInvalidate = true;
407b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn        }
4086e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        fragment.mAdded = false;
4096e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        moveToState(fragment, inactive ? Fragment.INITIALIZING : Fragment.CREATED,
4106e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                transition, transitionStyle);
411f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn    }
412f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn
4135ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn    public void hideFragment(Fragment fragment, int transition, int transitionStyle) {
4145ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn        if (DEBUG) Log.v(TAG, "hide: " + fragment);
4155ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn        if (!fragment.mHidden) {
4165ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn            fragment.mHidden = true;
4175ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn            if (fragment.mView != null) {
4185ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn                Animation anim = loadAnimation(fragment, transition, false,
4195ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn                        transitionStyle);
4205ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn                if (anim != null) {
4215ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn                    fragment.mView.setAnimation(anim);
4225ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn                }
4235ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn                fragment.mView.setVisibility(View.GONE);
4245ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn            }
425b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn            if (fragment.mAdded && fragment.mHasMenu) {
426b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn                mNeedMenuInvalidate = true;
427b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn            }
4285ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn            fragment.onHiddenChanged(true);
4295ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn        }
4305ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn    }
4315ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn
4325ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn    public void showFragment(Fragment fragment, int transition, int transitionStyle) {
4335ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn        if (DEBUG) Log.v(TAG, "show: " + fragment);
4345ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn        if (fragment.mHidden) {
4355ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn            fragment.mHidden = false;
4365ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn            if (fragment.mView != null) {
4375ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn                Animation anim = loadAnimation(fragment, transition, true,
4385ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn                        transitionStyle);
4395ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn                if (anim != null) {
4405ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn                    fragment.mView.setAnimation(anim);
4415ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn                }
4425ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn                fragment.mView.setVisibility(View.VISIBLE);
4435ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn            }
444b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn            if (fragment.mAdded && fragment.mHasMenu) {
445b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn                mNeedMenuInvalidate = true;
446b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn            }
4475ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn            fragment.onHiddenChanged(false);
4485ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn        }
4495ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn    }
4505ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn
451f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn    public Fragment findFragmentById(int id) {
4526e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        if (mActive != null) {
4535ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn            // First look through added fragments.
4545ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn            for (int i=mAdded.size()-1; i>=0; i--) {
4555ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn                Fragment f = mAdded.get(i);
4565ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn                if (f != null && f.mFragmentId == id) {
4575ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn                    return f;
4585ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn                }
4595ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn            }
4605ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn            // Now for any known fragment.
4616e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn            for (int i=mActive.size()-1; i>=0; i--) {
4626e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                Fragment f = mActive.get(i);
4636e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                if (f != null && f.mFragmentId == id) {
464b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                    return f;
465b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                }
466b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            }
467b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        }
468b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        return null;
469b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    }
470b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
471b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    public Fragment findFragmentByTag(String tag) {
4726e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        if (mActive != null && tag != null) {
4735ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn            // First look through added fragments.
4745ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn            for (int i=mAdded.size()-1; i>=0; i--) {
4755ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn                Fragment f = mAdded.get(i);
4765ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn                if (f != null && tag.equals(f.mTag)) {
4775ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn                    return f;
4785ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn                }
4795ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn            }
4805ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn            // Now for any known fragment.
4816e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn            for (int i=mActive.size()-1; i>=0; i--) {
4826e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                Fragment f = mActive.get(i);
4836e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                if (f != null && tag.equals(f.mTag)) {
4846e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                    return f;
4856e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                }
4866e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn            }
4876e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        }
4886e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        return null;
4896e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn    }
4906e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn
4916e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn    public Fragment findFragmentByWho(String who) {
4926e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        if (mActive != null && who != null) {
4936e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn            for (int i=mActive.size()-1; i>=0; i--) {
4946e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                Fragment f = mActive.get(i);
4956e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                if (f != null && who.equals(f.mWho)) {
496f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                    return f;
497f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                }
498f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            }
499f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn        }
500f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn        return null;
5012dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    }
5022dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn
503445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn    public void enqueueAction(Runnable action) {
504445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn        synchronized (this) {
505445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn            if (mPendingActions == null) {
506445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn                mPendingActions = new ArrayList<Runnable>();
507445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn            }
508445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn            mPendingActions.add(action);
509445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn            if (mPendingActions.size() == 1) {
510445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn                mActivity.mHandler.removeCallbacks(mExecCommit);
511445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn                mActivity.mHandler.post(mExecCommit);
512445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn            }
513445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn        }
514445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn    }
515445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn
516445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn    /**
517445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn     * Only call from main thread!
518445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn     */
519445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn    public void execPendingActions() {
520445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn        if (mExecutingActions) {
521445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn            throw new IllegalStateException("Recursive entry to execPendingActions");
522445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn        }
523445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn
524445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn        while (true) {
525445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn            int numActions;
526445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn
527445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn            synchronized (this) {
528445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn                if (mPendingActions == null || mPendingActions.size() == 0) {
529445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn                    return;
530445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn                }
531445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn
532445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn                numActions = mPendingActions.size();
533445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn                if (mTmpActions == null || mTmpActions.length < numActions) {
534445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn                    mTmpActions = new Runnable[numActions];
535445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn                }
536445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn                mPendingActions.toArray(mTmpActions);
537445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn                mPendingActions.clear();
538445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn                mActivity.mHandler.removeCallbacks(mExecCommit);
539445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn            }
540445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn
541445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn            mExecutingActions = true;
542445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn            for (int i=0; i<numActions; i++) {
543445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn                mTmpActions[i].run();
544445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn            }
545445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn            mExecutingActions = false;
546445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn        }
547445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn    }
548445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn
549b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    public void addBackStackState(BackStackEntry state) {
550ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn        if (mBackStack == null) {
551b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            mBackStack = new ArrayList<BackStackEntry>();
552ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn        }
553ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn        mBackStack.add(state);
554ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn    }
555ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn
556f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn    public boolean popBackStackState(Handler handler, String name) {
557ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn        if (mBackStack == null) {
558ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn            return false;
559ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn        }
560f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn        if (name == null) {
561f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            int last = mBackStack.size()-1;
562f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            if (last < 0) {
563f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                return false;
564f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            }
565b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            final BackStackEntry bss = mBackStack.remove(last);
566445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn            enqueueAction(new Runnable() {
567f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                public void run() {
568445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn                    if (DEBUG) Log.v(TAG, "Popping back stack state: " + bss);
569f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                    bss.popFromBackStack();
570f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                    moveToState(mCurState, reverseTransit(bss.getTransition()),
571f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                            bss.getTransitionStyle(), true);
572f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                }
573f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            });
574f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn        } else {
575f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            int index = mBackStack.size()-1;
576f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            while (index >= 0) {
577b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                BackStackEntry bss = mBackStack.get(index);
578f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                if (name.equals(bss.getName())) {
579f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                    break;
580f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                }
581f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            }
582f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            if (index < 0 || index == mBackStack.size()-1) {
583f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                return false;
584f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            }
585b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            final ArrayList<BackStackEntry> states
586b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                    = new ArrayList<BackStackEntry>();
587f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            for (int i=mBackStack.size()-1; i>index; i--) {
588f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                states.add(mBackStack.remove(i));
589ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn            }
590445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn            enqueueAction(new Runnable() {
591f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                public void run() {
592f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                    for (int i=0; i<states.size(); i++) {
593445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn                        if (DEBUG) Log.v(TAG, "Popping back stack state: " + states.get(i));
594f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                        states.get(i).popFromBackStack();
595f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                    }
596f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                    moveToState(mCurState, true);
597f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                }
598f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            });
599f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn        }
600ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn        return true;
601ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn    }
602ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn
603b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    ArrayList<Fragment> retainNonConfig() {
604b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        ArrayList<Fragment> fragments = null;
6056e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        if (mActive != null) {
6066e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn            for (int i=0; i<mActive.size(); i++) {
6076e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                Fragment f = mActive.get(i);
6086e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                if (f != null && f.mRetainInstance) {
609b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                    if (fragments == null) {
610b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                        fragments = new ArrayList<Fragment>();
611b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                    }
612b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                    fragments.add(f);
613b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                    f.mRetaining = true;
614b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                }
615b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            }
616b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        }
617b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        return fragments;
618b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    }
619b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
620b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    void saveFragmentViewState(Fragment f) {
6216e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        if (f.mView == null) {
622b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            return;
623b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        }
624b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        if (mStateArray == null) {
625b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            mStateArray = new SparseArray<Parcelable>();
626b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        }
627b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        f.mView.saveHierarchyState(mStateArray);
628b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        if (mStateArray.size() > 0) {
629b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            f.mSavedViewState = mStateArray;
630b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            mStateArray = null;
631b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        }
632b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    }
633b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
6346e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn    Parcelable saveAllState() {
6356e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        if (mActive == null || mActive.size() <= 0) {
6366e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn            return null;
637b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        }
638b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
6396e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        // First collect all active fragments.
6406e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        int N = mActive.size();
6416e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        FragmentState[] active = new FragmentState[N];
6426e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        boolean haveFragments = false;
6436e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        for (int i=0; i<N; i++) {
6446e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn            Fragment f = mActive.get(i);
6456e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn            if (f != null) {
6466e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                haveFragments = true;
6476e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn
6486e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                FragmentState fs = new FragmentState(f);
6496e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                active[i] = fs;
6506e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn
6516e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                if (mStateBundle == null) {
6526e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                    mStateBundle = new Bundle();
6536e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                }
6546e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                f.onSaveInstanceState(mStateBundle);
6556e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                if (!mStateBundle.isEmpty()) {
6566e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                    fs.mSavedFragmentState = mStateBundle;
6576e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                    mStateBundle = null;
658b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                }
6596e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn
6606e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                if (f.mView != null) {
6616e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                    saveFragmentViewState(f);
6626e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                    if (f.mSavedViewState != null) {
6636e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                        if (fs.mSavedFragmentState == null) {
6646e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                            fs.mSavedFragmentState = new Bundle();
6656e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                        }
6666e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                        fs.mSavedFragmentState.putSparseParcelableArray(
6676e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                                FragmentState.VIEW_STATE_TAG, f.mSavedViewState);
6686e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                    }
6696e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                }
6706e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn
671b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            }
672b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        }
673b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
6746e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        if (!haveFragments) {
675b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            return null;
676b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        }
677b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
678b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        int[] added = null;
679b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        BackStackState[] backStack = null;
680b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
6816e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        // Build list of currently added fragments.
6826e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        N = mAdded.size();
683b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        if (N > 0) {
684b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            added = new int[N];
685b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            for (int i=0; i<N; i++) {
6866e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                added[i] = mAdded.get(i).mIndex;
687b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            }
688b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        }
689b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
690b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        // Now save back stack.
691b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        if (mBackStack != null) {
692b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            N = mBackStack.size();
693b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            if (N > 0) {
694b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                backStack = new BackStackState[N];
695b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                for (int i=0; i<N; i++) {
696b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                    backStack[i] = new BackStackState(this, mBackStack.get(i));
697b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                }
698b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            }
699b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        }
700b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
701b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        FragmentManagerState fms = new FragmentManagerState();
7026e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        fms.mActive = active;
703b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        fms.mAdded = added;
704b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        fms.mBackStack = backStack;
705b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        return fms;
706b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    }
707b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
708b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    void restoreAllState(Parcelable state, ArrayList<Fragment> nonConfig) {
709b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        // If there is no saved state at all, then there can not be
710b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        // any nonConfig fragments either, so that is that.
711b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        if (state == null) return;
712b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        FragmentManagerState fms = (FragmentManagerState)state;
7136e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        if (fms.mActive == null) return;
714b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
7156e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        // First re-attach any non-config instances we are retaining back
7166e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        // to their saved state, so we don't try to instantiate them again.
717b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        if (nonConfig != null) {
718b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            for (int i=0; i<nonConfig.size(); i++) {
719b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                Fragment f = nonConfig.get(i);
7206e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                FragmentState fs = fms.mActive[f.mIndex];
721b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                fs.mInstance = f;
722b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                f.mSavedViewState = null;
7236e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                f.mBackStackNesting = 0;
7246e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                f.mAdded = false;
725b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                if (fs.mSavedFragmentState != null) {
726b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                    f.mSavedViewState = fs.mSavedFragmentState.getSparseParcelableArray(
727b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                            FragmentState.VIEW_STATE_TAG);
728b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                }
729b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            }
730b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        }
731b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
7326e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        // Build the full list of active fragments, instantiating them from
7336e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        // their saved state.
7346e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        mActive = new ArrayList<Fragment>(fms.mActive.length);
7356e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        if (mAvailIndices != null) {
7366e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn            mAvailIndices.clear();
7376e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        }
7386e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        for (int i=0; i<fms.mActive.length; i++) {
7396e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn            FragmentState fs = fms.mActive[i];
7406e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn            if (fs != null) {
7416e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                mActive.add(fs.instantiate(mActivity));
7426e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn            } else {
7436e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                mActive.add(null);
7446e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                if (mAvailIndices == null) {
7456e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                    mAvailIndices = new ArrayList<Integer>();
7466e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                }
7476e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                mAvailIndices.add(i);
748b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            }
7496e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        }
7506e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn
7516e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        // Build the list of currently added fragments.
7526e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        if (fms.mAdded != null) {
7536e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn            mAdded = new ArrayList<Fragment>(fms.mAdded.length);
754b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            for (int i=0; i<fms.mAdded.length; i++) {
7556e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                Fragment f = mActive.get(fms.mAdded[i]);
7566e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                if (f == null) {
7576e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                    throw new IllegalStateException(
7586e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                            "No instantiated fragment for index #" + fms.mAdded[i]);
759b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                }
7606e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                f.mAdded = true;
761b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn                f.mImmediateActivity = mActivity;
7626e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                mAdded.add(f);
763b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            }
7646e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        } else {
7656e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn            mAdded = null;
766b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        }
7676e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn
7686e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        // Build the back stack.
769b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        if (fms.mBackStack != null) {
770b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            mBackStack = new ArrayList<BackStackEntry>(fms.mBackStack.length);
771b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            for (int i=0; i<fms.mBackStack.length; i++) {
772b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                BackStackEntry bse = fms.mBackStack[i].instantiate(this);
773b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                mBackStack.add(bse);
774b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            }
7756e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        } else {
7766e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn            mBackStack = null;
777b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        }
778b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    }
779b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
7802dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    public void attachActivity(Activity activity) {
7812dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn        if (mActivity != null) throw new IllegalStateException();
7822dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn        mActivity = activity;
7832dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    }
7842dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn
785b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    public void dispatchCreate() {
786ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn        moveToState(Fragment.CREATED, false);
7872dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    }
7882dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn
789c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn    public void dispatchActivityCreated() {
790c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn        moveToState(Fragment.ACTIVITY_CREATED, false);
791c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn    }
792c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn
7932dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    public void dispatchStart() {
794ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn        moveToState(Fragment.STARTED, false);
7952dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    }
7962dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn
7972dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    public void dispatchResume() {
798ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn        moveToState(Fragment.RESUMED, false);
7992dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    }
8002dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn
8012dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    public void dispatchPause() {
802ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn        moveToState(Fragment.STARTED, false);
8032dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    }
8042dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn
8052dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    public void dispatchStop() {
806c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn        moveToState(Fragment.ACTIVITY_CREATED, false);
8072dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    }
8082dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn
8092dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    public void dispatchDestroy() {
810ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn        moveToState(Fragment.INITIALIZING, false);
8112dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn        mActivity = null;
8122dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    }
813f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn
814b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn    public boolean dispatchCreateOptionsMenu(Menu menu, MenuInflater inflater) {
815b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn        boolean show = false;
816b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn        if (mActive != null) {
817b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn            for (int i=0; i<mAdded.size(); i++) {
818b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn                Fragment f = mAdded.get(i);
819b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn                if (f != null && !f.mHidden && f.mHasMenu) {
820b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn                    show = true;
821b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn                    f.onCreateOptionsMenu(menu, inflater);
822b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn                }
823b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn            }
824b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn        }
825b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn        return show;
826b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn    }
827b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn
828b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn    public boolean dispatchPrepareOptionsMenu(Menu menu) {
829b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn        boolean show = false;
830b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn        if (mActive != null) {
831b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn            for (int i=0; i<mAdded.size(); i++) {
832b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn                Fragment f = mAdded.get(i);
833b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn                if (f != null && !f.mHidden && f.mHasMenu) {
834b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn                    show = true;
835b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn                    f.onPrepareOptionsMenu(menu);
836b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn                }
837b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn            }
838b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn        }
839b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn        return show;
840b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn    }
841b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn
842b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn    public boolean dispatchOptionsItemSelected(MenuItem item) {
843b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn        if (mActive != null) {
844b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn            for (int i=0; i<mAdded.size(); i++) {
845b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn                Fragment f = mAdded.get(i);
846b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn                if (f != null && !f.mHidden && f.mHasMenu) {
847b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn                    if (f.onOptionsItemSelected(item)) {
848b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn                        return true;
849b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn                    }
850b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn                }
851b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn            }
852b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn        }
853b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn        return false;
854b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn    }
855b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn
8565ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn    public boolean dispatchContextItemSelected(MenuItem item) {
8575ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn        if (mActive != null) {
8585ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn            for (int i=0; i<mAdded.size(); i++) {
8595ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn                Fragment f = mAdded.get(i);
8605ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn                if (f != null && !f.mHidden) {
8615ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn                    if (f.onContextItemSelected(item)) {
8625ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn                        return true;
8635ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn                    }
8645ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn                }
8655ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn            }
8665ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn        }
8675ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn        return false;
8685ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn    }
8695ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn
870b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn    public void dispatchOptionsMenuClosed(Menu menu) {
871b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn        if (mActive != null) {
872b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn            for (int i=0; i<mAdded.size(); i++) {
873b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn                Fragment f = mAdded.get(i);
874b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn                if (f != null && !f.mHidden && f.mHasMenu) {
875b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn                    f.onOptionsMenuClosed(menu);
876b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn                }
877b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn            }
878b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn        }
879b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn    }
880b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn
881f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn    public static int reverseTransit(int transit) {
882f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn        int rev = 0;
883f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn        switch (transit) {
884f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            case FragmentTransaction.TRANSIT_ENTER:
885f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                rev = FragmentTransaction.TRANSIT_EXIT;
886f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                break;
887f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            case FragmentTransaction.TRANSIT_EXIT:
888f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                rev = FragmentTransaction.TRANSIT_ENTER;
889f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                break;
890f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            case FragmentTransaction.TRANSIT_SHOW:
891f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                rev = FragmentTransaction.TRANSIT_HIDE;
892f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                break;
893f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            case FragmentTransaction.TRANSIT_HIDE:
894f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                rev = FragmentTransaction.TRANSIT_SHOW;
895f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                break;
896f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            case FragmentTransaction.TRANSIT_ACTIVITY_OPEN:
897f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                rev = FragmentTransaction.TRANSIT_ACTIVITY_CLOSE;
898f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                break;
899f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            case FragmentTransaction.TRANSIT_ACTIVITY_CLOSE:
900f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                rev = FragmentTransaction.TRANSIT_ACTIVITY_OPEN;
901f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                break;
902f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            case FragmentTransaction.TRANSIT_TASK_OPEN:
903f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                rev = FragmentTransaction.TRANSIT_TASK_CLOSE;
904f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                break;
905f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            case FragmentTransaction.TRANSIT_TASK_CLOSE:
906f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                rev = FragmentTransaction.TRANSIT_TASK_OPEN;
907f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                break;
908f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            case FragmentTransaction.TRANSIT_TASK_TO_FRONT:
909f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                rev = FragmentTransaction.TRANSIT_TASK_TO_BACK;
910f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                break;
911f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            case FragmentTransaction.TRANSIT_TASK_TO_BACK:
912f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                rev = FragmentTransaction.TRANSIT_TASK_TO_FRONT;
913f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                break;
914f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            case FragmentTransaction.TRANSIT_WALLPAPER_OPEN:
915f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                rev = FragmentTransaction.TRANSIT_WALLPAPER_CLOSE;
916f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                break;
917f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            case FragmentTransaction.TRANSIT_WALLPAPER_CLOSE:
918f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                rev = FragmentTransaction.TRANSIT_WALLPAPER_OPEN;
919f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                break;
920f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            case FragmentTransaction.TRANSIT_WALLPAPER_INTRA_OPEN:
921f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                rev = FragmentTransaction.TRANSIT_WALLPAPER_INTRA_CLOSE;
922f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                break;
923f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            case FragmentTransaction.TRANSIT_WALLPAPER_INTRA_CLOSE:
924f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                rev = FragmentTransaction.TRANSIT_WALLPAPER_INTRA_OPEN;
925f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                break;
926f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn        }
927f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn        return rev;
928f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn
929f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn    }
930f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn
931f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn    public static int transitToStyleIndex(int transit, boolean enter) {
932f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn        int animAttr = -1;
933f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn        switch (transit) {
934f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            case FragmentTransaction.TRANSIT_ENTER:
935f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                animAttr = com.android.internal.R.styleable.WindowAnimation_windowEnterAnimation;
936f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                break;
937f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            case FragmentTransaction.TRANSIT_EXIT:
938f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                animAttr = com.android.internal.R.styleable.WindowAnimation_windowExitAnimation;
939f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                break;
940f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            case FragmentTransaction.TRANSIT_SHOW:
941f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                animAttr = com.android.internal.R.styleable.WindowAnimation_windowShowAnimation;
942f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                break;
943f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            case FragmentTransaction.TRANSIT_HIDE:
944f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                animAttr = com.android.internal.R.styleable.WindowAnimation_windowHideAnimation;
945f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                break;
946f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            case FragmentTransaction.TRANSIT_ACTIVITY_OPEN:
947f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                animAttr = enter
948f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                        ? com.android.internal.R.styleable.WindowAnimation_activityOpenEnterAnimation
949f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                        : com.android.internal.R.styleable.WindowAnimation_activityOpenExitAnimation;
950f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                break;
951f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            case FragmentTransaction.TRANSIT_ACTIVITY_CLOSE:
952f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                animAttr = enter
953f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                        ? com.android.internal.R.styleable.WindowAnimation_activityCloseEnterAnimation
954f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                        : com.android.internal.R.styleable.WindowAnimation_activityCloseExitAnimation;
955f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                break;
956f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            case FragmentTransaction.TRANSIT_TASK_OPEN:
957f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                animAttr = enter
958f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                        ? com.android.internal.R.styleable.WindowAnimation_taskOpenEnterAnimation
959f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                        : com.android.internal.R.styleable.WindowAnimation_taskOpenExitAnimation;
960f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                break;
961f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            case FragmentTransaction.TRANSIT_TASK_CLOSE:
962f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                animAttr = enter
963f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                        ? com.android.internal.R.styleable.WindowAnimation_taskCloseEnterAnimation
964f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                        : com.android.internal.R.styleable.WindowAnimation_taskCloseExitAnimation;
965f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                break;
966f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            case FragmentTransaction.TRANSIT_TASK_TO_FRONT:
967f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                animAttr = enter
968f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                        ? com.android.internal.R.styleable.WindowAnimation_taskToFrontEnterAnimation
969f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                        : com.android.internal.R.styleable.WindowAnimation_taskToFrontExitAnimation;
970f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                break;
971f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            case FragmentTransaction.TRANSIT_TASK_TO_BACK:
972f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                animAttr = enter
973f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                        ? com.android.internal.R.styleable.WindowAnimation_taskToBackEnterAnimation
974f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                        : com.android.internal.R.styleable.WindowAnimation_taskToBackExitAnimation;
975f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                break;
976f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            case FragmentTransaction.TRANSIT_WALLPAPER_OPEN:
977f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                animAttr = enter
978f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                        ? com.android.internal.R.styleable.WindowAnimation_wallpaperOpenEnterAnimation
979f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                        : com.android.internal.R.styleable.WindowAnimation_wallpaperOpenExitAnimation;
980f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                break;
981f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            case FragmentTransaction.TRANSIT_WALLPAPER_CLOSE:
982f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                animAttr = enter
983f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                        ? com.android.internal.R.styleable.WindowAnimation_wallpaperCloseEnterAnimation
984f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                        : com.android.internal.R.styleable.WindowAnimation_wallpaperCloseExitAnimation;
985f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                break;
986f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            case FragmentTransaction.TRANSIT_WALLPAPER_INTRA_OPEN:
987f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                animAttr = enter
988f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                        ? com.android.internal.R.styleable.WindowAnimation_wallpaperIntraOpenEnterAnimation
989f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                        : com.android.internal.R.styleable.WindowAnimation_wallpaperIntraOpenExitAnimation;
990f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                break;
991f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            case FragmentTransaction.TRANSIT_WALLPAPER_INTRA_CLOSE:
992f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                animAttr = enter
993f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                        ? com.android.internal.R.styleable.WindowAnimation_wallpaperIntraCloseEnterAnimation
994f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                        : com.android.internal.R.styleable.WindowAnimation_wallpaperIntraCloseExitAnimation;
995f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                break;
996f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn        }
997f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn        return animAttr;
998f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn    }
9992dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn}
1000