FragmentManager.java revision 5f36c96f6d3623a826466db68cc1586f078ac307
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 19811ed1065f39469cf2cf6adba22cab397ed88d5eChet Haaseimport android.animation.Animatable; 20d51d368f2d512ab657b8ae45780c82c0dbea94c3Chet Haaseimport android.animation.AnimatableInflater; 21811ed1065f39469cf2cf6adba22cab397ed88d5eChet Haaseimport android.animation.PropertyAnimator; 22811ed1065f39469cf2cf6adba22cab397ed88d5eChet Haaseimport android.animation.Sequencer; 23f121be737c59390d97e21a92be8e166001534c7dDianne Hackbornimport android.content.res.TypedArray; 242dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackbornimport android.os.Bundle; 25ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackbornimport android.os.Handler; 26b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackbornimport android.os.Parcel; 27b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackbornimport android.os.Parcelable; 285ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackbornimport android.util.Log; 29b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackbornimport android.util.SparseArray; 30b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackbornimport android.view.Menu; 31b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackbornimport android.view.MenuInflater; 32b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackbornimport android.view.MenuItem; 335ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackbornimport android.view.View; 342dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackbornimport android.view.ViewGroup; 352dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn 362dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackbornimport java.util.ArrayList; 372dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn 38b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn/** 39b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * Interface for interacting with {@link Fragment} objects inside of an 40b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * {@link Activity} 41b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn */ 42b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackbornpublic interface FragmentManager { 43b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn /** 44b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * Start a series of edit operations on the Fragments associated with 45b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * this FragmentManager. 46b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn */ 47b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn public FragmentTransaction openTransaction(); 48b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn 49b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn /** 50b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * Finds a fragment that was identified by the given id either when inflated 51b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * from XML or as the container ID when added in a transaction. This first 52b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * searches through fragments that are currently added to the manager's 53b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * activity; if no such fragment is found, then all fragments currently 54b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * on the back stack associated with this ID are searched. 55b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * @return The fragment if found or null otherwise. 56b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn */ 57b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn public Fragment findFragmentById(int id); 58b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn 59b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn /** 60b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * Finds a fragment that was identified by the given tag either when inflated 61b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * from XML or as supplied when added in a transaction. This first 62b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * searches through fragments that are currently added to the manager's 63b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * activity; if no such fragment is found, then all fragments currently 64b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * on the back stack are searched. 65b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * @return The fragment if found or null otherwise. 66b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn */ 67b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn public Fragment findFragmentByTag(String tag); 68b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn 69b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn /** 70b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * Flag for {@link #popBackStack(String, int)} 71b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * and {@link #popBackStack(int, int)}: If set, and the name or ID of 72b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * a back stack entry has been supplied, then all matching entries will 73b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * be consumed until one that doesn't match is found or the bottom of 74b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * the stack is reached. Otherwise, all entries up to but not including that entry 75b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * will be removed. 76b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn */ 77b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn public static final int POP_BACK_STACK_INCLUSIVE = 1<<0; 78b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn 79b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn /** 80b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * Pop the top state off the back stack. Returns true if there was one 81b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * to pop, else false. 82b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn */ 83b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn public boolean popBackStack(); 84b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn 85b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn /** 86b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * Pop the last fragment transition from the manager's fragment 87b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * back stack. If there is nothing to pop, false is returned. 88b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * @param name If non-null, this is the name of a previous back state 89b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * to look for; if found, all states up to that state will be popped. The 90b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * {@link #POP_BACK_STACK_INCLUSIVE} flag can be used to control whether 91b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * the named state itself is popped. If null, only the top state is popped. 92b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * @param flags Either 0 or {@link #POP_BACK_STACK_INCLUSIVE}. 93b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn */ 94b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn public boolean popBackStack(String name, int flags); 95b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn 96b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn /** 97b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * Pop all back stack states up to the one with the given identifier. 98b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * @param id Identifier of the stated to be popped. If no identifier exists, 99b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * false is returned. 100b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * The identifier is the number returned by 101b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * {@link FragmentTransaction#commit() FragmentTransaction.commit()}. The 102b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * {@link #POP_BACK_STACK_INCLUSIVE} flag can be used to control whether 103b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * the named state itself is popped. 104b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * @param flags Either 0 or {@link #POP_BACK_STACK_INCLUSIVE}. 105b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn */ 106b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn public boolean popBackStack(int id, int flags); 107b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn 108b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn /** 109b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * Put a reference to a fragment in a Bundle. This Bundle can be 110b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * persisted as saved state, and when later restoring 111b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * {@link #getFragment(Bundle, String)} will return the current 112b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * instance of the same fragment. 113b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * 114b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * @param bundle The bundle in which to put the fragment reference. 115b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * @param key The name of the entry in the bundle. 116b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * @param fragment The Fragment whose reference is to be stored. 117b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn */ 118b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn public void putFragment(Bundle bundle, String key, Fragment fragment); 119b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn 120b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn /** 121b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * Retrieve the current Fragment instance for a reference previously 122b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * placed with {@link #putFragment(Bundle, String, Fragment)}. 123b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * 124b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * @param bundle The bundle from which to retrieve the fragment reference. 125b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * @param key The name of the entry in the bundle. 126b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * @return Returns the current Fragment instance that is associated with 127b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * the given reference. 128b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn */ 129b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn public Fragment getFragment(Bundle bundle, String key); 130b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn} 131b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn 132b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackbornfinal class FragmentManagerState implements Parcelable { 1336e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn FragmentState[] mActive; 134b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn int[] mAdded; 135b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn BackStackState[] mBackStack; 136b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn 137b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn public FragmentManagerState() { 138b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 139b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn 140b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn public FragmentManagerState(Parcel in) { 1416e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn mActive = in.createTypedArray(FragmentState.CREATOR); 142b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn mAdded = in.createIntArray(); 143b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn mBackStack = in.createTypedArray(BackStackState.CREATOR); 144b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 145b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn 146b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn public int describeContents() { 147b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn return 0; 148b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 149b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn 150b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn public void writeToParcel(Parcel dest, int flags) { 1516e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn dest.writeTypedArray(mActive, flags); 152b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn dest.writeIntArray(mAdded); 153b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn dest.writeTypedArray(mBackStack, flags); 154b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 155b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn 156b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn public static final Parcelable.Creator<FragmentManagerState> CREATOR 157b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn = new Parcelable.Creator<FragmentManagerState>() { 158b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn public FragmentManagerState createFromParcel(Parcel in) { 159b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn return new FragmentManagerState(in); 160b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 161b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn 162b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn public FragmentManagerState[] newArray(int size) { 163b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn return new FragmentManagerState[size]; 164b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 165b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn }; 166ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn} 167ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn 1682dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn/** 1692dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn * Container for fragments associated with an activity. 1702dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn */ 171def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackbornfinal class FragmentManagerImpl implements FragmentManager { 1725ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn static final boolean DEBUG = true; 1735ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn static final String TAG = "FragmentManager"; 1745ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn 175def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn static final String TARGET_REQUEST_CODE_STATE_TAG = "android:target_req_state"; 176def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn static final String TARGET_STATE_TAG = "android:target_state"; 177def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn static final String VIEW_STATE_TAG = "android:view_state"; 178def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn 179445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn ArrayList<Runnable> mPendingActions; 180445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn Runnable[] mTmpActions; 181445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn boolean mExecutingActions; 182445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn 1836e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn ArrayList<Fragment> mActive; 1846e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn ArrayList<Fragment> mAdded; 1856e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn ArrayList<Integer> mAvailIndices; 186b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn ArrayList<BackStackEntry> mBackStack; 1872dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn 188dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn // Must be accessed while locked. 189dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn ArrayList<BackStackEntry> mBackStackIndices; 190dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn ArrayList<Integer> mAvailBackStackIndices; 191dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn 1922dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn int mCurState = Fragment.INITIALIZING; 1932dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn Activity mActivity; 1942dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn 195b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn boolean mNeedMenuInvalidate; 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 251811ed1065f39469cf2cf6adba22cab397ed88d5eChet Haase Animatable loadAnimatable(Fragment fragment, int transit, boolean enter, 252f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn int transitionStyle) { 253811ed1065f39469cf2cf6adba22cab397ed88d5eChet Haase Animatable animObj = fragment.onCreateAnimatable(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) { 260d51d368f2d512ab657b8ae45780c82c0dbea94c3Chet Haase Animatable anim = AnimatableInflater.loadAnimatable(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 291d51d368f2d512ab657b8ae45780c82c0dbea94c3Chet Haase return AnimatableInflater.loadAnimatable(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) { 363811ed1065f39469cf2cf6adba22cab397ed88d5eChet Haase Animatable anim = loadAnimatable(f, transit, true, 364b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn transitionStyle); 365b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn if (anim != null) { 366811ed1065f39469cf2cf6adba22cab397ed88d5eChet Haase if (anim instanceof Sequencer) { 367811ed1065f39469cf2cf6adba22cab397ed88d5eChet Haase ((Sequencer)anim).setTarget(f.mView); 368811ed1065f39469cf2cf6adba22cab397ed88d5eChet Haase } else if (anim instanceof PropertyAnimator) { 369811ed1065f39469cf2cf6adba22cab397ed88d5eChet Haase ((PropertyAnimator)anim).setTarget(f.mView); 370811ed1065f39469cf2cf6adba22cab397ed88d5eChet Haase } 371811ed1065f39469cf2cf6adba22cab397ed88d5eChet Haase anim.start(); 372b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 373b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn container.addView(f.mView); 374b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn f.restoreViewState(); 375b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 3765ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn if (f.mHidden) f.mView.setVisibility(View.GONE); 377b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 378b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 379b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn 380b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn f.mCalled = false; 381c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn f.onActivityCreated(f.mSavedFragmentState); 382b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn if (!f.mCalled) { 383b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn throw new SuperNotCalledException("Fragment " + f 384b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn + " did not call through to super.onReady()"); 385f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } 386b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn f.mSavedFragmentState = null; 3872dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 388c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn case Fragment.ACTIVITY_CREATED: 389c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn if (newState > Fragment.ACTIVITY_CREATED) { 3905ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn if (DEBUG) Log.v(TAG, "moveto STARTED: " + f); 3912dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn f.mCalled = false; 3922dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn f.onStart(); 3932dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn if (!f.mCalled) { 3942dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn throw new SuperNotCalledException("Fragment " + f 3952dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn + " did not call through to super.onStart()"); 3962dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 3972dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 3982dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn case Fragment.STARTED: 3992dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn if (newState > Fragment.STARTED) { 4005ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn if (DEBUG) Log.v(TAG, "moveto RESUMED: " + f); 4012dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn f.mCalled = false; 4022707d6026240bcca6f0e35e2e1138958882e90ceDianne Hackborn f.mResumed = true; 4032dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn f.onResume(); 4042dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn if (!f.mCalled) { 4052dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn throw new SuperNotCalledException("Fragment " + f 4062dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn + " did not call through to super.onResume()"); 4072dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 4082dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 4092dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 4102dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } else if (f.mState > newState) { 4112dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn switch (f.mState) { 4122dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn case Fragment.RESUMED: 4132dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn if (newState < Fragment.RESUMED) { 4145ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn if (DEBUG) Log.v(TAG, "movefrom RESUMED: " + f); 4152dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn f.mCalled = false; 4162dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn f.onPause(); 4172dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn if (!f.mCalled) { 4182dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn throw new SuperNotCalledException("Fragment " + f 4192dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn + " did not call through to super.onPause()"); 4202dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 4212707d6026240bcca6f0e35e2e1138958882e90ceDianne Hackborn f.mResumed = false; 4222dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 4232dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn case Fragment.STARTED: 4242dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn if (newState < Fragment.STARTED) { 4255ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn if (DEBUG) Log.v(TAG, "movefrom STARTED: " + f); 4262dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn f.mCalled = false; 4272707d6026240bcca6f0e35e2e1138958882e90ceDianne Hackborn f.performStop(); 4282dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn if (!f.mCalled) { 4292dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn throw new SuperNotCalledException("Fragment " + f 4302dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn + " did not call through to super.onStop()"); 4312dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 4322dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 433c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn case Fragment.ACTIVITY_CREATED: 434c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn if (newState < Fragment.ACTIVITY_CREATED) { 4355ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn if (DEBUG) Log.v(TAG, "movefrom CONTENT: " + f); 436b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn if (f.mView != null) { 437b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn // Need to save the current view state if not 438b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn // done already. 4396e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (!mActivity.isFinishing() && f.mSavedFragmentState == null) { 440b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn saveFragmentViewState(f); 441b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 442def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn } 443def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn f.mCalled = false; 444def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn f.onDestroyView(); 445def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn if (!f.mCalled) { 446def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn throw new SuperNotCalledException("Fragment " + f 447def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn + " did not call through to super.onDestroyedView()"); 448def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn } 449def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn if (f.mView != null && f.mContainer != null) { 450def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn if (mCurState > Fragment.INITIALIZING) { 451def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn Animatable anim = loadAnimatable(f, transit, true, 452def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn transitionStyle); 453def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn if (anim != null) { 454def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn if (anim instanceof Sequencer) { 455def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn ((Sequencer)anim).setTarget(f.mView); 456def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn } else if (anim instanceof PropertyAnimator) { 457def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn ((PropertyAnimator)anim).setTarget(f.mView); 458b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 459def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn anim.start(); 460b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 461f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } 462def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn f.mContainer.removeView(f.mView); 4632dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 4642dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn f.mContainer = null; 4652dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn f.mView = null; 466b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 467b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn case Fragment.CREATED: 468b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn if (newState < Fragment.CREATED) { 4695ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn if (DEBUG) Log.v(TAG, "movefrom CREATED: " + f); 470b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn if (!f.mRetaining) { 471b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn f.mCalled = false; 472b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn f.onDestroy(); 473b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn if (!f.mCalled) { 474b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn throw new SuperNotCalledException("Fragment " + f 475b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn + " did not call through to super.onDestroy()"); 476b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 4772dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 478b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn 4792dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn f.mCalled = false; 4802dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn f.onDetach(); 4812dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn if (!f.mCalled) { 4822dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn throw new SuperNotCalledException("Fragment " + f 4832dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn + " did not call through to super.onDetach()"); 4842dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 4852dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn f.mActivity = null; 4862dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 4872dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 4882dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 4892dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn 4902dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn f.mState = newState; 4912dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 4922dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn 493ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn void moveToState(int newState, boolean always) { 494f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn moveToState(newState, 0, 0, always); 495f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } 496f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn 497f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn void moveToState(int newState, int transit, int transitStyle, boolean always) { 4982dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn if (mActivity == null && newState != Fragment.INITIALIZING) { 4992dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn throw new IllegalStateException("No activity"); 5002dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 5012dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn 502ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn if (!always && mCurState == newState) { 503ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn return; 504ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn } 505ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn 5062dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn mCurState = newState; 5076e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (mActive != null) { 5086e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn for (int i=0; i<mActive.size(); i++) { 5096e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn Fragment f = mActive.get(i); 5106e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (f != null) { 5116e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn moveToState(f, newState, transit, transitStyle); 5126e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } 5136e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } 5145f36c96f6d3623a826466db68cc1586f078ac307Dianne Hackborn 5155f36c96f6d3623a826466db68cc1586f078ac307Dianne Hackborn if (mNeedMenuInvalidate && mActivity != null) { 5165f36c96f6d3623a826466db68cc1586f078ac307Dianne Hackborn mActivity.invalidateOptionsMenu(); 5175f36c96f6d3623a826466db68cc1586f078ac307Dianne Hackborn mNeedMenuInvalidate = false; 5185f36c96f6d3623a826466db68cc1586f078ac307Dianne Hackborn } 5196e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } 5206e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } 5216e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn 5226e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn void makeActive(Fragment f) { 5236e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (f.mIndex >= 0) { 5246e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn return; 5256e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } 5266e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn 5276e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (mAvailIndices == null || mAvailIndices.size() <= 0) { 5286e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (mActive == null) { 5296e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn mActive = new ArrayList<Fragment>(); 530ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn } 5316e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn f.setIndex(mActive.size()); 5326e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn mActive.add(f); 5336e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn 5346e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } else { 5356e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn f.setIndex(mAvailIndices.remove(mAvailIndices.size()-1)); 5366e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn mActive.set(f.mIndex, f); 5372dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 5382dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 5392dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn 5406e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn void makeInactive(Fragment f) { 5416e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (f.mIndex < 0) { 5426e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn return; 5436e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } 5446e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn 545b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn if (DEBUG) Log.v(TAG, "Freeing fragment index " + f.mIndex); 5466e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn mActive.set(f.mIndex, null); 5476e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (mAvailIndices == null) { 5486e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn mAvailIndices = new ArrayList<Integer>(); 5496e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } 5506e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn mAvailIndices.add(f.mIndex); 5519e14e9f33a66b864b98c6ff9517988bafbca3301Dianne Hackborn mActivity.invalidateFragmentIndex(f.mIndex); 5526e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn f.clearIndex(); 5536e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } 5546e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn 555ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn public void addFragment(Fragment fragment, boolean moveToStateNow) { 5566e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (mAdded == null) { 5576e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn mAdded = new ArrayList<Fragment>(); 558ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn } 5596e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn mAdded.add(fragment); 5606e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn makeActive(fragment); 5615e0d59547c4042037e23a42ba4e2521721e9c7d3Dianne Hackborn if (DEBUG) Log.v(TAG, "add: " + fragment); 5626e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn fragment.mAdded = true; 563b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn if (fragment.mHasMenu) { 564b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn mNeedMenuInvalidate = true; 565b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn } 566ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn if (moveToStateNow) { 567f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn moveToState(fragment, mCurState, 0, 0); 568ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn } 5692dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 5702dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn 571f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn public void removeFragment(Fragment fragment, int transition, int transitionStyle) { 5725e0d59547c4042037e23a42ba4e2521721e9c7d3Dianne Hackborn if (DEBUG) Log.v(TAG, "remove: " + fragment + " nesting=" + fragment.mBackStackNesting); 5736e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn mAdded.remove(fragment); 5746e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn final boolean inactive = fragment.mBackStackNesting <= 0; 575b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn if (fragment.mHasMenu) { 576b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn mNeedMenuInvalidate = true; 577b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn } 5786e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn fragment.mAdded = false; 5796e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn moveToState(fragment, inactive ? Fragment.INITIALIZING : Fragment.CREATED, 5806e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn transition, transitionStyle); 5815e0d59547c4042037e23a42ba4e2521721e9c7d3Dianne Hackborn if (inactive) { 5825e0d59547c4042037e23a42ba4e2521721e9c7d3Dianne Hackborn makeInactive(fragment); 5835e0d59547c4042037e23a42ba4e2521721e9c7d3Dianne Hackborn } 584f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } 585f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn 5865ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn public void hideFragment(Fragment fragment, int transition, int transitionStyle) { 5875ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn if (DEBUG) Log.v(TAG, "hide: " + fragment); 5885ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn if (!fragment.mHidden) { 5895ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn fragment.mHidden = true; 5905ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn if (fragment.mView != null) { 591811ed1065f39469cf2cf6adba22cab397ed88d5eChet Haase Animatable anim = loadAnimatable(fragment, transition, true, 5925ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn transitionStyle); 5935ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn if (anim != null) { 594811ed1065f39469cf2cf6adba22cab397ed88d5eChet Haase if (anim instanceof Sequencer) { 595811ed1065f39469cf2cf6adba22cab397ed88d5eChet Haase ((Sequencer)anim).setTarget(fragment.mView); 596811ed1065f39469cf2cf6adba22cab397ed88d5eChet Haase } else if (anim instanceof PropertyAnimator) { 597811ed1065f39469cf2cf6adba22cab397ed88d5eChet Haase ((PropertyAnimator)anim).setTarget(fragment.mView); 598811ed1065f39469cf2cf6adba22cab397ed88d5eChet Haase } 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) { 615811ed1065f39469cf2cf6adba22cab397ed88d5eChet Haase Animatable anim = loadAnimatable(fragment, transition, true, 6165ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn transitionStyle); 6175ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn if (anim != null) { 618811ed1065f39469cf2cf6adba22cab397ed88d5eChet Haase if (anim instanceof Sequencer) { 619811ed1065f39469cf2cf6adba22cab397ed88d5eChet Haase ((Sequencer)anim).setTarget(fragment.mView); 620811ed1065f39469cf2cf6adba22cab397ed88d5eChet Haase } else if (anim instanceof PropertyAnimator) { 621811ed1065f39469cf2cf6adba22cab397ed88d5eChet Haase ((PropertyAnimator)anim).setTarget(fragment.mView); 622811ed1065f39469cf2cf6adba22cab397ed88d5eChet Haase } 623811ed1065f39469cf2cf6adba22cab397ed88d5eChet Haase anim.start(); 6245ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn } 6255ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn fragment.mView.setVisibility(View.VISIBLE); 6265ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn } 627b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn if (fragment.mAdded && fragment.mHasMenu) { 628b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn mNeedMenuInvalidate = true; 629b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn } 6305ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn fragment.onHiddenChanged(false); 6315ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn } 6325ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn } 6335ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn 634f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn public Fragment findFragmentById(int id) { 6356e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (mActive != null) { 6365ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn // First look through added fragments. 6375ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn for (int i=mAdded.size()-1; i>=0; i--) { 6385ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn Fragment f = mAdded.get(i); 6395ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn if (f != null && f.mFragmentId == id) { 6405ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn return f; 6415ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn } 6425ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn } 6435ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn // Now for any known fragment. 6446e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn for (int i=mActive.size()-1; i>=0; i--) { 6456e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn Fragment f = mActive.get(i); 6466e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (f != null && f.mFragmentId == id) { 647b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn return f; 648b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 649b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 650b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 651b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn return null; 652b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 653b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn 654b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn public Fragment findFragmentByTag(String tag) { 6556e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (mActive != null && tag != null) { 6565ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn // First look through added fragments. 6575ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn for (int i=mAdded.size()-1; i>=0; i--) { 6585ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn Fragment f = mAdded.get(i); 6595ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn if (f != null && tag.equals(f.mTag)) { 6605ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn return f; 6615ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn } 6625ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn } 6635ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn // Now for any known fragment. 6646e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn for (int i=mActive.size()-1; i>=0; i--) { 6656e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn Fragment f = mActive.get(i); 6666e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (f != null && tag.equals(f.mTag)) { 6676e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn return f; 6686e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } 6696e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } 6706e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } 6716e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn return null; 6726e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } 6736e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn 6746e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn public Fragment findFragmentByWho(String who) { 6756e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (mActive != null && who != null) { 6766e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn for (int i=mActive.size()-1; i>=0; i--) { 6776e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn Fragment f = mActive.get(i); 6786e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (f != null && who.equals(f.mWho)) { 679f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn return f; 680f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } 681f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } 682f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } 683f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn return null; 6842dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 6852dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn 686445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn public void enqueueAction(Runnable action) { 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() { 8976e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (mActive == null || mActive.size() <= 0) { 8986e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn return null; 899b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 900b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn 9016e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn // First collect all active fragments. 9026e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn int N = mActive.size(); 9036e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn FragmentState[] active = new FragmentState[N]; 9046e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn boolean haveFragments = false; 9056e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn for (int i=0; i<N; i++) { 9066e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn Fragment f = mActive.get(i); 9076e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (f != null) { 9086e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn haveFragments = true; 9096e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn 9106e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn FragmentState fs = new FragmentState(f); 9116e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn active[i] = fs; 9126e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn 9136e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (mStateBundle == null) { 9146e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn mStateBundle = new Bundle(); 9156e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } 9166e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn f.onSaveInstanceState(mStateBundle); 9176e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (!mStateBundle.isEmpty()) { 9186e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn fs.mSavedFragmentState = mStateBundle; 9196e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn mStateBundle = null; 920b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 9216e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn 9226e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (f.mView != null) { 9236e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn saveFragmentViewState(f); 9246e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (f.mSavedViewState != null) { 9256e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (fs.mSavedFragmentState == null) { 9266e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn fs.mSavedFragmentState = new Bundle(); 9276e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } 9286e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn fs.mSavedFragmentState.putSparseParcelableArray( 929def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn FragmentManagerImpl.VIEW_STATE_TAG, f.mSavedViewState); 930def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn } 931def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn } 932def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn 933def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn if (f.mTarget != null) { 934def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn if (fs.mSavedFragmentState == null) { 935def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn fs.mSavedFragmentState = new Bundle(); 936def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn } 937def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn putFragment(fs.mSavedFragmentState, 938def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn FragmentManagerImpl.TARGET_STATE_TAG, f.mTarget); 939def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn if (f.mTargetRequestCode != 0) { 940def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn fs.mSavedFragmentState.putInt( 941def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn FragmentManagerImpl.TARGET_REQUEST_CODE_STATE_TAG, 942def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn f.mTargetRequestCode); 9436e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } 9446e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } 9456e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn 946b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn if (DEBUG) Log.v(TAG, "Saved state of " + f + ": " 947b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn + fs.mSavedFragmentState); 948b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 949b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 950b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn 9516e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (!haveFragments) { 952b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn if (DEBUG) Log.v(TAG, "saveAllState: no fragments!"); 953b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn return null; 954b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 955b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn 956b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn int[] added = null; 957b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn BackStackState[] backStack = null; 958b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn 9596e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn // Build list of currently added fragments. 9606e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn N = mAdded.size(); 961b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn if (N > 0) { 962b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn added = new int[N]; 963b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn for (int i=0; i<N; i++) { 9646e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn added[i] = mAdded.get(i).mIndex; 965b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn if (DEBUG) Log.v(TAG, "saveAllState: adding fragment #" + i 966b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn + ": " + mAdded.get(i)); 967b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 968b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 969b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn 970b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn // Now save back stack. 971b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn if (mBackStack != null) { 972b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn N = mBackStack.size(); 973b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn if (N > 0) { 974b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn backStack = new BackStackState[N]; 975b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn for (int i=0; i<N; i++) { 976b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn backStack[i] = new BackStackState(this, mBackStack.get(i)); 977b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn if (DEBUG) Log.v(TAG, "saveAllState: adding back stack #" + i 978b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn + ": " + mBackStack.get(i)); 979b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 980b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 981b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 982b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn 983b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn FragmentManagerState fms = new FragmentManagerState(); 9846e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn fms.mActive = active; 985b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn fms.mAdded = added; 986b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn fms.mBackStack = backStack; 987b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn return fms; 988b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 989b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn 990b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn void restoreAllState(Parcelable state, ArrayList<Fragment> nonConfig) { 991b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn // If there is no saved state at all, then there can not be 992b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn // any nonConfig fragments either, so that is that. 993b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn if (state == null) return; 994b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn FragmentManagerState fms = (FragmentManagerState)state; 9956e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (fms.mActive == null) return; 996b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn 9976e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn // First re-attach any non-config instances we are retaining back 9986e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn // to their saved state, so we don't try to instantiate them again. 999b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn if (nonConfig != null) { 1000b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn for (int i=0; i<nonConfig.size(); i++) { 1001b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn Fragment f = nonConfig.get(i); 1002b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn if (DEBUG) Log.v(TAG, "restoreAllState: re-attaching retained " + f); 10036e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn FragmentState fs = fms.mActive[f.mIndex]; 1004b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn fs.mInstance = f; 1005b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn f.mSavedViewState = null; 10066e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn f.mBackStackNesting = 0; 10076e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn f.mAdded = false; 1008b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn if (fs.mSavedFragmentState != null) { 1009b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn f.mSavedViewState = fs.mSavedFragmentState.getSparseParcelableArray( 1010def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn FragmentManagerImpl.VIEW_STATE_TAG); 1011b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 1012b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 1013b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 1014b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn 10156e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn // Build the full list of active fragments, instantiating them from 10166e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn // their saved state. 10176e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn mActive = new ArrayList<Fragment>(fms.mActive.length); 10186e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (mAvailIndices != null) { 10196e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn mAvailIndices.clear(); 10206e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } 10216e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn for (int i=0; i<fms.mActive.length; i++) { 10226e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn FragmentState fs = fms.mActive[i]; 10236e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (fs != null) { 1024b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn Fragment f = fs.instantiate(mActivity); 1025b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn if (DEBUG) Log.v(TAG, "restoreAllState: adding #" + i + ": " + f); 1026b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn mActive.add(f); 10276e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } else { 1028b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn if (DEBUG) Log.v(TAG, "restoreAllState: adding #" + i + ": (null)"); 10296e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn mActive.add(null); 10306e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (mAvailIndices == null) { 10316e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn mAvailIndices = new ArrayList<Integer>(); 10326e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } 1033b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn if (DEBUG) Log.v(TAG, "restoreAllState: adding avail #" + i); 10346e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn mAvailIndices.add(i); 1035b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 10366e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } 10376e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn 10386e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn // Build the list of currently added fragments. 10396e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (fms.mAdded != null) { 10406e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn mAdded = new ArrayList<Fragment>(fms.mAdded.length); 1041b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn for (int i=0; i<fms.mAdded.length; i++) { 10426e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn Fragment f = mActive.get(fms.mAdded[i]); 10436e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (f == null) { 10446e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn throw new IllegalStateException( 10456e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn "No instantiated fragment for index #" + fms.mAdded[i]); 1046b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 10476e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn f.mAdded = true; 1048b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn f.mImmediateActivity = mActivity; 1049b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn if (DEBUG) Log.v(TAG, "restoreAllState: making added #" + i + ": " + f); 10506e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn mAdded.add(f); 1051b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 10526e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } else { 10536e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn mAdded = null; 1054b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 10556e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn 10566e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn // Build the back stack. 1057b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn if (fms.mBackStack != null) { 1058b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn mBackStack = new ArrayList<BackStackEntry>(fms.mBackStack.length); 1059b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn for (int i=0; i<fms.mBackStack.length; i++) { 1060b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn BackStackEntry bse = fms.mBackStack[i].instantiate(this); 1061b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn if (DEBUG) Log.v(TAG, "restoreAllState: adding bse #" + i 1062b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn + " (index " + bse.mIndex + "): " + bse); 1063b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn mBackStack.add(bse); 1064dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn if (bse.mIndex >= 0) { 1065dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn setBackStackIndex(bse.mIndex, bse); 1066dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn } 1067b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 10686e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } else { 10696e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn mBackStack = null; 1070b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 1071b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 1072b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn 10732dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn public void attachActivity(Activity activity) { 10742dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn if (mActivity != null) throw new IllegalStateException(); 10752dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn mActivity = activity; 10762dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 10772dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn 1078b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn public void dispatchCreate() { 1079ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn moveToState(Fragment.CREATED, false); 10802dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 10812dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn 1082c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn public void dispatchActivityCreated() { 1083c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn moveToState(Fragment.ACTIVITY_CREATED, false); 1084c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn } 1085c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn 10862dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn public void dispatchStart() { 1087ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn moveToState(Fragment.STARTED, false); 10882dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 10892dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn 10902dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn public void dispatchResume() { 1091ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn moveToState(Fragment.RESUMED, false); 10922dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 10932dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn 10942dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn public void dispatchPause() { 1095ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn moveToState(Fragment.STARTED, false); 10962dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 10972dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn 10982dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn public void dispatchStop() { 1099c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn moveToState(Fragment.ACTIVITY_CREATED, false); 11002dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 11012dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn 11022dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn public void dispatchDestroy() { 1103ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn moveToState(Fragment.INITIALIZING, false); 11042dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn mActivity = null; 11052dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 1106f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn 1107b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn public boolean dispatchCreateOptionsMenu(Menu menu, MenuInflater inflater) { 1108b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn boolean show = false; 1109b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn if (mActive != null) { 1110b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn for (int i=0; i<mAdded.size(); i++) { 1111b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn Fragment f = mAdded.get(i); 1112b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn if (f != null && !f.mHidden && f.mHasMenu) { 1113b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn show = true; 1114b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn f.onCreateOptionsMenu(menu, inflater); 1115b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn } 1116b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn } 1117b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn } 1118b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn return show; 1119b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn } 1120b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn 1121b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn public boolean dispatchPrepareOptionsMenu(Menu menu) { 1122b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn boolean show = false; 1123b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn if (mActive != null) { 1124b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn for (int i=0; i<mAdded.size(); i++) { 1125b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn Fragment f = mAdded.get(i); 1126b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn if (f != null && !f.mHidden && f.mHasMenu) { 1127b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn show = true; 1128b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn f.onPrepareOptionsMenu(menu); 1129b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn } 1130b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn } 1131b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn } 1132b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn return show; 1133b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn } 1134b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn 1135b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn public boolean dispatchOptionsItemSelected(MenuItem item) { 1136b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn if (mActive != null) { 1137b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn for (int i=0; i<mAdded.size(); i++) { 1138b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn Fragment f = mAdded.get(i); 1139b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn if (f != null && !f.mHidden && f.mHasMenu) { 1140b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn if (f.onOptionsItemSelected(item)) { 1141b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn return true; 1142b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn } 1143b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn } 1144b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn } 1145b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn } 1146b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn return false; 1147b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn } 1148b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn 11495ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn public boolean dispatchContextItemSelected(MenuItem item) { 11505ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn if (mActive != null) { 11515ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn for (int i=0; i<mAdded.size(); i++) { 11525ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn Fragment f = mAdded.get(i); 11535ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn if (f != null && !f.mHidden) { 11545ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn if (f.onContextItemSelected(item)) { 11555ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn return true; 11565ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn } 11575ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn } 11585ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn } 11595ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn } 11605ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn return false; 11615ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn } 11625ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn 1163b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn public void dispatchOptionsMenuClosed(Menu menu) { 1164b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn if (mActive != null) { 1165b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn for (int i=0; i<mAdded.size(); i++) { 1166b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn Fragment f = mAdded.get(i); 1167b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn if (f != null && !f.mHidden && f.mHasMenu) { 1168b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn f.onOptionsMenuClosed(menu); 1169b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn } 1170b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn } 1171b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn } 1172b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn } 1173b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn 1174f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn public static int reverseTransit(int transit) { 1175f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn int rev = 0; 1176f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn switch (transit) { 1177811ed1065f39469cf2cf6adba22cab397ed88d5eChet Haase case FragmentTransaction.TRANSIT_FRAGMENT_OPEN: 1178811ed1065f39469cf2cf6adba22cab397ed88d5eChet Haase rev = FragmentTransaction.TRANSIT_FRAGMENT_CLOSE; 1179f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn break; 1180811ed1065f39469cf2cf6adba22cab397ed88d5eChet Haase case FragmentTransaction.TRANSIT_FRAGMENT_CLOSE: 1181811ed1065f39469cf2cf6adba22cab397ed88d5eChet Haase rev = FragmentTransaction.TRANSIT_FRAGMENT_OPEN; 1182f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn break; 1183f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } 1184f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn return rev; 1185f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn 1186f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } 1187f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn 1188f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn public static int transitToStyleIndex(int transit, boolean enter) { 1189f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn int animAttr = -1; 1190f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn switch (transit) { 1191811ed1065f39469cf2cf6adba22cab397ed88d5eChet Haase case FragmentTransaction.TRANSIT_FRAGMENT_OPEN: 1192f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn animAttr = enter 1193811ed1065f39469cf2cf6adba22cab397ed88d5eChet Haase ? com.android.internal.R.styleable.FragmentAnimation_fragmentOpenEnterAnimation 1194811ed1065f39469cf2cf6adba22cab397ed88d5eChet Haase : com.android.internal.R.styleable.FragmentAnimation_fragmentOpenExitAnimation; 1195f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn break; 1196811ed1065f39469cf2cf6adba22cab397ed88d5eChet Haase case FragmentTransaction.TRANSIT_FRAGMENT_CLOSE: 1197f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn animAttr = enter 1198811ed1065f39469cf2cf6adba22cab397ed88d5eChet Haase ? com.android.internal.R.styleable.FragmentAnimation_fragmentCloseEnterAnimation 1199811ed1065f39469cf2cf6adba22cab397ed88d5eChet Haase : com.android.internal.R.styleable.FragmentAnimation_fragmentCloseExitAnimation; 1200f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn break; 1201f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } 1202f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn return animAttr; 1203f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } 12042dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn} 1205