FragmentManager.java revision fb3cffeb35368da22f99b85d45039c4e6e471c06
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
19a18a86b43e40e3c15dcca0ae0148d641be9b25feChet Haaseimport android.animation.Animator;
20a18a86b43e40e3c15dcca0ae0148d641be9b25feChet Haaseimport android.animation.AnimatorInflater;
21b20db3ec34e846010f389880b2cfab4d7bf79820Chet Haaseimport android.animation.AnimatorListenerAdapter;
22f121be737c59390d97e21a92be8e166001534c7dDianne Hackbornimport android.content.res.TypedArray;
232dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackbornimport android.os.Bundle;
24ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackbornimport android.os.Handler;
25b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackbornimport android.os.Parcel;
26b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackbornimport android.os.Parcelable;
275ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackbornimport android.util.Log;
28b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackbornimport android.util.SparseArray;
29b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackbornimport android.view.Menu;
30b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackbornimport android.view.MenuInflater;
31b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackbornimport android.view.MenuItem;
325ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackbornimport android.view.View;
332dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackbornimport android.view.ViewGroup;
342dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn
35625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackbornimport java.io.FileDescriptor;
36625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackbornimport java.io.PrintWriter;
372dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackbornimport java.util.ArrayList;
382dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn
39b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn/**
40b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * Interface for interacting with {@link Fragment} objects inside of an
41b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * {@link Activity}
42b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn */
43b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackbornpublic interface FragmentManager {
44b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn    /**
45c6669ca63299219d815464129dac051ab2404286Dianne Hackborn     * Representation of an entry on the fragment back stack, as created
46c6669ca63299219d815464129dac051ab2404286Dianne Hackborn     * with {@link FragmentTransaction#addToBackStack(String)
47c6669ca63299219d815464129dac051ab2404286Dianne Hackborn     * FragmentTransaction.addToBackStack()}.  Entries can later be
48c6669ca63299219d815464129dac051ab2404286Dianne Hackborn     * retrieved with {@link FragmentManager#getBackStackEntry(int)
49c6669ca63299219d815464129dac051ab2404286Dianne Hackborn     * FragmentManager.getBackStackEntry()}.
50c6669ca63299219d815464129dac051ab2404286Dianne Hackborn     *
51c6669ca63299219d815464129dac051ab2404286Dianne Hackborn     * <p>Note that you should never hold on to a BackStackEntry object;
52c6669ca63299219d815464129dac051ab2404286Dianne Hackborn     * the identifier as returned by {@link #getId} is the only thing that
53c6669ca63299219d815464129dac051ab2404286Dianne Hackborn     * will be persisted across activity instances.
54c6669ca63299219d815464129dac051ab2404286Dianne Hackborn     */
55c6669ca63299219d815464129dac051ab2404286Dianne Hackborn    public interface BackStackEntry {
56c6669ca63299219d815464129dac051ab2404286Dianne Hackborn        /**
57c6669ca63299219d815464129dac051ab2404286Dianne Hackborn         * Return the unique identifier for the entry.  This is the only
58c6669ca63299219d815464129dac051ab2404286Dianne Hackborn         * representation of the entry that will persist across activity
59c6669ca63299219d815464129dac051ab2404286Dianne Hackborn         * instances.
60c6669ca63299219d815464129dac051ab2404286Dianne Hackborn         */
61c6669ca63299219d815464129dac051ab2404286Dianne Hackborn        public int getId();
62c6669ca63299219d815464129dac051ab2404286Dianne Hackborn
63c6669ca63299219d815464129dac051ab2404286Dianne Hackborn        /**
64c6669ca63299219d815464129dac051ab2404286Dianne Hackborn         * Return the full bread crumb title for the entry, or null if it
65c6669ca63299219d815464129dac051ab2404286Dianne Hackborn         * does not have one.
66c6669ca63299219d815464129dac051ab2404286Dianne Hackborn         */
67c6669ca63299219d815464129dac051ab2404286Dianne Hackborn        public CharSequence getBreadCrumbTitle();
68c6669ca63299219d815464129dac051ab2404286Dianne Hackborn
69c6669ca63299219d815464129dac051ab2404286Dianne Hackborn        /**
70c6669ca63299219d815464129dac051ab2404286Dianne Hackborn         * Return the short bread crumb title for the entry, or null if it
71c6669ca63299219d815464129dac051ab2404286Dianne Hackborn         * does not have one.
72c6669ca63299219d815464129dac051ab2404286Dianne Hackborn         */
73c6669ca63299219d815464129dac051ab2404286Dianne Hackborn        public CharSequence getBreadCrumbShortTitle();
74c6669ca63299219d815464129dac051ab2404286Dianne Hackborn    }
75c6669ca63299219d815464129dac051ab2404286Dianne Hackborn
76c6669ca63299219d815464129dac051ab2404286Dianne Hackborn    /**
77c6669ca63299219d815464129dac051ab2404286Dianne Hackborn     * Interface to watch for changes to the back stack.
78c6669ca63299219d815464129dac051ab2404286Dianne Hackborn     */
79c6669ca63299219d815464129dac051ab2404286Dianne Hackborn    public interface OnBackStackChangedListener {
80c6669ca63299219d815464129dac051ab2404286Dianne Hackborn        /**
81c6669ca63299219d815464129dac051ab2404286Dianne Hackborn         * Called whenever the contents of the back stack change.
82c6669ca63299219d815464129dac051ab2404286Dianne Hackborn         */
83c6669ca63299219d815464129dac051ab2404286Dianne Hackborn        public void onBackStackChanged();
84c6669ca63299219d815464129dac051ab2404286Dianne Hackborn    }
85c6669ca63299219d815464129dac051ab2404286Dianne Hackborn
86c6669ca63299219d815464129dac051ab2404286Dianne Hackborn    /**
87b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn     * Start a series of edit operations on the Fragments associated with
88b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn     * this FragmentManager.
89fb3cffeb35368da22f99b85d45039c4e6e471c06Dianne Hackborn     *
90fb3cffeb35368da22f99b85d45039c4e6e471c06Dianne Hackborn     * <p>Note: A fragment transaction can only be created/committed prior
91fb3cffeb35368da22f99b85d45039c4e6e471c06Dianne Hackborn     * to an activity saving its state.  If you try to commit a transaction
92fb3cffeb35368da22f99b85d45039c4e6e471c06Dianne Hackborn     * after {@link Activity#onSaveInstanceState Activity.onSaveInstanceState()}
93fb3cffeb35368da22f99b85d45039c4e6e471c06Dianne Hackborn     * (and prior to a following {@link Activity#onStart Activity.onStart}
94fb3cffeb35368da22f99b85d45039c4e6e471c06Dianne Hackborn     * or {@link Activity#onResume Activity.onResume()}, you will get an error.
95fb3cffeb35368da22f99b85d45039c4e6e471c06Dianne Hackborn     * This is because the framework takes care of saving your current fragments
96fb3cffeb35368da22f99b85d45039c4e6e471c06Dianne Hackborn     * in the state, and if changes are made after the state is saved then they
97fb3cffeb35368da22f99b85d45039c4e6e471c06Dianne Hackborn     * will be lost.</p>
98b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn     */
99b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn    public FragmentTransaction openTransaction();
100b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn
101b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn    /**
102b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn     * Finds a fragment that was identified by the given id either when inflated
103b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn     * from XML or as the container ID when added in a transaction.  This first
104b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn     * searches through fragments that are currently added to the manager's
105b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn     * activity; if no such fragment is found, then all fragments currently
106b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn     * on the back stack associated with this ID are searched.
107b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn     * @return The fragment if found or null otherwise.
108b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn     */
109b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn    public Fragment findFragmentById(int id);
110b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn
111b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn    /**
112b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn     * Finds a fragment that was identified by the given tag either when inflated
113b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn     * from XML or as supplied when added in a transaction.  This first
114b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn     * searches through fragments that are currently added to the manager's
115b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn     * activity; if no such fragment is found, then all fragments currently
116b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn     * on the back stack are searched.
117b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn     * @return The fragment if found or null otherwise.
118b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn     */
119b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn    public Fragment findFragmentByTag(String tag);
120b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn
121b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn    /**
122b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn     * Flag for {@link #popBackStack(String, int)}
123b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn     * and {@link #popBackStack(int, int)}: If set, and the name or ID of
124b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn     * a back stack entry has been supplied, then all matching entries will
125b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn     * be consumed until one that doesn't match is found or the bottom of
126b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn     * the stack is reached.  Otherwise, all entries up to but not including that entry
127b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn     * will be removed.
128b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn     */
129b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn    public static final int POP_BACK_STACK_INCLUSIVE = 1<<0;
130b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn
131b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn    /**
132b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn     * Pop the top state off the back stack.  Returns true if there was one
133b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn     * to pop, else false.
134b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn     */
135b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn    public boolean popBackStack();
136b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn
137b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn    /**
138b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn     * Pop the last fragment transition from the manager's fragment
139b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn     * back stack.  If there is nothing to pop, false is returned.
140b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn     * @param name If non-null, this is the name of a previous back state
141b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn     * to look for; if found, all states up to that state will be popped.  The
142b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn     * {@link #POP_BACK_STACK_INCLUSIVE} flag can be used to control whether
143b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn     * the named state itself is popped. If null, only the top state is popped.
144b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn     * @param flags Either 0 or {@link #POP_BACK_STACK_INCLUSIVE}.
145b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn     */
146b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn    public boolean popBackStack(String name, int flags);
147b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn
148b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn    /**
149b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn     * Pop all back stack states up to the one with the given identifier.
150b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn     * @param id Identifier of the stated to be popped. If no identifier exists,
151b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn     * false is returned.
152b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn     * The identifier is the number returned by
153b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn     * {@link FragmentTransaction#commit() FragmentTransaction.commit()}.  The
154b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn     * {@link #POP_BACK_STACK_INCLUSIVE} flag can be used to control whether
155b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn     * the named state itself is popped.
156b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn     * @param flags Either 0 or {@link #POP_BACK_STACK_INCLUSIVE}.
157b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn     */
158b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn    public boolean popBackStack(int id, int flags);
159b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn
160b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn    /**
161c6669ca63299219d815464129dac051ab2404286Dianne Hackborn     * Return the number of entries currently in the back stack.
162c6669ca63299219d815464129dac051ab2404286Dianne Hackborn     */
163c6669ca63299219d815464129dac051ab2404286Dianne Hackborn    public int countBackStackEntries();
164c6669ca63299219d815464129dac051ab2404286Dianne Hackborn
165c6669ca63299219d815464129dac051ab2404286Dianne Hackborn    /**
166c6669ca63299219d815464129dac051ab2404286Dianne Hackborn     * Return the BackStackEntry at index <var>index</var> in the back stack;
167c6669ca63299219d815464129dac051ab2404286Dianne Hackborn     * entries start index 0 being the bottom of the stack.
168c6669ca63299219d815464129dac051ab2404286Dianne Hackborn     */
169c6669ca63299219d815464129dac051ab2404286Dianne Hackborn    public BackStackEntry getBackStackEntry(int index);
170c6669ca63299219d815464129dac051ab2404286Dianne Hackborn
171c6669ca63299219d815464129dac051ab2404286Dianne Hackborn    /**
172c6669ca63299219d815464129dac051ab2404286Dianne Hackborn     * Add a new listener for changes to the fragment back stack.
173c6669ca63299219d815464129dac051ab2404286Dianne Hackborn     */
174c6669ca63299219d815464129dac051ab2404286Dianne Hackborn    public void addOnBackStackChangedListener(OnBackStackChangedListener listener);
175c6669ca63299219d815464129dac051ab2404286Dianne Hackborn
176c6669ca63299219d815464129dac051ab2404286Dianne Hackborn    /**
177c6669ca63299219d815464129dac051ab2404286Dianne Hackborn     * Remove a listener that was previously added with
178c6669ca63299219d815464129dac051ab2404286Dianne Hackborn     * {@link #addOnBackStackChangedListener(OnBackStackChangedListener)}.
179c6669ca63299219d815464129dac051ab2404286Dianne Hackborn     */
180c6669ca63299219d815464129dac051ab2404286Dianne Hackborn    public void removeOnBackStackChangedListener(OnBackStackChangedListener listener);
181c6669ca63299219d815464129dac051ab2404286Dianne Hackborn
182c6669ca63299219d815464129dac051ab2404286Dianne Hackborn    /**
183b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn     * Put a reference to a fragment in a Bundle.  This Bundle can be
184b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn     * persisted as saved state, and when later restoring
185b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn     * {@link #getFragment(Bundle, String)} will return the current
186b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn     * instance of the same fragment.
187b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn     *
188b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn     * @param bundle The bundle in which to put the fragment reference.
189b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn     * @param key The name of the entry in the bundle.
190b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn     * @param fragment The Fragment whose reference is to be stored.
191b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn     */
192b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn    public void putFragment(Bundle bundle, String key, Fragment fragment);
193b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn
194b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn    /**
195b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn     * Retrieve the current Fragment instance for a reference previously
196b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn     * placed with {@link #putFragment(Bundle, String, Fragment)}.
197b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn     *
198b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn     * @param bundle The bundle from which to retrieve the fragment reference.
199b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn     * @param key The name of the entry in the bundle.
200b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn     * @return Returns the current Fragment instance that is associated with
201b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn     * the given reference.
202b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn     */
203b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn    public Fragment getFragment(Bundle bundle, String key);
204625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn
205625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn    /**
206625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn     * Print the FragmentManager's state into the given stream.
207625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn     *
208625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn     * @param prefix Text to print at the front of each line.
209625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn     * @param fd The raw file descriptor that the dump is being sent to.
210625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn     * @param writer A PrintWriter to which the dump is to be set.
211625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn     * @param args additional arguments to the dump request.
212625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn     */
213625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn    public void dump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args);
214b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn}
215b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn
216b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackbornfinal class FragmentManagerState implements Parcelable {
2176e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn    FragmentState[] mActive;
218b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    int[] mAdded;
219b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    BackStackState[] mBackStack;
220b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
221b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    public FragmentManagerState() {
222b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    }
223b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
224b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    public FragmentManagerState(Parcel in) {
2256e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        mActive = in.createTypedArray(FragmentState.CREATOR);
226b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        mAdded = in.createIntArray();
227b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        mBackStack = in.createTypedArray(BackStackState.CREATOR);
228b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    }
229b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
230b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    public int describeContents() {
231b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        return 0;
232b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    }
233b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
234b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    public void writeToParcel(Parcel dest, int flags) {
2356e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        dest.writeTypedArray(mActive, flags);
236b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        dest.writeIntArray(mAdded);
237b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        dest.writeTypedArray(mBackStack, flags);
238b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    }
239b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
240b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    public static final Parcelable.Creator<FragmentManagerState> CREATOR
241b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            = new Parcelable.Creator<FragmentManagerState>() {
242b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        public FragmentManagerState createFromParcel(Parcel in) {
243b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            return new FragmentManagerState(in);
244b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        }
245b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
246b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        public FragmentManagerState[] newArray(int size) {
247b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            return new FragmentManagerState[size];
248b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        }
249b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    };
250ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn}
251ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn
2522dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn/**
2532dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn * Container for fragments associated with an activity.
2542dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn */
255def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackbornfinal class FragmentManagerImpl implements FragmentManager {
2565ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn    static final boolean DEBUG = true;
2575ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn    static final String TAG = "FragmentManager";
2585ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn
259def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn    static final String TARGET_REQUEST_CODE_STATE_TAG = "android:target_req_state";
260def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn    static final String TARGET_STATE_TAG = "android:target_state";
261def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn    static final String VIEW_STATE_TAG = "android:view_state";
262def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn
263445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn    ArrayList<Runnable> mPendingActions;
264445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn    Runnable[] mTmpActions;
265445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn    boolean mExecutingActions;
266445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn
2676e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn    ArrayList<Fragment> mActive;
2686e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn    ArrayList<Fragment> mAdded;
2696e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn    ArrayList<Integer> mAvailIndices;
270c6669ca63299219d815464129dac051ab2404286Dianne Hackborn    ArrayList<BackStackRecord> mBackStack;
2712dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn
272dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    // Must be accessed while locked.
273c6669ca63299219d815464129dac051ab2404286Dianne Hackborn    ArrayList<BackStackRecord> mBackStackIndices;
274dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    ArrayList<Integer> mAvailBackStackIndices;
275dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn
276c6669ca63299219d815464129dac051ab2404286Dianne Hackborn    ArrayList<OnBackStackChangedListener> mBackStackChangeListeners;
277c6669ca63299219d815464129dac051ab2404286Dianne Hackborn
2782dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    int mCurState = Fragment.INITIALIZING;
2792dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    Activity mActivity;
2802dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn
281b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn    boolean mNeedMenuInvalidate;
2823e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn    boolean mStateSaved;
283fb3cffeb35368da22f99b85d45039c4e6e471c06Dianne Hackborn    String mNoTransactionsBecause;
284b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn
285b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    // Temporary vars for state save and restore.
286b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    Bundle mStateBundle = null;
287b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    SparseArray<Parcelable> mStateArray = null;
288b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
289445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn    Runnable mExecCommit = new Runnable() {
290445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn        @Override
291445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn        public void run() {
292445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn            execPendingActions();
293445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn        }
294445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn    };
295625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn
296625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn    @Override
297b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn    public FragmentTransaction openTransaction() {
298c6669ca63299219d815464129dac051ab2404286Dianne Hackborn        return new BackStackRecord(this);
299b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn    }
300b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn
301625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn    @Override
302b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn    public boolean popBackStack() {
303b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn        return popBackStackState(mActivity.mHandler, null, -1, 0);
304b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn    }
305b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn
306625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn    @Override
307b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn    public boolean popBackStack(String name, int flags) {
308b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn        return popBackStackState(mActivity.mHandler, name, -1, flags);
309b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn    }
310b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn
311625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn    @Override
312b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn    public boolean popBackStack(int id, int flags) {
313b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn        if (id < 0) {
314b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn            throw new IllegalArgumentException("Bad id: " + id);
315b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn        }
316b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn        return popBackStackState(mActivity.mHandler, null, id, flags);
317b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn    }
318b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn
319625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn    @Override
320c6669ca63299219d815464129dac051ab2404286Dianne Hackborn    public int countBackStackEntries() {
321c6669ca63299219d815464129dac051ab2404286Dianne Hackborn        return mBackStack != null ? mBackStack.size() : 0;
322c6669ca63299219d815464129dac051ab2404286Dianne Hackborn    }
323c6669ca63299219d815464129dac051ab2404286Dianne Hackborn
324625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn    @Override
325c6669ca63299219d815464129dac051ab2404286Dianne Hackborn    public BackStackEntry getBackStackEntry(int index) {
326c6669ca63299219d815464129dac051ab2404286Dianne Hackborn        return mBackStack.get(index);
327c6669ca63299219d815464129dac051ab2404286Dianne Hackborn    }
328c6669ca63299219d815464129dac051ab2404286Dianne Hackborn
329625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn    @Override
330c6669ca63299219d815464129dac051ab2404286Dianne Hackborn    public void addOnBackStackChangedListener(OnBackStackChangedListener listener) {
331c6669ca63299219d815464129dac051ab2404286Dianne Hackborn        if (mBackStackChangeListeners == null) {
332c6669ca63299219d815464129dac051ab2404286Dianne Hackborn            mBackStackChangeListeners = new ArrayList<OnBackStackChangedListener>();
333c6669ca63299219d815464129dac051ab2404286Dianne Hackborn        }
334c6669ca63299219d815464129dac051ab2404286Dianne Hackborn        mBackStackChangeListeners.add(listener);
335c6669ca63299219d815464129dac051ab2404286Dianne Hackborn    }
336c6669ca63299219d815464129dac051ab2404286Dianne Hackborn
337625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn    @Override
338c6669ca63299219d815464129dac051ab2404286Dianne Hackborn    public void removeOnBackStackChangedListener(OnBackStackChangedListener listener) {
339c6669ca63299219d815464129dac051ab2404286Dianne Hackborn        if (mBackStackChangeListeners != null) {
340c6669ca63299219d815464129dac051ab2404286Dianne Hackborn            mBackStackChangeListeners.remove(listener);
341c6669ca63299219d815464129dac051ab2404286Dianne Hackborn        }
342c6669ca63299219d815464129dac051ab2404286Dianne Hackborn    }
343c6669ca63299219d815464129dac051ab2404286Dianne Hackborn
344625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn    @Override
345b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn    public void putFragment(Bundle bundle, String key, Fragment fragment) {
346b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn        if (fragment.mIndex < 0) {
347b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn            throw new IllegalStateException("Fragment " + fragment
348b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn                    + " is not currently in the FragmentManager");
349b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn        }
350b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn        bundle.putInt(key, fragment.mIndex);
351b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn    }
352b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn
353625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn    @Override
354b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn    public Fragment getFragment(Bundle bundle, String key) {
355def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn        int index = bundle.getInt(key, -1);
356def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn        if (index == -1) {
357def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn            return null;
358def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn        }
359b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn        if (index >= mActive.size()) {
360b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn            throw new IllegalStateException("Fragement no longer exists for key "
361b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn                    + key + ": index " + index);
362b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn        }
363b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn        Fragment f = mActive.get(index);
364b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn        if (f == null) {
365b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn            throw new IllegalStateException("Fragement no longer exists for key "
366b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn                    + key + ": index " + index);
367b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn        }
368b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn        return f;
369b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn    }
370b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn
371625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn    @Override
372625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn    public void dump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args) {
373625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn        if (mActive == null || mActive.size() <= 0) {
374625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn            return;
375625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn        }
376625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn
377625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn        writer.print(prefix); writer.println("Active Fragments:");
378625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn
379625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn        String innerPrefix = prefix + "    ";
380625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn
381625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn        int N = mActive.size();
382625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn        for (int i=0; i<N; i++) {
383625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn            Fragment f = mActive.get(i);
384625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn            if (f != null) {
385625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn                writer.print(prefix); writer.print("  #"); writer.print(i);
386625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn                        writer.print(": "); writer.println(f.toString());
387625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn                f.dump(innerPrefix, fd, writer, args);
388625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn            }
389625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn        }
390625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn
391625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn        if (mAdded != null) {
392625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn            N = mAdded.size();
393625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn            if (N > 0) {
394625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn                writer.print(prefix); writer.println("Added Fragments:");
395625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn                for (int i=0; i<N; i++) {
396625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn                    Fragment f = mAdded.get(i);
397625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn                    writer.print(prefix); writer.print("  #"); writer.print(i);
398625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn                            writer.print(": "); writer.println(f.toString());
399625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn                }
400625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn            }
401625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn        }
402625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn
403625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn        if (mBackStack != null) {
404625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn            N = mBackStack.size();
405625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn            if (N > 0) {
406625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn                writer.print(prefix); writer.println("Back Stack:");
407625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn                for (int i=0; i<N; i++) {
408625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn                    BackStackRecord bs = mBackStack.get(i);
409625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn                    writer.print(prefix); writer.print("  #"); writer.print(i);
410625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn                            writer.print(": "); writer.println(bs.toString());
411625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn                }
412625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn            }
413625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn        }
414625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn    }
415625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn
416a18a86b43e40e3c15dcca0ae0148d641be9b25feChet Haase    Animator loadAnimator(Fragment fragment, int transit, boolean enter,
417f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            int transitionStyle) {
418a18a86b43e40e3c15dcca0ae0148d641be9b25feChet Haase        Animator animObj = fragment.onCreateAnimator(transit, enter,
4195ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn                fragment.mNextAnim);
420f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn        if (animObj != null) {
421f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            return animObj;
422f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn        }
423f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn
4245ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn        if (fragment.mNextAnim != 0) {
425a18a86b43e40e3c15dcca0ae0148d641be9b25feChet Haase            Animator anim = AnimatorInflater.loadAnimator(mActivity, fragment.mNextAnim);
4265ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn            if (anim != null) {
4275ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn                return anim;
4285ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn            }
4295ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn        }
4305ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn
431f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn        if (transit == 0) {
432f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            return null;
433f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn        }
434f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn
435f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn        int styleIndex = transitToStyleIndex(transit, enter);
436f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn        if (styleIndex < 0) {
437f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            return null;
438f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn        }
439f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn
440f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn        if (transitionStyle == 0 && mActivity.getWindow() != null) {
441f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            transitionStyle = mActivity.getWindow().getAttributes().windowAnimations;
442f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn        }
443f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn        if (transitionStyle == 0) {
444f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            return null;
445f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn        }
446f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn
447f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn        TypedArray attrs = mActivity.obtainStyledAttributes(transitionStyle,
448811ed1065f39469cf2cf6adba22cab397ed88d5eChet Haase                com.android.internal.R.styleable.FragmentAnimation);
449f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn        int anim = attrs.getResourceId(styleIndex, 0);
450f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn        attrs.recycle();
451f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn
452f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn        if (anim == 0) {
453f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            return null;
454f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn        }
455f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn
456a18a86b43e40e3c15dcca0ae0148d641be9b25feChet Haase        return AnimatorInflater.loadAnimator(mActivity, anim);
457f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn    }
458f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn
459f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn    void moveToState(Fragment f, int newState, int transit, int transitionStyle) {
4606e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        // Fragments that are not currently added will sit in the onCreate() state.
4616e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        if (!f.mAdded && newState > Fragment.CREATED) {
4626e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn            newState = Fragment.CREATED;
4636e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        }
4646e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn
4652dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn        if (f.mState < newState) {
4662dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn            switch (f.mState) {
4672dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                case Fragment.INITIALIZING:
4685ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn                    if (DEBUG) Log.v(TAG, "moveto CREATED: " + f);
469def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn                    if (f.mSavedFragmentState != null) {
470def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn                        f.mSavedViewState = f.mSavedFragmentState.getSparseParcelableArray(
471def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn                                FragmentManagerImpl.VIEW_STATE_TAG);
472def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn                        f.mTarget = getFragment(f.mSavedFragmentState,
473def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn                                FragmentManagerImpl.TARGET_STATE_TAG);
474def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn                        if (f.mTarget != null) {
475def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn                            f.mTargetRequestCode = f.mSavedFragmentState.getInt(
476def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn                                    FragmentManagerImpl.TARGET_REQUEST_CODE_STATE_TAG, 0);
477def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn                        }
478def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn                    }
4792dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                    f.mActivity = mActivity;
4802dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                    f.mCalled = false;
4812dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                    f.onAttach(mActivity);
4822dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                    if (!f.mCalled) {
4832dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                        throw new SuperNotCalledException("Fragment " + f
4842dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                                + " did not call through to super.onAttach()");
4852dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                    }
486c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn                    mActivity.onAttachFragment(f);
4872dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn
488b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                    if (!f.mRetaining) {
489b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                        f.mCalled = false;
490b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                        f.onCreate(f.mSavedFragmentState);
491b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                        if (!f.mCalled) {
492b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                            throw new SuperNotCalledException("Fragment " + f
493b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                                    + " did not call through to super.onCreate()");
4942dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                        }
4952dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                    }
496b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                    f.mRetaining = false;
497b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                    if (f.mFromLayout) {
498b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                        // For fragments that are part of the content view
499b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                        // layout, we need to instantiate the view immediately
500b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                        // and the inflater will take care of adding it.
501b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                        f.mView = f.onCreateView(mActivity.getLayoutInflater(),
502b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                                null, f.mSavedFragmentState);
5036e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                        if (f.mView != null) {
5046e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                            f.mView.setSaveFromParentEnabled(false);
5056e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                            f.restoreViewState();
5065ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn                            if (f.mHidden) f.mView.setVisibility(View.GONE);
5076e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                        }
508b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                    }
5096e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                case Fragment.CREATED:
5106e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                    if (newState > Fragment.CREATED) {
5115ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn                        if (DEBUG) Log.v(TAG, "moveto CONTENT: " + f);
512b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                        if (!f.mFromLayout) {
513b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                            ViewGroup container = null;
514b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                            if (f.mContainerId != 0) {
515b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                                container = (ViewGroup)mActivity.findViewById(f.mContainerId);
516b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                                if (container == null) {
517625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn                                    throw new IllegalArgumentException("No view found for id 0x"
518b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                                            + Integer.toHexString(f.mContainerId)
519b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                                            + " for fragment " + f);
520b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                                }
521b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                            }
522b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                            f.mContainer = container;
523b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                            f.mView = f.onCreateView(mActivity.getLayoutInflater(),
524b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                                    container, f.mSavedFragmentState);
525b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                            if (f.mView != null) {
526b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                                f.mView.setSaveFromParentEnabled(false);
527b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                                if (container != null) {
528a18a86b43e40e3c15dcca0ae0148d641be9b25feChet Haase                                    Animator anim = loadAnimator(f, transit, true,
529b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                                            transitionStyle);
530b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                                    if (anim != null) {
531b20db3ec34e846010f389880b2cfab4d7bf79820Chet Haase                                        anim.setTarget(f.mView);
532811ed1065f39469cf2cf6adba22cab397ed88d5eChet Haase                                        anim.start();
533b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                                    }
534b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                                    container.addView(f.mView);
535b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                                    f.restoreViewState();
536b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                                }
5375ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn                                if (f.mHidden) f.mView.setVisibility(View.GONE);
538b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                            }
539b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                        }
540b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
541b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                        f.mCalled = false;
542c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn                        f.onActivityCreated(f.mSavedFragmentState);
543b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                        if (!f.mCalled) {
544b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                            throw new SuperNotCalledException("Fragment " + f
545b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                                    + " did not call through to super.onReady()");
546f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                        }
547b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                        f.mSavedFragmentState = null;
5482dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                    }
549c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn                case Fragment.ACTIVITY_CREATED:
550c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn                    if (newState > Fragment.ACTIVITY_CREATED) {
5515ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn                        if (DEBUG) Log.v(TAG, "moveto STARTED: " + f);
5522dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                        f.mCalled = false;
5532dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                        f.onStart();
5542dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                        if (!f.mCalled) {
5552dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                            throw new SuperNotCalledException("Fragment " + f
5562dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                                    + " did not call through to super.onStart()");
5572dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                        }
5582dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                    }
5592dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                case Fragment.STARTED:
5602dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                    if (newState > Fragment.STARTED) {
5615ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn                        if (DEBUG) Log.v(TAG, "moveto RESUMED: " + f);
5622dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                        f.mCalled = false;
5632707d6026240bcca6f0e35e2e1138958882e90ceDianne Hackborn                        f.mResumed = true;
5642dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                        f.onResume();
5652dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                        if (!f.mCalled) {
5662dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                            throw new SuperNotCalledException("Fragment " + f
5672dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                                    + " did not call through to super.onResume()");
5682dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                        }
5692dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                    }
5702dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn            }
5712dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn        } else if (f.mState > newState) {
5722dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn            switch (f.mState) {
5732dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                case Fragment.RESUMED:
5742dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                    if (newState < Fragment.RESUMED) {
5755ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn                        if (DEBUG) Log.v(TAG, "movefrom RESUMED: " + f);
5762dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                        f.mCalled = false;
5772dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                        f.onPause();
5782dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                        if (!f.mCalled) {
5792dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                            throw new SuperNotCalledException("Fragment " + f
5802dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                                    + " did not call through to super.onPause()");
5812dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                        }
5822707d6026240bcca6f0e35e2e1138958882e90ceDianne Hackborn                        f.mResumed = false;
5832dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                    }
5842dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                case Fragment.STARTED:
5852dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                    if (newState < Fragment.STARTED) {
5865ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn                        if (DEBUG) Log.v(TAG, "movefrom STARTED: " + f);
5872dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                        f.mCalled = false;
5882707d6026240bcca6f0e35e2e1138958882e90ceDianne Hackborn                        f.performStop();
5892dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                        if (!f.mCalled) {
5902dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                            throw new SuperNotCalledException("Fragment " + f
5912dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                                    + " did not call through to super.onStop()");
5922dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                        }
5932dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                    }
594c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn                case Fragment.ACTIVITY_CREATED:
595c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn                    if (newState < Fragment.ACTIVITY_CREATED) {
5965ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn                        if (DEBUG) Log.v(TAG, "movefrom CONTENT: " + f);
597b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                        if (f.mView != null) {
598b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                            // Need to save the current view state if not
599b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                            // done already.
600625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn                            if (!mActivity.isFinishing() && f.mSavedViewState == null) {
601b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                                saveFragmentViewState(f);
602b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                            }
603def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn                        }
604def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn                        f.mCalled = false;
605def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn                        f.onDestroyView();
606def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn                        if (!f.mCalled) {
607def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn                            throw new SuperNotCalledException("Fragment " + f
608def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn                                    + " did not call through to super.onDestroyedView()");
609def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn                        }
610def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn                        if (f.mView != null && f.mContainer != null) {
611b20db3ec34e846010f389880b2cfab4d7bf79820Chet Haase                            Animator anim = null;
612def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn                            if (mCurState > Fragment.INITIALIZING) {
613b20db3ec34e846010f389880b2cfab4d7bf79820Chet Haase                                anim = loadAnimator(f, transit, false,
614def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn                                        transitionStyle);
615b20db3ec34e846010f389880b2cfab4d7bf79820Chet Haase                            }
616b20db3ec34e846010f389880b2cfab4d7bf79820Chet Haase                            if (anim != null) {
617b20db3ec34e846010f389880b2cfab4d7bf79820Chet Haase                                final ViewGroup container = f.mContainer;
618b20db3ec34e846010f389880b2cfab4d7bf79820Chet Haase                                final View view = f.mView;
619b20db3ec34e846010f389880b2cfab4d7bf79820Chet Haase                                container.startViewTransition(view);
620b20db3ec34e846010f389880b2cfab4d7bf79820Chet Haase                                anim.addListener(new AnimatorListenerAdapter() {
621b20db3ec34e846010f389880b2cfab4d7bf79820Chet Haase                                    @Override
622b20db3ec34e846010f389880b2cfab4d7bf79820Chet Haase                                    public void onAnimationEnd(Animator anim) {
623b20db3ec34e846010f389880b2cfab4d7bf79820Chet Haase                                        container.endViewTransition(view);
624b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                                    }
625b20db3ec34e846010f389880b2cfab4d7bf79820Chet Haase                                });
626b20db3ec34e846010f389880b2cfab4d7bf79820Chet Haase                                anim.setTarget(f.mView);
627b20db3ec34e846010f389880b2cfab4d7bf79820Chet Haase                                anim.start();
628b20db3ec34e846010f389880b2cfab4d7bf79820Chet Haase
629f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                            }
630def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn                            f.mContainer.removeView(f.mView);
6312dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                        }
6322dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                        f.mContainer = null;
6332dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                        f.mView = null;
634b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                    }
635b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                case Fragment.CREATED:
636b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                    if (newState < Fragment.CREATED) {
6375ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn                        if (DEBUG) Log.v(TAG, "movefrom CREATED: " + f);
638b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                        if (!f.mRetaining) {
639b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                            f.mCalled = false;
640b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                            f.onDestroy();
641b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                            if (!f.mCalled) {
642b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                                throw new SuperNotCalledException("Fragment " + f
643b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                                        + " did not call through to super.onDestroy()");
644b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                            }
6452dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                        }
646b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
6472dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                        f.mCalled = false;
6482dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                        f.onDetach();
6492dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                        if (!f.mCalled) {
6502dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                            throw new SuperNotCalledException("Fragment " + f
6512dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                                    + " did not call through to super.onDetach()");
6522dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                        }
6533e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn                        f.mImmediateActivity = null;
6542dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                        f.mActivity = null;
6552dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                    }
6562dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn            }
6572dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn        }
6582dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn
6592dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn        f.mState = newState;
6602dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    }
6612dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn
662625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn    void moveToState(Fragment f) {
663625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn        moveToState(f, mCurState, 0, 0);
664625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn    }
665625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn
666ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn    void moveToState(int newState, boolean always) {
667f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn        moveToState(newState, 0, 0, always);
668f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn    }
669f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn
670f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn    void moveToState(int newState, int transit, int transitStyle, boolean always) {
6712dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn        if (mActivity == null && newState != Fragment.INITIALIZING) {
6722dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn            throw new IllegalStateException("No activity");
6732dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn        }
6742dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn
675ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn        if (!always && mCurState == newState) {
676ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn            return;
677ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn        }
678ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn
6792dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn        mCurState = newState;
6806e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        if (mActive != null) {
6816e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn            for (int i=0; i<mActive.size(); i++) {
6826e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                Fragment f = mActive.get(i);
6836e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                if (f != null) {
6846e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                    moveToState(f, newState, transit, transitStyle);
6856e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                }
6866e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn            }
6875f36c96f6d3623a826466db68cc1586f078ac307Dianne Hackborn
6885f36c96f6d3623a826466db68cc1586f078ac307Dianne Hackborn            if (mNeedMenuInvalidate && mActivity != null) {
6895f36c96f6d3623a826466db68cc1586f078ac307Dianne Hackborn                mActivity.invalidateOptionsMenu();
6905f36c96f6d3623a826466db68cc1586f078ac307Dianne Hackborn                mNeedMenuInvalidate = false;
6915f36c96f6d3623a826466db68cc1586f078ac307Dianne Hackborn            }
6926e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        }
6936e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn    }
6946e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn
6956e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn    void makeActive(Fragment f) {
6966e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        if (f.mIndex >= 0) {
6976e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn            return;
6986e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        }
6996e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn
7006e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        if (mAvailIndices == null || mAvailIndices.size() <= 0) {
7016e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn            if (mActive == null) {
7026e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                mActive = new ArrayList<Fragment>();
703ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn            }
7046e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn            f.setIndex(mActive.size());
7056e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn            mActive.add(f);
7066e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn
7076e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        } else {
7086e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn            f.setIndex(mAvailIndices.remove(mAvailIndices.size()-1));
7096e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn            mActive.set(f.mIndex, f);
7102dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn        }
7112dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    }
7122dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn
7136e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn    void makeInactive(Fragment f) {
7146e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        if (f.mIndex < 0) {
7156e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn            return;
7166e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        }
7176e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn
718b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn        if (DEBUG) Log.v(TAG, "Freeing fragment index " + f.mIndex);
7196e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        mActive.set(f.mIndex, null);
7206e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        if (mAvailIndices == null) {
7216e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn            mAvailIndices = new ArrayList<Integer>();
7226e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        }
7236e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        mAvailIndices.add(f.mIndex);
7249e14e9f33a66b864b98c6ff9517988bafbca3301Dianne Hackborn        mActivity.invalidateFragmentIndex(f.mIndex);
7256e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        f.clearIndex();
7266e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn    }
7276e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn
728ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn    public void addFragment(Fragment fragment, boolean moveToStateNow) {
7296e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        if (mAdded == null) {
7306e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn            mAdded = new ArrayList<Fragment>();
731ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn        }
7326e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        mAdded.add(fragment);
7336e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        makeActive(fragment);
7345e0d59547c4042037e23a42ba4e2521721e9c7d3Dianne Hackborn        if (DEBUG) Log.v(TAG, "add: " + fragment);
7356e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        fragment.mAdded = true;
736b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn        if (fragment.mHasMenu) {
737b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn            mNeedMenuInvalidate = true;
738b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn        }
739ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn        if (moveToStateNow) {
740625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn            moveToState(fragment);
741ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn        }
7422dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    }
7432dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn
744f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn    public void removeFragment(Fragment fragment, int transition, int transitionStyle) {
7455e0d59547c4042037e23a42ba4e2521721e9c7d3Dianne Hackborn        if (DEBUG) Log.v(TAG, "remove: " + fragment + " nesting=" + fragment.mBackStackNesting);
7466e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        mAdded.remove(fragment);
7476e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        final boolean inactive = fragment.mBackStackNesting <= 0;
748b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn        if (fragment.mHasMenu) {
749b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn            mNeedMenuInvalidate = true;
750b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn        }
7516e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        fragment.mAdded = false;
7526e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        moveToState(fragment, inactive ? Fragment.INITIALIZING : Fragment.CREATED,
7536e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                transition, transitionStyle);
7545e0d59547c4042037e23a42ba4e2521721e9c7d3Dianne Hackborn        if (inactive) {
7555e0d59547c4042037e23a42ba4e2521721e9c7d3Dianne Hackborn            makeInactive(fragment);
7565e0d59547c4042037e23a42ba4e2521721e9c7d3Dianne Hackborn        }
757f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn    }
758f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn
7595ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn    public void hideFragment(Fragment fragment, int transition, int transitionStyle) {
7605ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn        if (DEBUG) Log.v(TAG, "hide: " + fragment);
7615ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn        if (!fragment.mHidden) {
7625ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn            fragment.mHidden = true;
7635ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn            if (fragment.mView != null) {
764a18a86b43e40e3c15dcca0ae0148d641be9b25feChet Haase                Animator anim = loadAnimator(fragment, transition, true,
7655ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn                        transitionStyle);
7665ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn                if (anim != null) {
767b20db3ec34e846010f389880b2cfab4d7bf79820Chet Haase                    anim.setTarget(fragment.mView);
768811ed1065f39469cf2cf6adba22cab397ed88d5eChet Haase                    anim.start();
7695ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn                }
7705ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn                fragment.mView.setVisibility(View.GONE);
7715ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn            }
772b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn            if (fragment.mAdded && fragment.mHasMenu) {
773b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn                mNeedMenuInvalidate = true;
774b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn            }
7755ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn            fragment.onHiddenChanged(true);
7765ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn        }
7775ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn    }
7785ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn
7795ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn    public void showFragment(Fragment fragment, int transition, int transitionStyle) {
7805ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn        if (DEBUG) Log.v(TAG, "show: " + fragment);
7815ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn        if (fragment.mHidden) {
7825ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn            fragment.mHidden = false;
7835ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn            if (fragment.mView != null) {
784a18a86b43e40e3c15dcca0ae0148d641be9b25feChet Haase                Animator anim = loadAnimator(fragment, transition, true,
7855ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn                        transitionStyle);
7865ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn                if (anim != null) {
787b20db3ec34e846010f389880b2cfab4d7bf79820Chet Haase                    anim.setTarget(fragment.mView);
788811ed1065f39469cf2cf6adba22cab397ed88d5eChet Haase                    anim.start();
7895ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn                }
7905ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn                fragment.mView.setVisibility(View.VISIBLE);
7915ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn            }
792b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn            if (fragment.mAdded && fragment.mHasMenu) {
793b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn                mNeedMenuInvalidate = true;
794b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn            }
7955ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn            fragment.onHiddenChanged(false);
7965ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn        }
7975ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn    }
7985ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn
799f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn    public Fragment findFragmentById(int id) {
8006e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        if (mActive != null) {
8015ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn            // First look through added fragments.
8025ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn            for (int i=mAdded.size()-1; i>=0; i--) {
8035ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn                Fragment f = mAdded.get(i);
8045ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn                if (f != null && f.mFragmentId == id) {
8055ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn                    return f;
8065ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn                }
8075ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn            }
8085ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn            // Now for any known fragment.
8096e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn            for (int i=mActive.size()-1; i>=0; i--) {
8106e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                Fragment f = mActive.get(i);
8116e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                if (f != null && f.mFragmentId == id) {
812b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                    return f;
813b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                }
814b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            }
815b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        }
816b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        return null;
817b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    }
818b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
819b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    public Fragment findFragmentByTag(String tag) {
8206e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        if (mActive != null && tag != null) {
8215ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn            // First look through added fragments.
8225ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn            for (int i=mAdded.size()-1; i>=0; i--) {
8235ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn                Fragment f = mAdded.get(i);
8245ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn                if (f != null && tag.equals(f.mTag)) {
8255ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn                    return f;
8265ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn                }
8275ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn            }
8285ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn            // Now for any known fragment.
8296e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn            for (int i=mActive.size()-1; i>=0; i--) {
8306e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                Fragment f = mActive.get(i);
8316e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                if (f != null && tag.equals(f.mTag)) {
8326e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                    return f;
8336e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                }
8346e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn            }
8356e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        }
8366e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        return null;
8376e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn    }
8386e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn
8396e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn    public Fragment findFragmentByWho(String who) {
8406e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        if (mActive != null && who != null) {
8416e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn            for (int i=mActive.size()-1; i>=0; i--) {
8426e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                Fragment f = mActive.get(i);
8436e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                if (f != null && who.equals(f.mWho)) {
844f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                    return f;
845f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                }
846f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            }
847f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn        }
848f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn        return null;
8492dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    }
8502dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn
851445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn    public void enqueueAction(Runnable action) {
8523e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn        if (mStateSaved) {
8533e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn            throw new IllegalStateException(
8543e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn                    "Can not perform this action after onSaveInstanceState");
8553e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn        }
856fb3cffeb35368da22f99b85d45039c4e6e471c06Dianne Hackborn        if (mNoTransactionsBecause != null) {
857fb3cffeb35368da22f99b85d45039c4e6e471c06Dianne Hackborn            throw new IllegalStateException(
858fb3cffeb35368da22f99b85d45039c4e6e471c06Dianne Hackborn                    "Can not perform this action inside of " + mNoTransactionsBecause);
859fb3cffeb35368da22f99b85d45039c4e6e471c06Dianne Hackborn        }
860445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn        synchronized (this) {
861445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn            if (mPendingActions == null) {
862445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn                mPendingActions = new ArrayList<Runnable>();
863445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn            }
864445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn            mPendingActions.add(action);
865445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn            if (mPendingActions.size() == 1) {
866445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn                mActivity.mHandler.removeCallbacks(mExecCommit);
867445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn                mActivity.mHandler.post(mExecCommit);
868445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn            }
869445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn        }
870445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn    }
871445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn
872c6669ca63299219d815464129dac051ab2404286Dianne Hackborn    public int allocBackStackIndex(BackStackRecord bse) {
873dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        synchronized (this) {
874dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn            if (mAvailBackStackIndices == null || mAvailBackStackIndices.size() <= 0) {
875dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn                if (mBackStackIndices == null) {
876c6669ca63299219d815464129dac051ab2404286Dianne Hackborn                    mBackStackIndices = new ArrayList<BackStackRecord>();
877dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn                }
878dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn                int index = mBackStackIndices.size();
879dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn                if (DEBUG) Log.v(TAG, "Setting back stack index " + index + " to " + bse);
880dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn                mBackStackIndices.add(bse);
881dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn                return index;
882dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn
883dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn            } else {
884dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn                int index = mAvailBackStackIndices.remove(mAvailBackStackIndices.size()-1);
885dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn                if (DEBUG) Log.v(TAG, "Adding back stack index " + index + " with " + bse);
886dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn                mBackStackIndices.set(index, bse);
887dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn                return index;
888dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn            }
889dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        }
890dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    }
891dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn
892c6669ca63299219d815464129dac051ab2404286Dianne Hackborn    public void setBackStackIndex(int index, BackStackRecord bse) {
893dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        synchronized (this) {
894dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn            if (mBackStackIndices == null) {
895c6669ca63299219d815464129dac051ab2404286Dianne Hackborn                mBackStackIndices = new ArrayList<BackStackRecord>();
896dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn            }
897dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn            int N = mBackStackIndices.size();
898dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn            if (index < N) {
899dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn                if (DEBUG) Log.v(TAG, "Setting back stack index " + index + " to " + bse);
900dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn                mBackStackIndices.set(index, bse);
901dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn            } else {
902dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn                while (N < index) {
903dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn                    mBackStackIndices.add(null);
904dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn                    if (mAvailBackStackIndices == null) {
905dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn                        mAvailBackStackIndices = new ArrayList<Integer>();
906dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn                    }
907dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn                    if (DEBUG) Log.v(TAG, "Adding available back stack index " + N);
908dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn                    mAvailBackStackIndices.add(N);
909dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn                    N++;
910dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn                }
911dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn                if (DEBUG) Log.v(TAG, "Adding back stack index " + index + " with " + bse);
912dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn                mBackStackIndices.add(bse);
913dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn            }
914dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        }
915dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    }
916dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn
917dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    public void freeBackStackIndex(int index) {
918dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        synchronized (this) {
919dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn            mBackStackIndices.set(index, null);
920dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn            if (mAvailBackStackIndices == null) {
921dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn                mAvailBackStackIndices = new ArrayList<Integer>();
922dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn            }
923dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn            if (DEBUG) Log.v(TAG, "Freeing back stack index " + index);
924dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn            mAvailBackStackIndices.add(index);
925dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn        }
926dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    }
927dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn
928445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn    /**
929445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn     * Only call from main thread!
930445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn     */
931445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn    public void execPendingActions() {
932445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn        if (mExecutingActions) {
933445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn            throw new IllegalStateException("Recursive entry to execPendingActions");
934445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn        }
935445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn
936445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn        while (true) {
937445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn            int numActions;
938445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn
939445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn            synchronized (this) {
940445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn                if (mPendingActions == null || mPendingActions.size() == 0) {
941445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn                    return;
942445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn                }
943445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn
944445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn                numActions = mPendingActions.size();
945445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn                if (mTmpActions == null || mTmpActions.length < numActions) {
946445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn                    mTmpActions = new Runnable[numActions];
947445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn                }
948445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn                mPendingActions.toArray(mTmpActions);
949445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn                mPendingActions.clear();
950445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn                mActivity.mHandler.removeCallbacks(mExecCommit);
951445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn            }
952445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn
953445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn            mExecutingActions = true;
954445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn            for (int i=0; i<numActions; i++) {
955445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn                mTmpActions[i].run();
956445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn            }
957445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn            mExecutingActions = false;
958445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn        }
959445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn    }
960445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn
961c6669ca63299219d815464129dac051ab2404286Dianne Hackborn    void reportBackStackChanged() {
962c6669ca63299219d815464129dac051ab2404286Dianne Hackborn        if (mBackStackChangeListeners != null) {
963c6669ca63299219d815464129dac051ab2404286Dianne Hackborn            for (int i=0; i<mBackStackChangeListeners.size(); i++) {
964c6669ca63299219d815464129dac051ab2404286Dianne Hackborn                mBackStackChangeListeners.get(i).onBackStackChanged();
965c6669ca63299219d815464129dac051ab2404286Dianne Hackborn            }
966c6669ca63299219d815464129dac051ab2404286Dianne Hackborn        }
967c6669ca63299219d815464129dac051ab2404286Dianne Hackborn    }
968c6669ca63299219d815464129dac051ab2404286Dianne Hackborn
969c6669ca63299219d815464129dac051ab2404286Dianne Hackborn    void addBackStackState(BackStackRecord state) {
970ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn        if (mBackStack == null) {
971c6669ca63299219d815464129dac051ab2404286Dianne Hackborn            mBackStack = new ArrayList<BackStackRecord>();
972ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn        }
973ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn        mBackStack.add(state);
974c6669ca63299219d815464129dac051ab2404286Dianne Hackborn        reportBackStackChanged();
975ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn    }
976ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn
977dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn    boolean popBackStackState(Handler handler, String name, int id, int flags) {
978ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn        if (mBackStack == null) {
979ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn            return false;
980ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn        }
981b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn        if (name == null && id < 0 && (flags&Activity.POP_BACK_STACK_INCLUSIVE) == 0) {
982f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            int last = mBackStack.size()-1;
983f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            if (last < 0) {
984f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                return false;
985f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            }
986c6669ca63299219d815464129dac051ab2404286Dianne Hackborn            final BackStackRecord bss = mBackStack.remove(last);
987445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn            enqueueAction(new Runnable() {
988f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                public void run() {
989445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn                    if (DEBUG) Log.v(TAG, "Popping back stack state: " + bss);
9905f36c96f6d3623a826466db68cc1586f078ac307Dianne Hackborn                    bss.popFromBackStack(true);
991c6669ca63299219d815464129dac051ab2404286Dianne Hackborn                    reportBackStackChanged();
992f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                }
993f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            });
994f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn        } else {
995b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn            int index = -1;
996b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn            if (name != null || id >= 0) {
997b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn                // If a name or ID is specified, look for that place in
998b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn                // the stack.
999b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn                index = mBackStack.size()-1;
1000b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn                while (index >= 0) {
1001c6669ca63299219d815464129dac051ab2404286Dianne Hackborn                    BackStackRecord bss = mBackStack.get(index);
1002b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn                    if (name != null && name.equals(bss.getName())) {
1003b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn                        break;
1004b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn                    }
1005b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn                    if (id >= 0 && id == bss.mIndex) {
1006b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn                        break;
1007b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn                    }
1008b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn                    index--;
1009dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn                }
1010b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn                if (index < 0) {
1011b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn                    return false;
1012b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn                }
1013b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn                if ((flags&Activity.POP_BACK_STACK_INCLUSIVE) != 0) {
1014b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn                    index--;
1015b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn                    // Consume all following entries that match.
1016b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn                    while (index >= 0) {
1017c6669ca63299219d815464129dac051ab2404286Dianne Hackborn                        BackStackRecord bss = mBackStack.get(index);
1018b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn                        if ((name != null && name.equals(bss.getName()))
1019b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn                                || (id >= 0 && id == bss.mIndex)) {
1020b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn                            index--;
1021b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn                            continue;
1022b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn                        }
1023b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn                        break;
1024b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn                    }
1025f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                }
1026dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn            }
1027dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn            if (index == mBackStack.size()-1) {
1028f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                return false;
1029f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            }
1030c6669ca63299219d815464129dac051ab2404286Dianne Hackborn            final ArrayList<BackStackRecord> states
1031c6669ca63299219d815464129dac051ab2404286Dianne Hackborn                    = new ArrayList<BackStackRecord>();
1032f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            for (int i=mBackStack.size()-1; i>index; i--) {
1033f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                states.add(mBackStack.remove(i));
1034ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn            }
1035445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn            enqueueAction(new Runnable() {
1036f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                public void run() {
10375f36c96f6d3623a826466db68cc1586f078ac307Dianne Hackborn                    final int LAST = states.size()-1;
10385f36c96f6d3623a826466db68cc1586f078ac307Dianne Hackborn                    for (int i=0; i<=LAST; i++) {
1039445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn                        if (DEBUG) Log.v(TAG, "Popping back stack state: " + states.get(i));
10405f36c96f6d3623a826466db68cc1586f078ac307Dianne Hackborn                        states.get(i).popFromBackStack(i == LAST);
1041f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                    }
1042c6669ca63299219d815464129dac051ab2404286Dianne Hackborn                    reportBackStackChanged();
1043f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                }
1044f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn            });
1045f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn        }
1046ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn        return true;
1047ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn    }
1048ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn
1049b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    ArrayList<Fragment> retainNonConfig() {
1050b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        ArrayList<Fragment> fragments = null;
10516e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        if (mActive != null) {
10526e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn            for (int i=0; i<mActive.size(); i++) {
10536e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                Fragment f = mActive.get(i);
10546e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                if (f != null && f.mRetainInstance) {
1055b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                    if (fragments == null) {
1056b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                        fragments = new ArrayList<Fragment>();
1057b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                    }
1058b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                    fragments.add(f);
1059b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                    f.mRetaining = true;
1060b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                }
1061b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            }
1062b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        }
1063b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        return fragments;
1064b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    }
1065b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
1066b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    void saveFragmentViewState(Fragment f) {
10676e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        if (f.mView == null) {
1068b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            return;
1069b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        }
1070b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        if (mStateArray == null) {
1071b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            mStateArray = new SparseArray<Parcelable>();
1072b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        }
1073b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        f.mView.saveHierarchyState(mStateArray);
1074b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        if (mStateArray.size() > 0) {
1075b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            f.mSavedViewState = mStateArray;
1076b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            mStateArray = null;
1077b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        }
1078b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    }
1079b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
10806e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn    Parcelable saveAllState() {
10813e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn        mStateSaved = true;
10823e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn
10836e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        if (mActive == null || mActive.size() <= 0) {
10846e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn            return null;
1085b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        }
1086b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
10876e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        // First collect all active fragments.
10886e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        int N = mActive.size();
10896e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        FragmentState[] active = new FragmentState[N];
10906e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        boolean haveFragments = false;
10916e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        for (int i=0; i<N; i++) {
10926e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn            Fragment f = mActive.get(i);
10936e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn            if (f != null) {
10946e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                haveFragments = true;
10956e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn
10966e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                FragmentState fs = new FragmentState(f);
10976e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                active[i] = fs;
10986e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn
1099625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn                if (f.mState > Fragment.INITIALIZING && fs.mSavedFragmentState == null) {
1100625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn                    if (mStateBundle == null) {
1101625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn                        mStateBundle = new Bundle();
1102625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn                    }
1103625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn                    f.onSaveInstanceState(mStateBundle);
1104625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn                    if (!mStateBundle.isEmpty()) {
1105625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn                        fs.mSavedFragmentState = mStateBundle;
1106625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn                        mStateBundle = null;
1107625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn                    }
1108625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn
1109625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn                    if (f.mView != null) {
1110625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn                        saveFragmentViewState(f);
1111625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn                        if (f.mSavedViewState != null) {
1112625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn                            if (fs.mSavedFragmentState == null) {
1113625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn                                fs.mSavedFragmentState = new Bundle();
1114625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn                            }
1115625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn                            fs.mSavedFragmentState.putSparseParcelableArray(
1116625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn                                    FragmentManagerImpl.VIEW_STATE_TAG, f.mSavedViewState);
1117625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn                        }
1118625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn                    }
1119625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn
1120625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn                    if (f.mTarget != null) {
11216e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                        if (fs.mSavedFragmentState == null) {
11226e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                            fs.mSavedFragmentState = new Bundle();
11236e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                        }
1124625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn                        putFragment(fs.mSavedFragmentState,
1125625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn                                FragmentManagerImpl.TARGET_STATE_TAG, f.mTarget);
1126625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn                        if (f.mTargetRequestCode != 0) {
1127625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn                            fs.mSavedFragmentState.putInt(
1128625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn                                    FragmentManagerImpl.TARGET_REQUEST_CODE_STATE_TAG,
1129625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn                                    f.mTargetRequestCode);
1130625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn                        }
1131def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn                    }
1132def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn
1133625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn                } else {
1134625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn                    fs.mSavedFragmentState = f.mSavedFragmentState;
11356e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                }
11366e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn
1137b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn                if (DEBUG) Log.v(TAG, "Saved state of " + f + ": "
1138b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn                        + fs.mSavedFragmentState);
1139b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            }
1140b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        }
1141b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
11426e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        if (!haveFragments) {
1143b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn            if (DEBUG) Log.v(TAG, "saveAllState: no fragments!");
1144b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            return null;
1145b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        }
1146b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
1147b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        int[] added = null;
1148b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        BackStackState[] backStack = null;
1149b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
11506e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        // Build list of currently added fragments.
1151625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn        if (mAdded != null) {
1152625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn            N = mAdded.size();
1153625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn            if (N > 0) {
1154625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn                added = new int[N];
1155625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn                for (int i=0; i<N; i++) {
1156625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn                    added[i] = mAdded.get(i).mIndex;
1157625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn                    if (DEBUG) Log.v(TAG, "saveAllState: adding fragment #" + i
1158625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn                            + ": " + mAdded.get(i));
1159625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn                }
1160b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            }
1161b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        }
1162b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
1163b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        // Now save back stack.
1164b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        if (mBackStack != null) {
1165b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            N = mBackStack.size();
1166b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            if (N > 0) {
1167b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                backStack = new BackStackState[N];
1168b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                for (int i=0; i<N; i++) {
1169b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                    backStack[i] = new BackStackState(this, mBackStack.get(i));
1170b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn                    if (DEBUG) Log.v(TAG, "saveAllState: adding back stack #" + i
1171b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn                            + ": " + mBackStack.get(i));
1172b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                }
1173b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            }
1174b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        }
1175b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
1176b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        FragmentManagerState fms = new FragmentManagerState();
11776e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        fms.mActive = active;
1178b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        fms.mAdded = added;
1179b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        fms.mBackStack = backStack;
1180b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        return fms;
1181b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    }
1182b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
1183b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    void restoreAllState(Parcelable state, ArrayList<Fragment> nonConfig) {
1184b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        // If there is no saved state at all, then there can not be
1185b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        // any nonConfig fragments either, so that is that.
1186b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        if (state == null) return;
1187b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        FragmentManagerState fms = (FragmentManagerState)state;
11886e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        if (fms.mActive == null) return;
1189b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
11906e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        // First re-attach any non-config instances we are retaining back
11916e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        // to their saved state, so we don't try to instantiate them again.
1192b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        if (nonConfig != null) {
1193b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            for (int i=0; i<nonConfig.size(); i++) {
1194b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                Fragment f = nonConfig.get(i);
1195b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn                if (DEBUG) Log.v(TAG, "restoreAllState: re-attaching retained " + f);
11966e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                FragmentState fs = fms.mActive[f.mIndex];
1197b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                fs.mInstance = f;
1198b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                f.mSavedViewState = null;
11996e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                f.mBackStackNesting = 0;
1200625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn                f.mInLayout = false;
12016e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                f.mAdded = false;
1202b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                if (fs.mSavedFragmentState != null) {
1203b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                    f.mSavedViewState = fs.mSavedFragmentState.getSparseParcelableArray(
1204def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn                            FragmentManagerImpl.VIEW_STATE_TAG);
1205b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                }
1206b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            }
1207b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        }
1208b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
12096e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        // Build the full list of active fragments, instantiating them from
12106e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        // their saved state.
12116e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        mActive = new ArrayList<Fragment>(fms.mActive.length);
12126e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        if (mAvailIndices != null) {
12136e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn            mAvailIndices.clear();
12146e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        }
12156e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        for (int i=0; i<fms.mActive.length; i++) {
12166e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn            FragmentState fs = fms.mActive[i];
12176e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn            if (fs != null) {
1218b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn                Fragment f = fs.instantiate(mActivity);
1219b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn                if (DEBUG) Log.v(TAG, "restoreAllState: adding #" + i + ": " + f);
1220b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn                mActive.add(f);
12216e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn            } else {
1222b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn                if (DEBUG) Log.v(TAG, "restoreAllState: adding #" + i + ": (null)");
12236e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                mActive.add(null);
12246e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                if (mAvailIndices == null) {
12256e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                    mAvailIndices = new ArrayList<Integer>();
12266e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                }
1227b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn                if (DEBUG) Log.v(TAG, "restoreAllState: adding avail #" + i);
12286e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                mAvailIndices.add(i);
1229b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            }
12306e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        }
12316e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn
12323e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn        // Update the target of all retained fragments.
12333e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn        if (nonConfig != null) {
12343e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn            for (int i=0; i<nonConfig.size(); i++) {
12353e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn                Fragment f = nonConfig.get(i);
12363e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn                if (f.mTarget != null) {
12373e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn                    if (f.mTarget.mIndex < mActive.size()) {
12383e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn                        f.mTarget = mActive.get(f.mTarget.mIndex);
12393e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn                    } else {
12403e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn                        Log.w(TAG, "Re-attaching retained fragment " + f
12413e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn                                + " target no longer exists: " + f.mTarget);
12423e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn                        f.mTarget = null;
12433e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn                    }
12443e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn                }
12453e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn            }
12463e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn        }
12473e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn
12486e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        // Build the list of currently added fragments.
12496e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        if (fms.mAdded != null) {
12506e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn            mAdded = new ArrayList<Fragment>(fms.mAdded.length);
1251b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            for (int i=0; i<fms.mAdded.length; i++) {
12526e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                Fragment f = mActive.get(fms.mAdded[i]);
12536e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                if (f == null) {
12546e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                    throw new IllegalStateException(
12556e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                            "No instantiated fragment for index #" + fms.mAdded[i]);
1256b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                }
12576e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                f.mAdded = true;
1258b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn                f.mImmediateActivity = mActivity;
1259b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn                if (DEBUG) Log.v(TAG, "restoreAllState: making added #" + i + ": " + f);
12606e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                mAdded.add(f);
1261b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            }
12626e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        } else {
12636e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn            mAdded = null;
1264b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        }
12656e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn
12666e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        // Build the back stack.
1267b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        if (fms.mBackStack != null) {
1268c6669ca63299219d815464129dac051ab2404286Dianne Hackborn            mBackStack = new ArrayList<BackStackRecord>(fms.mBackStack.length);
1269b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            for (int i=0; i<fms.mBackStack.length; i++) {
1270c6669ca63299219d815464129dac051ab2404286Dianne Hackborn                BackStackRecord bse = fms.mBackStack[i].instantiate(this);
1271b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn                if (DEBUG) Log.v(TAG, "restoreAllState: adding bse #" + i
1272b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn                        + " (index " + bse.mIndex + "): " + bse);
1273b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                mBackStack.add(bse);
1274dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn                if (bse.mIndex >= 0) {
1275dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn                    setBackStackIndex(bse.mIndex, bse);
1276dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn                }
1277b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn            }
12786e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        } else {
12796e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn            mBackStack = null;
1280b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn        }
1281b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    }
1282b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn
12832dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    public void attachActivity(Activity activity) {
12842dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn        if (mActivity != null) throw new IllegalStateException();
12852dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn        mActivity = activity;
12862dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    }
12872dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn
1288fb3cffeb35368da22f99b85d45039c4e6e471c06Dianne Hackborn    public void noteStateNotSaved() {
1289fb3cffeb35368da22f99b85d45039c4e6e471c06Dianne Hackborn        mStateSaved = false;
1290fb3cffeb35368da22f99b85d45039c4e6e471c06Dianne Hackborn    }
1291fb3cffeb35368da22f99b85d45039c4e6e471c06Dianne Hackborn
1292b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn    public void dispatchCreate() {
12933e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn        mStateSaved = false;
1294ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn        moveToState(Fragment.CREATED, false);
12952dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    }
12962dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn
1297c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn    public void dispatchActivityCreated() {
12983e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn        mStateSaved = false;
1299c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn        moveToState(Fragment.ACTIVITY_CREATED, false);
1300c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn    }
1301c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn
13022dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    public void dispatchStart() {
13033e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn        mStateSaved = false;
1304ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn        moveToState(Fragment.STARTED, false);
13052dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    }
13062dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn
13072dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    public void dispatchResume() {
13083e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn        mStateSaved = false;
1309ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn        moveToState(Fragment.RESUMED, false);
13102dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    }
13112dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn
13122dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    public void dispatchPause() {
1313ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn        moveToState(Fragment.STARTED, false);
13142dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    }
13152dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn
13162dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    public void dispatchStop() {
1317c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn        moveToState(Fragment.ACTIVITY_CREATED, false);
13182dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    }
13192dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn
13202dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    public void dispatchDestroy() {
1321ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn        moveToState(Fragment.INITIALIZING, false);
13222dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn        mActivity = null;
13232dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    }
1324f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn
1325b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn    public boolean dispatchCreateOptionsMenu(Menu menu, MenuInflater inflater) {
1326b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn        boolean show = false;
1327b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn        if (mActive != null) {
1328b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn            for (int i=0; i<mAdded.size(); i++) {
1329b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn                Fragment f = mAdded.get(i);
1330b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn                if (f != null && !f.mHidden && f.mHasMenu) {
1331b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn                    show = true;
1332b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn                    f.onCreateOptionsMenu(menu, inflater);
1333b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn                }
1334b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn            }
1335b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn        }
1336b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn        return show;
1337b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn    }
1338b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn
1339b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn    public boolean dispatchPrepareOptionsMenu(Menu menu) {
1340b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn        boolean show = false;
1341b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn        if (mActive != null) {
1342b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn            for (int i=0; i<mAdded.size(); i++) {
1343b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn                Fragment f = mAdded.get(i);
1344b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn                if (f != null && !f.mHidden && f.mHasMenu) {
1345b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn                    show = true;
1346b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn                    f.onPrepareOptionsMenu(menu);
1347b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn                }
1348b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn            }
1349b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn        }
1350b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn        return show;
1351b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn    }
1352b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn
1353b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn    public boolean dispatchOptionsItemSelected(MenuItem item) {
1354b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn        if (mActive != null) {
1355b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn            for (int i=0; i<mAdded.size(); i++) {
1356b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn                Fragment f = mAdded.get(i);
1357b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn                if (f != null && !f.mHidden && f.mHasMenu) {
1358b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn                    if (f.onOptionsItemSelected(item)) {
1359b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn                        return true;
1360b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn                    }
1361b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn                }
1362b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn            }
1363b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn        }
1364b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn        return false;
1365b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn    }
1366b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn
13675ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn    public boolean dispatchContextItemSelected(MenuItem item) {
13685ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn        if (mActive != null) {
13695ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn            for (int i=0; i<mAdded.size(); i++) {
13705ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn                Fragment f = mAdded.get(i);
13715ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn                if (f != null && !f.mHidden) {
13725ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn                    if (f.onContextItemSelected(item)) {
13735ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn                        return true;
13745ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn                    }
13755ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn                }
13765ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn            }
13775ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn        }
13785ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn        return false;
13795ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn    }
13805ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn
1381b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn    public void dispatchOptionsMenuClosed(Menu menu) {
1382b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn        if (mActive != null) {
1383b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn            for (int i=0; i<mAdded.size(); i++) {
1384b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn                Fragment f = mAdded.get(i);
1385b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn                if (f != null && !f.mHidden && f.mHasMenu) {
1386b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn                    f.onOptionsMenuClosed(menu);
1387b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn                }
1388b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn            }
1389b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn        }
1390b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn    }
1391b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn
1392f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn    public static int reverseTransit(int transit) {
1393f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn        int rev = 0;
1394f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn        switch (transit) {
1395811ed1065f39469cf2cf6adba22cab397ed88d5eChet Haase            case FragmentTransaction.TRANSIT_FRAGMENT_OPEN:
1396811ed1065f39469cf2cf6adba22cab397ed88d5eChet Haase                rev = FragmentTransaction.TRANSIT_FRAGMENT_CLOSE;
1397f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                break;
1398811ed1065f39469cf2cf6adba22cab397ed88d5eChet Haase            case FragmentTransaction.TRANSIT_FRAGMENT_CLOSE:
1399811ed1065f39469cf2cf6adba22cab397ed88d5eChet Haase                rev = FragmentTransaction.TRANSIT_FRAGMENT_OPEN;
1400f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                break;
14019ff82bf2b33513052500473d0d6d025a80dcecbfChet Haase            case FragmentTransaction.TRANSIT_FRAGMENT_NEXT:
14029ff82bf2b33513052500473d0d6d025a80dcecbfChet Haase                rev = FragmentTransaction.TRANSIT_FRAGMENT_PREV;
14039ff82bf2b33513052500473d0d6d025a80dcecbfChet Haase                break;
14049ff82bf2b33513052500473d0d6d025a80dcecbfChet Haase            case FragmentTransaction.TRANSIT_FRAGMENT_PREV:
14059ff82bf2b33513052500473d0d6d025a80dcecbfChet Haase                rev = FragmentTransaction.TRANSIT_FRAGMENT_NEXT;
14069ff82bf2b33513052500473d0d6d025a80dcecbfChet Haase                break;
1407f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn        }
1408f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn        return rev;
1409f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn
1410f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn    }
1411f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn
1412f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn    public static int transitToStyleIndex(int transit, boolean enter) {
1413f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn        int animAttr = -1;
1414f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn        switch (transit) {
1415811ed1065f39469cf2cf6adba22cab397ed88d5eChet Haase            case FragmentTransaction.TRANSIT_FRAGMENT_OPEN:
1416f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                animAttr = enter
1417811ed1065f39469cf2cf6adba22cab397ed88d5eChet Haase                    ? com.android.internal.R.styleable.FragmentAnimation_fragmentOpenEnterAnimation
1418811ed1065f39469cf2cf6adba22cab397ed88d5eChet Haase                    : com.android.internal.R.styleable.FragmentAnimation_fragmentOpenExitAnimation;
1419f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                break;
1420811ed1065f39469cf2cf6adba22cab397ed88d5eChet Haase            case FragmentTransaction.TRANSIT_FRAGMENT_CLOSE:
1421f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                animAttr = enter
1422811ed1065f39469cf2cf6adba22cab397ed88d5eChet Haase                    ? com.android.internal.R.styleable.FragmentAnimation_fragmentCloseEnterAnimation
1423811ed1065f39469cf2cf6adba22cab397ed88d5eChet Haase                    : com.android.internal.R.styleable.FragmentAnimation_fragmentCloseExitAnimation;
1424f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn                break;
14259ff82bf2b33513052500473d0d6d025a80dcecbfChet Haase            case FragmentTransaction.TRANSIT_FRAGMENT_NEXT:
14269ff82bf2b33513052500473d0d6d025a80dcecbfChet Haase                animAttr = enter
14279ff82bf2b33513052500473d0d6d025a80dcecbfChet Haase                    ? com.android.internal.R.styleable.FragmentAnimation_fragmentNextEnterAnimation
14289ff82bf2b33513052500473d0d6d025a80dcecbfChet Haase                    : com.android.internal.R.styleable.FragmentAnimation_fragmentNextExitAnimation;
14299ff82bf2b33513052500473d0d6d025a80dcecbfChet Haase                break;
14309ff82bf2b33513052500473d0d6d025a80dcecbfChet Haase            case FragmentTransaction.TRANSIT_FRAGMENT_PREV:
14319ff82bf2b33513052500473d0d6d025a80dcecbfChet Haase                animAttr = enter
14329ff82bf2b33513052500473d0d6d025a80dcecbfChet Haase                    ? com.android.internal.R.styleable.FragmentAnimation_fragmentPrevEnterAnimation
14339ff82bf2b33513052500473d0d6d025a80dcecbfChet Haase                    : com.android.internal.R.styleable.FragmentAnimation_fragmentPrevExitAnimation;
14349ff82bf2b33513052500473d0d6d025a80dcecbfChet Haase                break;
1435f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn        }
1436f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn        return animAttr;
1437f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn    }
14382dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn}
1439