FragmentManager.java revision def1537e9e8d0dd190cde5310ddae8b921088c9b
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; 20811ed1065f39469cf2cf6adba22cab397ed88d5eChet Haaseimport android.animation.PropertyAnimator; 21811ed1065f39469cf2cf6adba22cab397ed88d5eChet Haaseimport android.animation.Sequencer; 22f121be737c59390d97e21a92be8e166001534c7dDianne Hackbornimport android.content.res.TypedArray; 232dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackbornimport android.os.Bundle; 24ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackbornimport android.os.Handler; 25b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackbornimport android.os.Parcel; 26b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackbornimport android.os.Parcelable; 275ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackbornimport android.util.Log; 28b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackbornimport android.util.SparseArray; 29b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackbornimport android.view.Menu; 30b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackbornimport android.view.MenuInflater; 31b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackbornimport android.view.MenuItem; 325ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackbornimport android.view.View; 332dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackbornimport android.view.ViewGroup; 34f121be737c59390d97e21a92be8e166001534c7dDianne Hackbornimport android.view.animation.AnimationUtils; 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) { 260811ed1065f39469cf2cf6adba22cab397ed88d5eChet Haase Animatable anim = AnimationUtils.loadAnimator(mActivity, fragment.mNextAnim); 2615ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn if (anim != null) { 2625ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn return anim; 2635ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn } 2645ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn } 2655ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn 266f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn if (transit == 0) { 267f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn return null; 268f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } 269f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn 270f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn int styleIndex = transitToStyleIndex(transit, enter); 271f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn if (styleIndex < 0) { 272f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn return null; 273f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } 274f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn 275f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn if (transitionStyle == 0 && mActivity.getWindow() != null) { 276f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn transitionStyle = mActivity.getWindow().getAttributes().windowAnimations; 277f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } 278f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn if (transitionStyle == 0) { 279f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn return null; 280f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } 281f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn 282f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn TypedArray attrs = mActivity.obtainStyledAttributes(transitionStyle, 283811ed1065f39469cf2cf6adba22cab397ed88d5eChet Haase com.android.internal.R.styleable.FragmentAnimation); 284f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn int anim = attrs.getResourceId(styleIndex, 0); 285f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn attrs.recycle(); 286f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn 287f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn if (anim == 0) { 288f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn return null; 289f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } 290f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn 291811ed1065f39469cf2cf6adba22cab397ed88d5eChet Haase return AnimationUtils.loadAnimator(mActivity, anim); 292f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } 293f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn 294f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn void moveToState(Fragment f, int newState, int transit, int transitionStyle) { 2956e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn // Fragments that are not currently added will sit in the onCreate() state. 2966e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (!f.mAdded && newState > Fragment.CREATED) { 2976e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn newState = Fragment.CREATED; 2986e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } 2996e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn 3002dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn if (f.mState < newState) { 3012dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn switch (f.mState) { 3022dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn case Fragment.INITIALIZING: 3035ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn if (DEBUG) Log.v(TAG, "moveto CREATED: " + f); 304def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn if (f.mSavedFragmentState != null) { 305def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn f.mSavedViewState = f.mSavedFragmentState.getSparseParcelableArray( 306def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn FragmentManagerImpl.VIEW_STATE_TAG); 307def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn f.mTarget = getFragment(f.mSavedFragmentState, 308def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn FragmentManagerImpl.TARGET_STATE_TAG); 309def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn if (f.mTarget != null) { 310def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn f.mTargetRequestCode = f.mSavedFragmentState.getInt( 311def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn FragmentManagerImpl.TARGET_REQUEST_CODE_STATE_TAG, 0); 312def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn } 313def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn } 3142dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn f.mActivity = mActivity; 3152dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn f.mCalled = false; 3162dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn f.onAttach(mActivity); 3172dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn if (!f.mCalled) { 3182dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn throw new SuperNotCalledException("Fragment " + f 3192dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn + " did not call through to super.onAttach()"); 3202dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 321c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn mActivity.onAttachFragment(f); 3222dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn 323b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn if (!f.mRetaining) { 324b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn f.mCalled = false; 325b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn f.onCreate(f.mSavedFragmentState); 326b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn if (!f.mCalled) { 327b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn throw new SuperNotCalledException("Fragment " + f 328b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn + " did not call through to super.onCreate()"); 3292dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 3302dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 331b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn f.mRetaining = false; 332b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn if (f.mFromLayout) { 333b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn // For fragments that are part of the content view 334b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn // layout, we need to instantiate the view immediately 335b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn // and the inflater will take care of adding it. 336b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn f.mView = f.onCreateView(mActivity.getLayoutInflater(), 337b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn null, f.mSavedFragmentState); 3386e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (f.mView != null) { 3396e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn f.mView.setSaveFromParentEnabled(false); 3406e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn f.restoreViewState(); 3415ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn if (f.mHidden) f.mView.setVisibility(View.GONE); 3426e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } 343b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 3446e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn case Fragment.CREATED: 3456e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (newState > Fragment.CREATED) { 3465ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn if (DEBUG) Log.v(TAG, "moveto CONTENT: " + f); 347b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn if (!f.mFromLayout) { 348b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn ViewGroup container = null; 349b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn if (f.mContainerId != 0) { 350b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn container = (ViewGroup)mActivity.findViewById(f.mContainerId); 351b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn if (container == null) { 352b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn throw new IllegalArgumentException("New view found for id 0x" 353b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn + Integer.toHexString(f.mContainerId) 354b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn + " for fragment " + f); 355b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 356b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 357b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn f.mContainer = container; 358b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn f.mView = f.onCreateView(mActivity.getLayoutInflater(), 359b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn container, f.mSavedFragmentState); 360b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn if (f.mView != null) { 361b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn f.mView.setSaveFromParentEnabled(false); 362b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn if (container != null) { 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 } 5146e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } 5156e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } 5166e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn 5176e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn void makeActive(Fragment f) { 5186e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (f.mIndex >= 0) { 5196e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn return; 5206e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } 5216e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn 5226e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (mAvailIndices == null || mAvailIndices.size() <= 0) { 5236e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (mActive == null) { 5246e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn mActive = new ArrayList<Fragment>(); 525ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn } 5266e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn f.setIndex(mActive.size()); 5276e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn mActive.add(f); 5286e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn 5296e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } else { 5306e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn f.setIndex(mAvailIndices.remove(mAvailIndices.size()-1)); 5316e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn mActive.set(f.mIndex, f); 5322dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 5332dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 5342dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn 5356e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn void makeInactive(Fragment f) { 5366e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (f.mIndex < 0) { 5376e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn return; 5386e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } 5396e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn 540b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn if (DEBUG) Log.v(TAG, "Freeing fragment index " + f.mIndex); 5416e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn mActive.set(f.mIndex, null); 5426e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (mAvailIndices == null) { 5436e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn mAvailIndices = new ArrayList<Integer>(); 5446e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } 5456e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn mAvailIndices.add(f.mIndex); 5469e14e9f33a66b864b98c6ff9517988bafbca3301Dianne Hackborn mActivity.invalidateFragmentIndex(f.mIndex); 5476e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn f.clearIndex(); 5486e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } 5496e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn 550ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn public void addFragment(Fragment fragment, boolean moveToStateNow) { 5516e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (mAdded == null) { 5526e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn mAdded = new ArrayList<Fragment>(); 553ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn } 5546e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn mAdded.add(fragment); 5556e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn makeActive(fragment); 5565e0d59547c4042037e23a42ba4e2521721e9c7d3Dianne Hackborn if (DEBUG) Log.v(TAG, "add: " + fragment); 5576e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn fragment.mAdded = true; 558b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn if (fragment.mHasMenu) { 559b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn mNeedMenuInvalidate = true; 560b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn } 561ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn if (moveToStateNow) { 562f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn moveToState(fragment, mCurState, 0, 0); 563ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn } 5642dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 5652dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn 566f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn public void removeFragment(Fragment fragment, int transition, int transitionStyle) { 5675e0d59547c4042037e23a42ba4e2521721e9c7d3Dianne Hackborn if (DEBUG) Log.v(TAG, "remove: " + fragment + " nesting=" + fragment.mBackStackNesting); 5686e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn mAdded.remove(fragment); 5696e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn final boolean inactive = fragment.mBackStackNesting <= 0; 570b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn if (fragment.mHasMenu) { 571b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn mNeedMenuInvalidate = true; 572b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn } 5736e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn fragment.mAdded = false; 5746e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn moveToState(fragment, inactive ? Fragment.INITIALIZING : Fragment.CREATED, 5756e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn transition, transitionStyle); 5765e0d59547c4042037e23a42ba4e2521721e9c7d3Dianne Hackborn if (inactive) { 5775e0d59547c4042037e23a42ba4e2521721e9c7d3Dianne Hackborn makeInactive(fragment); 5785e0d59547c4042037e23a42ba4e2521721e9c7d3Dianne Hackborn } 579f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } 580f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn 5815ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn public void hideFragment(Fragment fragment, int transition, int transitionStyle) { 5825ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn if (DEBUG) Log.v(TAG, "hide: " + fragment); 5835ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn if (!fragment.mHidden) { 5845ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn fragment.mHidden = true; 5855ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn if (fragment.mView != null) { 586811ed1065f39469cf2cf6adba22cab397ed88d5eChet Haase Animatable anim = loadAnimatable(fragment, transition, true, 5875ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn transitionStyle); 5885ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn if (anim != null) { 589811ed1065f39469cf2cf6adba22cab397ed88d5eChet Haase if (anim instanceof Sequencer) { 590811ed1065f39469cf2cf6adba22cab397ed88d5eChet Haase ((Sequencer)anim).setTarget(fragment.mView); 591811ed1065f39469cf2cf6adba22cab397ed88d5eChet Haase } else if (anim instanceof PropertyAnimator) { 592811ed1065f39469cf2cf6adba22cab397ed88d5eChet Haase ((PropertyAnimator)anim).setTarget(fragment.mView); 593811ed1065f39469cf2cf6adba22cab397ed88d5eChet Haase } 594811ed1065f39469cf2cf6adba22cab397ed88d5eChet Haase anim.start(); 5955ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn } 5965ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn fragment.mView.setVisibility(View.GONE); 5975ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn } 598b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn if (fragment.mAdded && fragment.mHasMenu) { 599b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn mNeedMenuInvalidate = true; 600b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn } 6015ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn fragment.onHiddenChanged(true); 6025ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn } 6035ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn } 6045ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn 6055ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn public void showFragment(Fragment fragment, int transition, int transitionStyle) { 6065ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn if (DEBUG) Log.v(TAG, "show: " + fragment); 6075ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn if (fragment.mHidden) { 6085ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn fragment.mHidden = false; 6095ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn if (fragment.mView != null) { 610811ed1065f39469cf2cf6adba22cab397ed88d5eChet Haase Animatable anim = loadAnimatable(fragment, transition, true, 6115ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn transitionStyle); 6125ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn if (anim != null) { 613811ed1065f39469cf2cf6adba22cab397ed88d5eChet Haase if (anim instanceof Sequencer) { 614811ed1065f39469cf2cf6adba22cab397ed88d5eChet Haase ((Sequencer)anim).setTarget(fragment.mView); 615811ed1065f39469cf2cf6adba22cab397ed88d5eChet Haase } else if (anim instanceof PropertyAnimator) { 616811ed1065f39469cf2cf6adba22cab397ed88d5eChet Haase ((PropertyAnimator)anim).setTarget(fragment.mView); 617811ed1065f39469cf2cf6adba22cab397ed88d5eChet Haase } 618811ed1065f39469cf2cf6adba22cab397ed88d5eChet Haase anim.start(); 6195ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn } 6205ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn fragment.mView.setVisibility(View.VISIBLE); 6215ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn } 622b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn if (fragment.mAdded && fragment.mHasMenu) { 623b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn mNeedMenuInvalidate = true; 624b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn } 6255ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn fragment.onHiddenChanged(false); 6265ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn } 6275ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn } 6285ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn 629f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn public Fragment findFragmentById(int id) { 6306e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (mActive != null) { 6315ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn // First look through added fragments. 6325ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn for (int i=mAdded.size()-1; i>=0; i--) { 6335ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn Fragment f = mAdded.get(i); 6345ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn if (f != null && f.mFragmentId == id) { 6355ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn return f; 6365ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn } 6375ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn } 6385ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn // Now for any known fragment. 6396e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn for (int i=mActive.size()-1; i>=0; i--) { 6406e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn Fragment f = mActive.get(i); 6416e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (f != null && f.mFragmentId == id) { 642b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn return f; 643b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 644b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 645b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 646b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn return null; 647b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 648b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn 649b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn public Fragment findFragmentByTag(String tag) { 6506e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (mActive != null && tag != null) { 6515ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn // First look through added fragments. 6525ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn for (int i=mAdded.size()-1; i>=0; i--) { 6535ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn Fragment f = mAdded.get(i); 6545ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn if (f != null && tag.equals(f.mTag)) { 6555ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn return f; 6565ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn } 6575ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn } 6585ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn // Now for any known fragment. 6596e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn for (int i=mActive.size()-1; i>=0; i--) { 6606e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn Fragment f = mActive.get(i); 6616e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (f != null && tag.equals(f.mTag)) { 6626e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn return f; 6636e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } 6646e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } 6656e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } 6666e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn return null; 6676e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } 6686e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn 6696e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn public Fragment findFragmentByWho(String who) { 6706e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (mActive != null && who != null) { 6716e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn for (int i=mActive.size()-1; i>=0; i--) { 6726e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn Fragment f = mActive.get(i); 6736e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (f != null && who.equals(f.mWho)) { 674f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn return f; 675f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } 676f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } 677f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } 678f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn return null; 6792dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 6802dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn 681445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn public void enqueueAction(Runnable action) { 682445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn synchronized (this) { 683445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn if (mPendingActions == null) { 684445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn mPendingActions = new ArrayList<Runnable>(); 685445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn } 686445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn mPendingActions.add(action); 687445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn if (mPendingActions.size() == 1) { 688445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn mActivity.mHandler.removeCallbacks(mExecCommit); 689445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn mActivity.mHandler.post(mExecCommit); 690445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn } 691445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn } 692445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn } 693445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn 694dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn public int allocBackStackIndex(BackStackEntry bse) { 695dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn synchronized (this) { 696dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn if (mAvailBackStackIndices == null || mAvailBackStackIndices.size() <= 0) { 697dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn if (mBackStackIndices == null) { 698dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn mBackStackIndices = new ArrayList<BackStackEntry>(); 699dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn } 700dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn int index = mBackStackIndices.size(); 701dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn if (DEBUG) Log.v(TAG, "Setting back stack index " + index + " to " + bse); 702dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn mBackStackIndices.add(bse); 703dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn return index; 704dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn 705dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn } else { 706dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn int index = mAvailBackStackIndices.remove(mAvailBackStackIndices.size()-1); 707dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn if (DEBUG) Log.v(TAG, "Adding back stack index " + index + " with " + bse); 708dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn mBackStackIndices.set(index, bse); 709dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn return index; 710dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn } 711dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn } 712dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn } 713dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn 714dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn public void setBackStackIndex(int index, BackStackEntry bse) { 715dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn synchronized (this) { 716dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn if (mBackStackIndices == null) { 717dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn mBackStackIndices = new ArrayList<BackStackEntry>(); 718dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn } 719dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn int N = mBackStackIndices.size(); 720dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn if (index < N) { 721dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn if (DEBUG) Log.v(TAG, "Setting back stack index " + index + " to " + bse); 722dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn mBackStackIndices.set(index, bse); 723dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn } else { 724dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn while (N < index) { 725dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn mBackStackIndices.add(null); 726dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn if (mAvailBackStackIndices == null) { 727dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn mAvailBackStackIndices = new ArrayList<Integer>(); 728dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn } 729dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn if (DEBUG) Log.v(TAG, "Adding available back stack index " + N); 730dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn mAvailBackStackIndices.add(N); 731dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn N++; 732dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn } 733dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn if (DEBUG) Log.v(TAG, "Adding back stack index " + index + " with " + bse); 734dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn mBackStackIndices.add(bse); 735dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn } 736dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn } 737dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn } 738dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn 739dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn public void freeBackStackIndex(int index) { 740dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn synchronized (this) { 741dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn mBackStackIndices.set(index, null); 742dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn if (mAvailBackStackIndices == null) { 743dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn mAvailBackStackIndices = new ArrayList<Integer>(); 744dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn } 745dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn if (DEBUG) Log.v(TAG, "Freeing back stack index " + index); 746dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn mAvailBackStackIndices.add(index); 747dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn } 748dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn } 749dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn 750445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn /** 751445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn * Only call from main thread! 752445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn */ 753445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn public void execPendingActions() { 754445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn if (mExecutingActions) { 755445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn throw new IllegalStateException("Recursive entry to execPendingActions"); 756445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn } 757445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn 758445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn while (true) { 759445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn int numActions; 760445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn 761445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn synchronized (this) { 762445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn if (mPendingActions == null || mPendingActions.size() == 0) { 763445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn return; 764445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn } 765445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn 766445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn numActions = mPendingActions.size(); 767445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn if (mTmpActions == null || mTmpActions.length < numActions) { 768445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn mTmpActions = new Runnable[numActions]; 769445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn } 770445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn mPendingActions.toArray(mTmpActions); 771445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn mPendingActions.clear(); 772445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn mActivity.mHandler.removeCallbacks(mExecCommit); 773445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn } 774445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn 775445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn mExecutingActions = true; 776445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn for (int i=0; i<numActions; i++) { 777445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn mTmpActions[i].run(); 778445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn } 779445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn mExecutingActions = false; 780445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn } 781445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn } 782445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn 783b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn public void addBackStackState(BackStackEntry state) { 784ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn if (mBackStack == null) { 785b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn mBackStack = new ArrayList<BackStackEntry>(); 786ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn } 787ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn mBackStack.add(state); 788ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn } 789ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn 790dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn boolean popBackStackState(Handler handler, String name, int id, int flags) { 791ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn if (mBackStack == null) { 792ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn return false; 793ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn } 794b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn if (name == null && id < 0 && (flags&Activity.POP_BACK_STACK_INCLUSIVE) == 0) { 795f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn int last = mBackStack.size()-1; 796f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn if (last < 0) { 797f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn return false; 798f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } 799b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn final BackStackEntry bss = mBackStack.remove(last); 800445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn enqueueAction(new Runnable() { 801f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn public void run() { 802445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn if (DEBUG) Log.v(TAG, "Popping back stack state: " + bss); 803f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn bss.popFromBackStack(); 804f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn moveToState(mCurState, reverseTransit(bss.getTransition()), 805f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn bss.getTransitionStyle(), true); 806f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } 807f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn }); 808f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } else { 809b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn int index = -1; 810b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn if (name != null || id >= 0) { 811b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn // If a name or ID is specified, look for that place in 812b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn // the stack. 813b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn index = mBackStack.size()-1; 814b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn while (index >= 0) { 815b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn BackStackEntry bss = mBackStack.get(index); 816b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn if (name != null && name.equals(bss.getName())) { 817b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn break; 818b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn } 819b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn if (id >= 0 && id == bss.mIndex) { 820b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn break; 821b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn } 822b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn index--; 823dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn } 824b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn if (index < 0) { 825b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn return false; 826b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn } 827b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn if ((flags&Activity.POP_BACK_STACK_INCLUSIVE) != 0) { 828b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn index--; 829b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn // Consume all following entries that match. 830b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn while (index >= 0) { 831b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn BackStackEntry bss = mBackStack.get(index); 832b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn if ((name != null && name.equals(bss.getName())) 833b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn || (id >= 0 && id == bss.mIndex)) { 834b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn index--; 835b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn continue; 836b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn } 837b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn break; 838b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn } 839f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } 840dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn } 841dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn if (index == mBackStack.size()-1) { 842f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn return false; 843f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } 844b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn final ArrayList<BackStackEntry> states 845b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn = new ArrayList<BackStackEntry>(); 846f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn for (int i=mBackStack.size()-1; i>index; i--) { 847f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn states.add(mBackStack.remove(i)); 848ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn } 849445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn enqueueAction(new Runnable() { 850f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn public void run() { 851f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn for (int i=0; i<states.size(); i++) { 852445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn if (DEBUG) Log.v(TAG, "Popping back stack state: " + states.get(i)); 853f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn states.get(i).popFromBackStack(); 854f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } 855f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn moveToState(mCurState, true); 856f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } 857f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn }); 858f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } 859ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn return true; 860ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn } 861ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn 862b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn ArrayList<Fragment> retainNonConfig() { 863b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn ArrayList<Fragment> fragments = null; 8646e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (mActive != null) { 8656e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn for (int i=0; i<mActive.size(); i++) { 8666e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn Fragment f = mActive.get(i); 8676e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (f != null && f.mRetainInstance) { 868b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn if (fragments == null) { 869b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn fragments = new ArrayList<Fragment>(); 870b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 871b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn fragments.add(f); 872b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn f.mRetaining = true; 873b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 874b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 875b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 876b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn return fragments; 877b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 878b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn 879b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn void saveFragmentViewState(Fragment f) { 8806e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (f.mView == null) { 881b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn return; 882b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 883b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn if (mStateArray == null) { 884b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn mStateArray = new SparseArray<Parcelable>(); 885b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 886b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn f.mView.saveHierarchyState(mStateArray); 887b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn if (mStateArray.size() > 0) { 888b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn f.mSavedViewState = mStateArray; 889b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn mStateArray = null; 890b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 891b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 892b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn 8936e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn Parcelable saveAllState() { 8946e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (mActive == null || mActive.size() <= 0) { 8956e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn return null; 896b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 897b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn 8986e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn // First collect all active fragments. 8996e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn int N = mActive.size(); 9006e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn FragmentState[] active = new FragmentState[N]; 9016e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn boolean haveFragments = false; 9026e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn for (int i=0; i<N; i++) { 9036e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn Fragment f = mActive.get(i); 9046e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (f != null) { 9056e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn haveFragments = true; 9066e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn 9076e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn FragmentState fs = new FragmentState(f); 9086e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn active[i] = fs; 9096e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn 9106e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (mStateBundle == null) { 9116e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn mStateBundle = new Bundle(); 9126e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } 9136e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn f.onSaveInstanceState(mStateBundle); 9146e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (!mStateBundle.isEmpty()) { 9156e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn fs.mSavedFragmentState = mStateBundle; 9166e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn mStateBundle = null; 917b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 9186e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn 9196e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (f.mView != null) { 9206e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn saveFragmentViewState(f); 9216e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (f.mSavedViewState != null) { 9226e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (fs.mSavedFragmentState == null) { 9236e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn fs.mSavedFragmentState = new Bundle(); 9246e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } 9256e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn fs.mSavedFragmentState.putSparseParcelableArray( 926def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn FragmentManagerImpl.VIEW_STATE_TAG, f.mSavedViewState); 927def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn } 928def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn } 929def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn 930def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn if (f.mTarget != null) { 931def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn if (fs.mSavedFragmentState == null) { 932def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn fs.mSavedFragmentState = new Bundle(); 933def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn } 934def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn putFragment(fs.mSavedFragmentState, 935def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn FragmentManagerImpl.TARGET_STATE_TAG, f.mTarget); 936def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn if (f.mTargetRequestCode != 0) { 937def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn fs.mSavedFragmentState.putInt( 938def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn FragmentManagerImpl.TARGET_REQUEST_CODE_STATE_TAG, 939def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn f.mTargetRequestCode); 9406e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } 9416e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } 9426e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn 943b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn if (DEBUG) Log.v(TAG, "Saved state of " + f + ": " 944b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn + fs.mSavedFragmentState); 945b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 946b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 947b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn 9486e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (!haveFragments) { 949b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn if (DEBUG) Log.v(TAG, "saveAllState: no fragments!"); 950b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn return null; 951b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 952b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn 953b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn int[] added = null; 954b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn BackStackState[] backStack = null; 955b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn 9566e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn // Build list of currently added fragments. 9576e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn N = mAdded.size(); 958b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn if (N > 0) { 959b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn added = new int[N]; 960b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn for (int i=0; i<N; i++) { 9616e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn added[i] = mAdded.get(i).mIndex; 962b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn if (DEBUG) Log.v(TAG, "saveAllState: adding fragment #" + i 963b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn + ": " + mAdded.get(i)); 964b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 965b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 966b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn 967b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn // Now save back stack. 968b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn if (mBackStack != null) { 969b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn N = mBackStack.size(); 970b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn if (N > 0) { 971b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn backStack = new BackStackState[N]; 972b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn for (int i=0; i<N; i++) { 973b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn backStack[i] = new BackStackState(this, mBackStack.get(i)); 974b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn if (DEBUG) Log.v(TAG, "saveAllState: adding back stack #" + i 975b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn + ": " + mBackStack.get(i)); 976b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 977b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 978b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 979b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn 980b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn FragmentManagerState fms = new FragmentManagerState(); 9816e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn fms.mActive = active; 982b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn fms.mAdded = added; 983b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn fms.mBackStack = backStack; 984b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn return fms; 985b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 986b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn 987b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn void restoreAllState(Parcelable state, ArrayList<Fragment> nonConfig) { 988b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn // If there is no saved state at all, then there can not be 989b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn // any nonConfig fragments either, so that is that. 990b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn if (state == null) return; 991b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn FragmentManagerState fms = (FragmentManagerState)state; 9926e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (fms.mActive == null) return; 993b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn 9946e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn // First re-attach any non-config instances we are retaining back 9956e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn // to their saved state, so we don't try to instantiate them again. 996b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn if (nonConfig != null) { 997b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn for (int i=0; i<nonConfig.size(); i++) { 998b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn Fragment f = nonConfig.get(i); 999b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn if (DEBUG) Log.v(TAG, "restoreAllState: re-attaching retained " + f); 10006e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn FragmentState fs = fms.mActive[f.mIndex]; 1001b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn fs.mInstance = f; 1002b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn f.mSavedViewState = null; 10036e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn f.mBackStackNesting = 0; 10046e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn f.mAdded = false; 1005b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn if (fs.mSavedFragmentState != null) { 1006b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn f.mSavedViewState = fs.mSavedFragmentState.getSparseParcelableArray( 1007def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn FragmentManagerImpl.VIEW_STATE_TAG); 1008b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 1009b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 1010b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 1011b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn 10126e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn // Build the full list of active fragments, instantiating them from 10136e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn // their saved state. 10146e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn mActive = new ArrayList<Fragment>(fms.mActive.length); 10156e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (mAvailIndices != null) { 10166e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn mAvailIndices.clear(); 10176e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } 10186e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn for (int i=0; i<fms.mActive.length; i++) { 10196e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn FragmentState fs = fms.mActive[i]; 10206e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (fs != null) { 1021b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn Fragment f = fs.instantiate(mActivity); 1022b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn if (DEBUG) Log.v(TAG, "restoreAllState: adding #" + i + ": " + f); 1023b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn mActive.add(f); 10246e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } else { 1025b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn if (DEBUG) Log.v(TAG, "restoreAllState: adding #" + i + ": (null)"); 10266e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn mActive.add(null); 10276e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (mAvailIndices == null) { 10286e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn mAvailIndices = new ArrayList<Integer>(); 10296e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } 1030b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn if (DEBUG) Log.v(TAG, "restoreAllState: adding avail #" + i); 10316e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn mAvailIndices.add(i); 1032b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 10336e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } 10346e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn 10356e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn // Build the list of currently added fragments. 10366e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (fms.mAdded != null) { 10376e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn mAdded = new ArrayList<Fragment>(fms.mAdded.length); 1038b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn for (int i=0; i<fms.mAdded.length; i++) { 10396e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn Fragment f = mActive.get(fms.mAdded[i]); 10406e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (f == null) { 10416e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn throw new IllegalStateException( 10426e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn "No instantiated fragment for index #" + fms.mAdded[i]); 1043b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 10446e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn f.mAdded = true; 1045b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn f.mImmediateActivity = mActivity; 1046b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn if (DEBUG) Log.v(TAG, "restoreAllState: making added #" + i + ": " + f); 10476e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn mAdded.add(f); 1048b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 10496e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } else { 10506e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn mAdded = null; 1051b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 10526e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn 10536e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn // Build the back stack. 1054b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn if (fms.mBackStack != null) { 1055b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn mBackStack = new ArrayList<BackStackEntry>(fms.mBackStack.length); 1056b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn for (int i=0; i<fms.mBackStack.length; i++) { 1057b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn BackStackEntry bse = fms.mBackStack[i].instantiate(this); 1058b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn if (DEBUG) Log.v(TAG, "restoreAllState: adding bse #" + i 1059b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn + " (index " + bse.mIndex + "): " + bse); 1060b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn mBackStack.add(bse); 1061dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn if (bse.mIndex >= 0) { 1062dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn setBackStackIndex(bse.mIndex, bse); 1063dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn } 1064b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 10656e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } else { 10666e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn mBackStack = null; 1067b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 1068b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 1069b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn 10702dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn public void attachActivity(Activity activity) { 10712dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn if (mActivity != null) throw new IllegalStateException(); 10722dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn mActivity = activity; 10732dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 10742dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn 1075b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn public void dispatchCreate() { 1076ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn moveToState(Fragment.CREATED, false); 10772dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 10782dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn 1079c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn public void dispatchActivityCreated() { 1080c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn moveToState(Fragment.ACTIVITY_CREATED, false); 1081c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn } 1082c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn 10832dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn public void dispatchStart() { 1084ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn moveToState(Fragment.STARTED, false); 10852dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 10862dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn 10872dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn public void dispatchResume() { 1088ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn moveToState(Fragment.RESUMED, false); 10892dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 10902dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn 10912dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn public void dispatchPause() { 1092ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn moveToState(Fragment.STARTED, false); 10932dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 10942dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn 10952dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn public void dispatchStop() { 1096c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn moveToState(Fragment.ACTIVITY_CREATED, false); 10972dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 10982dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn 10992dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn public void dispatchDestroy() { 1100ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn moveToState(Fragment.INITIALIZING, false); 11012dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn mActivity = null; 11022dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 1103f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn 1104b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn public boolean dispatchCreateOptionsMenu(Menu menu, MenuInflater inflater) { 1105b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn boolean show = false; 1106b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn if (mActive != null) { 1107b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn for (int i=0; i<mAdded.size(); i++) { 1108b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn Fragment f = mAdded.get(i); 1109b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn if (f != null && !f.mHidden && f.mHasMenu) { 1110b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn show = true; 1111b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn f.onCreateOptionsMenu(menu, inflater); 1112b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn } 1113b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn } 1114b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn } 1115b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn return show; 1116b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn } 1117b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn 1118b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn public boolean dispatchPrepareOptionsMenu(Menu menu) { 1119b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn boolean show = false; 1120b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn if (mActive != null) { 1121b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn for (int i=0; i<mAdded.size(); i++) { 1122b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn Fragment f = mAdded.get(i); 1123b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn if (f != null && !f.mHidden && f.mHasMenu) { 1124b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn show = true; 1125b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn f.onPrepareOptionsMenu(menu); 1126b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn } 1127b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn } 1128b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn } 1129b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn return show; 1130b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn } 1131b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn 1132b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn public boolean dispatchOptionsItemSelected(MenuItem item) { 1133b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn if (mActive != null) { 1134b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn for (int i=0; i<mAdded.size(); i++) { 1135b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn Fragment f = mAdded.get(i); 1136b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn if (f != null && !f.mHidden && f.mHasMenu) { 1137b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn if (f.onOptionsItemSelected(item)) { 1138b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn return true; 1139b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn } 1140b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn } 1141b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn } 1142b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn } 1143b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn return false; 1144b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn } 1145b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn 11465ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn public boolean dispatchContextItemSelected(MenuItem item) { 11475ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn if (mActive != null) { 11485ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn for (int i=0; i<mAdded.size(); i++) { 11495ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn Fragment f = mAdded.get(i); 11505ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn if (f != null && !f.mHidden) { 11515ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn if (f.onContextItemSelected(item)) { 11525ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn return true; 11535ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn } 11545ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn } 11555ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn } 11565ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn } 11575ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn return false; 11585ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn } 11595ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn 1160b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn public void dispatchOptionsMenuClosed(Menu menu) { 1161b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn if (mActive != null) { 1162b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn for (int i=0; i<mAdded.size(); i++) { 1163b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn Fragment f = mAdded.get(i); 1164b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn if (f != null && !f.mHidden && f.mHasMenu) { 1165b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn f.onOptionsMenuClosed(menu); 1166b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn } 1167b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn } 1168b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn } 1169b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn } 1170b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn 1171f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn public static int reverseTransit(int transit) { 1172f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn int rev = 0; 1173f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn switch (transit) { 1174811ed1065f39469cf2cf6adba22cab397ed88d5eChet Haase case FragmentTransaction.TRANSIT_FRAGMENT_OPEN: 1175811ed1065f39469cf2cf6adba22cab397ed88d5eChet Haase rev = FragmentTransaction.TRANSIT_FRAGMENT_CLOSE; 1176f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn break; 1177811ed1065f39469cf2cf6adba22cab397ed88d5eChet Haase case FragmentTransaction.TRANSIT_FRAGMENT_CLOSE: 1178811ed1065f39469cf2cf6adba22cab397ed88d5eChet Haase rev = FragmentTransaction.TRANSIT_FRAGMENT_OPEN; 1179f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn break; 1180f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } 1181f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn return rev; 1182f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn 1183f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } 1184f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn 1185f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn public static int transitToStyleIndex(int transit, boolean enter) { 1186f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn int animAttr = -1; 1187f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn switch (transit) { 1188811ed1065f39469cf2cf6adba22cab397ed88d5eChet Haase case FragmentTransaction.TRANSIT_FRAGMENT_OPEN: 1189f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn animAttr = enter 1190811ed1065f39469cf2cf6adba22cab397ed88d5eChet Haase ? com.android.internal.R.styleable.FragmentAnimation_fragmentOpenEnterAnimation 1191811ed1065f39469cf2cf6adba22cab397ed88d5eChet Haase : com.android.internal.R.styleable.FragmentAnimation_fragmentOpenExitAnimation; 1192f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn break; 1193811ed1065f39469cf2cf6adba22cab397ed88d5eChet Haase case FragmentTransaction.TRANSIT_FRAGMENT_CLOSE: 1194f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn animAttr = enter 1195811ed1065f39469cf2cf6adba22cab397ed88d5eChet Haase ? com.android.internal.R.styleable.FragmentAnimation_fragmentCloseEnterAnimation 1196811ed1065f39469cf2cf6adba22cab397ed88d5eChet Haase : com.android.internal.R.styleable.FragmentAnimation_fragmentCloseExitAnimation; 1197f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn break; 1198f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } 1199f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn return animAttr; 1200f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } 12012dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn} 1202