FragmentManager.java revision 6908cd154c5a2ed2e3b21d40f51952d45be69184
12dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn/* 22dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn * Copyright (C) 2010 The Android Open Source Project 32dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn * 42dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn * Licensed under the Apache License, Version 2.0 (the "License"); 52dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn * you may not use this file except in compliance with the License. 62dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn * You may obtain a copy of the License at 72dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn * 82dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn * http://www.apache.org/licenses/LICENSE-2.0 92dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn * 102dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn * Unless required by applicable law or agreed to in writing, software 112dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn * distributed under the License is distributed on an "AS IS" BASIS, 122dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 132dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn * See the License for the specific language governing permissions and 142dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn * limitations under the License. 152dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn */ 162dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn 172dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackbornpackage android.app; 182dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn 19a18a86b43e40e3c15dcca0ae0148d641be9b25feChet Haaseimport android.animation.Animator; 20a18a86b43e40e3c15dcca0ae0148d641be9b25feChet Haaseimport android.animation.AnimatorInflater; 21b20db3ec34e846010f389880b2cfab4d7bf79820Chet Haaseimport android.animation.AnimatorListenerAdapter; 22f121be737c59390d97e21a92be8e166001534c7dDianne Hackbornimport android.content.res.TypedArray; 232dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackbornimport android.os.Bundle; 24ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackbornimport android.os.Handler; 25b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackbornimport android.os.Parcel; 26b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackbornimport android.os.Parcelable; 275ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackbornimport android.util.Log; 28b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackbornimport android.util.SparseArray; 29b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackbornimport android.view.Menu; 30b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackbornimport android.view.MenuInflater; 31b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackbornimport android.view.MenuItem; 325ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackbornimport android.view.View; 332dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackbornimport android.view.ViewGroup; 342dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn 35625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackbornimport java.io.FileDescriptor; 36625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackbornimport java.io.PrintWriter; 372dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackbornimport java.util.ArrayList; 382dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn 39b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn/** 40b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * Interface for interacting with {@link Fragment} objects inside of an 41b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * {@link Activity} 42b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn */ 43ab36acb39941ce981dddda9f9cf4d2d23a56fd26Dianne Hackbornpublic abstract class FragmentManager { 44b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn /** 45c6669ca63299219d815464129dac051ab2404286Dianne Hackborn * Representation of an entry on the fragment back stack, as created 46c6669ca63299219d815464129dac051ab2404286Dianne Hackborn * with {@link FragmentTransaction#addToBackStack(String) 47c6669ca63299219d815464129dac051ab2404286Dianne Hackborn * FragmentTransaction.addToBackStack()}. Entries can later be 48c6669ca63299219d815464129dac051ab2404286Dianne Hackborn * retrieved with {@link FragmentManager#getBackStackEntry(int) 49c6669ca63299219d815464129dac051ab2404286Dianne Hackborn * FragmentManager.getBackStackEntry()}. 50c6669ca63299219d815464129dac051ab2404286Dianne Hackborn * 51c6669ca63299219d815464129dac051ab2404286Dianne Hackborn * <p>Note that you should never hold on to a BackStackEntry object; 52c6669ca63299219d815464129dac051ab2404286Dianne Hackborn * the identifier as returned by {@link #getId} is the only thing that 53c6669ca63299219d815464129dac051ab2404286Dianne Hackborn * will be persisted across activity instances. 54c6669ca63299219d815464129dac051ab2404286Dianne Hackborn */ 55c6669ca63299219d815464129dac051ab2404286Dianne Hackborn public interface BackStackEntry { 56c6669ca63299219d815464129dac051ab2404286Dianne Hackborn /** 57c6669ca63299219d815464129dac051ab2404286Dianne Hackborn * Return the unique identifier for the entry. This is the only 58c6669ca63299219d815464129dac051ab2404286Dianne Hackborn * representation of the entry that will persist across activity 59c6669ca63299219d815464129dac051ab2404286Dianne Hackborn * instances. 60c6669ca63299219d815464129dac051ab2404286Dianne Hackborn */ 61c6669ca63299219d815464129dac051ab2404286Dianne Hackborn public int getId(); 62c6669ca63299219d815464129dac051ab2404286Dianne Hackborn 63c6669ca63299219d815464129dac051ab2404286Dianne Hackborn /** 64c6669ca63299219d815464129dac051ab2404286Dianne Hackborn * Return the full bread crumb title for the entry, or null if it 65c6669ca63299219d815464129dac051ab2404286Dianne Hackborn * does not have one. 66c6669ca63299219d815464129dac051ab2404286Dianne Hackborn */ 67c6669ca63299219d815464129dac051ab2404286Dianne Hackborn public CharSequence getBreadCrumbTitle(); 68c6669ca63299219d815464129dac051ab2404286Dianne Hackborn 69c6669ca63299219d815464129dac051ab2404286Dianne Hackborn /** 70c6669ca63299219d815464129dac051ab2404286Dianne Hackborn * Return the short bread crumb title for the entry, or null if it 71c6669ca63299219d815464129dac051ab2404286Dianne Hackborn * does not have one. 72c6669ca63299219d815464129dac051ab2404286Dianne Hackborn */ 73c6669ca63299219d815464129dac051ab2404286Dianne Hackborn public CharSequence getBreadCrumbShortTitle(); 74c6669ca63299219d815464129dac051ab2404286Dianne Hackborn } 75c6669ca63299219d815464129dac051ab2404286Dianne Hackborn 76c6669ca63299219d815464129dac051ab2404286Dianne Hackborn /** 77c6669ca63299219d815464129dac051ab2404286Dianne Hackborn * Interface to watch for changes to the back stack. 78c6669ca63299219d815464129dac051ab2404286Dianne Hackborn */ 79c6669ca63299219d815464129dac051ab2404286Dianne Hackborn public interface OnBackStackChangedListener { 80c6669ca63299219d815464129dac051ab2404286Dianne Hackborn /** 81c6669ca63299219d815464129dac051ab2404286Dianne Hackborn * Called whenever the contents of the back stack change. 82c6669ca63299219d815464129dac051ab2404286Dianne Hackborn */ 83c6669ca63299219d815464129dac051ab2404286Dianne Hackborn public void onBackStackChanged(); 84c6669ca63299219d815464129dac051ab2404286Dianne Hackborn } 85c6669ca63299219d815464129dac051ab2404286Dianne Hackborn 86c6669ca63299219d815464129dac051ab2404286Dianne Hackborn /** 87b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * Start a series of edit operations on the Fragments associated with 88b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * this FragmentManager. 89fb3cffeb35368da22f99b85d45039c4e6e471c06Dianne Hackborn * 90fb3cffeb35368da22f99b85d45039c4e6e471c06Dianne Hackborn * <p>Note: A fragment transaction can only be created/committed prior 91fb3cffeb35368da22f99b85d45039c4e6e471c06Dianne Hackborn * to an activity saving its state. If you try to commit a transaction 92fb3cffeb35368da22f99b85d45039c4e6e471c06Dianne Hackborn * after {@link Activity#onSaveInstanceState Activity.onSaveInstanceState()} 93fb3cffeb35368da22f99b85d45039c4e6e471c06Dianne Hackborn * (and prior to a following {@link Activity#onStart Activity.onStart} 94fb3cffeb35368da22f99b85d45039c4e6e471c06Dianne Hackborn * or {@link Activity#onResume Activity.onResume()}, you will get an error. 95fb3cffeb35368da22f99b85d45039c4e6e471c06Dianne Hackborn * This is because the framework takes care of saving your current fragments 96fb3cffeb35368da22f99b85d45039c4e6e471c06Dianne Hackborn * in the state, and if changes are made after the state is saved then they 97fb3cffeb35368da22f99b85d45039c4e6e471c06Dianne Hackborn * will be lost.</p> 98b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn */ 99ab36acb39941ce981dddda9f9cf4d2d23a56fd26Dianne Hackborn public abstract FragmentTransaction openTransaction(); 100b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn 101b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn /** 102b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * Finds a fragment that was identified by the given id either when inflated 103b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * from XML or as the container ID when added in a transaction. This first 104b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * searches through fragments that are currently added to the manager's 105b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * activity; if no such fragment is found, then all fragments currently 106b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * on the back stack associated with this ID are searched. 107b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * @return The fragment if found or null otherwise. 108b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn */ 109ab36acb39941ce981dddda9f9cf4d2d23a56fd26Dianne Hackborn public abstract Fragment findFragmentById(int id); 110b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn 111b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn /** 112b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * Finds a fragment that was identified by the given tag either when inflated 113b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * from XML or as supplied when added in a transaction. This first 114b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * searches through fragments that are currently added to the manager's 115b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * activity; if no such fragment is found, then all fragments currently 116b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * on the back stack are searched. 117b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * @return The fragment if found or null otherwise. 118b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn */ 119ab36acb39941ce981dddda9f9cf4d2d23a56fd26Dianne Hackborn public abstract Fragment findFragmentByTag(String tag); 120b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn 121b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn /** 122b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * Flag for {@link #popBackStack(String, int)} 123b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * and {@link #popBackStack(int, int)}: If set, and the name or ID of 124b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * a back stack entry has been supplied, then all matching entries will 125b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * be consumed until one that doesn't match is found or the bottom of 126b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * the stack is reached. Otherwise, all entries up to but not including that entry 127b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * will be removed. 128b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn */ 129b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn public static final int POP_BACK_STACK_INCLUSIVE = 1<<0; 130b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn 131b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn /** 132b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * Pop the top state off the back stack. Returns true if there was one 133b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * to pop, else false. 134b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn */ 135ab36acb39941ce981dddda9f9cf4d2d23a56fd26Dianne Hackborn public abstract boolean popBackStack(); 136b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn 137b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn /** 138b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * Pop the last fragment transition from the manager's fragment 139b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * back stack. If there is nothing to pop, false is returned. 140b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * @param name If non-null, this is the name of a previous back state 141b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * to look for; if found, all states up to that state will be popped. The 142b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * {@link #POP_BACK_STACK_INCLUSIVE} flag can be used to control whether 143b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * the named state itself is popped. If null, only the top state is popped. 144b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * @param flags Either 0 or {@link #POP_BACK_STACK_INCLUSIVE}. 145b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn */ 146ab36acb39941ce981dddda9f9cf4d2d23a56fd26Dianne Hackborn public abstract boolean popBackStack(String name, int flags); 147b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn 148b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn /** 149b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * Pop all back stack states up to the one with the given identifier. 150b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * @param id Identifier of the stated to be popped. If no identifier exists, 151b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * false is returned. 152b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * The identifier is the number returned by 153b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * {@link FragmentTransaction#commit() FragmentTransaction.commit()}. The 154b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * {@link #POP_BACK_STACK_INCLUSIVE} flag can be used to control whether 155b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * the named state itself is popped. 156b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * @param flags Either 0 or {@link #POP_BACK_STACK_INCLUSIVE}. 157b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn */ 158ab36acb39941ce981dddda9f9cf4d2d23a56fd26Dianne Hackborn public abstract boolean popBackStack(int id, int flags); 159b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn 160b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn /** 161c6669ca63299219d815464129dac051ab2404286Dianne Hackborn * Return the number of entries currently in the back stack. 162c6669ca63299219d815464129dac051ab2404286Dianne Hackborn */ 163ab36acb39941ce981dddda9f9cf4d2d23a56fd26Dianne Hackborn public abstract int countBackStackEntries(); 164c6669ca63299219d815464129dac051ab2404286Dianne Hackborn 165c6669ca63299219d815464129dac051ab2404286Dianne Hackborn /** 166c6669ca63299219d815464129dac051ab2404286Dianne Hackborn * Return the BackStackEntry at index <var>index</var> in the back stack; 167c6669ca63299219d815464129dac051ab2404286Dianne Hackborn * entries start index 0 being the bottom of the stack. 168c6669ca63299219d815464129dac051ab2404286Dianne Hackborn */ 169ab36acb39941ce981dddda9f9cf4d2d23a56fd26Dianne Hackborn public abstract BackStackEntry getBackStackEntry(int index); 170c6669ca63299219d815464129dac051ab2404286Dianne Hackborn 171c6669ca63299219d815464129dac051ab2404286Dianne Hackborn /** 172c6669ca63299219d815464129dac051ab2404286Dianne Hackborn * Add a new listener for changes to the fragment back stack. 173c6669ca63299219d815464129dac051ab2404286Dianne Hackborn */ 174ab36acb39941ce981dddda9f9cf4d2d23a56fd26Dianne Hackborn public abstract void addOnBackStackChangedListener(OnBackStackChangedListener listener); 175c6669ca63299219d815464129dac051ab2404286Dianne Hackborn 176c6669ca63299219d815464129dac051ab2404286Dianne Hackborn /** 177c6669ca63299219d815464129dac051ab2404286Dianne Hackborn * Remove a listener that was previously added with 178c6669ca63299219d815464129dac051ab2404286Dianne Hackborn * {@link #addOnBackStackChangedListener(OnBackStackChangedListener)}. 179c6669ca63299219d815464129dac051ab2404286Dianne Hackborn */ 180ab36acb39941ce981dddda9f9cf4d2d23a56fd26Dianne Hackborn public abstract void removeOnBackStackChangedListener(OnBackStackChangedListener listener); 181c6669ca63299219d815464129dac051ab2404286Dianne Hackborn 182c6669ca63299219d815464129dac051ab2404286Dianne Hackborn /** 183b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * Put a reference to a fragment in a Bundle. This Bundle can be 184b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * persisted as saved state, and when later restoring 185b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * {@link #getFragment(Bundle, String)} will return the current 186b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * instance of the same fragment. 187b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * 188b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * @param bundle The bundle in which to put the fragment reference. 189b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * @param key The name of the entry in the bundle. 190b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * @param fragment The Fragment whose reference is to be stored. 191b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn */ 192ab36acb39941ce981dddda9f9cf4d2d23a56fd26Dianne Hackborn public abstract void putFragment(Bundle bundle, String key, Fragment fragment); 193b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn 194b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn /** 195b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * Retrieve the current Fragment instance for a reference previously 196b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * placed with {@link #putFragment(Bundle, String, Fragment)}. 197b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * 198b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * @param bundle The bundle from which to retrieve the fragment reference. 199b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * @param key The name of the entry in the bundle. 200b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * @return Returns the current Fragment instance that is associated with 201b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * the given reference. 202b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn */ 203ab36acb39941ce981dddda9f9cf4d2d23a56fd26Dianne Hackborn public abstract Fragment getFragment(Bundle bundle, String key); 204625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn 205625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn /** 206625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn * Print the FragmentManager's state into the given stream. 207625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn * 208625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn * @param prefix Text to print at the front of each line. 209625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn * @param fd The raw file descriptor that the dump is being sent to. 210625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn * @param writer A PrintWriter to which the dump is to be set. 211625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn * @param args additional arguments to the dump request. 212625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn */ 213ab36acb39941ce981dddda9f9cf4d2d23a56fd26Dianne Hackborn public abstract void dump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args); 214b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn} 215b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn 216b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackbornfinal class FragmentManagerState implements Parcelable { 2176e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn FragmentState[] mActive; 218b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn int[] mAdded; 219b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn BackStackState[] mBackStack; 220b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn 221b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn public FragmentManagerState() { 222b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 223b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn 224b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn public FragmentManagerState(Parcel in) { 2256e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn mActive = in.createTypedArray(FragmentState.CREATOR); 226b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn mAdded = in.createIntArray(); 227b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn mBackStack = in.createTypedArray(BackStackState.CREATOR); 228b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 229b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn 230b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn public int describeContents() { 231b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn return 0; 232b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 233b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn 234b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn public void writeToParcel(Parcel dest, int flags) { 2356e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn dest.writeTypedArray(mActive, flags); 236b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn dest.writeIntArray(mAdded); 237b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn dest.writeTypedArray(mBackStack, flags); 238b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 239b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn 240b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn public static final Parcelable.Creator<FragmentManagerState> CREATOR 241b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn = new Parcelable.Creator<FragmentManagerState>() { 242b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn public FragmentManagerState createFromParcel(Parcel in) { 243b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn return new FragmentManagerState(in); 244b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 245b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn 246b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn public FragmentManagerState[] newArray(int size) { 247b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn return new FragmentManagerState[size]; 248b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 249b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn }; 250ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn} 251ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn 2522dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn/** 2532dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn * Container for fragments associated with an activity. 2542dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn */ 255ab36acb39941ce981dddda9f9cf4d2d23a56fd26Dianne Hackbornfinal class FragmentManagerImpl extends FragmentManager { 2565ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn static final boolean DEBUG = true; 2575ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn static final String TAG = "FragmentManager"; 2585ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn 259def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn static final String TARGET_REQUEST_CODE_STATE_TAG = "android:target_req_state"; 260def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn static final String TARGET_STATE_TAG = "android:target_state"; 261def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn static final String VIEW_STATE_TAG = "android:view_state"; 262def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn 263445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn ArrayList<Runnable> mPendingActions; 264445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn Runnable[] mTmpActions; 265445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn boolean mExecutingActions; 266445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn 2676e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn ArrayList<Fragment> mActive; 2686e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn ArrayList<Fragment> mAdded; 2696e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn ArrayList<Integer> mAvailIndices; 270c6669ca63299219d815464129dac051ab2404286Dianne Hackborn ArrayList<BackStackRecord> mBackStack; 2718eb2e244f9b14d946ee587d0b673b866865026c0Dianne Hackborn ArrayList<Fragment> mCreatedMenus; 2722dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn 273dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn // Must be accessed while locked. 274c6669ca63299219d815464129dac051ab2404286Dianne Hackborn ArrayList<BackStackRecord> mBackStackIndices; 275dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn ArrayList<Integer> mAvailBackStackIndices; 276dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn 277c6669ca63299219d815464129dac051ab2404286Dianne Hackborn ArrayList<OnBackStackChangedListener> mBackStackChangeListeners; 278c6669ca63299219d815464129dac051ab2404286Dianne Hackborn 2792dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn int mCurState = Fragment.INITIALIZING; 2802dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn Activity mActivity; 2812dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn 282b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn boolean mNeedMenuInvalidate; 2833e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn boolean mStateSaved; 284fb3cffeb35368da22f99b85d45039c4e6e471c06Dianne Hackborn String mNoTransactionsBecause; 285b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn 286b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn // Temporary vars for state save and restore. 287b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn Bundle mStateBundle = null; 288b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn SparseArray<Parcelable> mStateArray = null; 289b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn 290445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn Runnable mExecCommit = new Runnable() { 291445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn @Override 292445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn public void run() { 293445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn execPendingActions(); 294445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn } 295445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn }; 296625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn 297625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn @Override 298b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn public FragmentTransaction openTransaction() { 299c6669ca63299219d815464129dac051ab2404286Dianne Hackborn return new BackStackRecord(this); 300b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn } 301b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn 302625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn @Override 303b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn public boolean popBackStack() { 304b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn return popBackStackState(mActivity.mHandler, null, -1, 0); 305b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn } 306b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn 307625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn @Override 308b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn public boolean popBackStack(String name, int flags) { 309b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn return popBackStackState(mActivity.mHandler, name, -1, flags); 310b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn } 311b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn 312625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn @Override 313b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn public boolean popBackStack(int id, int flags) { 314b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn if (id < 0) { 315b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn throw new IllegalArgumentException("Bad id: " + id); 316b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn } 317b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn return popBackStackState(mActivity.mHandler, null, id, flags); 318b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn } 319b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn 320625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn @Override 321c6669ca63299219d815464129dac051ab2404286Dianne Hackborn public int countBackStackEntries() { 322c6669ca63299219d815464129dac051ab2404286Dianne Hackborn return mBackStack != null ? mBackStack.size() : 0; 323c6669ca63299219d815464129dac051ab2404286Dianne Hackborn } 324c6669ca63299219d815464129dac051ab2404286Dianne Hackborn 325625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn @Override 326c6669ca63299219d815464129dac051ab2404286Dianne Hackborn public BackStackEntry getBackStackEntry(int index) { 327c6669ca63299219d815464129dac051ab2404286Dianne Hackborn return mBackStack.get(index); 328c6669ca63299219d815464129dac051ab2404286Dianne Hackborn } 329c6669ca63299219d815464129dac051ab2404286Dianne Hackborn 330625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn @Override 331c6669ca63299219d815464129dac051ab2404286Dianne Hackborn public void addOnBackStackChangedListener(OnBackStackChangedListener listener) { 332c6669ca63299219d815464129dac051ab2404286Dianne Hackborn if (mBackStackChangeListeners == null) { 333c6669ca63299219d815464129dac051ab2404286Dianne Hackborn mBackStackChangeListeners = new ArrayList<OnBackStackChangedListener>(); 334c6669ca63299219d815464129dac051ab2404286Dianne Hackborn } 335c6669ca63299219d815464129dac051ab2404286Dianne Hackborn mBackStackChangeListeners.add(listener); 336c6669ca63299219d815464129dac051ab2404286Dianne Hackborn } 337c6669ca63299219d815464129dac051ab2404286Dianne Hackborn 338625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn @Override 339c6669ca63299219d815464129dac051ab2404286Dianne Hackborn public void removeOnBackStackChangedListener(OnBackStackChangedListener listener) { 340c6669ca63299219d815464129dac051ab2404286Dianne Hackborn if (mBackStackChangeListeners != null) { 341c6669ca63299219d815464129dac051ab2404286Dianne Hackborn mBackStackChangeListeners.remove(listener); 342c6669ca63299219d815464129dac051ab2404286Dianne Hackborn } 343c6669ca63299219d815464129dac051ab2404286Dianne Hackborn } 344c6669ca63299219d815464129dac051ab2404286Dianne Hackborn 345625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn @Override 346b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn public void putFragment(Bundle bundle, String key, Fragment fragment) { 347b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn if (fragment.mIndex < 0) { 348b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn throw new IllegalStateException("Fragment " + fragment 349b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn + " is not currently in the FragmentManager"); 350b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn } 351b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn bundle.putInt(key, fragment.mIndex); 352b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn } 353b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn 354625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn @Override 355b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn public Fragment getFragment(Bundle bundle, String key) { 356def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn int index = bundle.getInt(key, -1); 357def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn if (index == -1) { 358def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn return null; 359def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn } 360b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn if (index >= mActive.size()) { 361b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn throw new IllegalStateException("Fragement no longer exists for key " 362b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn + key + ": index " + index); 363b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn } 364b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn Fragment f = mActive.get(index); 365b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn if (f == null) { 366b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn throw new IllegalStateException("Fragement no longer exists for key " 367b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn + key + ": index " + index); 368b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn } 369b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn return f; 370b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn } 371b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn 372625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn @Override 373625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn public void dump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args) { 374625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn if (mActive == null || mActive.size() <= 0) { 375625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn return; 376625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn } 377625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn 378625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn writer.print(prefix); writer.println("Active Fragments:"); 379625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn 380625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn String innerPrefix = prefix + " "; 381625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn 382625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn int N = mActive.size(); 383625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn for (int i=0; i<N; i++) { 384625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn Fragment f = mActive.get(i); 385625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn if (f != null) { 386625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn writer.print(prefix); writer.print(" #"); writer.print(i); 387625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn writer.print(": "); writer.println(f.toString()); 388625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn f.dump(innerPrefix, fd, writer, args); 389625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn } 390625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn } 391625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn 392625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn if (mAdded != null) { 393625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn N = mAdded.size(); 394625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn if (N > 0) { 395625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn writer.print(prefix); writer.println("Added Fragments:"); 396625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn for (int i=0; i<N; i++) { 397625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn Fragment f = mAdded.get(i); 398625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn writer.print(prefix); writer.print(" #"); writer.print(i); 399625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn writer.print(": "); writer.println(f.toString()); 400625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn } 401625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn } 402625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn } 403625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn 404625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn if (mBackStack != null) { 405625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn N = mBackStack.size(); 406625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn if (N > 0) { 407625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn writer.print(prefix); writer.println("Back Stack:"); 408625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn for (int i=0; i<N; i++) { 409625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn BackStackRecord bs = mBackStack.get(i); 410625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn writer.print(prefix); writer.print(" #"); writer.print(i); 411625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn writer.print(": "); writer.println(bs.toString()); 412625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn } 413625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn } 414625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn } 415625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn } 416625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn 417a18a86b43e40e3c15dcca0ae0148d641be9b25feChet Haase Animator loadAnimator(Fragment fragment, int transit, boolean enter, 418f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn int transitionStyle) { 419a18a86b43e40e3c15dcca0ae0148d641be9b25feChet Haase Animator animObj = fragment.onCreateAnimator(transit, enter, 4205ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn fragment.mNextAnim); 421f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn if (animObj != null) { 422f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn return animObj; 423f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } 424f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn 4255ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn if (fragment.mNextAnim != 0) { 426a18a86b43e40e3c15dcca0ae0148d641be9b25feChet Haase Animator anim = AnimatorInflater.loadAnimator(mActivity, fragment.mNextAnim); 4275ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn if (anim != null) { 4285ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn return anim; 4295ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn } 4305ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn } 4315ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn 432f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn if (transit == 0) { 433f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn return null; 434f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } 435f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn 436f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn int styleIndex = transitToStyleIndex(transit, enter); 437f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn if (styleIndex < 0) { 438f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn return null; 439f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } 440f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn 441f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn if (transitionStyle == 0 && mActivity.getWindow() != null) { 442f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn transitionStyle = mActivity.getWindow().getAttributes().windowAnimations; 443f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } 444f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn if (transitionStyle == 0) { 445f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn return null; 446f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } 447f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn 448f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn TypedArray attrs = mActivity.obtainStyledAttributes(transitionStyle, 449811ed1065f39469cf2cf6adba22cab397ed88d5eChet Haase com.android.internal.R.styleable.FragmentAnimation); 450f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn int anim = attrs.getResourceId(styleIndex, 0); 451f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn attrs.recycle(); 452f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn 453f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn if (anim == 0) { 454f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn return null; 455f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } 456f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn 457a18a86b43e40e3c15dcca0ae0148d641be9b25feChet Haase return AnimatorInflater.loadAnimator(mActivity, anim); 458f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } 459f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn 460f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn void moveToState(Fragment f, int newState, int transit, int transitionStyle) { 4616e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn // Fragments that are not currently added will sit in the onCreate() state. 4626e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (!f.mAdded && newState > Fragment.CREATED) { 4636e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn newState = Fragment.CREATED; 4646e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } 4656e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn 4662dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn if (f.mState < newState) { 4672dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn switch (f.mState) { 4682dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn case Fragment.INITIALIZING: 4695ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn if (DEBUG) Log.v(TAG, "moveto CREATED: " + f); 470def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn if (f.mSavedFragmentState != null) { 471def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn f.mSavedViewState = f.mSavedFragmentState.getSparseParcelableArray( 472def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn FragmentManagerImpl.VIEW_STATE_TAG); 473def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn f.mTarget = getFragment(f.mSavedFragmentState, 474def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn FragmentManagerImpl.TARGET_STATE_TAG); 475def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn if (f.mTarget != null) { 476def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn f.mTargetRequestCode = f.mSavedFragmentState.getInt( 477def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn FragmentManagerImpl.TARGET_REQUEST_CODE_STATE_TAG, 0); 478def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn } 479def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn } 4802dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn f.mActivity = mActivity; 4812dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn f.mCalled = false; 4822dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn f.onAttach(mActivity); 4832dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn if (!f.mCalled) { 4842dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn throw new SuperNotCalledException("Fragment " + f 4852dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn + " did not call through to super.onAttach()"); 4862dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 487c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn mActivity.onAttachFragment(f); 4882dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn 489b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn if (!f.mRetaining) { 490b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn f.mCalled = false; 491b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn f.onCreate(f.mSavedFragmentState); 492b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn if (!f.mCalled) { 493b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn throw new SuperNotCalledException("Fragment " + f 494b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn + " did not call through to super.onCreate()"); 4952dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 4962dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 497b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn f.mRetaining = false; 498b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn if (f.mFromLayout) { 499b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn // For fragments that are part of the content view 500b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn // layout, we need to instantiate the view immediately 501b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn // and the inflater will take care of adding it. 502b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn f.mView = f.onCreateView(mActivity.getLayoutInflater(), 503b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn null, f.mSavedFragmentState); 5046e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (f.mView != null) { 5056e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn f.mView.setSaveFromParentEnabled(false); 5066e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn f.restoreViewState(); 5075ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn if (f.mHidden) f.mView.setVisibility(View.GONE); 5086e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } 509b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 5106e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn case Fragment.CREATED: 5116e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (newState > Fragment.CREATED) { 5125ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn if (DEBUG) Log.v(TAG, "moveto CONTENT: " + f); 513b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn if (!f.mFromLayout) { 514b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn ViewGroup container = null; 515b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn if (f.mContainerId != 0) { 516b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn container = (ViewGroup)mActivity.findViewById(f.mContainerId); 517b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn if (container == null) { 518625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn throw new IllegalArgumentException("No view found for id 0x" 519b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn + Integer.toHexString(f.mContainerId) 520b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn + " for fragment " + f); 521b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 522b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 523b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn f.mContainer = container; 524b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn f.mView = f.onCreateView(mActivity.getLayoutInflater(), 525b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn container, f.mSavedFragmentState); 526b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn if (f.mView != null) { 527b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn f.mView.setSaveFromParentEnabled(false); 528b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn if (container != null) { 529a18a86b43e40e3c15dcca0ae0148d641be9b25feChet Haase Animator anim = loadAnimator(f, transit, true, 530b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn transitionStyle); 531b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn if (anim != null) { 532b20db3ec34e846010f389880b2cfab4d7bf79820Chet Haase anim.setTarget(f.mView); 533811ed1065f39469cf2cf6adba22cab397ed88d5eChet Haase anim.start(); 534b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 535b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn container.addView(f.mView); 536b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn f.restoreViewState(); 537b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 5385ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn if (f.mHidden) f.mView.setVisibility(View.GONE); 539b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 540b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 541b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn 542b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn f.mCalled = false; 543c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn f.onActivityCreated(f.mSavedFragmentState); 544b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn if (!f.mCalled) { 545b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn throw new SuperNotCalledException("Fragment " + f 546b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn + " did not call through to super.onReady()"); 547f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } 548b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn f.mSavedFragmentState = null; 5492dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 550c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn case Fragment.ACTIVITY_CREATED: 551c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn if (newState > Fragment.ACTIVITY_CREATED) { 5525ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn if (DEBUG) Log.v(TAG, "moveto STARTED: " + f); 5532dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn f.mCalled = false; 5542dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn f.onStart(); 5552dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn if (!f.mCalled) { 5562dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn throw new SuperNotCalledException("Fragment " + f 5572dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn + " did not call through to super.onStart()"); 5582dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 5592dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 5602dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn case Fragment.STARTED: 5612dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn if (newState > Fragment.STARTED) { 5625ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn if (DEBUG) Log.v(TAG, "moveto RESUMED: " + f); 5632dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn f.mCalled = false; 5642707d6026240bcca6f0e35e2e1138958882e90ceDianne Hackborn f.mResumed = true; 5652dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn f.onResume(); 5662dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn if (!f.mCalled) { 5672dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn throw new SuperNotCalledException("Fragment " + f 5682dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn + " did not call through to super.onResume()"); 5692dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 5702dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 5712dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 5722dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } else if (f.mState > newState) { 5732dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn switch (f.mState) { 5742dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn case Fragment.RESUMED: 5752dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn if (newState < Fragment.RESUMED) { 5765ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn if (DEBUG) Log.v(TAG, "movefrom RESUMED: " + f); 5772dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn f.mCalled = false; 5782dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn f.onPause(); 5792dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn if (!f.mCalled) { 5802dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn throw new SuperNotCalledException("Fragment " + f 5812dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn + " did not call through to super.onPause()"); 5822dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 5832707d6026240bcca6f0e35e2e1138958882e90ceDianne Hackborn f.mResumed = false; 5842dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 5852dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn case Fragment.STARTED: 5862dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn if (newState < Fragment.STARTED) { 5875ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn if (DEBUG) Log.v(TAG, "movefrom STARTED: " + f); 5882dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn f.mCalled = false; 5892707d6026240bcca6f0e35e2e1138958882e90ceDianne Hackborn f.performStop(); 5902dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn if (!f.mCalled) { 5912dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn throw new SuperNotCalledException("Fragment " + f 5922dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn + " did not call through to super.onStop()"); 5932dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 5942dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 595c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn case Fragment.ACTIVITY_CREATED: 596c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn if (newState < Fragment.ACTIVITY_CREATED) { 5975ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn if (DEBUG) Log.v(TAG, "movefrom CONTENT: " + f); 598b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn if (f.mView != null) { 599b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn // Need to save the current view state if not 600b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn // done already. 601625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn if (!mActivity.isFinishing() && f.mSavedViewState == null) { 602b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn saveFragmentViewState(f); 603b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 604def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn } 605def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn f.mCalled = false; 606def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn f.onDestroyView(); 607def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn if (!f.mCalled) { 608def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn throw new SuperNotCalledException("Fragment " + f 609def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn + " did not call through to super.onDestroyedView()"); 610def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn } 611def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn if (f.mView != null && f.mContainer != null) { 612b20db3ec34e846010f389880b2cfab4d7bf79820Chet Haase Animator anim = null; 613def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn if (mCurState > Fragment.INITIALIZING) { 614b20db3ec34e846010f389880b2cfab4d7bf79820Chet Haase anim = loadAnimator(f, transit, false, 615def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn transitionStyle); 616b20db3ec34e846010f389880b2cfab4d7bf79820Chet Haase } 617b20db3ec34e846010f389880b2cfab4d7bf79820Chet Haase if (anim != null) { 618b20db3ec34e846010f389880b2cfab4d7bf79820Chet Haase final ViewGroup container = f.mContainer; 619b20db3ec34e846010f389880b2cfab4d7bf79820Chet Haase final View view = f.mView; 620b20db3ec34e846010f389880b2cfab4d7bf79820Chet Haase container.startViewTransition(view); 621b20db3ec34e846010f389880b2cfab4d7bf79820Chet Haase anim.addListener(new AnimatorListenerAdapter() { 622b20db3ec34e846010f389880b2cfab4d7bf79820Chet Haase @Override 623b20db3ec34e846010f389880b2cfab4d7bf79820Chet Haase public void onAnimationEnd(Animator anim) { 624b20db3ec34e846010f389880b2cfab4d7bf79820Chet Haase container.endViewTransition(view); 625b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 626b20db3ec34e846010f389880b2cfab4d7bf79820Chet Haase }); 627b20db3ec34e846010f389880b2cfab4d7bf79820Chet Haase anim.setTarget(f.mView); 628b20db3ec34e846010f389880b2cfab4d7bf79820Chet Haase anim.start(); 629b20db3ec34e846010f389880b2cfab4d7bf79820Chet Haase 630f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } 631def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn f.mContainer.removeView(f.mView); 6322dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 6332dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn f.mContainer = null; 6342dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn f.mView = null; 635b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 636b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn case Fragment.CREATED: 637b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn if (newState < Fragment.CREATED) { 6385ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn if (DEBUG) Log.v(TAG, "movefrom CREATED: " + f); 639b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn if (!f.mRetaining) { 640b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn f.mCalled = false; 641b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn f.onDestroy(); 642b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn if (!f.mCalled) { 643b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn throw new SuperNotCalledException("Fragment " + f 644b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn + " did not call through to super.onDestroy()"); 645b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 6462dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 647b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn 6482dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn f.mCalled = false; 6492dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn f.onDetach(); 6502dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn if (!f.mCalled) { 6512dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn throw new SuperNotCalledException("Fragment " + f 6522dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn + " did not call through to super.onDetach()"); 6532dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 6543e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn f.mImmediateActivity = null; 6552dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn f.mActivity = null; 6562dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 6572dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 6582dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 6592dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn 6602dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn f.mState = newState; 6612dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 6622dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn 663625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn void moveToState(Fragment f) { 664625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn moveToState(f, mCurState, 0, 0); 665625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn } 666625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn 667ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn void moveToState(int newState, boolean always) { 668f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn moveToState(newState, 0, 0, always); 669f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } 670f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn 671f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn void moveToState(int newState, int transit, int transitStyle, boolean always) { 6722dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn if (mActivity == null && newState != Fragment.INITIALIZING) { 6732dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn throw new IllegalStateException("No activity"); 6742dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 6752dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn 676ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn if (!always && mCurState == newState) { 677ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn return; 678ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn } 679ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn 6802dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn mCurState = newState; 6816e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (mActive != null) { 6826e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn for (int i=0; i<mActive.size(); i++) { 6836e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn Fragment f = mActive.get(i); 6846e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (f != null) { 6856e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn moveToState(f, newState, transit, transitStyle); 6866e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } 6876e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } 6885f36c96f6d3623a826466db68cc1586f078ac307Dianne Hackborn 6895f36c96f6d3623a826466db68cc1586f078ac307Dianne Hackborn if (mNeedMenuInvalidate && mActivity != null) { 6905f36c96f6d3623a826466db68cc1586f078ac307Dianne Hackborn mActivity.invalidateOptionsMenu(); 6915f36c96f6d3623a826466db68cc1586f078ac307Dianne Hackborn mNeedMenuInvalidate = false; 6925f36c96f6d3623a826466db68cc1586f078ac307Dianne Hackborn } 6936e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } 6946e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } 6956e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn 6966e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn void makeActive(Fragment f) { 6976e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (f.mIndex >= 0) { 6986e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn return; 6996e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } 7006e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn 7016e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (mAvailIndices == null || mAvailIndices.size() <= 0) { 7026e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (mActive == null) { 7036e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn mActive = new ArrayList<Fragment>(); 704ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn } 7056e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn f.setIndex(mActive.size()); 7066e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn mActive.add(f); 7076e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn 7086e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } else { 7096e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn f.setIndex(mAvailIndices.remove(mAvailIndices.size()-1)); 7106e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn mActive.set(f.mIndex, f); 7112dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 7122dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 7132dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn 7146e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn void makeInactive(Fragment f) { 7156e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (f.mIndex < 0) { 7166e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn return; 7176e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } 7186e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn 719b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn if (DEBUG) Log.v(TAG, "Freeing fragment index " + f.mIndex); 7206e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn mActive.set(f.mIndex, null); 7216e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (mAvailIndices == null) { 7226e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn mAvailIndices = new ArrayList<Integer>(); 7236e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } 7246e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn mAvailIndices.add(f.mIndex); 7259e14e9f33a66b864b98c6ff9517988bafbca3301Dianne Hackborn mActivity.invalidateFragmentIndex(f.mIndex); 7266e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn f.clearIndex(); 7276e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } 7286e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn 729ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn public void addFragment(Fragment fragment, boolean moveToStateNow) { 7306e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (mAdded == null) { 7316e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn mAdded = new ArrayList<Fragment>(); 732ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn } 7336e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn mAdded.add(fragment); 7346e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn makeActive(fragment); 7355e0d59547c4042037e23a42ba4e2521721e9c7d3Dianne Hackborn if (DEBUG) Log.v(TAG, "add: " + fragment); 7366e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn fragment.mAdded = true; 737b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn if (fragment.mHasMenu) { 738b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn mNeedMenuInvalidate = true; 739b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn } 740ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn if (moveToStateNow) { 741625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn moveToState(fragment); 742ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn } 7432dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 7442dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn 745f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn public void removeFragment(Fragment fragment, int transition, int transitionStyle) { 7465e0d59547c4042037e23a42ba4e2521721e9c7d3Dianne Hackborn if (DEBUG) Log.v(TAG, "remove: " + fragment + " nesting=" + fragment.mBackStackNesting); 7476e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn mAdded.remove(fragment); 7486e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn final boolean inactive = fragment.mBackStackNesting <= 0; 749b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn if (fragment.mHasMenu) { 750b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn mNeedMenuInvalidate = true; 751b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn } 7526e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn fragment.mAdded = false; 7536e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn moveToState(fragment, inactive ? Fragment.INITIALIZING : Fragment.CREATED, 7546e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn transition, transitionStyle); 7555e0d59547c4042037e23a42ba4e2521721e9c7d3Dianne Hackborn if (inactive) { 7565e0d59547c4042037e23a42ba4e2521721e9c7d3Dianne Hackborn makeInactive(fragment); 7575e0d59547c4042037e23a42ba4e2521721e9c7d3Dianne Hackborn } 758f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } 759f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn 7605ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn public void hideFragment(Fragment fragment, int transition, int transitionStyle) { 7615ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn if (DEBUG) Log.v(TAG, "hide: " + fragment); 7625ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn if (!fragment.mHidden) { 7635ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn fragment.mHidden = true; 7645ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn if (fragment.mView != null) { 765a18a86b43e40e3c15dcca0ae0148d641be9b25feChet Haase Animator anim = loadAnimator(fragment, transition, true, 7665ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn transitionStyle); 7675ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn if (anim != null) { 768b20db3ec34e846010f389880b2cfab4d7bf79820Chet Haase anim.setTarget(fragment.mView); 769811ed1065f39469cf2cf6adba22cab397ed88d5eChet Haase anim.start(); 7705ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn } 7715ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn fragment.mView.setVisibility(View.GONE); 7725ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn } 773b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn if (fragment.mAdded && fragment.mHasMenu) { 774b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn mNeedMenuInvalidate = true; 775b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn } 7765ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn fragment.onHiddenChanged(true); 7775ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn } 7785ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn } 7795ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn 7805ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn public void showFragment(Fragment fragment, int transition, int transitionStyle) { 7815ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn if (DEBUG) Log.v(TAG, "show: " + fragment); 7825ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn if (fragment.mHidden) { 7835ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn fragment.mHidden = false; 7845ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn if (fragment.mView != null) { 785a18a86b43e40e3c15dcca0ae0148d641be9b25feChet Haase Animator anim = loadAnimator(fragment, transition, true, 7865ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn transitionStyle); 7875ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn if (anim != null) { 788b20db3ec34e846010f389880b2cfab4d7bf79820Chet Haase anim.setTarget(fragment.mView); 789811ed1065f39469cf2cf6adba22cab397ed88d5eChet Haase anim.start(); 7905ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn } 7915ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn fragment.mView.setVisibility(View.VISIBLE); 7925ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn } 793b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn if (fragment.mAdded && fragment.mHasMenu) { 794b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn mNeedMenuInvalidate = true; 795b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn } 7965ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn fragment.onHiddenChanged(false); 7975ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn } 7985ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn } 7995ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn 800f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn public Fragment findFragmentById(int id) { 8016e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (mActive != null) { 8025ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn // First look through added fragments. 8035ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn for (int i=mAdded.size()-1; i>=0; i--) { 8045ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn Fragment f = mAdded.get(i); 8055ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn if (f != null && f.mFragmentId == id) { 8065ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn return f; 8075ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn } 8085ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn } 8095ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn // Now for any known fragment. 8106e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn for (int i=mActive.size()-1; i>=0; i--) { 8116e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn Fragment f = mActive.get(i); 8126e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (f != null && f.mFragmentId == id) { 813b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn return f; 814b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 815b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 816b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 817b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn return null; 818b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 819b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn 820b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn public Fragment findFragmentByTag(String tag) { 8216e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (mActive != null && tag != null) { 8225ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn // First look through added fragments. 8235ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn for (int i=mAdded.size()-1; i>=0; i--) { 8245ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn Fragment f = mAdded.get(i); 8255ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn if (f != null && tag.equals(f.mTag)) { 8265ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn return f; 8275ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn } 8285ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn } 8295ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn // Now for any known fragment. 8306e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn for (int i=mActive.size()-1; i>=0; i--) { 8316e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn Fragment f = mActive.get(i); 8326e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (f != null && tag.equals(f.mTag)) { 8336e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn return f; 8346e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } 8356e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } 8366e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } 8376e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn return null; 8386e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } 8396e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn 8406e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn public Fragment findFragmentByWho(String who) { 8416e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (mActive != null && who != null) { 8426e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn for (int i=mActive.size()-1; i>=0; i--) { 8436e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn Fragment f = mActive.get(i); 8446e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (f != null && who.equals(f.mWho)) { 845f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn return f; 846f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } 847f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } 848f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } 849f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn return null; 8502dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 8512dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn 852ab36acb39941ce981dddda9f9cf4d2d23a56fd26Dianne Hackborn public void enqueueAction(Runnable action, boolean allowStateLoss) { 8536908cd154c5a2ed2e3b21d40f51952d45be69184Dianne Hackborn if (!allowStateLoss) { 8546908cd154c5a2ed2e3b21d40f51952d45be69184Dianne Hackborn if (mStateSaved) { 8556908cd154c5a2ed2e3b21d40f51952d45be69184Dianne Hackborn throw new IllegalStateException( 8566908cd154c5a2ed2e3b21d40f51952d45be69184Dianne Hackborn "Can not perform this action after onSaveInstanceState"); 8576908cd154c5a2ed2e3b21d40f51952d45be69184Dianne Hackborn } 8586908cd154c5a2ed2e3b21d40f51952d45be69184Dianne Hackborn if (mNoTransactionsBecause != null) { 8596908cd154c5a2ed2e3b21d40f51952d45be69184Dianne Hackborn throw new IllegalStateException( 8606908cd154c5a2ed2e3b21d40f51952d45be69184Dianne Hackborn "Can not perform this action inside of " + mNoTransactionsBecause); 8616908cd154c5a2ed2e3b21d40f51952d45be69184Dianne Hackborn } 862fb3cffeb35368da22f99b85d45039c4e6e471c06Dianne Hackborn } 863445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn synchronized (this) { 8646908cd154c5a2ed2e3b21d40f51952d45be69184Dianne Hackborn if (mActivity == null) { 8656908cd154c5a2ed2e3b21d40f51952d45be69184Dianne Hackborn throw new IllegalStateException("Activity has been destroyed"); 8666908cd154c5a2ed2e3b21d40f51952d45be69184Dianne Hackborn } 867445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn if (mPendingActions == null) { 868445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn mPendingActions = new ArrayList<Runnable>(); 869445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn } 870445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn mPendingActions.add(action); 871445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn if (mPendingActions.size() == 1) { 872445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn mActivity.mHandler.removeCallbacks(mExecCommit); 873445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn mActivity.mHandler.post(mExecCommit); 874445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn } 875445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn } 876445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn } 877445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn 878c6669ca63299219d815464129dac051ab2404286Dianne Hackborn public int allocBackStackIndex(BackStackRecord bse) { 879dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn synchronized (this) { 880dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn if (mAvailBackStackIndices == null || mAvailBackStackIndices.size() <= 0) { 881dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn if (mBackStackIndices == null) { 882c6669ca63299219d815464129dac051ab2404286Dianne Hackborn mBackStackIndices = new ArrayList<BackStackRecord>(); 883dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn } 884dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn int index = mBackStackIndices.size(); 885dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn if (DEBUG) Log.v(TAG, "Setting back stack index " + index + " to " + bse); 886dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn mBackStackIndices.add(bse); 887dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn return index; 888dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn 889dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn } else { 890dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn int index = mAvailBackStackIndices.remove(mAvailBackStackIndices.size()-1); 891dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn if (DEBUG) Log.v(TAG, "Adding back stack index " + index + " with " + bse); 892dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn mBackStackIndices.set(index, bse); 893dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn return index; 894dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn } 895dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn } 896dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn } 897dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn 898c6669ca63299219d815464129dac051ab2404286Dianne Hackborn public void setBackStackIndex(int index, BackStackRecord bse) { 899dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn synchronized (this) { 900dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn if (mBackStackIndices == null) { 901c6669ca63299219d815464129dac051ab2404286Dianne Hackborn mBackStackIndices = new ArrayList<BackStackRecord>(); 902dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn } 903dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn int N = mBackStackIndices.size(); 904dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn if (index < N) { 905dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn if (DEBUG) Log.v(TAG, "Setting back stack index " + index + " to " + bse); 906dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn mBackStackIndices.set(index, bse); 907dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn } else { 908dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn while (N < index) { 909dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn mBackStackIndices.add(null); 910dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn if (mAvailBackStackIndices == null) { 911dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn mAvailBackStackIndices = new ArrayList<Integer>(); 912dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn } 913dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn if (DEBUG) Log.v(TAG, "Adding available back stack index " + N); 914dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn mAvailBackStackIndices.add(N); 915dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn N++; 916dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn } 917dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn if (DEBUG) Log.v(TAG, "Adding back stack index " + index + " with " + bse); 918dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn mBackStackIndices.add(bse); 919dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn } 920dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn } 921dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn } 922dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn 923dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn public void freeBackStackIndex(int index) { 924dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn synchronized (this) { 925dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn mBackStackIndices.set(index, null); 926dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn if (mAvailBackStackIndices == null) { 927dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn mAvailBackStackIndices = new ArrayList<Integer>(); 928dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn } 929dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn if (DEBUG) Log.v(TAG, "Freeing back stack index " + index); 930dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn mAvailBackStackIndices.add(index); 931dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn } 932dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn } 933dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn 934445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn /** 935445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn * Only call from main thread! 936445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn */ 937445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn public void execPendingActions() { 938445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn if (mExecutingActions) { 939445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn throw new IllegalStateException("Recursive entry to execPendingActions"); 940445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn } 941445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn 942445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn while (true) { 943445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn int numActions; 944445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn 945445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn synchronized (this) { 946445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn if (mPendingActions == null || mPendingActions.size() == 0) { 947445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn return; 948445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn } 949445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn 950445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn numActions = mPendingActions.size(); 951445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn if (mTmpActions == null || mTmpActions.length < numActions) { 952445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn mTmpActions = new Runnable[numActions]; 953445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn } 954445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn mPendingActions.toArray(mTmpActions); 955445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn mPendingActions.clear(); 956445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn mActivity.mHandler.removeCallbacks(mExecCommit); 957445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn } 958445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn 959445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn mExecutingActions = true; 960445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn for (int i=0; i<numActions; i++) { 961445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn mTmpActions[i].run(); 962445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn } 963445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn mExecutingActions = false; 964445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn } 965445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn } 966445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn 967c6669ca63299219d815464129dac051ab2404286Dianne Hackborn void reportBackStackChanged() { 968c6669ca63299219d815464129dac051ab2404286Dianne Hackborn if (mBackStackChangeListeners != null) { 969c6669ca63299219d815464129dac051ab2404286Dianne Hackborn for (int i=0; i<mBackStackChangeListeners.size(); i++) { 970c6669ca63299219d815464129dac051ab2404286Dianne Hackborn mBackStackChangeListeners.get(i).onBackStackChanged(); 971c6669ca63299219d815464129dac051ab2404286Dianne Hackborn } 972c6669ca63299219d815464129dac051ab2404286Dianne Hackborn } 973c6669ca63299219d815464129dac051ab2404286Dianne Hackborn } 974c6669ca63299219d815464129dac051ab2404286Dianne Hackborn 975c6669ca63299219d815464129dac051ab2404286Dianne Hackborn void addBackStackState(BackStackRecord state) { 976ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn if (mBackStack == null) { 977c6669ca63299219d815464129dac051ab2404286Dianne Hackborn mBackStack = new ArrayList<BackStackRecord>(); 978ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn } 979ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn mBackStack.add(state); 980c6669ca63299219d815464129dac051ab2404286Dianne Hackborn reportBackStackChanged(); 981ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn } 982ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn 983dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn boolean popBackStackState(Handler handler, String name, int id, int flags) { 984ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn if (mBackStack == null) { 985ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn return false; 986ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn } 987b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn if (name == null && id < 0 && (flags&Activity.POP_BACK_STACK_INCLUSIVE) == 0) { 988f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn int last = mBackStack.size()-1; 989f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn if (last < 0) { 990f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn return false; 991f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } 992c6669ca63299219d815464129dac051ab2404286Dianne Hackborn final BackStackRecord bss = mBackStack.remove(last); 993445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn enqueueAction(new Runnable() { 994f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn public void run() { 995445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn if (DEBUG) Log.v(TAG, "Popping back stack state: " + bss); 9965f36c96f6d3623a826466db68cc1586f078ac307Dianne Hackborn bss.popFromBackStack(true); 997c6669ca63299219d815464129dac051ab2404286Dianne Hackborn reportBackStackChanged(); 998f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } 999ab36acb39941ce981dddda9f9cf4d2d23a56fd26Dianne Hackborn }, false); 1000f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } else { 1001b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn int index = -1; 1002b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn if (name != null || id >= 0) { 1003b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn // If a name or ID is specified, look for that place in 1004b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn // the stack. 1005b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn index = mBackStack.size()-1; 1006b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn while (index >= 0) { 1007c6669ca63299219d815464129dac051ab2404286Dianne Hackborn BackStackRecord bss = mBackStack.get(index); 1008b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn if (name != null && name.equals(bss.getName())) { 1009b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn break; 1010b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn } 1011b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn if (id >= 0 && id == bss.mIndex) { 1012b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn break; 1013b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn } 1014b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn index--; 1015dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn } 1016b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn if (index < 0) { 1017b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn return false; 1018b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn } 1019b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn if ((flags&Activity.POP_BACK_STACK_INCLUSIVE) != 0) { 1020b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn index--; 1021b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn // Consume all following entries that match. 1022b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn while (index >= 0) { 1023c6669ca63299219d815464129dac051ab2404286Dianne Hackborn BackStackRecord bss = mBackStack.get(index); 1024b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn if ((name != null && name.equals(bss.getName())) 1025b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn || (id >= 0 && id == bss.mIndex)) { 1026b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn index--; 1027b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn continue; 1028b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn } 1029b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn break; 1030b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn } 1031f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } 1032dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn } 1033dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn if (index == mBackStack.size()-1) { 1034f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn return false; 1035f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } 1036c6669ca63299219d815464129dac051ab2404286Dianne Hackborn final ArrayList<BackStackRecord> states 1037c6669ca63299219d815464129dac051ab2404286Dianne Hackborn = new ArrayList<BackStackRecord>(); 1038f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn for (int i=mBackStack.size()-1; i>index; i--) { 1039f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn states.add(mBackStack.remove(i)); 1040ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn } 1041445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn enqueueAction(new Runnable() { 1042f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn public void run() { 10435f36c96f6d3623a826466db68cc1586f078ac307Dianne Hackborn final int LAST = states.size()-1; 10445f36c96f6d3623a826466db68cc1586f078ac307Dianne Hackborn for (int i=0; i<=LAST; i++) { 1045445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn if (DEBUG) Log.v(TAG, "Popping back stack state: " + states.get(i)); 10465f36c96f6d3623a826466db68cc1586f078ac307Dianne Hackborn states.get(i).popFromBackStack(i == LAST); 1047f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } 1048c6669ca63299219d815464129dac051ab2404286Dianne Hackborn reportBackStackChanged(); 1049f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } 1050ab36acb39941ce981dddda9f9cf4d2d23a56fd26Dianne Hackborn }, false); 1051f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } 1052ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn return true; 1053ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn } 1054ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn 1055b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn ArrayList<Fragment> retainNonConfig() { 1056b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn ArrayList<Fragment> fragments = null; 10576e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (mActive != null) { 10586e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn for (int i=0; i<mActive.size(); i++) { 10596e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn Fragment f = mActive.get(i); 10606e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (f != null && f.mRetainInstance) { 1061b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn if (fragments == null) { 1062b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn fragments = new ArrayList<Fragment>(); 1063b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 1064b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn fragments.add(f); 1065b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn f.mRetaining = true; 1066b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 1067b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 1068b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 1069b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn return fragments; 1070b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 1071b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn 1072b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn void saveFragmentViewState(Fragment f) { 10736e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (f.mView == null) { 1074b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn return; 1075b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 1076b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn if (mStateArray == null) { 1077b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn mStateArray = new SparseArray<Parcelable>(); 1078b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 1079b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn f.mView.saveHierarchyState(mStateArray); 1080b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn if (mStateArray.size() > 0) { 1081b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn f.mSavedViewState = mStateArray; 1082b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn mStateArray = null; 1083b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 1084b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 1085b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn 10866e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn Parcelable saveAllState() { 10873e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn mStateSaved = true; 10883e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn 10896e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (mActive == null || mActive.size() <= 0) { 10906e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn return null; 1091b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 1092b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn 10936e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn // First collect all active fragments. 10946e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn int N = mActive.size(); 10956e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn FragmentState[] active = new FragmentState[N]; 10966e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn boolean haveFragments = false; 10976e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn for (int i=0; i<N; i++) { 10986e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn Fragment f = mActive.get(i); 10996e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (f != null) { 11006e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn haveFragments = true; 11016e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn 11026e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn FragmentState fs = new FragmentState(f); 11036e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn active[i] = fs; 11046e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn 1105625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn if (f.mState > Fragment.INITIALIZING && fs.mSavedFragmentState == null) { 1106625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn if (mStateBundle == null) { 1107625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn mStateBundle = new Bundle(); 1108625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn } 1109625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn f.onSaveInstanceState(mStateBundle); 1110625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn if (!mStateBundle.isEmpty()) { 1111625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn fs.mSavedFragmentState = mStateBundle; 1112625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn mStateBundle = null; 1113625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn } 1114625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn 1115625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn if (f.mView != null) { 1116625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn saveFragmentViewState(f); 1117625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn if (f.mSavedViewState != null) { 1118625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn if (fs.mSavedFragmentState == null) { 1119625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn fs.mSavedFragmentState = new Bundle(); 1120625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn } 1121625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn fs.mSavedFragmentState.putSparseParcelableArray( 1122625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn FragmentManagerImpl.VIEW_STATE_TAG, f.mSavedViewState); 1123625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn } 1124625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn } 1125625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn 1126625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn if (f.mTarget != null) { 11276e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (fs.mSavedFragmentState == null) { 11286e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn fs.mSavedFragmentState = new Bundle(); 11296e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } 1130625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn putFragment(fs.mSavedFragmentState, 1131625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn FragmentManagerImpl.TARGET_STATE_TAG, f.mTarget); 1132625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn if (f.mTargetRequestCode != 0) { 1133625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn fs.mSavedFragmentState.putInt( 1134625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn FragmentManagerImpl.TARGET_REQUEST_CODE_STATE_TAG, 1135625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn f.mTargetRequestCode); 1136625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn } 1137def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn } 1138def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn 1139625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn } else { 1140625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn fs.mSavedFragmentState = f.mSavedFragmentState; 11416e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } 11426e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn 1143b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn if (DEBUG) Log.v(TAG, "Saved state of " + f + ": " 1144b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn + fs.mSavedFragmentState); 1145b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 1146b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 1147b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn 11486e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (!haveFragments) { 1149b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn if (DEBUG) Log.v(TAG, "saveAllState: no fragments!"); 1150b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn return null; 1151b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 1152b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn 1153b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn int[] added = null; 1154b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn BackStackState[] backStack = null; 1155b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn 11566e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn // Build list of currently added fragments. 1157625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn if (mAdded != null) { 1158625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn N = mAdded.size(); 1159625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn if (N > 0) { 1160625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn added = new int[N]; 1161625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn for (int i=0; i<N; i++) { 1162625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn added[i] = mAdded.get(i).mIndex; 1163625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn if (DEBUG) Log.v(TAG, "saveAllState: adding fragment #" + i 1164625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn + ": " + mAdded.get(i)); 1165625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn } 1166b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 1167b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 1168b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn 1169b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn // Now save back stack. 1170b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn if (mBackStack != null) { 1171b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn N = mBackStack.size(); 1172b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn if (N > 0) { 1173b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn backStack = new BackStackState[N]; 1174b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn for (int i=0; i<N; i++) { 1175b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn backStack[i] = new BackStackState(this, mBackStack.get(i)); 1176b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn if (DEBUG) Log.v(TAG, "saveAllState: adding back stack #" + i 1177b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn + ": " + mBackStack.get(i)); 1178b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 1179b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 1180b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 1181b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn 1182b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn FragmentManagerState fms = new FragmentManagerState(); 11836e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn fms.mActive = active; 1184b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn fms.mAdded = added; 1185b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn fms.mBackStack = backStack; 1186b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn return fms; 1187b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 1188b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn 1189b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn void restoreAllState(Parcelable state, ArrayList<Fragment> nonConfig) { 1190b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn // If there is no saved state at all, then there can not be 1191b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn // any nonConfig fragments either, so that is that. 1192b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn if (state == null) return; 1193b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn FragmentManagerState fms = (FragmentManagerState)state; 11946e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (fms.mActive == null) return; 1195b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn 11966e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn // First re-attach any non-config instances we are retaining back 11976e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn // to their saved state, so we don't try to instantiate them again. 1198b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn if (nonConfig != null) { 1199b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn for (int i=0; i<nonConfig.size(); i++) { 1200b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn Fragment f = nonConfig.get(i); 1201b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn if (DEBUG) Log.v(TAG, "restoreAllState: re-attaching retained " + f); 12026e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn FragmentState fs = fms.mActive[f.mIndex]; 1203b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn fs.mInstance = f; 1204b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn f.mSavedViewState = null; 12056e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn f.mBackStackNesting = 0; 1206625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn f.mInLayout = false; 12076e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn f.mAdded = false; 1208b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn if (fs.mSavedFragmentState != null) { 12095164246d7e47b9c995ca1e1587f3056eb777f60bDianne Hackborn fs.mSavedFragmentState.setClassLoader(mActivity.getClassLoader()); 1210b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn f.mSavedViewState = fs.mSavedFragmentState.getSparseParcelableArray( 1211def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn FragmentManagerImpl.VIEW_STATE_TAG); 1212b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 1213b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 1214b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 1215b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn 12166e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn // Build the full list of active fragments, instantiating them from 12176e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn // their saved state. 12186e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn mActive = new ArrayList<Fragment>(fms.mActive.length); 12196e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (mAvailIndices != null) { 12206e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn mAvailIndices.clear(); 12216e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } 12226e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn for (int i=0; i<fms.mActive.length; i++) { 12236e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn FragmentState fs = fms.mActive[i]; 12246e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (fs != null) { 1225b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn Fragment f = fs.instantiate(mActivity); 1226b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn if (DEBUG) Log.v(TAG, "restoreAllState: adding #" + i + ": " + f); 1227b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn mActive.add(f); 12286e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } else { 1229b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn if (DEBUG) Log.v(TAG, "restoreAllState: adding #" + i + ": (null)"); 12306e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn mActive.add(null); 12316e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (mAvailIndices == null) { 12326e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn mAvailIndices = new ArrayList<Integer>(); 12336e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } 1234b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn if (DEBUG) Log.v(TAG, "restoreAllState: adding avail #" + i); 12356e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn mAvailIndices.add(i); 1236b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 12376e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } 12386e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn 12393e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn // Update the target of all retained fragments. 12403e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn if (nonConfig != null) { 12413e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn for (int i=0; i<nonConfig.size(); i++) { 12423e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn Fragment f = nonConfig.get(i); 12433e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn if (f.mTarget != null) { 12443e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn if (f.mTarget.mIndex < mActive.size()) { 12453e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn f.mTarget = mActive.get(f.mTarget.mIndex); 12463e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn } else { 12473e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn Log.w(TAG, "Re-attaching retained fragment " + f 12483e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn + " target no longer exists: " + f.mTarget); 12493e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn f.mTarget = null; 12503e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn } 12513e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn } 12523e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn } 12533e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn } 12543e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn 12556e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn // Build the list of currently added fragments. 12566e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (fms.mAdded != null) { 12576e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn mAdded = new ArrayList<Fragment>(fms.mAdded.length); 1258b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn for (int i=0; i<fms.mAdded.length; i++) { 12596e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn Fragment f = mActive.get(fms.mAdded[i]); 12606e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (f == null) { 12616e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn throw new IllegalStateException( 12626e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn "No instantiated fragment for index #" + fms.mAdded[i]); 1263b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 12646e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn f.mAdded = true; 1265b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn f.mImmediateActivity = mActivity; 1266b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn if (DEBUG) Log.v(TAG, "restoreAllState: making added #" + i + ": " + f); 12676e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn mAdded.add(f); 1268b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 12696e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } else { 12706e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn mAdded = null; 1271b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 12726e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn 12736e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn // Build the back stack. 1274b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn if (fms.mBackStack != null) { 1275c6669ca63299219d815464129dac051ab2404286Dianne Hackborn mBackStack = new ArrayList<BackStackRecord>(fms.mBackStack.length); 1276b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn for (int i=0; i<fms.mBackStack.length; i++) { 1277c6669ca63299219d815464129dac051ab2404286Dianne Hackborn BackStackRecord bse = fms.mBackStack[i].instantiate(this); 1278b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn if (DEBUG) Log.v(TAG, "restoreAllState: adding bse #" + i 1279b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn + " (index " + bse.mIndex + "): " + bse); 1280b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn mBackStack.add(bse); 1281dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn if (bse.mIndex >= 0) { 1282dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn setBackStackIndex(bse.mIndex, bse); 1283dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn } 1284b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 12856e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } else { 12866e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn mBackStack = null; 1287b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 1288b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 1289b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn 12902dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn public void attachActivity(Activity activity) { 12912dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn if (mActivity != null) throw new IllegalStateException(); 12922dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn mActivity = activity; 12932dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 12942dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn 1295fb3cffeb35368da22f99b85d45039c4e6e471c06Dianne Hackborn public void noteStateNotSaved() { 1296fb3cffeb35368da22f99b85d45039c4e6e471c06Dianne Hackborn mStateSaved = false; 1297fb3cffeb35368da22f99b85d45039c4e6e471c06Dianne Hackborn } 1298fb3cffeb35368da22f99b85d45039c4e6e471c06Dianne Hackborn 1299b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn public void dispatchCreate() { 13003e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn mStateSaved = false; 1301ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn moveToState(Fragment.CREATED, false); 13022dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 13032dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn 1304c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn public void dispatchActivityCreated() { 13053e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn mStateSaved = false; 1306c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn moveToState(Fragment.ACTIVITY_CREATED, false); 1307c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn } 1308c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn 13092dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn public void dispatchStart() { 13103e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn mStateSaved = false; 1311ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn moveToState(Fragment.STARTED, false); 13122dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 13132dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn 13142dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn public void dispatchResume() { 13153e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn mStateSaved = false; 1316ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn moveToState(Fragment.RESUMED, false); 13172dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 13182dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn 13192dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn public void dispatchPause() { 1320ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn moveToState(Fragment.STARTED, false); 13212dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 13222dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn 13232dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn public void dispatchStop() { 1324c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn moveToState(Fragment.ACTIVITY_CREATED, false); 13252dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 13262dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn 13272dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn public void dispatchDestroy() { 1328ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn moveToState(Fragment.INITIALIZING, false); 13292dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn mActivity = null; 13302dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 1331f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn 1332b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn public boolean dispatchCreateOptionsMenu(Menu menu, MenuInflater inflater) { 1333b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn boolean show = false; 13348eb2e244f9b14d946ee587d0b673b866865026c0Dianne Hackborn ArrayList<Fragment> newMenus = null; 1335b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn if (mActive != null) { 1336b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn for (int i=0; i<mAdded.size(); i++) { 1337b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn Fragment f = mAdded.get(i); 1338b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn if (f != null && !f.mHidden && f.mHasMenu) { 1339b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn show = true; 1340b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn f.onCreateOptionsMenu(menu, inflater); 13418eb2e244f9b14d946ee587d0b673b866865026c0Dianne Hackborn if (newMenus == null) { 13428eb2e244f9b14d946ee587d0b673b866865026c0Dianne Hackborn newMenus = new ArrayList<Fragment>(); 13438eb2e244f9b14d946ee587d0b673b866865026c0Dianne Hackborn } 13448eb2e244f9b14d946ee587d0b673b866865026c0Dianne Hackborn newMenus.add(f); 1345b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn } 1346b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn } 1347b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn } 13488eb2e244f9b14d946ee587d0b673b866865026c0Dianne Hackborn 13498eb2e244f9b14d946ee587d0b673b866865026c0Dianne Hackborn if (mCreatedMenus != null) { 13508eb2e244f9b14d946ee587d0b673b866865026c0Dianne Hackborn for (int i=0; i<mCreatedMenus.size(); i++) { 13518eb2e244f9b14d946ee587d0b673b866865026c0Dianne Hackborn Fragment f = mCreatedMenus.get(i); 13528eb2e244f9b14d946ee587d0b673b866865026c0Dianne Hackborn if (newMenus == null || !newMenus.contains(f)) { 13538eb2e244f9b14d946ee587d0b673b866865026c0Dianne Hackborn f.onDestroyOptionsMenu(); 13548eb2e244f9b14d946ee587d0b673b866865026c0Dianne Hackborn } 13558eb2e244f9b14d946ee587d0b673b866865026c0Dianne Hackborn } 13568eb2e244f9b14d946ee587d0b673b866865026c0Dianne Hackborn } 13578eb2e244f9b14d946ee587d0b673b866865026c0Dianne Hackborn 13588eb2e244f9b14d946ee587d0b673b866865026c0Dianne Hackborn mCreatedMenus = newMenus; 13598eb2e244f9b14d946ee587d0b673b866865026c0Dianne Hackborn 1360b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn return show; 1361b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn } 1362b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn 1363b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn public boolean dispatchPrepareOptionsMenu(Menu menu) { 1364b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn boolean show = false; 1365b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn if (mActive != null) { 1366b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn for (int i=0; i<mAdded.size(); i++) { 1367b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn Fragment f = mAdded.get(i); 1368b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn if (f != null && !f.mHidden && f.mHasMenu) { 1369b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn show = true; 1370b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn f.onPrepareOptionsMenu(menu); 1371b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn } 1372b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn } 1373b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn } 1374b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn return show; 1375b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn } 1376b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn 1377b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn public boolean dispatchOptionsItemSelected(MenuItem item) { 1378b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn if (mActive != null) { 1379b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn for (int i=0; i<mAdded.size(); i++) { 1380b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn Fragment f = mAdded.get(i); 1381b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn if (f != null && !f.mHidden && f.mHasMenu) { 1382b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn if (f.onOptionsItemSelected(item)) { 1383b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn return true; 1384b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn } 1385b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn } 1386b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn } 1387b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn } 1388b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn return false; 1389b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn } 1390b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn 13915ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn public boolean dispatchContextItemSelected(MenuItem item) { 13925ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn if (mActive != null) { 13935ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn for (int i=0; i<mAdded.size(); i++) { 13945ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn Fragment f = mAdded.get(i); 13955ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn if (f != null && !f.mHidden) { 13965ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn if (f.onContextItemSelected(item)) { 13975ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn return true; 13985ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn } 13995ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn } 14005ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn } 14015ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn } 14025ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn return false; 14035ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn } 14045ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn 1405b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn public void dispatchOptionsMenuClosed(Menu menu) { 1406b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn if (mActive != null) { 1407b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn for (int i=0; i<mAdded.size(); i++) { 1408b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn Fragment f = mAdded.get(i); 1409b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn if (f != null && !f.mHidden && f.mHasMenu) { 1410b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn f.onOptionsMenuClosed(menu); 1411b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn } 1412b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn } 1413b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn } 1414b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn } 1415b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn 1416f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn public static int reverseTransit(int transit) { 1417f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn int rev = 0; 1418f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn switch (transit) { 1419811ed1065f39469cf2cf6adba22cab397ed88d5eChet Haase case FragmentTransaction.TRANSIT_FRAGMENT_OPEN: 1420811ed1065f39469cf2cf6adba22cab397ed88d5eChet Haase rev = FragmentTransaction.TRANSIT_FRAGMENT_CLOSE; 1421f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn break; 1422811ed1065f39469cf2cf6adba22cab397ed88d5eChet Haase case FragmentTransaction.TRANSIT_FRAGMENT_CLOSE: 1423811ed1065f39469cf2cf6adba22cab397ed88d5eChet Haase rev = FragmentTransaction.TRANSIT_FRAGMENT_OPEN; 1424f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn break; 14259ff82bf2b33513052500473d0d6d025a80dcecbfChet Haase case FragmentTransaction.TRANSIT_FRAGMENT_NEXT: 14269ff82bf2b33513052500473d0d6d025a80dcecbfChet Haase rev = FragmentTransaction.TRANSIT_FRAGMENT_PREV; 14279ff82bf2b33513052500473d0d6d025a80dcecbfChet Haase break; 14289ff82bf2b33513052500473d0d6d025a80dcecbfChet Haase case FragmentTransaction.TRANSIT_FRAGMENT_PREV: 14299ff82bf2b33513052500473d0d6d025a80dcecbfChet Haase rev = FragmentTransaction.TRANSIT_FRAGMENT_NEXT; 14309ff82bf2b33513052500473d0d6d025a80dcecbfChet Haase break; 1431f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } 1432f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn return rev; 1433f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn 1434f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } 1435f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn 1436f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn public static int transitToStyleIndex(int transit, boolean enter) { 1437f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn int animAttr = -1; 1438f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn switch (transit) { 1439811ed1065f39469cf2cf6adba22cab397ed88d5eChet Haase case FragmentTransaction.TRANSIT_FRAGMENT_OPEN: 1440f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn animAttr = enter 1441811ed1065f39469cf2cf6adba22cab397ed88d5eChet Haase ? com.android.internal.R.styleable.FragmentAnimation_fragmentOpenEnterAnimation 1442811ed1065f39469cf2cf6adba22cab397ed88d5eChet Haase : com.android.internal.R.styleable.FragmentAnimation_fragmentOpenExitAnimation; 1443f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn break; 1444811ed1065f39469cf2cf6adba22cab397ed88d5eChet Haase case FragmentTransaction.TRANSIT_FRAGMENT_CLOSE: 1445f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn animAttr = enter 1446811ed1065f39469cf2cf6adba22cab397ed88d5eChet Haase ? com.android.internal.R.styleable.FragmentAnimation_fragmentCloseEnterAnimation 1447811ed1065f39469cf2cf6adba22cab397ed88d5eChet Haase : com.android.internal.R.styleable.FragmentAnimation_fragmentCloseExitAnimation; 1448f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn break; 14499ff82bf2b33513052500473d0d6d025a80dcecbfChet Haase case FragmentTransaction.TRANSIT_FRAGMENT_NEXT: 14509ff82bf2b33513052500473d0d6d025a80dcecbfChet Haase animAttr = enter 14519ff82bf2b33513052500473d0d6d025a80dcecbfChet Haase ? com.android.internal.R.styleable.FragmentAnimation_fragmentNextEnterAnimation 14529ff82bf2b33513052500473d0d6d025a80dcecbfChet Haase : com.android.internal.R.styleable.FragmentAnimation_fragmentNextExitAnimation; 14539ff82bf2b33513052500473d0d6d025a80dcecbfChet Haase break; 14549ff82bf2b33513052500473d0d6d025a80dcecbfChet Haase case FragmentTransaction.TRANSIT_FRAGMENT_PREV: 14559ff82bf2b33513052500473d0d6d025a80dcecbfChet Haase animAttr = enter 14569ff82bf2b33513052500473d0d6d025a80dcecbfChet Haase ? com.android.internal.R.styleable.FragmentAnimation_fragmentPrevEnterAnimation 14579ff82bf2b33513052500473d0d6d025a80dcecbfChet Haase : com.android.internal.R.styleable.FragmentAnimation_fragmentPrevExitAnimation; 14589ff82bf2b33513052500473d0d6d025a80dcecbfChet Haase break; 1459f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } 1460f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn return animAttr; 1461f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } 14622dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn} 1463