FragmentManager.java revision b4bc78b16a05554c57508b488e21dd8eca4e13e6
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;
30b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackbornimport java.util.HashMap;
312dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn
32b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackbornfinal class BackStackEntry implements FragmentTransaction, Runnable {
33b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    final FragmentManager mManager;
34b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
35b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    ArrayList<Fragment> mAdded;
36b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    ArrayList<Fragment> mRemoved;
37b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    int mTransition;
38b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    int mTransitionStyle;
39b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    boolean mAddToBackStack;
40b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    String mName;
41b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    boolean mCommitted;
42b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
43b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    public BackStackEntry(FragmentManager manager) {
44b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        mManager = manager;
45b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    }
46b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
47b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    public FragmentTransaction add(Fragment fragment, String tag) {
48b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        fragment.mTag = tag;
49b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        return add(fragment, 0);
50b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    }
51b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
52b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    public FragmentTransaction add(Fragment fragment, int containerViewId) {
53b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        if (fragment.mActivity != null) {
54b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            throw new IllegalStateException("Fragment already added: " + fragment);
55b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        }
56b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        if (mRemoved != null) {
57b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            mRemoved.remove(fragment);
58b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        }
59b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        if (mAdded == null) {
60b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            mAdded = new ArrayList<Fragment>();
61b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        }
62b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        fragment.mContainerId = fragment.mFragmentId = containerViewId;
63b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        mAdded.add(fragment);
64b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        return this;
65b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    }
66b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
67b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    public FragmentTransaction replace(Fragment fragment, int containerViewId) {
68b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        if (containerViewId == 0) {
69b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            throw new IllegalArgumentException("Must use non-zero containerViewId");
70b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        }
71b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        if (mManager.mFragments != null) {
72b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            for (int i=0; i<mManager.mFragments.size(); i++) {
73b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                Fragment old = mManager.mFragments.get(i);
74b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                if (old.mContainerId == containerViewId) {
75b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                    remove(old);
76b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                }
77b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            }
78b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        }
79b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        return add(fragment, containerViewId);
80b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    }
81b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
82b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    public FragmentTransaction remove(Fragment fragment) {
83b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        if (fragment.mActivity == null) {
84b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            throw new IllegalStateException("Fragment not added: " + fragment);
85b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        }
86b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        if (mAdded != null) {
87b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            mAdded.remove(fragment);
88b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        }
89b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        if (mRemoved == null) {
90b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            mRemoved = new ArrayList<Fragment>();
91b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        }
92b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        mRemoved.add(fragment);
93b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        return this;
94b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    }
95b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
96b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    public FragmentTransaction setTransition(int transition) {
97b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        mTransition = transition;
98b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        return this;
99b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    }
100b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
101b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    public FragmentTransaction setTransitionStyle(int styleRes) {
102b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        mTransitionStyle = styleRes;
103b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        return this;
104b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    }
105b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
106b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    public FragmentTransaction addToBackStack(String name) {
107b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        mAddToBackStack = true;
108b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        mName = name;
109b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        return this;
110b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    }
111b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
112b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    public void commit() {
113b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        if (mCommitted) throw new IllegalStateException("commit already called");
114b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        mCommitted = true;
115b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        mManager.mActivity.mHandler.post(this);
116b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    }
117b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
118b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    public void run() {
119b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        if (mRemoved != null) {
120b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            for (int i=mRemoved.size()-1; i>=0; i--) {
121b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                mManager.removeFragment(mRemoved.get(i), mTransition,
122b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                        mTransitionStyle);
123b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            }
124b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        }
125b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        if (mAdded != null) {
126b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            for (int i=mAdded.size()-1; i>=0; i--) {
127b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                Fragment f = mAdded.get(i);
128b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                mManager.addFragment(f, false);
129b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                if (mAddToBackStack) {
130b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                    f.mBackStackNesting++;
131b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                }
132b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            }
133b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        }
134b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        mManager.moveToState(mManager.mCurState, mTransition,
135b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                mTransitionStyle, true);
136b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        if (mAddToBackStack) {
137b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            mManager.addBackStackState(this);
138b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        }
139b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    }
140b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
141b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    public void popFromBackStack() {
142b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        if (mAdded != null) {
143b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            for (int i=mAdded.size()-1; i>=0; i--) {
144b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                Fragment f = mAdded.get(i);
145b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                if (mAddToBackStack) {
146b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                    f.mBackStackNesting--;
147b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                }
148b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                mManager.removeFragment(f,
149b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                        FragmentManager.reverseTransit(mTransition),
150b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                        mTransitionStyle);
151b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            }
152b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        }
153b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        if (mRemoved != null) {
154b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            for (int i=mRemoved.size()-1; i>=0; i--) {
155b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                mManager.addFragment(mRemoved.get(i), false);
156b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            }
157b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        }
158b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    }
159b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
160b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    public String getName() {
161b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        return mName;
162b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    }
163b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
164b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    public int getTransition() {
165b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        return mTransition;
166b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    }
167b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
168b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    public int getTransitionStyle() {
169b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        return mTransitionStyle;
170b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    }
171b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn}
172b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
173b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackbornfinal class BackStackState implements Parcelable {
174b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    final int[] mAdded;
175b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    final int[] mRemoved;
176b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    final int mTransition;
177b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    final int mTransitionStyle;
178b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    final String mName;
179b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
180b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    public BackStackState(FragmentManager fm, BackStackEntry bse) {
181b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        mAdded = buildFragmentStateList(fm, bse.mAdded);
182b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        mRemoved = buildFragmentStateList(fm, bse.mRemoved);
183b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        mTransition = bse.mTransition;
184b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        mTransitionStyle = bse.mTransitionStyle;
185b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        mName = bse.mName;
186b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    }
187b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
188b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    public BackStackState(Parcel in) {
189b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        mAdded = in.createIntArray();
190b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        mRemoved = in.createIntArray();
191b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        mTransition = in.readInt();
192b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        mTransitionStyle = in.readInt();
193b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        mName = in.readString();
194b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    }
195b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
196b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    public BackStackEntry instantiate(FragmentManager fm) {
197b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        BackStackEntry bse = new BackStackEntry(fm);
198b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        bse.mAdded = buildFragmentList(fm, mAdded);
199b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        bse.mRemoved = buildFragmentList(fm, mRemoved);
200b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        bse.mTransition = mTransition;
201b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        bse.mTransitionStyle = mTransitionStyle;
202b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        bse.mName = mName;
203b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        return bse;
204b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    }
205b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
206b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    static int[] buildFragmentStateList(FragmentManager fm, ArrayList<Fragment> frags) {
207b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        if (frags == null) return null;
208b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        final int N = frags.size();
209b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        int[] ids = new int[N];
210b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        for (int i=0; i<N; i++) {
211b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            FragmentState fs = fm.saveFragment(frags.get(i));
212b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            ids[i] = fs.mSavedStateId;
213b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        }
214b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        return ids;
215b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    }
216b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
217b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    static ArrayList<Fragment> buildFragmentList(FragmentManager fm, int[] states) {
218b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        if (states == null) return null;
219b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        final int N = states.length;
220b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        ArrayList<Fragment> frags = new ArrayList<Fragment>(N);
221b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        for (int i=0; i<N; i++) {
222b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            frags.add(fm.mRestoredFragments.get(states[i]).instantiate(fm.mActivity));
223b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        }
224b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        return frags;
225b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    }
226b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
227b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    public int describeContents() {
228b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        return 0;
229b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    }
230b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
231b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    public void writeToParcel(Parcel dest, int flags) {
232b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        dest.writeIntArray(mAdded);
233b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        dest.writeIntArray(mRemoved);
234b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        dest.writeInt(mTransition);
235b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        dest.writeInt(mTransitionStyle);
236b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        dest.writeString(mName);
237b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    }
238b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
239b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    public static final Parcelable.Creator<BackStackState> CREATOR
240b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            = new Parcelable.Creator<BackStackState>() {
241b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        public BackStackState createFromParcel(Parcel in) {
242b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            return new BackStackState(in);
243b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        }
244b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
245b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        public BackStackState[] newArray(int size) {
246b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            return new BackStackState[size];
247b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        }
248b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    };
249b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn}
250b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
251b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackbornfinal class FragmentManagerState implements Parcelable {
252b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    FragmentState[] mFragments;
253b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    int[] mAdded;
254b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    BackStackState[] mBackStack;
255b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
256b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    public FragmentManagerState() {
257b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    }
258b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
259b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    public FragmentManagerState(Parcel in) {
260b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        mFragments = in.createTypedArray(FragmentState.CREATOR);
261b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        mAdded = in.createIntArray();
262b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        mBackStack = in.createTypedArray(BackStackState.CREATOR);
263b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    }
264b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
265b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    public int describeContents() {
266b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        return 0;
267b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    }
268b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
269b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    public void writeToParcel(Parcel dest, int flags) {
270b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        dest.writeTypedArray(mFragments, flags);
271b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        dest.writeIntArray(mAdded);
272b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        dest.writeTypedArray(mBackStack, flags);
273b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    }
274b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
275b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    public static final Parcelable.Creator<FragmentManagerState> CREATOR
276b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            = new Parcelable.Creator<FragmentManagerState>() {
277b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        public FragmentManagerState createFromParcel(Parcel in) {
278b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            return new FragmentManagerState(in);
279b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        }
280b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
281b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        public FragmentManagerState[] newArray(int size) {
282b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            return new FragmentManagerState[size];
283b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        }
284b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    };
285ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn}
286ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn
2872dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn/**
288f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn * @hide
2892dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn * Container for fragments associated with an activity.
2902dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn */
291f121be737c59390d97e21a92be8e166001534c7dDianne Hackbornpublic class FragmentManager {
292ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn    ArrayList<Fragment> mFragments;
293b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    ArrayList<BackStackEntry> mBackStack;
2942dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn
2952dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    int mCurState = Fragment.INITIALIZING;
2962dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    Activity mActivity;
2972dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn
298b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    int mSaveStateSeq = 0;
299b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
300b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    // Temporary vars for state save and restore.
301b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    int mCurSaveId = 0;
302b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    HashMap<Fragment, FragmentState> mSavedFragments;
303b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    SparseArray<FragmentState> mRestoredFragments;
304b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    Bundle mStateBundle = null;
305b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    SparseArray<Parcelable> mStateArray = null;
306b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
307f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn    Animation loadAnimation(Fragment fragment, int transit, boolean enter,
308f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            int transitionStyle) {
309f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn        Animation animObj = fragment.onCreateAnimation(transitionStyle, enter);
310f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn        if (animObj != null) {
311f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            return animObj;
312f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn        }
313f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn
314f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn        if (transit == 0) {
315f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            return null;
316f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn        }
317f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn
318f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn        int styleIndex = transitToStyleIndex(transit, enter);
319f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn        if (styleIndex < 0) {
320f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            return null;
321f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn        }
322f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn
323f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn        if (transitionStyle == 0 && mActivity.getWindow() != null) {
324f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            transitionStyle = mActivity.getWindow().getAttributes().windowAnimations;
325f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn        }
326f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn        if (transitionStyle == 0) {
327f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            return null;
328f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn        }
329f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn
330f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn        TypedArray attrs = mActivity.obtainStyledAttributes(transitionStyle,
331f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                com.android.internal.R.styleable.WindowAnimation);
332f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn        int anim = attrs.getResourceId(styleIndex, 0);
333f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn        attrs.recycle();
334f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn
335f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn        if (anim == 0) {
336f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            return null;
337f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn        }
338f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn
339f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn        return AnimationUtils.loadAnimation(mActivity, anim);
340f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn    }
341f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn
342f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn    void moveToState(Fragment f, int newState, int transit, int transitionStyle) {
3432dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn        if (f.mState < newState) {
3442dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn            switch (f.mState) {
3452dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                case Fragment.INITIALIZING:
3462dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                    f.mActivity = mActivity;
3472dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                    f.mCalled = false;
3482dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                    f.onAttach(mActivity);
3492dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                    if (!f.mCalled) {
3502dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                        throw new SuperNotCalledException("Fragment " + f
3512dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                                + " did not call through to super.onAttach()");
3522dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                    }
3532dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn
354b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                    if (!f.mRetaining) {
355b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                        f.mCalled = false;
356b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                        f.onCreate(f.mSavedFragmentState);
357b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                        if (!f.mCalled) {
358b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                            throw new SuperNotCalledException("Fragment " + f
359b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                                    + " did not call through to super.onCreate()");
3602dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                        }
3612dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                    }
362b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                    f.mRetaining = false;
363b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                    if (f.mFromLayout) {
364b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                        // For fragments that are part of the content view
365b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                        // layout, we need to instantiate the view immediately
366b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                        // and the inflater will take care of adding it.
367b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                        f.mView = f.onCreateView(mActivity.getLayoutInflater(),
368b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                                null, f.mSavedFragmentState);
369b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                    }
370b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                case Fragment.CONTENT:
371b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                    if (newState > Fragment.CONTENT) {
372b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                        if (!f.mFromLayout) {
373b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                            ViewGroup container = null;
374b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                            if (f.mContainerId != 0) {
375b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                                container = (ViewGroup)mActivity.findViewById(f.mContainerId);
376b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                                if (container == null) {
377b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                                    throw new IllegalArgumentException("New view found for id 0x"
378b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                                            + Integer.toHexString(f.mContainerId)
379b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                                            + " for fragment " + f);
380b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                                }
381b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                            }
382b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                            f.mContainer = container;
383b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                            f.mView = f.onCreateView(mActivity.getLayoutInflater(),
384b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                                    container, f.mSavedFragmentState);
385b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                            if (f.mView != null) {
386b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                                f.mView.setSaveFromParentEnabled(false);
387b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                                if (container != null) {
388b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                                    Animation anim = loadAnimation(f, transit, true,
389b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                                            transitionStyle);
390b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                                    if (anim != null) {
391b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                                        f.mView.setAnimation(anim);
392b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                                    }
393b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                                    container.addView(f.mView);
394b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                                    f.restoreViewState();
395b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                                }
396b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                            }
397b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                        }
398b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
399b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                        f.mCalled = false;
400b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                        f.onReady(f.mSavedFragmentState);
401b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                        if (!f.mCalled) {
402b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                            throw new SuperNotCalledException("Fragment " + f
403b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                                    + " did not call through to super.onReady()");
404f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                        }
405b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                        f.mSavedFragmentState = null;
4062dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                    }
4072dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                case Fragment.CREATED:
4082dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                    if (newState > Fragment.CREATED) {
4092dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                        f.mCalled = false;
4102dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                        f.onStart();
4112dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                        if (!f.mCalled) {
4122dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                            throw new SuperNotCalledException("Fragment " + f
4132dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                                    + " did not call through to super.onStart()");
4142dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                        }
4152dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                    }
4162dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                case Fragment.STARTED:
4172dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                    if (newState > Fragment.STARTED) {
4182dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                        f.mCalled = false;
4192dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                        f.onResume();
4202dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                        if (!f.mCalled) {
4212dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                            throw new SuperNotCalledException("Fragment " + f
4222dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                                    + " did not call through to super.onResume()");
4232dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                        }
4242dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                    }
4252dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn            }
4262dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn        } else if (f.mState > newState) {
4272dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn            switch (f.mState) {
4282dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                case Fragment.RESUMED:
4292dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                    if (newState < Fragment.RESUMED) {
4302dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                        f.mCalled = false;
4312dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                        f.onPause();
4322dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                        if (!f.mCalled) {
4332dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                            throw new SuperNotCalledException("Fragment " + f
4342dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                                    + " did not call through to super.onPause()");
4352dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                        }
4362dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                    }
4372dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                case Fragment.STARTED:
4382dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                    if (newState < Fragment.STARTED) {
4392dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                        f.mCalled = false;
4402dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                        f.onStop();
4412dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                        if (!f.mCalled) {
4422dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                            throw new SuperNotCalledException("Fragment " + f
4432dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                                    + " did not call through to super.onStop()");
4442dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                        }
4452dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                    }
446b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                case Fragment.CONTENT:
447b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                    if (newState < Fragment.CONTENT) {
448b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                        if (f.mView != null) {
449b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                            // Need to save the current view state if not
450b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                            // done already.
451b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                            if (!mActivity.isFinishing()) {
452b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                                saveFragmentViewState(f);
453b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                            }
454b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                            if (f.mContainer != null) {
455b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                                if (mCurState > Fragment.INITIALIZING) {
456b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                                    Animation anim = loadAnimation(f, transit, false,
457b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                                            transitionStyle);
458b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                                    if (anim != null) {
459b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                                        f.mView.setAnimation(anim);
460b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                                    }
461b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                                }
462b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                                f.mContainer.removeView(f.mView);
463f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                            }
4642dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                        }
4652dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                        f.mContainer = null;
4662dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                        f.mView = null;
467b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                    }
468b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                case Fragment.CREATED:
469b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                    if (newState < Fragment.CREATED) {
470b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                        if (!f.mRetaining) {
471b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                            f.mCalled = false;
472b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                            f.onDestroy();
473b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                            if (!f.mCalled) {
474b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                                throw new SuperNotCalledException("Fragment " + f
475b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                                        + " did not call through to super.onDestroy()");
476b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                            }
4772dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                        }
478b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
4792dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                        f.mCalled = false;
4802dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                        f.onDetach();
4812dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                        if (!f.mCalled) {
4822dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                            throw new SuperNotCalledException("Fragment " + f
4832dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                                    + " did not call through to super.onDetach()");
4842dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                        }
4852dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                        f.mActivity = null;
4862dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                    }
4872dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn            }
4882dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn        }
4892dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn
4902dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn        f.mState = newState;
4912dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    }
4922dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn
493ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn    void moveToState(int newState, boolean always) {
494f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn        moveToState(newState, 0, 0, always);
495f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn    }
496f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn
497f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn    void moveToState(int newState, int transit, int transitStyle, boolean always) {
4982dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn        if (mActivity == null && newState != Fragment.INITIALIZING) {
4992dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn            throw new IllegalStateException("No activity");
5002dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn        }
5012dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn
502ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn        if (!always && mCurState == newState) {
503ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn            return;
504ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn        }
505ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn
5062dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn        mCurState = newState;
507ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn        if (mFragments != null) {
508ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn            for (int i=0; i<mFragments.size(); i++) {
509ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn                Fragment f = mFragments.get(i);
510f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                moveToState(f, newState, transit, transitStyle);
511ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn            }
5122dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn        }
5132dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    }
5142dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn
515ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn    public void addFragment(Fragment fragment, boolean moveToStateNow) {
516ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn        if (mFragments == null) {
517ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn            mFragments = new ArrayList<Fragment>();
518ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn        }
5192dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn        mFragments.add(fragment);
520ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn        if (moveToStateNow) {
521f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            moveToState(fragment, mCurState, 0, 0);
522ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn        }
5232dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    }
5242dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn
525f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn    public void removeFragment(Fragment fragment, int transition, int transitionStyle) {
5262dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn        mFragments.remove(fragment);
527f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn        moveToState(fragment, Fragment.INITIALIZING, transition, transitionStyle);
528f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn    }
529f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn
530f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn    public Fragment findFragmentById(int id) {
531f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn        if (mFragments != null) {
532f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            for (int i=mFragments.size()-1; i>=0; i--) {
533f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                Fragment f = mFragments.get(i);
534b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                if (f.mFragmentId == id) {
535b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                    return f;
536b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                }
537b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            }
538b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        }
539b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        return null;
540b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    }
541b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
542b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    public Fragment findFragmentByTag(String tag) {
543b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        if (mFragments != null && tag != null) {
544b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            for (int i=mFragments.size()-1; i>=0; i--) {
545b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                Fragment f = mFragments.get(i);
546b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                if (tag.equals(f.mTag)) {
547f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                    return f;
548f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                }
549f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            }
550f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn        }
551f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn        return null;
5522dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    }
5532dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn
554b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    public void addBackStackState(BackStackEntry state) {
555ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn        if (mBackStack == null) {
556b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            mBackStack = new ArrayList<BackStackEntry>();
557ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn        }
558ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn        mBackStack.add(state);
559ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn    }
560ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn
561f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn    public boolean popBackStackState(Handler handler, String name) {
562ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn        if (mBackStack == null) {
563ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn            return false;
564ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn        }
565f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn        if (name == null) {
566f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            int last = mBackStack.size()-1;
567f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            if (last < 0) {
568f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                return false;
569f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            }
570b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            final BackStackEntry bss = mBackStack.remove(last);
571f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            handler.post(new Runnable() {
572f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                public void run() {
573f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                    bss.popFromBackStack();
574f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                    moveToState(mCurState, reverseTransit(bss.getTransition()),
575f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                            bss.getTransitionStyle(), true);
576f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                }
577f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            });
578f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn        } else {
579f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            int index = mBackStack.size()-1;
580f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            while (index >= 0) {
581b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                BackStackEntry bss = mBackStack.get(index);
582f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                if (name.equals(bss.getName())) {
583f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                    break;
584f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                }
585f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            }
586f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            if (index < 0 || index == mBackStack.size()-1) {
587f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                return false;
588f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            }
589b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            final ArrayList<BackStackEntry> states
590b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                    = new ArrayList<BackStackEntry>();
591f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            for (int i=mBackStack.size()-1; i>index; i--) {
592f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                states.add(mBackStack.remove(i));
593ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn            }
594f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            handler.post(new Runnable() {
595f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                public void run() {
596f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                    for (int i=0; i<states.size(); i++) {
597f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                        states.get(i).popFromBackStack();
598f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                    }
599f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                    moveToState(mCurState, true);
600f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                }
601f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            });
602f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn        }
603ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn        return true;
604ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn    }
605ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn
606b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    ArrayList<Fragment> retainNonConfig() {
607b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        ArrayList<Fragment> fragments = null;
608b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        if (mFragments != null) {
609b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            for (int i=0; i<mFragments.size(); i++) {
610b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                Fragment f = mFragments.get(i);
611b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                if (f.mBackStackNesting <= 0 && f.mRetainInstance && f.mTag != null) {
612b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                    if (fragments == null) {
613b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                        fragments = new ArrayList<Fragment>();
614b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                    }
615b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                    fragments.add(f);
616b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                    f.mRetaining = true;
617b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                }
618b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            }
619b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        }
620b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        return fragments;
621b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    }
622b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
623b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    void saveFragmentViewState(Fragment f) {
624b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        if (f.mSavedViewState != null) {
625b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            return;
626b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        }
627b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        if (mStateArray == null) {
628b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            mStateArray = new SparseArray<Parcelable>();
629b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        }
630b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        f.mView.saveHierarchyState(mStateArray);
631b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        if (mStateArray.size() > 0) {
632b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            f.mSavedViewState = mStateArray;
633b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            mStateArray = null;
634b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        }
635b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    }
636b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
637b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    FragmentState saveFragment(Fragment f) {
638b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        if (mSavedFragments != null) {
639b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            FragmentState fs = mSavedFragments.get(f);
640b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            if (fs != null) {
641b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                return fs;
642b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            }
643b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        } else {
644b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            mSavedFragments = new HashMap<Fragment, FragmentState>();
645b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        }
646b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
647b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        f.mSavedStateSeq = mSaveStateSeq;
648b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        f.mSavedStateId = ++mCurSaveId;
649b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
650b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        FragmentState fs = new FragmentState(f);
651b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        mSavedFragments.put(f, fs);
652b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
653b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        if (mStateBundle == null) {
654b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            mStateBundle = new Bundle();
655b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        }
656b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        f.onSaveInstanceState(mStateBundle);
657b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        if (!mStateBundle.isEmpty()) {
658b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            fs.mSavedFragmentState = mStateBundle;
659b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            mStateBundle = null;
660b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        }
661b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
662b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        if (f.mView != null) {
663b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            saveFragmentViewState(f);
664b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            if (f.mSavedViewState != null) {
665b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                if (fs.mSavedFragmentState == null) {
666b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                    fs.mSavedFragmentState = new Bundle();
667b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                }
668b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                fs.mSavedFragmentState.putSparseParcelableArray(
669b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                        FragmentState.VIEW_STATE_TAG, f.mSavedViewState);
670b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            }
671b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        }
672b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
673b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        return fs;
674b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    }
675b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
676b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    Parcelable saveAllState() {
677b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        mSavedFragments = null;
678b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        mSaveStateSeq++;
679b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
680b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        if (mFragments == null) {
681b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            return null;
682b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        }
683b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
684b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        int[] added = null;
685b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        BackStackState[] backStack = null;
686b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
687b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        // First collect all active fragments.
688b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        int N = mFragments.size();
689b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        if (N > 0) {
690b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            added = new int[N];
691b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            for (int i=0; i<N; i++) {
692b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                added[i] = saveFragment(mFragments.get(i)).mSavedStateId;
693b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            }
694b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        }
695b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
696b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        // Now save back stack.
697b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        if (mBackStack != null) {
698b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            N = mBackStack.size();
699b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            if (N > 0) {
700b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                backStack = new BackStackState[N];
701b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                for (int i=0; i<N; i++) {
702b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                    backStack[i] = new BackStackState(this, mBackStack.get(i));
703b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                }
704b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            }
705b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        }
706b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
707b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        if (mSavedFragments == null) {
708b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            return null;
709b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        }
710b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        N = mSavedFragments.size();
711b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        if (N <= 0) {
712b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            return null;
713b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        }
714b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
715b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        FragmentManagerState fms = new FragmentManagerState();
716b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        fms.mFragments = new FragmentState[N];
717b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        int i = 0;
718b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        for (FragmentState fs : mSavedFragments.values()) {
719b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            fms.mFragments[i] = fs;
720b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            i++;
721b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        }
722b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        fms.mAdded = added;
723b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        fms.mBackStack = backStack;
724b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        return fms;
725b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    }
726b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
727b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    void restoreAllState(Parcelable state, ArrayList<Fragment> nonConfig) {
728b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        // If there is no saved state at all, then there can not be
729b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        // any nonConfig fragments either, so that is that.
730b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        if (state == null) return;
731b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        FragmentManagerState fms = (FragmentManagerState)state;
732b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        if (fms.mFragments == null) return;
733b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
734b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        // First build our lookup table of all known Fragment objects.
735b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        mRestoredFragments = new SparseArray<FragmentState>();
736b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        for (int i=0; i<fms.mFragments.length; i++) {
737b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            FragmentState fs = fms.mFragments[i];
738b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            mRestoredFragments.put(fs.mSavedStateId, fs);
739b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        }
740b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
741b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        // Stick any non-config instances we are retaining directly
742b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        // into the lookup table, so we don't try to instantiate them again.
743b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        if (nonConfig != null) {
744b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            for (int i=0; i<nonConfig.size(); i++) {
745b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                Fragment f = nonConfig.get(i);
746b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                FragmentState fs = mRestoredFragments.get(f.mSavedStateId);
747b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                fs.mInstance = f;
748b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                f.mSavedViewState = null;
749b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                if (fs.mSavedFragmentState != null) {
750b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                    f.mSavedViewState = fs.mSavedFragmentState.getSparseParcelableArray(
751b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                            FragmentState.VIEW_STATE_TAG);
752b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                }
753b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                addFragment(f, false);
754b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            }
755b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        }
756b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
757b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        // Now build our data structures from the saved state, instantiating
758b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        // the fragment objects as needed.
759b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        if (fms.mAdded != null) {
760b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            if (mFragments == null) {
761b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                mFragments = new ArrayList<Fragment>(fms.mAdded.length);
762b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            }
763b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            for (int i=0; i<fms.mAdded.length; i++) {
764b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                FragmentState fs = mRestoredFragments.get(fms.mAdded[i]);
765b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                Fragment f = fs.instantiate(mActivity);
766b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                // This will return null if this is a layout fragment,
767b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                // since the instance for such a fragment will be created
768b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                // later during layout inflation.
769b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                if (f != null) {
770b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                    mFragments.add(f);
771b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                }
772b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            }
773b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        }
774b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        if (fms.mBackStack != null) {
775b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            mBackStack = new ArrayList<BackStackEntry>(fms.mBackStack.length);
776b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            for (int i=0; i<fms.mBackStack.length; i++) {
777b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                BackStackEntry bse = fms.mBackStack[i].instantiate(this);
778b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                mBackStack.add(bse);
779b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            }
780b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        }
781b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    }
782b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
7832dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    public void attachActivity(Activity activity) {
7842dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn        if (mActivity != null) throw new IllegalStateException();
7852dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn        mActivity = activity;
7862dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    }
7872dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn
788b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    public void dispatchCreate() {
789ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn        moveToState(Fragment.CREATED, false);
7902dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    }
7912dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn
7922dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    public void dispatchStart() {
793ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn        moveToState(Fragment.STARTED, false);
7942dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    }
7952dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn
7962dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    public void dispatchResume() {
797ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn        moveToState(Fragment.RESUMED, false);
7982dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    }
7992dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn
8002dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    public void dispatchPause() {
801ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn        moveToState(Fragment.STARTED, false);
8022dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    }
8032dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn
8042dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    public void dispatchStop() {
805ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn        moveToState(Fragment.CREATED, false);
8062dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    }
8072dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn
8082dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    public void dispatchDestroy() {
809ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn        moveToState(Fragment.INITIALIZING, false);
8102dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn        mActivity = null;
8112dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    }
812f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn
813f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn    public static int reverseTransit(int transit) {
814f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn        int rev = 0;
815f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn        switch (transit) {
816f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            case FragmentTransaction.TRANSIT_ENTER:
817f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                rev = FragmentTransaction.TRANSIT_EXIT;
818f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                break;
819f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            case FragmentTransaction.TRANSIT_EXIT:
820f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                rev = FragmentTransaction.TRANSIT_ENTER;
821f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                break;
822f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            case FragmentTransaction.TRANSIT_SHOW:
823f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                rev = FragmentTransaction.TRANSIT_HIDE;
824f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                break;
825f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            case FragmentTransaction.TRANSIT_HIDE:
826f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                rev = FragmentTransaction.TRANSIT_SHOW;
827f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                break;
828f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            case FragmentTransaction.TRANSIT_ACTIVITY_OPEN:
829f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                rev = FragmentTransaction.TRANSIT_ACTIVITY_CLOSE;
830f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                break;
831f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            case FragmentTransaction.TRANSIT_ACTIVITY_CLOSE:
832f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                rev = FragmentTransaction.TRANSIT_ACTIVITY_OPEN;
833f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                break;
834f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            case FragmentTransaction.TRANSIT_TASK_OPEN:
835f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                rev = FragmentTransaction.TRANSIT_TASK_CLOSE;
836f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                break;
837f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            case FragmentTransaction.TRANSIT_TASK_CLOSE:
838f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                rev = FragmentTransaction.TRANSIT_TASK_OPEN;
839f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                break;
840f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            case FragmentTransaction.TRANSIT_TASK_TO_FRONT:
841f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                rev = FragmentTransaction.TRANSIT_TASK_TO_BACK;
842f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                break;
843f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            case FragmentTransaction.TRANSIT_TASK_TO_BACK:
844f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                rev = FragmentTransaction.TRANSIT_TASK_TO_FRONT;
845f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                break;
846f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            case FragmentTransaction.TRANSIT_WALLPAPER_OPEN:
847f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                rev = FragmentTransaction.TRANSIT_WALLPAPER_CLOSE;
848f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                break;
849f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            case FragmentTransaction.TRANSIT_WALLPAPER_CLOSE:
850f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                rev = FragmentTransaction.TRANSIT_WALLPAPER_OPEN;
851f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                break;
852f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            case FragmentTransaction.TRANSIT_WALLPAPER_INTRA_OPEN:
853f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                rev = FragmentTransaction.TRANSIT_WALLPAPER_INTRA_CLOSE;
854f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                break;
855f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            case FragmentTransaction.TRANSIT_WALLPAPER_INTRA_CLOSE:
856f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                rev = FragmentTransaction.TRANSIT_WALLPAPER_INTRA_OPEN;
857f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                break;
858f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn        }
859f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn        return rev;
860f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn
861f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn    }
862f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn
863f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn    public static int transitToStyleIndex(int transit, boolean enter) {
864f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn        int animAttr = -1;
865f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn        switch (transit) {
866f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            case FragmentTransaction.TRANSIT_ENTER:
867f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                animAttr = com.android.internal.R.styleable.WindowAnimation_windowEnterAnimation;
868f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                break;
869f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            case FragmentTransaction.TRANSIT_EXIT:
870f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                animAttr = com.android.internal.R.styleable.WindowAnimation_windowExitAnimation;
871f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                break;
872f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            case FragmentTransaction.TRANSIT_SHOW:
873f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                animAttr = com.android.internal.R.styleable.WindowAnimation_windowShowAnimation;
874f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                break;
875f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            case FragmentTransaction.TRANSIT_HIDE:
876f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                animAttr = com.android.internal.R.styleable.WindowAnimation_windowHideAnimation;
877f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                break;
878f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            case FragmentTransaction.TRANSIT_ACTIVITY_OPEN:
879f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                animAttr = enter
880f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                        ? com.android.internal.R.styleable.WindowAnimation_activityOpenEnterAnimation
881f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                        : com.android.internal.R.styleable.WindowAnimation_activityOpenExitAnimation;
882f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                break;
883f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            case FragmentTransaction.TRANSIT_ACTIVITY_CLOSE:
884f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                animAttr = enter
885f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                        ? com.android.internal.R.styleable.WindowAnimation_activityCloseEnterAnimation
886f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                        : com.android.internal.R.styleable.WindowAnimation_activityCloseExitAnimation;
887f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                break;
888f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            case FragmentTransaction.TRANSIT_TASK_OPEN:
889f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                animAttr = enter
890f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                        ? com.android.internal.R.styleable.WindowAnimation_taskOpenEnterAnimation
891f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                        : com.android.internal.R.styleable.WindowAnimation_taskOpenExitAnimation;
892f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                break;
893f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            case FragmentTransaction.TRANSIT_TASK_CLOSE:
894f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                animAttr = enter
895f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                        ? com.android.internal.R.styleable.WindowAnimation_taskCloseEnterAnimation
896f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                        : com.android.internal.R.styleable.WindowAnimation_taskCloseExitAnimation;
897f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                break;
898f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            case FragmentTransaction.TRANSIT_TASK_TO_FRONT:
899f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                animAttr = enter
900f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                        ? com.android.internal.R.styleable.WindowAnimation_taskToFrontEnterAnimation
901f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                        : com.android.internal.R.styleable.WindowAnimation_taskToFrontExitAnimation;
902f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                break;
903f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            case FragmentTransaction.TRANSIT_TASK_TO_BACK:
904f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                animAttr = enter
905f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                        ? com.android.internal.R.styleable.WindowAnimation_taskToBackEnterAnimation
906f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                        : com.android.internal.R.styleable.WindowAnimation_taskToBackExitAnimation;
907f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                break;
908f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            case FragmentTransaction.TRANSIT_WALLPAPER_OPEN:
909f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                animAttr = enter
910f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                        ? com.android.internal.R.styleable.WindowAnimation_wallpaperOpenEnterAnimation
911f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                        : com.android.internal.R.styleable.WindowAnimation_wallpaperOpenExitAnimation;
912f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                break;
913f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            case FragmentTransaction.TRANSIT_WALLPAPER_CLOSE:
914f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                animAttr = enter
915f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                        ? com.android.internal.R.styleable.WindowAnimation_wallpaperCloseEnterAnimation
916f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                        : com.android.internal.R.styleable.WindowAnimation_wallpaperCloseExitAnimation;
917f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                break;
918f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            case FragmentTransaction.TRANSIT_WALLPAPER_INTRA_OPEN:
919f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                animAttr = enter
920f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                        ? com.android.internal.R.styleable.WindowAnimation_wallpaperIntraOpenEnterAnimation
921f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                        : com.android.internal.R.styleable.WindowAnimation_wallpaperIntraOpenExitAnimation;
922f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                break;
923f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            case FragmentTransaction.TRANSIT_WALLPAPER_INTRA_CLOSE:
924f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                animAttr = enter
925f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                        ? com.android.internal.R.styleable.WindowAnimation_wallpaperIntraCloseEnterAnimation
926f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                        : com.android.internal.R.styleable.WindowAnimation_wallpaperIntraCloseExitAnimation;
927f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                break;
928f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn        }
929f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn        return animAttr;
930f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn    }
9312dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn}
932