FragmentManager.java revision 3e449ce00ed2d3b271e50bc7a52798f630973bf1
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 352dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackbornimport java.util.ArrayList; 362dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn 37b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn/** 38b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * Interface for interacting with {@link Fragment} objects inside of an 39b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * {@link Activity} 40b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn */ 41b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackbornpublic interface FragmentManager { 42b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn /** 43b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * Start a series of edit operations on the Fragments associated with 44b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * this FragmentManager. 45b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn */ 46b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn public FragmentTransaction openTransaction(); 47b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn 48b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn /** 49b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * Finds a fragment that was identified by the given id either when inflated 50b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * from XML or as the container ID when added in a transaction. This first 51b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * searches through fragments that are currently added to the manager's 52b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * activity; if no such fragment is found, then all fragments currently 53b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * on the back stack associated with this ID are searched. 54b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * @return The fragment if found or null otherwise. 55b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn */ 56b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn public Fragment findFragmentById(int id); 57b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn 58b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn /** 59b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * Finds a fragment that was identified by the given tag either when inflated 60b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * from XML or as supplied when added in a transaction. This first 61b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * searches through fragments that are currently added to the manager's 62b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * activity; if no such fragment is found, then all fragments currently 63b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * on the back stack are searched. 64b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * @return The fragment if found or null otherwise. 65b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn */ 66b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn public Fragment findFragmentByTag(String tag); 67b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn 68b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn /** 69b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * Flag for {@link #popBackStack(String, int)} 70b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * and {@link #popBackStack(int, int)}: If set, and the name or ID of 71b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * a back stack entry has been supplied, then all matching entries will 72b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * be consumed until one that doesn't match is found or the bottom of 73b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * the stack is reached. Otherwise, all entries up to but not including that entry 74b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * will be removed. 75b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn */ 76b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn public static final int POP_BACK_STACK_INCLUSIVE = 1<<0; 77b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn 78b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn /** 79b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * Pop the top state off the back stack. Returns true if there was one 80b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * to pop, else false. 81b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn */ 82b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn public boolean popBackStack(); 83b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn 84b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn /** 85b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * Pop the last fragment transition from the manager's fragment 86b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * back stack. If there is nothing to pop, false is returned. 87b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * @param name If non-null, this is the name of a previous back state 88b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * to look for; if found, all states up to that state will be popped. The 89b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * {@link #POP_BACK_STACK_INCLUSIVE} flag can be used to control whether 90b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * the named state itself is popped. If null, only the top state is popped. 91b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * @param flags Either 0 or {@link #POP_BACK_STACK_INCLUSIVE}. 92b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn */ 93b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn public boolean popBackStack(String name, int flags); 94b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn 95b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn /** 96b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * Pop all back stack states up to the one with the given identifier. 97b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * @param id Identifier of the stated to be popped. If no identifier exists, 98b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * false is returned. 99b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * The identifier is the number returned by 100b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * {@link FragmentTransaction#commit() FragmentTransaction.commit()}. The 101b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * {@link #POP_BACK_STACK_INCLUSIVE} flag can be used to control whether 102b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * the named state itself is popped. 103b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * @param flags Either 0 or {@link #POP_BACK_STACK_INCLUSIVE}. 104b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn */ 105b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn public boolean popBackStack(int id, int flags); 106b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn 107b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn /** 108b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * Put a reference to a fragment in a Bundle. This Bundle can be 109b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * persisted as saved state, and when later restoring 110b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * {@link #getFragment(Bundle, String)} will return the current 111b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * instance of the same fragment. 112b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * 113b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * @param bundle The bundle in which to put the fragment reference. 114b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * @param key The name of the entry in the bundle. 115b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * @param fragment The Fragment whose reference is to be stored. 116b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn */ 117b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn public void putFragment(Bundle bundle, String key, Fragment fragment); 118b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn 119b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn /** 120b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * Retrieve the current Fragment instance for a reference previously 121b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * placed with {@link #putFragment(Bundle, String, Fragment)}. 122b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * 123b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * @param bundle The bundle from which to retrieve the fragment reference. 124b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * @param key The name of the entry in the bundle. 125b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * @return Returns the current Fragment instance that is associated with 126b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * the given reference. 127b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn */ 128b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn public Fragment getFragment(Bundle bundle, String key); 129b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn} 130b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn 131b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackbornfinal class FragmentManagerState implements Parcelable { 1326e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn FragmentState[] mActive; 133b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn int[] mAdded; 134b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn BackStackState[] mBackStack; 135b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn 136b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn public FragmentManagerState() { 137b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 138b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn 139b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn public FragmentManagerState(Parcel in) { 1406e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn mActive = in.createTypedArray(FragmentState.CREATOR); 141b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn mAdded = in.createIntArray(); 142b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn mBackStack = in.createTypedArray(BackStackState.CREATOR); 143b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 144b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn 145b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn public int describeContents() { 146b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn return 0; 147b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 148b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn 149b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn public void writeToParcel(Parcel dest, int flags) { 1506e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn dest.writeTypedArray(mActive, flags); 151b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn dest.writeIntArray(mAdded); 152b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn dest.writeTypedArray(mBackStack, flags); 153b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 154b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn 155b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn public static final Parcelable.Creator<FragmentManagerState> CREATOR 156b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn = new Parcelable.Creator<FragmentManagerState>() { 157b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn public FragmentManagerState createFromParcel(Parcel in) { 158b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn return new FragmentManagerState(in); 159b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 160b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn 161b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn public FragmentManagerState[] newArray(int size) { 162b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn return new FragmentManagerState[size]; 163b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 164b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn }; 165ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn} 166ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn 1672dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn/** 1682dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn * Container for fragments associated with an activity. 1692dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn */ 170def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackbornfinal class FragmentManagerImpl implements FragmentManager { 1715ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn static final boolean DEBUG = true; 1725ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn static final String TAG = "FragmentManager"; 1735ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn 174def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn static final String TARGET_REQUEST_CODE_STATE_TAG = "android:target_req_state"; 175def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn static final String TARGET_STATE_TAG = "android:target_state"; 176def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn static final String VIEW_STATE_TAG = "android:view_state"; 177def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn 178445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn ArrayList<Runnable> mPendingActions; 179445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn Runnable[] mTmpActions; 180445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn boolean mExecutingActions; 181445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn 1826e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn ArrayList<Fragment> mActive; 1836e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn ArrayList<Fragment> mAdded; 1846e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn ArrayList<Integer> mAvailIndices; 185b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn ArrayList<BackStackEntry> mBackStack; 1862dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn 187dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn // Must be accessed while locked. 188dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn ArrayList<BackStackEntry> mBackStackIndices; 189dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn ArrayList<Integer> mAvailBackStackIndices; 190dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn 1912dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn int mCurState = Fragment.INITIALIZING; 1922dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn Activity mActivity; 1932dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn 194b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn boolean mNeedMenuInvalidate; 1953e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn boolean mStateSaved; 196b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn 197b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn // Temporary vars for state save and restore. 198b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn Bundle mStateBundle = null; 199b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn SparseArray<Parcelable> mStateArray = null; 200b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn 201445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn Runnable mExecCommit = new Runnable() { 202445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn @Override 203445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn public void run() { 204445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn execPendingActions(); 205445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn } 206445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn }; 207b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn public FragmentTransaction openTransaction() { 208b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn return new BackStackEntry(this); 209b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn } 210b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn 211b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn public boolean popBackStack() { 212b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn return popBackStackState(mActivity.mHandler, null, -1, 0); 213b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn } 214b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn 215b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn public boolean popBackStack(String name, int flags) { 216b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn return popBackStackState(mActivity.mHandler, name, -1, flags); 217b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn } 218b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn 219b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn public boolean popBackStack(int id, int flags) { 220b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn if (id < 0) { 221b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn throw new IllegalArgumentException("Bad id: " + id); 222b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn } 223b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn return popBackStackState(mActivity.mHandler, null, id, flags); 224b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn } 225b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn 226b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn public void putFragment(Bundle bundle, String key, Fragment fragment) { 227b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn if (fragment.mIndex < 0) { 228b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn throw new IllegalStateException("Fragment " + fragment 229b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn + " is not currently in the FragmentManager"); 230b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn } 231b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn bundle.putInt(key, fragment.mIndex); 232b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn } 233b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn 234b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn public Fragment getFragment(Bundle bundle, String key) { 235def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn int index = bundle.getInt(key, -1); 236def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn if (index == -1) { 237def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn return null; 238def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn } 239b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn if (index >= mActive.size()) { 240b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn throw new IllegalStateException("Fragement no longer exists for key " 241b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn + key + ": index " + index); 242b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn } 243b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn Fragment f = mActive.get(index); 244b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn if (f == null) { 245b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn throw new IllegalStateException("Fragement no longer exists for key " 246b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn + key + ": index " + index); 247b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn } 248b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn return f; 249b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn } 250b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn 251a18a86b43e40e3c15dcca0ae0148d641be9b25feChet Haase Animator loadAnimator(Fragment fragment, int transit, boolean enter, 252f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn int transitionStyle) { 253a18a86b43e40e3c15dcca0ae0148d641be9b25feChet Haase Animator animObj = fragment.onCreateAnimator(transit, enter, 2545ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn fragment.mNextAnim); 255f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn if (animObj != null) { 256f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn return animObj; 257f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } 258f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn 2595ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn if (fragment.mNextAnim != 0) { 260a18a86b43e40e3c15dcca0ae0148d641be9b25feChet Haase Animator anim = AnimatorInflater.loadAnimator(mActivity, fragment.mNextAnim); 2615ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn if (anim != null) { 2625ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn return anim; 2635ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn } 2645ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn } 2655ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn 266f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn if (transit == 0) { 267f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn return null; 268f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } 269f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn 270f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn int styleIndex = transitToStyleIndex(transit, enter); 271f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn if (styleIndex < 0) { 272f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn return null; 273f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } 274f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn 275f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn if (transitionStyle == 0 && mActivity.getWindow() != null) { 276f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn transitionStyle = mActivity.getWindow().getAttributes().windowAnimations; 277f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } 278f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn if (transitionStyle == 0) { 279f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn return null; 280f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } 281f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn 282f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn TypedArray attrs = mActivity.obtainStyledAttributes(transitionStyle, 283811ed1065f39469cf2cf6adba22cab397ed88d5eChet Haase com.android.internal.R.styleable.FragmentAnimation); 284f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn int anim = attrs.getResourceId(styleIndex, 0); 285f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn attrs.recycle(); 286f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn 287f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn if (anim == 0) { 288f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn return null; 289f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } 290f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn 291a18a86b43e40e3c15dcca0ae0148d641be9b25feChet Haase return AnimatorInflater.loadAnimator(mActivity, anim); 292f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } 293f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn 294f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn void moveToState(Fragment f, int newState, int transit, int transitionStyle) { 2956e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn // Fragments that are not currently added will sit in the onCreate() state. 2966e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (!f.mAdded && newState > Fragment.CREATED) { 2976e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn newState = Fragment.CREATED; 2986e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } 2996e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn 3002dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn if (f.mState < newState) { 3012dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn switch (f.mState) { 3022dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn case Fragment.INITIALIZING: 3035ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn if (DEBUG) Log.v(TAG, "moveto CREATED: " + f); 304def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn if (f.mSavedFragmentState != null) { 305def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn f.mSavedViewState = f.mSavedFragmentState.getSparseParcelableArray( 306def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn FragmentManagerImpl.VIEW_STATE_TAG); 307def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn f.mTarget = getFragment(f.mSavedFragmentState, 308def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn FragmentManagerImpl.TARGET_STATE_TAG); 309def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn if (f.mTarget != null) { 310def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn f.mTargetRequestCode = f.mSavedFragmentState.getInt( 311def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn FragmentManagerImpl.TARGET_REQUEST_CODE_STATE_TAG, 0); 312def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn } 313def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn } 3142dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn f.mActivity = mActivity; 3152dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn f.mCalled = false; 3162dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn f.onAttach(mActivity); 3172dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn if (!f.mCalled) { 3182dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn throw new SuperNotCalledException("Fragment " + f 3192dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn + " did not call through to super.onAttach()"); 3202dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 321c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn mActivity.onAttachFragment(f); 3222dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn 323b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn if (!f.mRetaining) { 324b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn f.mCalled = false; 325b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn f.onCreate(f.mSavedFragmentState); 326b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn if (!f.mCalled) { 327b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn throw new SuperNotCalledException("Fragment " + f 328b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn + " did not call through to super.onCreate()"); 3292dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 3302dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 331b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn f.mRetaining = false; 332b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn if (f.mFromLayout) { 333b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn // For fragments that are part of the content view 334b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn // layout, we need to instantiate the view immediately 335b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn // and the inflater will take care of adding it. 336b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn f.mView = f.onCreateView(mActivity.getLayoutInflater(), 337b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn null, f.mSavedFragmentState); 3386e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (f.mView != null) { 3396e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn f.mView.setSaveFromParentEnabled(false); 3406e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn f.restoreViewState(); 3415ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn if (f.mHidden) f.mView.setVisibility(View.GONE); 3426e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } 343b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 3446e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn case Fragment.CREATED: 3456e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (newState > Fragment.CREATED) { 3465ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn if (DEBUG) Log.v(TAG, "moveto CONTENT: " + f); 347b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn if (!f.mFromLayout) { 348b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn ViewGroup container = null; 349b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn if (f.mContainerId != 0) { 350b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn container = (ViewGroup)mActivity.findViewById(f.mContainerId); 351b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn if (container == null) { 352b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn throw new IllegalArgumentException("New view found for id 0x" 353b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn + Integer.toHexString(f.mContainerId) 354b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn + " for fragment " + f); 355b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 356b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 357b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn f.mContainer = container; 358b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn f.mView = f.onCreateView(mActivity.getLayoutInflater(), 359b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn container, f.mSavedFragmentState); 360b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn if (f.mView != null) { 361b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn f.mView.setSaveFromParentEnabled(false); 362b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn if (container != null) { 363a18a86b43e40e3c15dcca0ae0148d641be9b25feChet Haase Animator anim = loadAnimator(f, transit, true, 364b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn transitionStyle); 365b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn if (anim != null) { 366b20db3ec34e846010f389880b2cfab4d7bf79820Chet Haase anim.setTarget(f.mView); 367811ed1065f39469cf2cf6adba22cab397ed88d5eChet Haase anim.start(); 368b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 369b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn container.addView(f.mView); 370b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn f.restoreViewState(); 371b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 3725ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn if (f.mHidden) f.mView.setVisibility(View.GONE); 373b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 374b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 375b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn 376b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn f.mCalled = false; 377c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn f.onActivityCreated(f.mSavedFragmentState); 378b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn if (!f.mCalled) { 379b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn throw new SuperNotCalledException("Fragment " + f 380b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn + " did not call through to super.onReady()"); 381f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } 382b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn f.mSavedFragmentState = null; 3832dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 384c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn case Fragment.ACTIVITY_CREATED: 385c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn if (newState > Fragment.ACTIVITY_CREATED) { 3865ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn if (DEBUG) Log.v(TAG, "moveto STARTED: " + f); 3872dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn f.mCalled = false; 3882dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn f.onStart(); 3892dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn if (!f.mCalled) { 3902dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn throw new SuperNotCalledException("Fragment " + f 3912dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn + " did not call through to super.onStart()"); 3922dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 3932dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 3942dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn case Fragment.STARTED: 3952dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn if (newState > Fragment.STARTED) { 3965ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn if (DEBUG) Log.v(TAG, "moveto RESUMED: " + f); 3972dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn f.mCalled = false; 3982707d6026240bcca6f0e35e2e1138958882e90ceDianne Hackborn f.mResumed = true; 3992dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn f.onResume(); 4002dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn if (!f.mCalled) { 4012dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn throw new SuperNotCalledException("Fragment " + f 4022dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn + " did not call through to super.onResume()"); 4032dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 4042dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 4052dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 4062dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } else if (f.mState > newState) { 4072dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn switch (f.mState) { 4082dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn case Fragment.RESUMED: 4092dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn if (newState < Fragment.RESUMED) { 4105ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn if (DEBUG) Log.v(TAG, "movefrom RESUMED: " + f); 4112dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn f.mCalled = false; 4122dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn f.onPause(); 4132dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn if (!f.mCalled) { 4142dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn throw new SuperNotCalledException("Fragment " + f 4152dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn + " did not call through to super.onPause()"); 4162dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 4172707d6026240bcca6f0e35e2e1138958882e90ceDianne Hackborn f.mResumed = false; 4182dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 4192dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn case Fragment.STARTED: 4202dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn if (newState < Fragment.STARTED) { 4215ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn if (DEBUG) Log.v(TAG, "movefrom STARTED: " + f); 4222dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn f.mCalled = false; 4232707d6026240bcca6f0e35e2e1138958882e90ceDianne Hackborn f.performStop(); 4242dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn if (!f.mCalled) { 4252dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn throw new SuperNotCalledException("Fragment " + f 4262dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn + " did not call through to super.onStop()"); 4272dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 4282dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 429c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn case Fragment.ACTIVITY_CREATED: 430c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn if (newState < Fragment.ACTIVITY_CREATED) { 4315ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn if (DEBUG) Log.v(TAG, "movefrom CONTENT: " + f); 432b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn if (f.mView != null) { 433b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn // Need to save the current view state if not 434b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn // done already. 4356e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (!mActivity.isFinishing() && f.mSavedFragmentState == null) { 436b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn saveFragmentViewState(f); 437b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 438def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn } 439def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn f.mCalled = false; 440def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn f.onDestroyView(); 441def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn if (!f.mCalled) { 442def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn throw new SuperNotCalledException("Fragment " + f 443def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn + " did not call through to super.onDestroyedView()"); 444def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn } 445def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn if (f.mView != null && f.mContainer != null) { 446b20db3ec34e846010f389880b2cfab4d7bf79820Chet Haase Animator anim = null; 447def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn if (mCurState > Fragment.INITIALIZING) { 448b20db3ec34e846010f389880b2cfab4d7bf79820Chet Haase anim = loadAnimator(f, transit, false, 449def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn transitionStyle); 450b20db3ec34e846010f389880b2cfab4d7bf79820Chet Haase } 451b20db3ec34e846010f389880b2cfab4d7bf79820Chet Haase if (anim != null) { 452b20db3ec34e846010f389880b2cfab4d7bf79820Chet Haase final ViewGroup container = f.mContainer; 453b20db3ec34e846010f389880b2cfab4d7bf79820Chet Haase final View view = f.mView; 454b20db3ec34e846010f389880b2cfab4d7bf79820Chet Haase container.startViewTransition(view); 455b20db3ec34e846010f389880b2cfab4d7bf79820Chet Haase anim.addListener(new AnimatorListenerAdapter() { 456b20db3ec34e846010f389880b2cfab4d7bf79820Chet Haase @Override 457b20db3ec34e846010f389880b2cfab4d7bf79820Chet Haase public void onAnimationEnd(Animator anim) { 458b20db3ec34e846010f389880b2cfab4d7bf79820Chet Haase container.endViewTransition(view); 459b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 460b20db3ec34e846010f389880b2cfab4d7bf79820Chet Haase }); 461b20db3ec34e846010f389880b2cfab4d7bf79820Chet Haase anim.setTarget(f.mView); 462b20db3ec34e846010f389880b2cfab4d7bf79820Chet Haase anim.start(); 463b20db3ec34e846010f389880b2cfab4d7bf79820Chet Haase 464f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } 465def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn f.mContainer.removeView(f.mView); 4662dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 4672dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn f.mContainer = null; 4682dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn f.mView = null; 469b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 470b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn case Fragment.CREATED: 471b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn if (newState < Fragment.CREATED) { 4725ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn if (DEBUG) Log.v(TAG, "movefrom CREATED: " + f); 473b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn if (!f.mRetaining) { 474b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn f.mCalled = false; 475b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn f.onDestroy(); 476b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn if (!f.mCalled) { 477b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn throw new SuperNotCalledException("Fragment " + f 478b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn + " did not call through to super.onDestroy()"); 479b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 4802dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 481b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn 4822dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn f.mCalled = false; 4832dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn f.onDetach(); 4842dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn if (!f.mCalled) { 4852dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn throw new SuperNotCalledException("Fragment " + f 4862dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn + " did not call through to super.onDetach()"); 4872dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 4883e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn f.mImmediateActivity = null; 4892dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn f.mActivity = null; 4902dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 4912dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 4922dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 4932dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn 4942dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn f.mState = newState; 4952dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 4962dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn 497ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn void moveToState(int newState, boolean always) { 498f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn moveToState(newState, 0, 0, always); 499f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } 500f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn 501f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn void moveToState(int newState, int transit, int transitStyle, boolean always) { 5022dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn if (mActivity == null && newState != Fragment.INITIALIZING) { 5032dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn throw new IllegalStateException("No activity"); 5042dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 5052dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn 506ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn if (!always && mCurState == newState) { 507ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn return; 508ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn } 509ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn 5102dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn mCurState = newState; 5116e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (mActive != null) { 5126e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn for (int i=0; i<mActive.size(); i++) { 5136e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn Fragment f = mActive.get(i); 5146e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (f != null) { 5156e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn moveToState(f, newState, transit, transitStyle); 5166e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } 5176e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } 5185f36c96f6d3623a826466db68cc1586f078ac307Dianne Hackborn 5195f36c96f6d3623a826466db68cc1586f078ac307Dianne Hackborn if (mNeedMenuInvalidate && mActivity != null) { 5205f36c96f6d3623a826466db68cc1586f078ac307Dianne Hackborn mActivity.invalidateOptionsMenu(); 5215f36c96f6d3623a826466db68cc1586f078ac307Dianne Hackborn mNeedMenuInvalidate = false; 5225f36c96f6d3623a826466db68cc1586f078ac307Dianne Hackborn } 5236e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } 5246e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } 5256e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn 5266e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn void makeActive(Fragment f) { 5276e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (f.mIndex >= 0) { 5286e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn return; 5296e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } 5306e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn 5316e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (mAvailIndices == null || mAvailIndices.size() <= 0) { 5326e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (mActive == null) { 5336e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn mActive = new ArrayList<Fragment>(); 534ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn } 5356e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn f.setIndex(mActive.size()); 5366e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn mActive.add(f); 5376e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn 5386e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } else { 5396e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn f.setIndex(mAvailIndices.remove(mAvailIndices.size()-1)); 5406e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn mActive.set(f.mIndex, f); 5412dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 5422dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 5432dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn 5446e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn void makeInactive(Fragment f) { 5456e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (f.mIndex < 0) { 5466e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn return; 5476e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } 5486e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn 549b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn if (DEBUG) Log.v(TAG, "Freeing fragment index " + f.mIndex); 5506e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn mActive.set(f.mIndex, null); 5516e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (mAvailIndices == null) { 5526e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn mAvailIndices = new ArrayList<Integer>(); 5536e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } 5546e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn mAvailIndices.add(f.mIndex); 5559e14e9f33a66b864b98c6ff9517988bafbca3301Dianne Hackborn mActivity.invalidateFragmentIndex(f.mIndex); 5566e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn f.clearIndex(); 5576e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } 5586e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn 559ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn public void addFragment(Fragment fragment, boolean moveToStateNow) { 5606e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (mAdded == null) { 5616e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn mAdded = new ArrayList<Fragment>(); 562ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn } 5636e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn mAdded.add(fragment); 5646e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn makeActive(fragment); 5655e0d59547c4042037e23a42ba4e2521721e9c7d3Dianne Hackborn if (DEBUG) Log.v(TAG, "add: " + fragment); 5666e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn fragment.mAdded = true; 567b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn if (fragment.mHasMenu) { 568b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn mNeedMenuInvalidate = true; 569b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn } 570ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn if (moveToStateNow) { 571f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn moveToState(fragment, mCurState, 0, 0); 572ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn } 5732dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 5742dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn 575f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn public void removeFragment(Fragment fragment, int transition, int transitionStyle) { 5765e0d59547c4042037e23a42ba4e2521721e9c7d3Dianne Hackborn if (DEBUG) Log.v(TAG, "remove: " + fragment + " nesting=" + fragment.mBackStackNesting); 5776e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn mAdded.remove(fragment); 5786e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn final boolean inactive = fragment.mBackStackNesting <= 0; 579b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn if (fragment.mHasMenu) { 580b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn mNeedMenuInvalidate = true; 581b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn } 5826e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn fragment.mAdded = false; 5836e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn moveToState(fragment, inactive ? Fragment.INITIALIZING : Fragment.CREATED, 5846e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn transition, transitionStyle); 5855e0d59547c4042037e23a42ba4e2521721e9c7d3Dianne Hackborn if (inactive) { 5865e0d59547c4042037e23a42ba4e2521721e9c7d3Dianne Hackborn makeInactive(fragment); 5875e0d59547c4042037e23a42ba4e2521721e9c7d3Dianne Hackborn } 588f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } 589f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn 5905ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn public void hideFragment(Fragment fragment, int transition, int transitionStyle) { 5915ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn if (DEBUG) Log.v(TAG, "hide: " + fragment); 5925ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn if (!fragment.mHidden) { 5935ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn fragment.mHidden = true; 5945ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn if (fragment.mView != null) { 595a18a86b43e40e3c15dcca0ae0148d641be9b25feChet Haase Animator anim = loadAnimator(fragment, transition, true, 5965ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn transitionStyle); 5975ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn if (anim != null) { 598b20db3ec34e846010f389880b2cfab4d7bf79820Chet Haase anim.setTarget(fragment.mView); 599811ed1065f39469cf2cf6adba22cab397ed88d5eChet Haase anim.start(); 6005ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn } 6015ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn fragment.mView.setVisibility(View.GONE); 6025ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn } 603b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn if (fragment.mAdded && fragment.mHasMenu) { 604b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn mNeedMenuInvalidate = true; 605b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn } 6065ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn fragment.onHiddenChanged(true); 6075ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn } 6085ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn } 6095ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn 6105ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn public void showFragment(Fragment fragment, int transition, int transitionStyle) { 6115ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn if (DEBUG) Log.v(TAG, "show: " + fragment); 6125ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn if (fragment.mHidden) { 6135ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn fragment.mHidden = false; 6145ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn if (fragment.mView != null) { 615a18a86b43e40e3c15dcca0ae0148d641be9b25feChet Haase Animator anim = loadAnimator(fragment, transition, true, 6165ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn transitionStyle); 6175ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn if (anim != null) { 618b20db3ec34e846010f389880b2cfab4d7bf79820Chet Haase anim.setTarget(fragment.mView); 619811ed1065f39469cf2cf6adba22cab397ed88d5eChet Haase anim.start(); 6205ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn } 6215ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn fragment.mView.setVisibility(View.VISIBLE); 6225ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn } 623b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn if (fragment.mAdded && fragment.mHasMenu) { 624b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn mNeedMenuInvalidate = true; 625b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn } 6265ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn fragment.onHiddenChanged(false); 6275ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn } 6285ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn } 6295ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn 630f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn public Fragment findFragmentById(int id) { 6316e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (mActive != null) { 6325ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn // First look through added fragments. 6335ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn for (int i=mAdded.size()-1; i>=0; i--) { 6345ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn Fragment f = mAdded.get(i); 6355ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn if (f != null && f.mFragmentId == id) { 6365ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn return f; 6375ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn } 6385ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn } 6395ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn // Now for any known fragment. 6406e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn for (int i=mActive.size()-1; i>=0; i--) { 6416e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn Fragment f = mActive.get(i); 6426e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (f != null && f.mFragmentId == id) { 643b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn return f; 644b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 645b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 646b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 647b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn return null; 648b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 649b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn 650b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn public Fragment findFragmentByTag(String tag) { 6516e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (mActive != null && tag != null) { 6525ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn // First look through added fragments. 6535ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn for (int i=mAdded.size()-1; i>=0; i--) { 6545ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn Fragment f = mAdded.get(i); 6555ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn if (f != null && tag.equals(f.mTag)) { 6565ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn return f; 6575ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn } 6585ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn } 6595ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn // Now for any known fragment. 6606e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn for (int i=mActive.size()-1; i>=0; i--) { 6616e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn Fragment f = mActive.get(i); 6626e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (f != null && tag.equals(f.mTag)) { 6636e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn return f; 6646e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } 6656e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } 6666e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } 6676e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn return null; 6686e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } 6696e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn 6706e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn public Fragment findFragmentByWho(String who) { 6716e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (mActive != null && who != null) { 6726e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn for (int i=mActive.size()-1; i>=0; i--) { 6736e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn Fragment f = mActive.get(i); 6746e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (f != null && who.equals(f.mWho)) { 675f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn return f; 676f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } 677f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } 678f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } 679f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn return null; 6802dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 6812dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn 682445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn public void enqueueAction(Runnable action) { 6833e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn if (mStateSaved) { 6843e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn throw new IllegalStateException( 6853e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn "Can not perform this action after onSaveInstanceState"); 6863e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn } 687445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn synchronized (this) { 688445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn if (mPendingActions == null) { 689445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn mPendingActions = new ArrayList<Runnable>(); 690445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn } 691445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn mPendingActions.add(action); 692445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn if (mPendingActions.size() == 1) { 693445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn mActivity.mHandler.removeCallbacks(mExecCommit); 694445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn mActivity.mHandler.post(mExecCommit); 695445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn } 696445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn } 697445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn } 698445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn 699dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn public int allocBackStackIndex(BackStackEntry bse) { 700dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn synchronized (this) { 701dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn if (mAvailBackStackIndices == null || mAvailBackStackIndices.size() <= 0) { 702dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn if (mBackStackIndices == null) { 703dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn mBackStackIndices = new ArrayList<BackStackEntry>(); 704dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn } 705dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn int index = mBackStackIndices.size(); 706dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn if (DEBUG) Log.v(TAG, "Setting back stack index " + index + " to " + bse); 707dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn mBackStackIndices.add(bse); 708dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn return index; 709dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn 710dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn } else { 711dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn int index = mAvailBackStackIndices.remove(mAvailBackStackIndices.size()-1); 712dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn if (DEBUG) Log.v(TAG, "Adding back stack index " + index + " with " + bse); 713dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn mBackStackIndices.set(index, bse); 714dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn return index; 715dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn } 716dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn } 717dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn } 718dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn 719dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn public void setBackStackIndex(int index, BackStackEntry bse) { 720dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn synchronized (this) { 721dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn if (mBackStackIndices == null) { 722dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn mBackStackIndices = new ArrayList<BackStackEntry>(); 723dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn } 724dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn int N = mBackStackIndices.size(); 725dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn if (index < N) { 726dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn if (DEBUG) Log.v(TAG, "Setting back stack index " + index + " to " + bse); 727dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn mBackStackIndices.set(index, bse); 728dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn } else { 729dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn while (N < index) { 730dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn mBackStackIndices.add(null); 731dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn if (mAvailBackStackIndices == null) { 732dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn mAvailBackStackIndices = new ArrayList<Integer>(); 733dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn } 734dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn if (DEBUG) Log.v(TAG, "Adding available back stack index " + N); 735dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn mAvailBackStackIndices.add(N); 736dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn N++; 737dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn } 738dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn if (DEBUG) Log.v(TAG, "Adding back stack index " + index + " with " + bse); 739dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn mBackStackIndices.add(bse); 740dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn } 741dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn } 742dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn } 743dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn 744dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn public void freeBackStackIndex(int index) { 745dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn synchronized (this) { 746dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn mBackStackIndices.set(index, null); 747dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn if (mAvailBackStackIndices == null) { 748dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn mAvailBackStackIndices = new ArrayList<Integer>(); 749dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn } 750dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn if (DEBUG) Log.v(TAG, "Freeing back stack index " + index); 751dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn mAvailBackStackIndices.add(index); 752dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn } 753dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn } 754dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn 755445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn /** 756445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn * Only call from main thread! 757445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn */ 758445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn public void execPendingActions() { 759445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn if (mExecutingActions) { 760445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn throw new IllegalStateException("Recursive entry to execPendingActions"); 761445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn } 762445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn 763445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn while (true) { 764445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn int numActions; 765445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn 766445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn synchronized (this) { 767445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn if (mPendingActions == null || mPendingActions.size() == 0) { 768445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn return; 769445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn } 770445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn 771445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn numActions = mPendingActions.size(); 772445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn if (mTmpActions == null || mTmpActions.length < numActions) { 773445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn mTmpActions = new Runnable[numActions]; 774445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn } 775445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn mPendingActions.toArray(mTmpActions); 776445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn mPendingActions.clear(); 777445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn mActivity.mHandler.removeCallbacks(mExecCommit); 778445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn } 779445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn 780445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn mExecutingActions = true; 781445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn for (int i=0; i<numActions; i++) { 782445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn mTmpActions[i].run(); 783445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn } 784445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn mExecutingActions = false; 785445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn } 786445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn } 787445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn 788b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn public void addBackStackState(BackStackEntry state) { 789ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn if (mBackStack == null) { 790b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn mBackStack = new ArrayList<BackStackEntry>(); 791ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn } 792ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn mBackStack.add(state); 793ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn } 794ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn 795dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn boolean popBackStackState(Handler handler, String name, int id, int flags) { 796ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn if (mBackStack == null) { 797ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn return false; 798ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn } 799b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn if (name == null && id < 0 && (flags&Activity.POP_BACK_STACK_INCLUSIVE) == 0) { 800f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn int last = mBackStack.size()-1; 801f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn if (last < 0) { 802f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn return false; 803f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } 804b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn final BackStackEntry bss = mBackStack.remove(last); 805445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn enqueueAction(new Runnable() { 806f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn public void run() { 807445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn if (DEBUG) Log.v(TAG, "Popping back stack state: " + bss); 8085f36c96f6d3623a826466db68cc1586f078ac307Dianne Hackborn bss.popFromBackStack(true); 809f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } 810f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn }); 811f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } else { 812b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn int index = -1; 813b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn if (name != null || id >= 0) { 814b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn // If a name or ID is specified, look for that place in 815b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn // the stack. 816b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn index = mBackStack.size()-1; 817b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn while (index >= 0) { 818b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn BackStackEntry bss = mBackStack.get(index); 819b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn if (name != null && name.equals(bss.getName())) { 820b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn break; 821b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn } 822b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn if (id >= 0 && id == bss.mIndex) { 823b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn break; 824b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn } 825b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn index--; 826dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn } 827b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn if (index < 0) { 828b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn return false; 829b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn } 830b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn if ((flags&Activity.POP_BACK_STACK_INCLUSIVE) != 0) { 831b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn index--; 832b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn // Consume all following entries that match. 833b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn while (index >= 0) { 834b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn BackStackEntry bss = mBackStack.get(index); 835b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn if ((name != null && name.equals(bss.getName())) 836b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn || (id >= 0 && id == bss.mIndex)) { 837b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn index--; 838b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn continue; 839b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn } 840b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn break; 841b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn } 842f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } 843dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn } 844dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn if (index == mBackStack.size()-1) { 845f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn return false; 846f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } 847b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn final ArrayList<BackStackEntry> states 848b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn = new ArrayList<BackStackEntry>(); 849f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn for (int i=mBackStack.size()-1; i>index; i--) { 850f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn states.add(mBackStack.remove(i)); 851ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn } 852445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn enqueueAction(new Runnable() { 853f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn public void run() { 8545f36c96f6d3623a826466db68cc1586f078ac307Dianne Hackborn final int LAST = states.size()-1; 8555f36c96f6d3623a826466db68cc1586f078ac307Dianne Hackborn for (int i=0; i<=LAST; i++) { 856445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn if (DEBUG) Log.v(TAG, "Popping back stack state: " + states.get(i)); 8575f36c96f6d3623a826466db68cc1586f078ac307Dianne Hackborn states.get(i).popFromBackStack(i == LAST); 858f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } 859f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } 860f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn }); 861f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } 862ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn return true; 863ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn } 864ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn 865b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn ArrayList<Fragment> retainNonConfig() { 866b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn ArrayList<Fragment> fragments = null; 8676e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (mActive != null) { 8686e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn for (int i=0; i<mActive.size(); i++) { 8696e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn Fragment f = mActive.get(i); 8706e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (f != null && f.mRetainInstance) { 871b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn if (fragments == null) { 872b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn fragments = new ArrayList<Fragment>(); 873b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 874b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn fragments.add(f); 875b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn f.mRetaining = true; 876b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 877b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 878b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 879b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn return fragments; 880b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 881b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn 882b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn void saveFragmentViewState(Fragment f) { 8836e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (f.mView == null) { 884b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn return; 885b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 886b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn if (mStateArray == null) { 887b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn mStateArray = new SparseArray<Parcelable>(); 888b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 889b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn f.mView.saveHierarchyState(mStateArray); 890b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn if (mStateArray.size() > 0) { 891b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn f.mSavedViewState = mStateArray; 892b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn mStateArray = null; 893b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 894b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 895b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn 8966e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn Parcelable saveAllState() { 8973e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn mStateSaved = true; 8983e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn 8996e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (mActive == null || mActive.size() <= 0) { 9006e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn return null; 901b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 902b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn 9036e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn // First collect all active fragments. 9046e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn int N = mActive.size(); 9056e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn FragmentState[] active = new FragmentState[N]; 9066e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn boolean haveFragments = false; 9076e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn for (int i=0; i<N; i++) { 9086e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn Fragment f = mActive.get(i); 9096e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (f != null) { 9106e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn haveFragments = true; 9116e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn 9126e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn FragmentState fs = new FragmentState(f); 9136e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn active[i] = fs; 9146e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn 9156e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (mStateBundle == null) { 9166e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn mStateBundle = new Bundle(); 9176e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } 9186e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn f.onSaveInstanceState(mStateBundle); 9196e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (!mStateBundle.isEmpty()) { 9206e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn fs.mSavedFragmentState = mStateBundle; 9216e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn mStateBundle = null; 922b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 9236e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn 9246e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (f.mView != null) { 9256e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn saveFragmentViewState(f); 9266e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (f.mSavedViewState != null) { 9276e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (fs.mSavedFragmentState == null) { 9286e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn fs.mSavedFragmentState = new Bundle(); 9296e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } 9306e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn fs.mSavedFragmentState.putSparseParcelableArray( 931def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn FragmentManagerImpl.VIEW_STATE_TAG, f.mSavedViewState); 932def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn } 933def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn } 934def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn 935def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn if (f.mTarget != null) { 936def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn if (fs.mSavedFragmentState == null) { 937def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn fs.mSavedFragmentState = new Bundle(); 938def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn } 939def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn putFragment(fs.mSavedFragmentState, 940def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn FragmentManagerImpl.TARGET_STATE_TAG, f.mTarget); 941def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn if (f.mTargetRequestCode != 0) { 942def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn fs.mSavedFragmentState.putInt( 943def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn FragmentManagerImpl.TARGET_REQUEST_CODE_STATE_TAG, 944def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn f.mTargetRequestCode); 9456e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } 9466e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } 9476e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn 948b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn if (DEBUG) Log.v(TAG, "Saved state of " + f + ": " 949b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn + fs.mSavedFragmentState); 950b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 951b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 952b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn 9536e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (!haveFragments) { 954b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn if (DEBUG) Log.v(TAG, "saveAllState: no fragments!"); 955b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn return null; 956b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 957b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn 958b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn int[] added = null; 959b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn BackStackState[] backStack = null; 960b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn 9616e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn // Build list of currently added fragments. 9626e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn N = mAdded.size(); 963b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn if (N > 0) { 964b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn added = new int[N]; 965b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn for (int i=0; i<N; i++) { 9666e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn added[i] = mAdded.get(i).mIndex; 967b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn if (DEBUG) Log.v(TAG, "saveAllState: adding fragment #" + i 968b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn + ": " + mAdded.get(i)); 969b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 970b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 971b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn 972b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn // Now save back stack. 973b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn if (mBackStack != null) { 974b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn N = mBackStack.size(); 975b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn if (N > 0) { 976b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn backStack = new BackStackState[N]; 977b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn for (int i=0; i<N; i++) { 978b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn backStack[i] = new BackStackState(this, mBackStack.get(i)); 979b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn if (DEBUG) Log.v(TAG, "saveAllState: adding back stack #" + i 980b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn + ": " + mBackStack.get(i)); 981b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 982b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 983b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 984b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn 985b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn FragmentManagerState fms = new FragmentManagerState(); 9866e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn fms.mActive = active; 987b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn fms.mAdded = added; 988b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn fms.mBackStack = backStack; 989b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn return fms; 990b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 991b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn 992b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn void restoreAllState(Parcelable state, ArrayList<Fragment> nonConfig) { 993b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn // If there is no saved state at all, then there can not be 994b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn // any nonConfig fragments either, so that is that. 995b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn if (state == null) return; 996b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn FragmentManagerState fms = (FragmentManagerState)state; 9976e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (fms.mActive == null) return; 998b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn 9996e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn // First re-attach any non-config instances we are retaining back 10006e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn // to their saved state, so we don't try to instantiate them again. 1001b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn if (nonConfig != null) { 1002b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn for (int i=0; i<nonConfig.size(); i++) { 1003b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn Fragment f = nonConfig.get(i); 1004b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn if (DEBUG) Log.v(TAG, "restoreAllState: re-attaching retained " + f); 10056e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn FragmentState fs = fms.mActive[f.mIndex]; 1006b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn fs.mInstance = f; 1007b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn f.mSavedViewState = null; 10086e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn f.mBackStackNesting = 0; 10096e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn f.mAdded = false; 1010b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn if (fs.mSavedFragmentState != null) { 1011b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn f.mSavedViewState = fs.mSavedFragmentState.getSparseParcelableArray( 1012def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn FragmentManagerImpl.VIEW_STATE_TAG); 1013b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 1014b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 1015b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 1016b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn 10176e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn // Build the full list of active fragments, instantiating them from 10186e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn // their saved state. 10196e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn mActive = new ArrayList<Fragment>(fms.mActive.length); 10206e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (mAvailIndices != null) { 10216e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn mAvailIndices.clear(); 10226e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } 10236e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn for (int i=0; i<fms.mActive.length; i++) { 10246e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn FragmentState fs = fms.mActive[i]; 10256e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (fs != null) { 1026b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn Fragment f = fs.instantiate(mActivity); 1027b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn if (DEBUG) Log.v(TAG, "restoreAllState: adding #" + i + ": " + f); 1028b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn mActive.add(f); 10296e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } else { 1030b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn if (DEBUG) Log.v(TAG, "restoreAllState: adding #" + i + ": (null)"); 10316e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn mActive.add(null); 10326e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (mAvailIndices == null) { 10336e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn mAvailIndices = new ArrayList<Integer>(); 10346e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } 1035b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn if (DEBUG) Log.v(TAG, "restoreAllState: adding avail #" + i); 10366e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn mAvailIndices.add(i); 1037b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 10386e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } 10396e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn 10403e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn // Update the target of all retained fragments. 10413e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn if (nonConfig != null) { 10423e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn for (int i=0; i<nonConfig.size(); i++) { 10433e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn Fragment f = nonConfig.get(i); 10443e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn if (f.mTarget != null) { 10453e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn if (f.mTarget.mIndex < mActive.size()) { 10463e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn f.mTarget = mActive.get(f.mTarget.mIndex); 10473e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn } else { 10483e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn Log.w(TAG, "Re-attaching retained fragment " + f 10493e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn + " target no longer exists: " + f.mTarget); 10503e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn f.mTarget = null; 10513e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn } 10523e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn } 10533e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn } 10543e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn } 10553e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn 10566e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn // Build the list of currently added fragments. 10576e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (fms.mAdded != null) { 10586e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn mAdded = new ArrayList<Fragment>(fms.mAdded.length); 1059b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn for (int i=0; i<fms.mAdded.length; i++) { 10606e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn Fragment f = mActive.get(fms.mAdded[i]); 10616e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (f == null) { 10626e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn throw new IllegalStateException( 10636e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn "No instantiated fragment for index #" + fms.mAdded[i]); 1064b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 10656e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn f.mAdded = true; 1066b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn f.mImmediateActivity = mActivity; 1067b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn if (DEBUG) Log.v(TAG, "restoreAllState: making added #" + i + ": " + f); 10686e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn mAdded.add(f); 1069b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 10706e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } else { 10716e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn mAdded = null; 1072b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 10736e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn 10746e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn // Build the back stack. 1075b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn if (fms.mBackStack != null) { 1076b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn mBackStack = new ArrayList<BackStackEntry>(fms.mBackStack.length); 1077b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn for (int i=0; i<fms.mBackStack.length; i++) { 1078b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn BackStackEntry bse = fms.mBackStack[i].instantiate(this); 1079b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn if (DEBUG) Log.v(TAG, "restoreAllState: adding bse #" + i 1080b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn + " (index " + bse.mIndex + "): " + bse); 1081b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn mBackStack.add(bse); 1082dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn if (bse.mIndex >= 0) { 1083dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn setBackStackIndex(bse.mIndex, bse); 1084dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn } 1085b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 10866e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } else { 10876e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn mBackStack = null; 1088b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 1089b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 1090b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn 10912dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn public void attachActivity(Activity activity) { 10922dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn if (mActivity != null) throw new IllegalStateException(); 10932dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn mActivity = activity; 10942dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 10952dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn 1096b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn public void dispatchCreate() { 10973e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn mStateSaved = false; 1098ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn moveToState(Fragment.CREATED, false); 10992dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 11002dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn 1101c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn public void dispatchActivityCreated() { 11023e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn mStateSaved = false; 1103c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn moveToState(Fragment.ACTIVITY_CREATED, false); 1104c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn } 1105c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn 11062dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn public void dispatchStart() { 11073e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn mStateSaved = false; 1108ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn moveToState(Fragment.STARTED, false); 11092dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 11102dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn 11112dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn public void dispatchResume() { 11123e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn mStateSaved = false; 1113ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn moveToState(Fragment.RESUMED, false); 11142dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 11152dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn 11162dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn public void dispatchPause() { 1117ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn moveToState(Fragment.STARTED, false); 11182dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 11192dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn 11202dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn public void dispatchStop() { 1121c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn moveToState(Fragment.ACTIVITY_CREATED, false); 11222dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 11232dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn 11242dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn public void dispatchDestroy() { 1125ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn moveToState(Fragment.INITIALIZING, false); 11262dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn mActivity = null; 11272dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 1128f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn 1129b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn public boolean dispatchCreateOptionsMenu(Menu menu, MenuInflater inflater) { 1130b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn boolean show = false; 1131b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn if (mActive != null) { 1132b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn for (int i=0; i<mAdded.size(); i++) { 1133b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn Fragment f = mAdded.get(i); 1134b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn if (f != null && !f.mHidden && f.mHasMenu) { 1135b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn show = true; 1136b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn f.onCreateOptionsMenu(menu, inflater); 1137b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn } 1138b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn } 1139b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn } 1140b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn return show; 1141b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn } 1142b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn 1143b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn public boolean dispatchPrepareOptionsMenu(Menu menu) { 1144b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn boolean show = false; 1145b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn if (mActive != null) { 1146b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn for (int i=0; i<mAdded.size(); i++) { 1147b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn Fragment f = mAdded.get(i); 1148b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn if (f != null && !f.mHidden && f.mHasMenu) { 1149b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn show = true; 1150b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn f.onPrepareOptionsMenu(menu); 1151b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn } 1152b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn } 1153b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn } 1154b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn return show; 1155b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn } 1156b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn 1157b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn public boolean dispatchOptionsItemSelected(MenuItem item) { 1158b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn if (mActive != null) { 1159b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn for (int i=0; i<mAdded.size(); i++) { 1160b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn Fragment f = mAdded.get(i); 1161b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn if (f != null && !f.mHidden && f.mHasMenu) { 1162b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn if (f.onOptionsItemSelected(item)) { 1163b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn return true; 1164b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn } 1165b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn } 1166b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn } 1167b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn } 1168b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn return false; 1169b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn } 1170b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn 11715ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn public boolean dispatchContextItemSelected(MenuItem item) { 11725ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn if (mActive != null) { 11735ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn for (int i=0; i<mAdded.size(); i++) { 11745ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn Fragment f = mAdded.get(i); 11755ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn if (f != null && !f.mHidden) { 11765ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn if (f.onContextItemSelected(item)) { 11775ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn return true; 11785ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn } 11795ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn } 11805ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn } 11815ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn } 11825ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn return false; 11835ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn } 11845ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn 1185b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn public void dispatchOptionsMenuClosed(Menu menu) { 1186b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn if (mActive != null) { 1187b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn for (int i=0; i<mAdded.size(); i++) { 1188b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn Fragment f = mAdded.get(i); 1189b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn if (f != null && !f.mHidden && f.mHasMenu) { 1190b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn f.onOptionsMenuClosed(menu); 1191b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn } 1192b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn } 1193b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn } 1194b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn } 1195b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn 1196f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn public static int reverseTransit(int transit) { 1197f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn int rev = 0; 1198f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn switch (transit) { 1199811ed1065f39469cf2cf6adba22cab397ed88d5eChet Haase case FragmentTransaction.TRANSIT_FRAGMENT_OPEN: 1200811ed1065f39469cf2cf6adba22cab397ed88d5eChet Haase rev = FragmentTransaction.TRANSIT_FRAGMENT_CLOSE; 1201f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn break; 1202811ed1065f39469cf2cf6adba22cab397ed88d5eChet Haase case FragmentTransaction.TRANSIT_FRAGMENT_CLOSE: 1203811ed1065f39469cf2cf6adba22cab397ed88d5eChet Haase rev = FragmentTransaction.TRANSIT_FRAGMENT_OPEN; 1204f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn break; 1205f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } 1206f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn return rev; 1207f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn 1208f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } 1209f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn 1210f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn public static int transitToStyleIndex(int transit, boolean enter) { 1211f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn int animAttr = -1; 1212f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn switch (transit) { 1213811ed1065f39469cf2cf6adba22cab397ed88d5eChet Haase case FragmentTransaction.TRANSIT_FRAGMENT_OPEN: 1214f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn animAttr = enter 1215811ed1065f39469cf2cf6adba22cab397ed88d5eChet Haase ? com.android.internal.R.styleable.FragmentAnimation_fragmentOpenEnterAnimation 1216811ed1065f39469cf2cf6adba22cab397ed88d5eChet Haase : com.android.internal.R.styleable.FragmentAnimation_fragmentOpenExitAnimation; 1217f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn break; 1218811ed1065f39469cf2cf6adba22cab397ed88d5eChet Haase case FragmentTransaction.TRANSIT_FRAGMENT_CLOSE: 1219f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn animAttr = enter 1220811ed1065f39469cf2cf6adba22cab397ed88d5eChet Haase ? com.android.internal.R.styleable.FragmentAnimation_fragmentCloseEnterAnimation 1221811ed1065f39469cf2cf6adba22cab397ed88d5eChet Haase : com.android.internal.R.styleable.FragmentAnimation_fragmentCloseExitAnimation; 1222f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn break; 1223f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } 1224f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn return animAttr; 1225f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } 12262dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn} 1227