FragmentManager.java revision 6e8304e57ec533e257a2496183125f257be1ff60
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;
24b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackbornimport android.util.SparseArray;
252dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackbornimport android.view.ViewGroup;
26f121be737c59390d97e21a92be8e166001534c7dDianne Hackbornimport android.view.animation.Animation;
27f121be737c59390d97e21a92be8e166001534c7dDianne Hackbornimport android.view.animation.AnimationUtils;
282dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn
292dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackbornimport java.util.ArrayList;
302dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn
31b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackbornfinal class BackStackEntry implements FragmentTransaction, Runnable {
32b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    final FragmentManager mManager;
33b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
34b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    ArrayList<Fragment> mAdded;
35b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    ArrayList<Fragment> mRemoved;
36b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    int mTransition;
37b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    int mTransitionStyle;
38b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    boolean mAddToBackStack;
39b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    String mName;
40b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    boolean mCommitted;
41b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
42b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    public BackStackEntry(FragmentManager manager) {
43b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        mManager = manager;
44b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    }
45b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
46b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    public FragmentTransaction add(Fragment fragment, String tag) {
47b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        fragment.mTag = tag;
48b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        return add(fragment, 0);
49b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    }
50b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
51b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    public FragmentTransaction add(Fragment fragment, int containerViewId) {
52b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        if (fragment.mActivity != null) {
53b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            throw new IllegalStateException("Fragment already added: " + fragment);
54b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        }
55b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        if (mRemoved != null) {
56b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            mRemoved.remove(fragment);
57b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        }
58b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        if (mAdded == null) {
59b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            mAdded = new ArrayList<Fragment>();
60b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        }
61b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        fragment.mContainerId = fragment.mFragmentId = containerViewId;
62b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        mAdded.add(fragment);
63b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        return this;
64b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    }
65b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
66b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    public FragmentTransaction replace(Fragment fragment, int containerViewId) {
67b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        if (containerViewId == 0) {
68b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            throw new IllegalArgumentException("Must use non-zero containerViewId");
69b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        }
706e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        if (mManager.mAdded != null) {
716e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn            for (int i=0; i<mManager.mAdded.size(); i++) {
726e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                Fragment old = mManager.mAdded.get(i);
73b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                if (old.mContainerId == containerViewId) {
74b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                    remove(old);
75b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                }
76b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            }
77b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        }
78b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        return add(fragment, containerViewId);
79b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    }
80b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
81b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    public FragmentTransaction remove(Fragment fragment) {
82b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        if (fragment.mActivity == null) {
83b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            throw new IllegalStateException("Fragment not added: " + fragment);
84b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        }
85b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        if (mAdded != null) {
86b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            mAdded.remove(fragment);
87b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        }
88b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        if (mRemoved == null) {
89b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            mRemoved = new ArrayList<Fragment>();
90b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        }
91b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        mRemoved.add(fragment);
92b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        return this;
93b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    }
94b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
95b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    public FragmentTransaction setTransition(int transition) {
96b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        mTransition = transition;
97b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        return this;
98b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    }
99b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
100b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    public FragmentTransaction setTransitionStyle(int styleRes) {
101b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        mTransitionStyle = styleRes;
102b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        return this;
103b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    }
104b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
105b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    public FragmentTransaction addToBackStack(String name) {
106b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        mAddToBackStack = true;
107b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        mName = name;
108b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        return this;
109b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    }
110b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
111b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    public void commit() {
112b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        if (mCommitted) throw new IllegalStateException("commit already called");
113b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        mCommitted = true;
114b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        mManager.mActivity.mHandler.post(this);
115b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    }
116b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
117b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    public void run() {
118b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        if (mRemoved != null) {
119b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            for (int i=mRemoved.size()-1; i>=0; i--) {
1206e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                Fragment f = mRemoved.get(i);
1216e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                if (mAddToBackStack) {
1226e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                    f.mBackStackNesting++;
1236e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                }
1246e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                mManager.removeFragment(f, mTransition, mTransitionStyle);
125b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            }
126b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        }
127b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        if (mAdded != null) {
128b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            for (int i=mAdded.size()-1; i>=0; i--) {
129b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                Fragment f = mAdded.get(i);
130b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                if (mAddToBackStack) {
131b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                    f.mBackStackNesting++;
132b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                }
1336e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                mManager.addFragment(f, false);
134b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            }
135b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        }
136b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        mManager.moveToState(mManager.mCurState, mTransition,
137b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                mTransitionStyle, true);
138b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        if (mAddToBackStack) {
139b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            mManager.addBackStackState(this);
140b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        }
141b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    }
142b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
143b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    public void popFromBackStack() {
144b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        if (mAdded != null) {
145b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            for (int i=mAdded.size()-1; i>=0; i--) {
146b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                Fragment f = mAdded.get(i);
147b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                if (mAddToBackStack) {
148b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                    f.mBackStackNesting--;
149b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                }
150b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                mManager.removeFragment(f,
151b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                        FragmentManager.reverseTransit(mTransition),
152b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                        mTransitionStyle);
153b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            }
154b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        }
155b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        if (mRemoved != null) {
156b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            for (int i=mRemoved.size()-1; i>=0; i--) {
1576e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                Fragment f = mRemoved.get(i);
1586e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                if (mAddToBackStack) {
1596e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                    f.mBackStackNesting--;
1606e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                }
1616e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                mManager.addFragment(f, false);
162b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            }
163b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        }
164b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    }
165b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
166b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    public String getName() {
167b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        return mName;
168b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    }
169b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
170b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    public int getTransition() {
171b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        return mTransition;
172b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    }
173b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
174b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    public int getTransitionStyle() {
175b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        return mTransitionStyle;
176b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    }
177b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn}
178b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
179b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackbornfinal class BackStackState implements Parcelable {
180b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    final int[] mAdded;
181b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    final int[] mRemoved;
182b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    final int mTransition;
183b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    final int mTransitionStyle;
184b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    final String mName;
185b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
186b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    public BackStackState(FragmentManager fm, BackStackEntry bse) {
187b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        mAdded = buildFragmentStateList(fm, bse.mAdded);
188b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        mRemoved = buildFragmentStateList(fm, bse.mRemoved);
189b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        mTransition = bse.mTransition;
190b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        mTransitionStyle = bse.mTransitionStyle;
191b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        mName = bse.mName;
192b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    }
193b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
194b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    public BackStackState(Parcel in) {
195b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        mAdded = in.createIntArray();
196b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        mRemoved = in.createIntArray();
197b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        mTransition = in.readInt();
198b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        mTransitionStyle = in.readInt();
199b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        mName = in.readString();
200b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    }
201b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
202b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    public BackStackEntry instantiate(FragmentManager fm) {
203b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        BackStackEntry bse = new BackStackEntry(fm);
204b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        bse.mAdded = buildFragmentList(fm, mAdded);
205b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        bse.mRemoved = buildFragmentList(fm, mRemoved);
206b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        bse.mTransition = mTransition;
207b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        bse.mTransitionStyle = mTransitionStyle;
208b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        bse.mName = mName;
209b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        return bse;
210b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    }
211b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
212b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    static int[] buildFragmentStateList(FragmentManager fm, ArrayList<Fragment> frags) {
213b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        if (frags == null) return null;
214b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        final int N = frags.size();
215b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        int[] ids = new int[N];
216b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        for (int i=0; i<N; i++) {
2176e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn            ids[i] = frags.get(i).mIndex;
218b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        }
219b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        return ids;
220b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    }
221b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
222b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    static ArrayList<Fragment> buildFragmentList(FragmentManager fm, int[] states) {
223b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        if (states == null) return null;
224b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        final int N = states.length;
225b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        ArrayList<Fragment> frags = new ArrayList<Fragment>(N);
226b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        for (int i=0; i<N; i++) {
2276e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn            Fragment f = fm.mActive.get(states[i]);
2286e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn            f.mBackStackNesting++;
2296e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn            frags.add(f);
230b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        }
231b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        return frags;
232b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    }
233b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
234b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    public int describeContents() {
235b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        return 0;
236b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    }
237b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
238b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    public void writeToParcel(Parcel dest, int flags) {
239b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        dest.writeIntArray(mAdded);
240b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        dest.writeIntArray(mRemoved);
241b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        dest.writeInt(mTransition);
242b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        dest.writeInt(mTransitionStyle);
243b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        dest.writeString(mName);
244b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    }
245b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
246b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    public static final Parcelable.Creator<BackStackState> CREATOR
247b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            = new Parcelable.Creator<BackStackState>() {
248b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        public BackStackState createFromParcel(Parcel in) {
249b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            return new BackStackState(in);
250b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        }
251b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
252b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        public BackStackState[] newArray(int size) {
253b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            return new BackStackState[size];
254b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        }
255b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    };
256b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn}
257b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
258b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackbornfinal class FragmentManagerState implements Parcelable {
2596e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn    FragmentState[] mActive;
260b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    int[] mAdded;
261b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    BackStackState[] mBackStack;
262b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
263b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    public FragmentManagerState() {
264b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    }
265b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
266b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    public FragmentManagerState(Parcel in) {
2676e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        mActive = in.createTypedArray(FragmentState.CREATOR);
268b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        mAdded = in.createIntArray();
269b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        mBackStack = in.createTypedArray(BackStackState.CREATOR);
270b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    }
271b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
272b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    public int describeContents() {
273b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        return 0;
274b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    }
275b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
276b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    public void writeToParcel(Parcel dest, int flags) {
2776e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        dest.writeTypedArray(mActive, flags);
278b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        dest.writeIntArray(mAdded);
279b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        dest.writeTypedArray(mBackStack, flags);
280b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    }
281b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
282b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    public static final Parcelable.Creator<FragmentManagerState> CREATOR
283b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            = new Parcelable.Creator<FragmentManagerState>() {
284b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        public FragmentManagerState createFromParcel(Parcel in) {
285b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            return new FragmentManagerState(in);
286b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        }
287b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
288b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        public FragmentManagerState[] newArray(int size) {
289b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            return new FragmentManagerState[size];
290b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        }
291b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    };
292ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn}
293ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn
2942dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn/**
295f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn * @hide
2962dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn * Container for fragments associated with an activity.
2972dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn */
298f121be737c59390d97e21a92be8e166001534c7dDianne Hackbornpublic class FragmentManager {
2996e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn    ArrayList<Fragment> mActive;
3006e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn    ArrayList<Fragment> mAdded;
3016e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn    ArrayList<Integer> mAvailIndices;
302b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    ArrayList<BackStackEntry> mBackStack;
3032dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn
3042dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    int mCurState = Fragment.INITIALIZING;
3052dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    Activity mActivity;
3062dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn
307b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    // Temporary vars for state save and restore.
308b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    Bundle mStateBundle = null;
309b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    SparseArray<Parcelable> mStateArray = null;
310b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
311f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn    Animation loadAnimation(Fragment fragment, int transit, boolean enter,
312f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            int transitionStyle) {
313f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn        Animation animObj = fragment.onCreateAnimation(transitionStyle, enter);
314f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn        if (animObj != null) {
315f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            return animObj;
316f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn        }
317f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn
318f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn        if (transit == 0) {
319f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            return null;
320f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn        }
321f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn
322f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn        int styleIndex = transitToStyleIndex(transit, enter);
323f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn        if (styleIndex < 0) {
324f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            return null;
325f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn        }
326f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn
327f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn        if (transitionStyle == 0 && mActivity.getWindow() != null) {
328f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            transitionStyle = mActivity.getWindow().getAttributes().windowAnimations;
329f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn        }
330f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn        if (transitionStyle == 0) {
331f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            return null;
332f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn        }
333f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn
334f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn        TypedArray attrs = mActivity.obtainStyledAttributes(transitionStyle,
335f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                com.android.internal.R.styleable.WindowAnimation);
336f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn        int anim = attrs.getResourceId(styleIndex, 0);
337f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn        attrs.recycle();
338f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn
339f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn        if (anim == 0) {
340f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            return null;
341f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn        }
342f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn
343f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn        return AnimationUtils.loadAnimation(mActivity, anim);
344f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn    }
345f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn
346f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn    void moveToState(Fragment f, int newState, int transit, int transitionStyle) {
3476e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        // Fragments that are not currently added will sit in the onCreate() state.
3486e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        if (!f.mAdded && newState > Fragment.CREATED) {
3496e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn            newState = Fragment.CREATED;
3506e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        }
3516e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn
3522dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn        if (f.mState < newState) {
3532dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn            switch (f.mState) {
3542dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                case Fragment.INITIALIZING:
3552dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                    f.mActivity = mActivity;
3562dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                    f.mCalled = false;
3572dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                    f.onAttach(mActivity);
3582dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                    if (!f.mCalled) {
3592dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                        throw new SuperNotCalledException("Fragment " + f
3602dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                                + " did not call through to super.onAttach()");
3612dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                    }
3622dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn
363b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                    if (!f.mRetaining) {
364b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                        f.mCalled = false;
365b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                        f.onCreate(f.mSavedFragmentState);
366b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                        if (!f.mCalled) {
367b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                            throw new SuperNotCalledException("Fragment " + f
368b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                                    + " did not call through to super.onCreate()");
3692dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                        }
3702dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                    }
371b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                    f.mRetaining = false;
372b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                    if (f.mFromLayout) {
373b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                        // For fragments that are part of the content view
374b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                        // layout, we need to instantiate the view immediately
375b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                        // and the inflater will take care of adding it.
376b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                        f.mView = f.onCreateView(mActivity.getLayoutInflater(),
377b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                                null, f.mSavedFragmentState);
3786e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                        if (f.mView != null) {
3796e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                            f.mView.setSaveFromParentEnabled(false);
3806e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                            f.restoreViewState();
3816e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                        }
382b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                    }
3836e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                case Fragment.CREATED:
3846e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                    if (newState > Fragment.CREATED) {
385b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                        if (!f.mFromLayout) {
386b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                            ViewGroup container = null;
387b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                            if (f.mContainerId != 0) {
388b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                                container = (ViewGroup)mActivity.findViewById(f.mContainerId);
389b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                                if (container == null) {
390b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                                    throw new IllegalArgumentException("New view found for id 0x"
391b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                                            + Integer.toHexString(f.mContainerId)
392b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                                            + " for fragment " + f);
393b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                                }
394b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                            }
395b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                            f.mContainer = container;
396b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                            f.mView = f.onCreateView(mActivity.getLayoutInflater(),
397b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                                    container, f.mSavedFragmentState);
398b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                            if (f.mView != null) {
399b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                                f.mView.setSaveFromParentEnabled(false);
400b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                                if (container != null) {
401b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                                    Animation anim = loadAnimation(f, transit, true,
402b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                                            transitionStyle);
403b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                                    if (anim != null) {
404b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                                        f.mView.setAnimation(anim);
405b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                                    }
406b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                                    container.addView(f.mView);
407b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                                    f.restoreViewState();
408b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                                }
409b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                            }
410b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                        }
411b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
412b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                        f.mCalled = false;
413b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                        f.onReady(f.mSavedFragmentState);
414b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                        if (!f.mCalled) {
415b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                            throw new SuperNotCalledException("Fragment " + f
416b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                                    + " did not call through to super.onReady()");
417f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                        }
418b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                        f.mSavedFragmentState = null;
4192dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                    }
4206e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                case Fragment.CONTENT:
4216e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                    if (newState > Fragment.CONTENT) {
4222dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                        f.mCalled = false;
4232dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                        f.onStart();
4242dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                        if (!f.mCalled) {
4252dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                            throw new SuperNotCalledException("Fragment " + f
4262dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                                    + " did not call through to super.onStart()");
4272dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                        }
4282dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                    }
4292dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                case Fragment.STARTED:
4302dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                    if (newState > Fragment.STARTED) {
4312dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                        f.mCalled = false;
4322dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                        f.onResume();
4332dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                        if (!f.mCalled) {
4342dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                            throw new SuperNotCalledException("Fragment " + f
4352dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                                    + " did not call through to super.onResume()");
4362dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                        }
4372dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                    }
4382dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn            }
4392dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn        } else if (f.mState > newState) {
4402dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn            switch (f.mState) {
4412dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                case Fragment.RESUMED:
4422dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                    if (newState < Fragment.RESUMED) {
4432dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                        f.mCalled = false;
4442dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                        f.onPause();
4452dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                        if (!f.mCalled) {
4462dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                            throw new SuperNotCalledException("Fragment " + f
4472dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                                    + " did not call through to super.onPause()");
4482dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                        }
4492dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                    }
4502dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                case Fragment.STARTED:
4512dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                    if (newState < Fragment.STARTED) {
4522dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                        f.mCalled = false;
4532dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                        f.onStop();
4542dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                        if (!f.mCalled) {
4552dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                            throw new SuperNotCalledException("Fragment " + f
4562dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                                    + " did not call through to super.onStop()");
4572dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                        }
4582dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                    }
459b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                case Fragment.CONTENT:
460b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                    if (newState < Fragment.CONTENT) {
461b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                        if (f.mView != null) {
462b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                            // Need to save the current view state if not
463b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                            // done already.
4646e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                            if (!mActivity.isFinishing() && f.mSavedFragmentState == null) {
465b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                                saveFragmentViewState(f);
466b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                            }
467b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                            if (f.mContainer != null) {
468b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                                if (mCurState > Fragment.INITIALIZING) {
469b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                                    Animation anim = loadAnimation(f, transit, false,
470b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                                            transitionStyle);
471b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                                    if (anim != null) {
472b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                                        f.mView.setAnimation(anim);
473b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                                    }
474b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                                }
475b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                                f.mContainer.removeView(f.mView);
476f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                            }
4772dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                        }
4782dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                        f.mContainer = null;
4792dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                        f.mView = null;
480b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                    }
481b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                case Fragment.CREATED:
482b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                    if (newState < Fragment.CREATED) {
483b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                        if (!f.mRetaining) {
484b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                            f.mCalled = false;
485b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                            f.onDestroy();
486b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                            if (!f.mCalled) {
487b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                                throw new SuperNotCalledException("Fragment " + f
488b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                                        + " did not call through to super.onDestroy()");
489b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                            }
4902dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                        }
491b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
4922dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                        f.mCalled = false;
4932dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                        f.onDetach();
4942dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                        if (!f.mCalled) {
4952dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                            throw new SuperNotCalledException("Fragment " + f
4962dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                                    + " did not call through to super.onDetach()");
4972dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                        }
4982dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                        f.mActivity = null;
4992dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                    }
5002dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn            }
5012dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn        }
5022dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn
5032dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn        f.mState = newState;
5042dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    }
5052dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn
506ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn    void moveToState(int newState, boolean always) {
507f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn        moveToState(newState, 0, 0, always);
508f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn    }
509f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn
510f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn    void moveToState(int newState, int transit, int transitStyle, boolean always) {
5112dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn        if (mActivity == null && newState != Fragment.INITIALIZING) {
5122dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn            throw new IllegalStateException("No activity");
5132dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn        }
5142dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn
515ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn        if (!always && mCurState == newState) {
516ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn            return;
517ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn        }
518ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn
5192dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn        mCurState = newState;
5206e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        if (mActive != null) {
5216e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn            for (int i=0; i<mActive.size(); i++) {
5226e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                Fragment f = mActive.get(i);
5236e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                if (f != null) {
5246e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                    moveToState(f, newState, transit, transitStyle);
5256e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                }
5266e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn            }
5276e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        }
5286e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn    }
5296e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn
5306e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn    void makeActive(Fragment f) {
5316e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        if (f.mIndex >= 0) {
5326e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn            return;
5336e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        }
5346e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn
5356e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        if (mAvailIndices == null || mAvailIndices.size() <= 0) {
5366e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn            if (mActive == null) {
5376e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                mActive = new ArrayList<Fragment>();
538ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn            }
5396e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn            f.setIndex(mActive.size());
5406e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn            mActive.add(f);
5416e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn
5426e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        } else {
5436e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn            f.setIndex(mAvailIndices.remove(mAvailIndices.size()-1));
5446e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn            mActive.set(f.mIndex, f);
5452dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn        }
5462dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    }
5472dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn
5486e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn    void makeInactive(Fragment f) {
5496e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        if (f.mIndex < 0) {
5506e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn            return;
5516e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        }
5526e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn
5536e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        mActive.set(f.mIndex, null);
5546e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        if (mAvailIndices == null) {
5556e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn            mAvailIndices = new ArrayList<Integer>();
5566e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        }
5576e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        mAvailIndices.add(f.mIndex);
5586e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        f.clearIndex();
5596e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn    }
5606e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn
561ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn    public void addFragment(Fragment fragment, boolean moveToStateNow) {
5626e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        if (mAdded == null) {
5636e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn            mAdded = new ArrayList<Fragment>();
564ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn        }
5656e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        mAdded.add(fragment);
5666e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        makeActive(fragment);
5676e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        fragment.mAdded = true;
568ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn        if (moveToStateNow) {
569f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            moveToState(fragment, mCurState, 0, 0);
570ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn        }
5712dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    }
5722dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn
573f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn    public void removeFragment(Fragment fragment, int transition, int transitionStyle) {
5746e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        mAdded.remove(fragment);
5756e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        final boolean inactive = fragment.mBackStackNesting <= 0;
5766e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        if (inactive) {
5776e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn            makeInactive(fragment);
5786e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        }
5796e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        fragment.mAdded = false;
5806e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        moveToState(fragment, inactive ? Fragment.INITIALIZING : Fragment.CREATED,
5816e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                transition, transitionStyle);
582f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn    }
583f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn
584f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn    public Fragment findFragmentById(int id) {
5856e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        if (mActive != null) {
5866e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn            for (int i=mActive.size()-1; i>=0; i--) {
5876e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                Fragment f = mActive.get(i);
5886e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                if (f != null && f.mFragmentId == id) {
589b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                    return f;
590b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                }
591b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            }
592b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        }
593b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        return null;
594b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    }
595b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
596b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    public Fragment findFragmentByTag(String tag) {
5976e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        if (mActive != null && tag != null) {
5986e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn            for (int i=mActive.size()-1; i>=0; i--) {
5996e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                Fragment f = mActive.get(i);
6006e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                if (f != null && tag.equals(f.mTag)) {
6016e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                    return f;
6026e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                }
6036e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn            }
6046e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        }
6056e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        return null;
6066e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn    }
6076e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn
6086e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn    public Fragment findFragmentByWho(String who) {
6096e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        if (mActive != null && who != null) {
6106e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn            for (int i=mActive.size()-1; i>=0; i--) {
6116e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                Fragment f = mActive.get(i);
6126e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                if (f != null && who.equals(f.mWho)) {
613f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                    return f;
614f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                }
615f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            }
616f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn        }
617f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn        return null;
6182dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    }
6192dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn
620b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    public void addBackStackState(BackStackEntry state) {
621ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn        if (mBackStack == null) {
622b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            mBackStack = new ArrayList<BackStackEntry>();
623ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn        }
624ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn        mBackStack.add(state);
625ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn    }
626ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn
627f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn    public boolean popBackStackState(Handler handler, String name) {
628ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn        if (mBackStack == null) {
629ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn            return false;
630ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn        }
631f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn        if (name == null) {
632f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            int last = mBackStack.size()-1;
633f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            if (last < 0) {
634f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                return false;
635f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            }
636b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            final BackStackEntry bss = mBackStack.remove(last);
637f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            handler.post(new Runnable() {
638f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                public void run() {
639f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                    bss.popFromBackStack();
640f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                    moveToState(mCurState, reverseTransit(bss.getTransition()),
641f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                            bss.getTransitionStyle(), true);
642f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                }
643f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            });
644f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn        } else {
645f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            int index = mBackStack.size()-1;
646f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            while (index >= 0) {
647b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                BackStackEntry bss = mBackStack.get(index);
648f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                if (name.equals(bss.getName())) {
649f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                    break;
650f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                }
651f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            }
652f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            if (index < 0 || index == mBackStack.size()-1) {
653f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                return false;
654f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            }
655b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            final ArrayList<BackStackEntry> states
656b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                    = new ArrayList<BackStackEntry>();
657f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            for (int i=mBackStack.size()-1; i>index; i--) {
658f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                states.add(mBackStack.remove(i));
659ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn            }
660f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            handler.post(new Runnable() {
661f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                public void run() {
662f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                    for (int i=0; i<states.size(); i++) {
663f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                        states.get(i).popFromBackStack();
664f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                    }
665f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                    moveToState(mCurState, true);
666f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                }
667f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            });
668f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn        }
669ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn        return true;
670ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn    }
671ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn
672b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    ArrayList<Fragment> retainNonConfig() {
673b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        ArrayList<Fragment> fragments = null;
6746e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        if (mActive != null) {
6756e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn            for (int i=0; i<mActive.size(); i++) {
6766e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                Fragment f = mActive.get(i);
6776e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                if (f != null && f.mRetainInstance) {
678b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                    if (fragments == null) {
679b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                        fragments = new ArrayList<Fragment>();
680b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                    }
681b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                    fragments.add(f);
682b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                    f.mRetaining = true;
683b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                }
684b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            }
685b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        }
686b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        return fragments;
687b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    }
688b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
689b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    void saveFragmentViewState(Fragment f) {
6906e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        if (f.mView == null) {
691b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            return;
692b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        }
693b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        if (mStateArray == null) {
694b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            mStateArray = new SparseArray<Parcelable>();
695b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        }
696b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        f.mView.saveHierarchyState(mStateArray);
697b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        if (mStateArray.size() > 0) {
698b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            f.mSavedViewState = mStateArray;
699b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            mStateArray = null;
700b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        }
701b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    }
702b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
7036e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn    Parcelable saveAllState() {
7046e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        if (mActive == null || mActive.size() <= 0) {
7056e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn            return null;
706b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        }
707b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
7086e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        // First collect all active fragments.
7096e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        int N = mActive.size();
7106e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        FragmentState[] active = new FragmentState[N];
7116e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        boolean haveFragments = false;
7126e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        for (int i=0; i<N; i++) {
7136e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn            Fragment f = mActive.get(i);
7146e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn            if (f != null) {
7156e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                haveFragments = true;
7166e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn
7176e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                FragmentState fs = new FragmentState(f);
7186e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                active[i] = fs;
7196e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn
7206e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                if (mStateBundle == null) {
7216e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                    mStateBundle = new Bundle();
7226e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                }
7236e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                f.onSaveInstanceState(mStateBundle);
7246e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                if (!mStateBundle.isEmpty()) {
7256e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                    fs.mSavedFragmentState = mStateBundle;
7266e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                    mStateBundle = null;
727b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                }
7286e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn
7296e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                if (f.mView != null) {
7306e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                    saveFragmentViewState(f);
7316e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                    if (f.mSavedViewState != null) {
7326e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                        if (fs.mSavedFragmentState == null) {
7336e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                            fs.mSavedFragmentState = new Bundle();
7346e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                        }
7356e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                        fs.mSavedFragmentState.putSparseParcelableArray(
7366e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                                FragmentState.VIEW_STATE_TAG, f.mSavedViewState);
7376e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                    }
7386e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                }
7396e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn
740b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            }
741b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        }
742b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
7436e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        if (!haveFragments) {
744b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            return null;
745b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        }
746b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
747b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        int[] added = null;
748b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        BackStackState[] backStack = null;
749b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
7506e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        // Build list of currently added fragments.
7516e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        N = mAdded.size();
752b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        if (N > 0) {
753b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            added = new int[N];
754b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            for (int i=0; i<N; i++) {
7556e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                added[i] = mAdded.get(i).mIndex;
756b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            }
757b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        }
758b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
759b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        // Now save back stack.
760b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        if (mBackStack != null) {
761b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            N = mBackStack.size();
762b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            if (N > 0) {
763b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                backStack = new BackStackState[N];
764b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                for (int i=0; i<N; i++) {
765b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                    backStack[i] = new BackStackState(this, mBackStack.get(i));
766b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                }
767b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            }
768b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        }
769b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
770b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        FragmentManagerState fms = new FragmentManagerState();
7716e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        fms.mActive = active;
772b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        fms.mAdded = added;
773b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        fms.mBackStack = backStack;
774b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        return fms;
775b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    }
776b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
777b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    void restoreAllState(Parcelable state, ArrayList<Fragment> nonConfig) {
778b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        // If there is no saved state at all, then there can not be
779b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        // any nonConfig fragments either, so that is that.
780b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        if (state == null) return;
781b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        FragmentManagerState fms = (FragmentManagerState)state;
7826e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        if (fms.mActive == null) return;
783b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
7846e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        // First re-attach any non-config instances we are retaining back
7856e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        // to their saved state, so we don't try to instantiate them again.
786b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        if (nonConfig != null) {
787b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            for (int i=0; i<nonConfig.size(); i++) {
788b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                Fragment f = nonConfig.get(i);
7896e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                FragmentState fs = fms.mActive[f.mIndex];
790b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                fs.mInstance = f;
791b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                f.mSavedViewState = null;
7926e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                f.mBackStackNesting = 0;
7936e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                f.mAdded = false;
794b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                if (fs.mSavedFragmentState != null) {
795b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                    f.mSavedViewState = fs.mSavedFragmentState.getSparseParcelableArray(
796b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                            FragmentState.VIEW_STATE_TAG);
797b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                }
798b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            }
799b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        }
800b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
8016e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        // Build the full list of active fragments, instantiating them from
8026e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        // their saved state.
8036e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        mActive = new ArrayList<Fragment>(fms.mActive.length);
8046e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        if (mAvailIndices != null) {
8056e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn            mAvailIndices.clear();
8066e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        }
8076e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        for (int i=0; i<fms.mActive.length; i++) {
8086e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn            FragmentState fs = fms.mActive[i];
8096e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn            if (fs != null) {
8106e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                mActive.add(fs.instantiate(mActivity));
8116e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn            } else {
8126e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                mActive.add(null);
8136e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                if (mAvailIndices == null) {
8146e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                    mAvailIndices = new ArrayList<Integer>();
8156e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                }
8166e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                mAvailIndices.add(i);
817b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            }
8186e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        }
8196e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn
8206e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        // Build the list of currently added fragments.
8216e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        if (fms.mAdded != null) {
8226e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn            mAdded = new ArrayList<Fragment>(fms.mAdded.length);
823b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            for (int i=0; i<fms.mAdded.length; i++) {
8246e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                Fragment f = mActive.get(fms.mAdded[i]);
8256e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                if (f == null) {
8266e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                    throw new IllegalStateException(
8276e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                            "No instantiated fragment for index #" + fms.mAdded[i]);
828b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                }
8296e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                f.mAdded = true;
8306e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                mAdded.add(f);
831b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            }
8326e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        } else {
8336e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn            mAdded = null;
834b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        }
8356e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn
8366e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        // Build the back stack.
837b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        if (fms.mBackStack != null) {
838b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            mBackStack = new ArrayList<BackStackEntry>(fms.mBackStack.length);
839b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            for (int i=0; i<fms.mBackStack.length; i++) {
840b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                BackStackEntry bse = fms.mBackStack[i].instantiate(this);
841b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                mBackStack.add(bse);
842b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            }
8436e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        } else {
8446e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn            mBackStack = null;
845b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        }
846b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    }
847b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
8482dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    public void attachActivity(Activity activity) {
8492dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn        if (mActivity != null) throw new IllegalStateException();
8502dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn        mActivity = activity;
8512dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    }
8522dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn
853b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    public void dispatchCreate() {
854ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn        moveToState(Fragment.CREATED, false);
8552dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    }
8562dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn
8572dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    public void dispatchStart() {
858ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn        moveToState(Fragment.STARTED, false);
8592dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    }
8602dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn
8612dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    public void dispatchResume() {
862ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn        moveToState(Fragment.RESUMED, false);
8632dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    }
8642dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn
8652dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    public void dispatchPause() {
866ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn        moveToState(Fragment.STARTED, false);
8672dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    }
8682dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn
8692dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    public void dispatchStop() {
8706e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        moveToState(Fragment.CONTENT, false);
8712dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    }
8722dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn
8732dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    public void dispatchDestroy() {
874ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn        moveToState(Fragment.INITIALIZING, false);
8752dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn        mActivity = null;
8762dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    }
877f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn
878f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn    public static int reverseTransit(int transit) {
879f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn        int rev = 0;
880f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn        switch (transit) {
881f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            case FragmentTransaction.TRANSIT_ENTER:
882f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                rev = FragmentTransaction.TRANSIT_EXIT;
883f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                break;
884f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            case FragmentTransaction.TRANSIT_EXIT:
885f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                rev = FragmentTransaction.TRANSIT_ENTER;
886f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                break;
887f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            case FragmentTransaction.TRANSIT_SHOW:
888f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                rev = FragmentTransaction.TRANSIT_HIDE;
889f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                break;
890f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            case FragmentTransaction.TRANSIT_HIDE:
891f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                rev = FragmentTransaction.TRANSIT_SHOW;
892f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                break;
893f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            case FragmentTransaction.TRANSIT_ACTIVITY_OPEN:
894f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                rev = FragmentTransaction.TRANSIT_ACTIVITY_CLOSE;
895f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                break;
896f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            case FragmentTransaction.TRANSIT_ACTIVITY_CLOSE:
897f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                rev = FragmentTransaction.TRANSIT_ACTIVITY_OPEN;
898f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                break;
899f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            case FragmentTransaction.TRANSIT_TASK_OPEN:
900f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                rev = FragmentTransaction.TRANSIT_TASK_CLOSE;
901f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                break;
902f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            case FragmentTransaction.TRANSIT_TASK_CLOSE:
903f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                rev = FragmentTransaction.TRANSIT_TASK_OPEN;
904f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                break;
905f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            case FragmentTransaction.TRANSIT_TASK_TO_FRONT:
906f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                rev = FragmentTransaction.TRANSIT_TASK_TO_BACK;
907f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                break;
908f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            case FragmentTransaction.TRANSIT_TASK_TO_BACK:
909f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                rev = FragmentTransaction.TRANSIT_TASK_TO_FRONT;
910f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                break;
911f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            case FragmentTransaction.TRANSIT_WALLPAPER_OPEN:
912f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                rev = FragmentTransaction.TRANSIT_WALLPAPER_CLOSE;
913f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                break;
914f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            case FragmentTransaction.TRANSIT_WALLPAPER_CLOSE:
915f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                rev = FragmentTransaction.TRANSIT_WALLPAPER_OPEN;
916f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                break;
917f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            case FragmentTransaction.TRANSIT_WALLPAPER_INTRA_OPEN:
918f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                rev = FragmentTransaction.TRANSIT_WALLPAPER_INTRA_CLOSE;
919f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                break;
920f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            case FragmentTransaction.TRANSIT_WALLPAPER_INTRA_CLOSE:
921f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                rev = FragmentTransaction.TRANSIT_WALLPAPER_INTRA_OPEN;
922f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                break;
923f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn        }
924f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn        return rev;
925f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn
926f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn    }
927f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn
928f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn    public static int transitToStyleIndex(int transit, boolean enter) {
929f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn        int animAttr = -1;
930f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn        switch (transit) {
931f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            case FragmentTransaction.TRANSIT_ENTER:
932f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                animAttr = com.android.internal.R.styleable.WindowAnimation_windowEnterAnimation;
933f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                break;
934f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            case FragmentTransaction.TRANSIT_EXIT:
935f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                animAttr = com.android.internal.R.styleable.WindowAnimation_windowExitAnimation;
936f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                break;
937f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            case FragmentTransaction.TRANSIT_SHOW:
938f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                animAttr = com.android.internal.R.styleable.WindowAnimation_windowShowAnimation;
939f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                break;
940f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            case FragmentTransaction.TRANSIT_HIDE:
941f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                animAttr = com.android.internal.R.styleable.WindowAnimation_windowHideAnimation;
942f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                break;
943f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            case FragmentTransaction.TRANSIT_ACTIVITY_OPEN:
944f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                animAttr = enter
945f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                        ? com.android.internal.R.styleable.WindowAnimation_activityOpenEnterAnimation
946f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                        : com.android.internal.R.styleable.WindowAnimation_activityOpenExitAnimation;
947f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                break;
948f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            case FragmentTransaction.TRANSIT_ACTIVITY_CLOSE:
949f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                animAttr = enter
950f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                        ? com.android.internal.R.styleable.WindowAnimation_activityCloseEnterAnimation
951f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                        : com.android.internal.R.styleable.WindowAnimation_activityCloseExitAnimation;
952f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                break;
953f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            case FragmentTransaction.TRANSIT_TASK_OPEN:
954f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                animAttr = enter
955f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                        ? com.android.internal.R.styleable.WindowAnimation_taskOpenEnterAnimation
956f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                        : com.android.internal.R.styleable.WindowAnimation_taskOpenExitAnimation;
957f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                break;
958f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            case FragmentTransaction.TRANSIT_TASK_CLOSE:
959f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                animAttr = enter
960f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                        ? com.android.internal.R.styleable.WindowAnimation_taskCloseEnterAnimation
961f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                        : com.android.internal.R.styleable.WindowAnimation_taskCloseExitAnimation;
962f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                break;
963f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            case FragmentTransaction.TRANSIT_TASK_TO_FRONT:
964f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                animAttr = enter
965f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                        ? com.android.internal.R.styleable.WindowAnimation_taskToFrontEnterAnimation
966f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                        : com.android.internal.R.styleable.WindowAnimation_taskToFrontExitAnimation;
967f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                break;
968f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            case FragmentTransaction.TRANSIT_TASK_TO_BACK:
969f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                animAttr = enter
970f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                        ? com.android.internal.R.styleable.WindowAnimation_taskToBackEnterAnimation
971f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                        : com.android.internal.R.styleable.WindowAnimation_taskToBackExitAnimation;
972f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                break;
973f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            case FragmentTransaction.TRANSIT_WALLPAPER_OPEN:
974f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                animAttr = enter
975f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                        ? com.android.internal.R.styleable.WindowAnimation_wallpaperOpenEnterAnimation
976f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                        : com.android.internal.R.styleable.WindowAnimation_wallpaperOpenExitAnimation;
977f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                break;
978f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            case FragmentTransaction.TRANSIT_WALLPAPER_CLOSE:
979f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                animAttr = enter
980f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                        ? com.android.internal.R.styleable.WindowAnimation_wallpaperCloseEnterAnimation
981f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                        : com.android.internal.R.styleable.WindowAnimation_wallpaperCloseExitAnimation;
982f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                break;
983f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            case FragmentTransaction.TRANSIT_WALLPAPER_INTRA_OPEN:
984f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                animAttr = enter
985f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                        ? com.android.internal.R.styleable.WindowAnimation_wallpaperIntraOpenEnterAnimation
986f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                        : com.android.internal.R.styleable.WindowAnimation_wallpaperIntraOpenExitAnimation;
987f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                break;
988f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            case FragmentTransaction.TRANSIT_WALLPAPER_INTRA_CLOSE:
989f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                animAttr = enter
990f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                        ? com.android.internal.R.styleable.WindowAnimation_wallpaperIntraCloseEnterAnimation
991f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                        : com.android.internal.R.styleable.WindowAnimation_wallpaperIntraCloseExitAnimation;
992f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                break;
993f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn        }
994f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn        return animAttr;
995f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn    }
9962dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn}
997