FragmentManager.java revision 8eb2e244f9b14d946ee587d0b673b866865026c0
12dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn/* 22dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn * Copyright (C) 2010 The Android Open Source Project 32dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn * 42dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn * Licensed under the Apache License, Version 2.0 (the "License"); 52dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn * you may not use this file except in compliance with the License. 62dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn * You may obtain a copy of the License at 72dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn * 82dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn * http://www.apache.org/licenses/LICENSE-2.0 92dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn * 102dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn * Unless required by applicable law or agreed to in writing, software 112dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn * distributed under the License is distributed on an "AS IS" BASIS, 122dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 132dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn * See the License for the specific language governing permissions and 142dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn * limitations under the License. 152dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn */ 162dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn 172dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackbornpackage android.app; 182dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn 19a18a86b43e40e3c15dcca0ae0148d641be9b25feChet Haaseimport android.animation.Animator; 20a18a86b43e40e3c15dcca0ae0148d641be9b25feChet Haaseimport android.animation.AnimatorInflater; 21b20db3ec34e846010f389880b2cfab4d7bf79820Chet Haaseimport android.animation.AnimatorListenerAdapter; 22f121be737c59390d97e21a92be8e166001534c7dDianne Hackbornimport android.content.res.TypedArray; 232dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackbornimport android.os.Bundle; 24ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackbornimport android.os.Handler; 25b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackbornimport android.os.Parcel; 26b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackbornimport android.os.Parcelable; 275ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackbornimport android.util.Log; 28b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackbornimport android.util.SparseArray; 29b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackbornimport android.view.Menu; 30b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackbornimport android.view.MenuInflater; 31b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackbornimport android.view.MenuItem; 325ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackbornimport android.view.View; 332dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackbornimport android.view.ViewGroup; 342dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn 35625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackbornimport java.io.FileDescriptor; 36625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackbornimport java.io.PrintWriter; 372dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackbornimport java.util.ArrayList; 382dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn 39b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn/** 40b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * Interface for interacting with {@link Fragment} objects inside of an 41b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * {@link Activity} 42b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn */ 43b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackbornpublic interface FragmentManager { 44b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn /** 45c6669ca63299219d815464129dac051ab2404286Dianne Hackborn * Representation of an entry on the fragment back stack, as created 46c6669ca63299219d815464129dac051ab2404286Dianne Hackborn * with {@link FragmentTransaction#addToBackStack(String) 47c6669ca63299219d815464129dac051ab2404286Dianne Hackborn * FragmentTransaction.addToBackStack()}. Entries can later be 48c6669ca63299219d815464129dac051ab2404286Dianne Hackborn * retrieved with {@link FragmentManager#getBackStackEntry(int) 49c6669ca63299219d815464129dac051ab2404286Dianne Hackborn * FragmentManager.getBackStackEntry()}. 50c6669ca63299219d815464129dac051ab2404286Dianne Hackborn * 51c6669ca63299219d815464129dac051ab2404286Dianne Hackborn * <p>Note that you should never hold on to a BackStackEntry object; 52c6669ca63299219d815464129dac051ab2404286Dianne Hackborn * the identifier as returned by {@link #getId} is the only thing that 53c6669ca63299219d815464129dac051ab2404286Dianne Hackborn * will be persisted across activity instances. 54c6669ca63299219d815464129dac051ab2404286Dianne Hackborn */ 55c6669ca63299219d815464129dac051ab2404286Dianne Hackborn public interface BackStackEntry { 56c6669ca63299219d815464129dac051ab2404286Dianne Hackborn /** 57c6669ca63299219d815464129dac051ab2404286Dianne Hackborn * Return the unique identifier for the entry. This is the only 58c6669ca63299219d815464129dac051ab2404286Dianne Hackborn * representation of the entry that will persist across activity 59c6669ca63299219d815464129dac051ab2404286Dianne Hackborn * instances. 60c6669ca63299219d815464129dac051ab2404286Dianne Hackborn */ 61c6669ca63299219d815464129dac051ab2404286Dianne Hackborn public int getId(); 62c6669ca63299219d815464129dac051ab2404286Dianne Hackborn 63c6669ca63299219d815464129dac051ab2404286Dianne Hackborn /** 64c6669ca63299219d815464129dac051ab2404286Dianne Hackborn * Return the full bread crumb title for the entry, or null if it 65c6669ca63299219d815464129dac051ab2404286Dianne Hackborn * does not have one. 66c6669ca63299219d815464129dac051ab2404286Dianne Hackborn */ 67c6669ca63299219d815464129dac051ab2404286Dianne Hackborn public CharSequence getBreadCrumbTitle(); 68c6669ca63299219d815464129dac051ab2404286Dianne Hackborn 69c6669ca63299219d815464129dac051ab2404286Dianne Hackborn /** 70c6669ca63299219d815464129dac051ab2404286Dianne Hackborn * Return the short bread crumb title for the entry, or null if it 71c6669ca63299219d815464129dac051ab2404286Dianne Hackborn * does not have one. 72c6669ca63299219d815464129dac051ab2404286Dianne Hackborn */ 73c6669ca63299219d815464129dac051ab2404286Dianne Hackborn public CharSequence getBreadCrumbShortTitle(); 74c6669ca63299219d815464129dac051ab2404286Dianne Hackborn } 75c6669ca63299219d815464129dac051ab2404286Dianne Hackborn 76c6669ca63299219d815464129dac051ab2404286Dianne Hackborn /** 77c6669ca63299219d815464129dac051ab2404286Dianne Hackborn * Interface to watch for changes to the back stack. 78c6669ca63299219d815464129dac051ab2404286Dianne Hackborn */ 79c6669ca63299219d815464129dac051ab2404286Dianne Hackborn public interface OnBackStackChangedListener { 80c6669ca63299219d815464129dac051ab2404286Dianne Hackborn /** 81c6669ca63299219d815464129dac051ab2404286Dianne Hackborn * Called whenever the contents of the back stack change. 82c6669ca63299219d815464129dac051ab2404286Dianne Hackborn */ 83c6669ca63299219d815464129dac051ab2404286Dianne Hackborn public void onBackStackChanged(); 84c6669ca63299219d815464129dac051ab2404286Dianne Hackborn } 85c6669ca63299219d815464129dac051ab2404286Dianne Hackborn 86c6669ca63299219d815464129dac051ab2404286Dianne Hackborn /** 87b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * Start a series of edit operations on the Fragments associated with 88b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * this FragmentManager. 89fb3cffeb35368da22f99b85d45039c4e6e471c06Dianne Hackborn * 90fb3cffeb35368da22f99b85d45039c4e6e471c06Dianne Hackborn * <p>Note: A fragment transaction can only be created/committed prior 91fb3cffeb35368da22f99b85d45039c4e6e471c06Dianne Hackborn * to an activity saving its state. If you try to commit a transaction 92fb3cffeb35368da22f99b85d45039c4e6e471c06Dianne Hackborn * after {@link Activity#onSaveInstanceState Activity.onSaveInstanceState()} 93fb3cffeb35368da22f99b85d45039c4e6e471c06Dianne Hackborn * (and prior to a following {@link Activity#onStart Activity.onStart} 94fb3cffeb35368da22f99b85d45039c4e6e471c06Dianne Hackborn * or {@link Activity#onResume Activity.onResume()}, you will get an error. 95fb3cffeb35368da22f99b85d45039c4e6e471c06Dianne Hackborn * This is because the framework takes care of saving your current fragments 96fb3cffeb35368da22f99b85d45039c4e6e471c06Dianne Hackborn * in the state, and if changes are made after the state is saved then they 97fb3cffeb35368da22f99b85d45039c4e6e471c06Dianne Hackborn * will be lost.</p> 98b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn */ 99b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn public FragmentTransaction openTransaction(); 100b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn 101b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn /** 102b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * Finds a fragment that was identified by the given id either when inflated 103b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * from XML or as the container ID when added in a transaction. This first 104b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * searches through fragments that are currently added to the manager's 105b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * activity; if no such fragment is found, then all fragments currently 106b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * on the back stack associated with this ID are searched. 107b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * @return The fragment if found or null otherwise. 108b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn */ 109b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn public Fragment findFragmentById(int id); 110b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn 111b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn /** 112b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * Finds a fragment that was identified by the given tag either when inflated 113b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * from XML or as supplied when added in a transaction. This first 114b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * searches through fragments that are currently added to the manager's 115b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * activity; if no such fragment is found, then all fragments currently 116b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * on the back stack are searched. 117b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * @return The fragment if found or null otherwise. 118b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn */ 119b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn public Fragment findFragmentByTag(String tag); 120b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn 121b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn /** 122b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * Flag for {@link #popBackStack(String, int)} 123b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * and {@link #popBackStack(int, int)}: If set, and the name or ID of 124b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * a back stack entry has been supplied, then all matching entries will 125b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * be consumed until one that doesn't match is found or the bottom of 126b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * the stack is reached. Otherwise, all entries up to but not including that entry 127b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * will be removed. 128b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn */ 129b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn public static final int POP_BACK_STACK_INCLUSIVE = 1<<0; 130b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn 131b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn /** 132b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * Pop the top state off the back stack. Returns true if there was one 133b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * to pop, else false. 134b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn */ 135b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn public boolean popBackStack(); 136b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn 137b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn /** 138b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * Pop the last fragment transition from the manager's fragment 139b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * back stack. If there is nothing to pop, false is returned. 140b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * @param name If non-null, this is the name of a previous back state 141b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * to look for; if found, all states up to that state will be popped. The 142b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * {@link #POP_BACK_STACK_INCLUSIVE} flag can be used to control whether 143b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * the named state itself is popped. If null, only the top state is popped. 144b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * @param flags Either 0 or {@link #POP_BACK_STACK_INCLUSIVE}. 145b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn */ 146b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn public boolean popBackStack(String name, int flags); 147b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn 148b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn /** 149b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * Pop all back stack states up to the one with the given identifier. 150b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * @param id Identifier of the stated to be popped. If no identifier exists, 151b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * false is returned. 152b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * The identifier is the number returned by 153b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * {@link FragmentTransaction#commit() FragmentTransaction.commit()}. The 154b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * {@link #POP_BACK_STACK_INCLUSIVE} flag can be used to control whether 155b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * the named state itself is popped. 156b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * @param flags Either 0 or {@link #POP_BACK_STACK_INCLUSIVE}. 157b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn */ 158b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn public boolean popBackStack(int id, int flags); 159b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn 160b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn /** 161c6669ca63299219d815464129dac051ab2404286Dianne Hackborn * Return the number of entries currently in the back stack. 162c6669ca63299219d815464129dac051ab2404286Dianne Hackborn */ 163c6669ca63299219d815464129dac051ab2404286Dianne Hackborn public int countBackStackEntries(); 164c6669ca63299219d815464129dac051ab2404286Dianne Hackborn 165c6669ca63299219d815464129dac051ab2404286Dianne Hackborn /** 166c6669ca63299219d815464129dac051ab2404286Dianne Hackborn * Return the BackStackEntry at index <var>index</var> in the back stack; 167c6669ca63299219d815464129dac051ab2404286Dianne Hackborn * entries start index 0 being the bottom of the stack. 168c6669ca63299219d815464129dac051ab2404286Dianne Hackborn */ 169c6669ca63299219d815464129dac051ab2404286Dianne Hackborn public BackStackEntry getBackStackEntry(int index); 170c6669ca63299219d815464129dac051ab2404286Dianne Hackborn 171c6669ca63299219d815464129dac051ab2404286Dianne Hackborn /** 172c6669ca63299219d815464129dac051ab2404286Dianne Hackborn * Add a new listener for changes to the fragment back stack. 173c6669ca63299219d815464129dac051ab2404286Dianne Hackborn */ 174c6669ca63299219d815464129dac051ab2404286Dianne Hackborn public void addOnBackStackChangedListener(OnBackStackChangedListener listener); 175c6669ca63299219d815464129dac051ab2404286Dianne Hackborn 176c6669ca63299219d815464129dac051ab2404286Dianne Hackborn /** 177c6669ca63299219d815464129dac051ab2404286Dianne Hackborn * Remove a listener that was previously added with 178c6669ca63299219d815464129dac051ab2404286Dianne Hackborn * {@link #addOnBackStackChangedListener(OnBackStackChangedListener)}. 179c6669ca63299219d815464129dac051ab2404286Dianne Hackborn */ 180c6669ca63299219d815464129dac051ab2404286Dianne Hackborn public void removeOnBackStackChangedListener(OnBackStackChangedListener listener); 181c6669ca63299219d815464129dac051ab2404286Dianne Hackborn 182c6669ca63299219d815464129dac051ab2404286Dianne Hackborn /** 183b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * Put a reference to a fragment in a Bundle. This Bundle can be 184b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * persisted as saved state, and when later restoring 185b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * {@link #getFragment(Bundle, String)} will return the current 186b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * instance of the same fragment. 187b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * 188b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * @param bundle The bundle in which to put the fragment reference. 189b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * @param key The name of the entry in the bundle. 190b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * @param fragment The Fragment whose reference is to be stored. 191b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn */ 192b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn public void putFragment(Bundle bundle, String key, Fragment fragment); 193b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn 194b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn /** 195b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * Retrieve the current Fragment instance for a reference previously 196b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * placed with {@link #putFragment(Bundle, String, Fragment)}. 197b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * 198b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * @param bundle The bundle from which to retrieve the fragment reference. 199b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * @param key The name of the entry in the bundle. 200b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * @return Returns the current Fragment instance that is associated with 201b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * the given reference. 202b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn */ 203b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn public Fragment getFragment(Bundle bundle, String key); 204625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn 205625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn /** 206625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn * Print the FragmentManager's state into the given stream. 207625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn * 208625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn * @param prefix Text to print at the front of each line. 209625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn * @param fd The raw file descriptor that the dump is being sent to. 210625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn * @param writer A PrintWriter to which the dump is to be set. 211625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn * @param args additional arguments to the dump request. 212625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn */ 213625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn public void dump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args); 214b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn} 215b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn 216b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackbornfinal class FragmentManagerState implements Parcelable { 2176e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn FragmentState[] mActive; 218b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn int[] mAdded; 219b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn BackStackState[] mBackStack; 220b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn 221b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn public FragmentManagerState() { 222b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 223b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn 224b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn public FragmentManagerState(Parcel in) { 2256e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn mActive = in.createTypedArray(FragmentState.CREATOR); 226b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn mAdded = in.createIntArray(); 227b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn mBackStack = in.createTypedArray(BackStackState.CREATOR); 228b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 229b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn 230b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn public int describeContents() { 231b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn return 0; 232b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 233b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn 234b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn public void writeToParcel(Parcel dest, int flags) { 2356e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn dest.writeTypedArray(mActive, flags); 236b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn dest.writeIntArray(mAdded); 237b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn dest.writeTypedArray(mBackStack, flags); 238b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 239b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn 240b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn public static final Parcelable.Creator<FragmentManagerState> CREATOR 241b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn = new Parcelable.Creator<FragmentManagerState>() { 242b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn public FragmentManagerState createFromParcel(Parcel in) { 243b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn return new FragmentManagerState(in); 244b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 245b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn 246b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn public FragmentManagerState[] newArray(int size) { 247b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn return new FragmentManagerState[size]; 248b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 249b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn }; 250ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn} 251ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn 2522dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn/** 2532dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn * Container for fragments associated with an activity. 2542dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn */ 255def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackbornfinal class FragmentManagerImpl implements FragmentManager { 2565ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn static final boolean DEBUG = true; 2575ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn static final String TAG = "FragmentManager"; 2585ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn 259def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn static final String TARGET_REQUEST_CODE_STATE_TAG = "android:target_req_state"; 260def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn static final String TARGET_STATE_TAG = "android:target_state"; 261def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn static final String VIEW_STATE_TAG = "android:view_state"; 262def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn 263445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn ArrayList<Runnable> mPendingActions; 264445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn Runnable[] mTmpActions; 265445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn boolean mExecutingActions; 266445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn 2676e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn ArrayList<Fragment> mActive; 2686e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn ArrayList<Fragment> mAdded; 2696e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn ArrayList<Integer> mAvailIndices; 270c6669ca63299219d815464129dac051ab2404286Dianne Hackborn ArrayList<BackStackRecord> mBackStack; 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 852445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn public void enqueueAction(Runnable action) { 8533e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn if (mStateSaved) { 8543e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn throw new IllegalStateException( 8553e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn "Can not perform this action after onSaveInstanceState"); 8563e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn } 857fb3cffeb35368da22f99b85d45039c4e6e471c06Dianne Hackborn if (mNoTransactionsBecause != null) { 858fb3cffeb35368da22f99b85d45039c4e6e471c06Dianne Hackborn throw new IllegalStateException( 859fb3cffeb35368da22f99b85d45039c4e6e471c06Dianne Hackborn "Can not perform this action inside of " + mNoTransactionsBecause); 860fb3cffeb35368da22f99b85d45039c4e6e471c06Dianne Hackborn } 861445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn synchronized (this) { 862445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn if (mPendingActions == null) { 863445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn mPendingActions = new ArrayList<Runnable>(); 864445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn } 865445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn mPendingActions.add(action); 866445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn if (mPendingActions.size() == 1) { 867445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn mActivity.mHandler.removeCallbacks(mExecCommit); 868445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn mActivity.mHandler.post(mExecCommit); 869445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn } 870445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn } 871445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn } 872445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn 873c6669ca63299219d815464129dac051ab2404286Dianne Hackborn public int allocBackStackIndex(BackStackRecord bse) { 874dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn synchronized (this) { 875dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn if (mAvailBackStackIndices == null || mAvailBackStackIndices.size() <= 0) { 876dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn if (mBackStackIndices == null) { 877c6669ca63299219d815464129dac051ab2404286Dianne Hackborn mBackStackIndices = new ArrayList<BackStackRecord>(); 878dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn } 879dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn int index = mBackStackIndices.size(); 880dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn if (DEBUG) Log.v(TAG, "Setting back stack index " + index + " to " + bse); 881dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn mBackStackIndices.add(bse); 882dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn return index; 883dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn 884dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn } else { 885dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn int index = mAvailBackStackIndices.remove(mAvailBackStackIndices.size()-1); 886dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn if (DEBUG) Log.v(TAG, "Adding back stack index " + index + " with " + bse); 887dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn mBackStackIndices.set(index, bse); 888dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn return index; 889dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn } 890dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn } 891dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn } 892dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn 893c6669ca63299219d815464129dac051ab2404286Dianne Hackborn public void setBackStackIndex(int index, BackStackRecord bse) { 894dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn synchronized (this) { 895dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn if (mBackStackIndices == null) { 896c6669ca63299219d815464129dac051ab2404286Dianne Hackborn mBackStackIndices = new ArrayList<BackStackRecord>(); 897dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn } 898dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn int N = mBackStackIndices.size(); 899dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn if (index < N) { 900dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn if (DEBUG) Log.v(TAG, "Setting back stack index " + index + " to " + bse); 901dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn mBackStackIndices.set(index, bse); 902dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn } else { 903dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn while (N < index) { 904dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn mBackStackIndices.add(null); 905dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn if (mAvailBackStackIndices == null) { 906dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn mAvailBackStackIndices = new ArrayList<Integer>(); 907dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn } 908dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn if (DEBUG) Log.v(TAG, "Adding available back stack index " + N); 909dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn mAvailBackStackIndices.add(N); 910dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn N++; 911dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn } 912dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn if (DEBUG) Log.v(TAG, "Adding back stack index " + index + " with " + bse); 913dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn mBackStackIndices.add(bse); 914dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn } 915dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn } 916dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn } 917dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn 918dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn public void freeBackStackIndex(int index) { 919dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn synchronized (this) { 920dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn mBackStackIndices.set(index, null); 921dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn if (mAvailBackStackIndices == null) { 922dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn mAvailBackStackIndices = new ArrayList<Integer>(); 923dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn } 924dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn if (DEBUG) Log.v(TAG, "Freeing back stack index " + index); 925dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn mAvailBackStackIndices.add(index); 926dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn } 927dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn } 928dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn 929445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn /** 930445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn * Only call from main thread! 931445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn */ 932445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn public void execPendingActions() { 933445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn if (mExecutingActions) { 934445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn throw new IllegalStateException("Recursive entry to execPendingActions"); 935445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn } 936445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn 937445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn while (true) { 938445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn int numActions; 939445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn 940445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn synchronized (this) { 941445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn if (mPendingActions == null || mPendingActions.size() == 0) { 942445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn return; 943445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn } 944445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn 945445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn numActions = mPendingActions.size(); 946445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn if (mTmpActions == null || mTmpActions.length < numActions) { 947445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn mTmpActions = new Runnable[numActions]; 948445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn } 949445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn mPendingActions.toArray(mTmpActions); 950445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn mPendingActions.clear(); 951445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn mActivity.mHandler.removeCallbacks(mExecCommit); 952445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn } 953445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn 954445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn mExecutingActions = true; 955445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn for (int i=0; i<numActions; i++) { 956445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn mTmpActions[i].run(); 957445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn } 958445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn mExecutingActions = false; 959445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn } 960445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn } 961445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn 962c6669ca63299219d815464129dac051ab2404286Dianne Hackborn void reportBackStackChanged() { 963c6669ca63299219d815464129dac051ab2404286Dianne Hackborn if (mBackStackChangeListeners != null) { 964c6669ca63299219d815464129dac051ab2404286Dianne Hackborn for (int i=0; i<mBackStackChangeListeners.size(); i++) { 965c6669ca63299219d815464129dac051ab2404286Dianne Hackborn mBackStackChangeListeners.get(i).onBackStackChanged(); 966c6669ca63299219d815464129dac051ab2404286Dianne Hackborn } 967c6669ca63299219d815464129dac051ab2404286Dianne Hackborn } 968c6669ca63299219d815464129dac051ab2404286Dianne Hackborn } 969c6669ca63299219d815464129dac051ab2404286Dianne Hackborn 970c6669ca63299219d815464129dac051ab2404286Dianne Hackborn void addBackStackState(BackStackRecord state) { 971ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn if (mBackStack == null) { 972c6669ca63299219d815464129dac051ab2404286Dianne Hackborn mBackStack = new ArrayList<BackStackRecord>(); 973ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn } 974ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn mBackStack.add(state); 975c6669ca63299219d815464129dac051ab2404286Dianne Hackborn reportBackStackChanged(); 976ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn } 977ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn 978dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn boolean popBackStackState(Handler handler, String name, int id, int flags) { 979ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn if (mBackStack == null) { 980ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn return false; 981ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn } 982b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn if (name == null && id < 0 && (flags&Activity.POP_BACK_STACK_INCLUSIVE) == 0) { 983f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn int last = mBackStack.size()-1; 984f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn if (last < 0) { 985f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn return false; 986f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } 987c6669ca63299219d815464129dac051ab2404286Dianne Hackborn final BackStackRecord bss = mBackStack.remove(last); 988445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn enqueueAction(new Runnable() { 989f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn public void run() { 990445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn if (DEBUG) Log.v(TAG, "Popping back stack state: " + bss); 9915f36c96f6d3623a826466db68cc1586f078ac307Dianne Hackborn bss.popFromBackStack(true); 992c6669ca63299219d815464129dac051ab2404286Dianne Hackborn reportBackStackChanged(); 993f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } 994f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn }); 995f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } else { 996b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn int index = -1; 997b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn if (name != null || id >= 0) { 998b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn // If a name or ID is specified, look for that place in 999b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn // the stack. 1000b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn index = mBackStack.size()-1; 1001b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn while (index >= 0) { 1002c6669ca63299219d815464129dac051ab2404286Dianne Hackborn BackStackRecord bss = mBackStack.get(index); 1003b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn if (name != null && name.equals(bss.getName())) { 1004b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn break; 1005b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn } 1006b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn if (id >= 0 && id == bss.mIndex) { 1007b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn break; 1008b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn } 1009b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn index--; 1010dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn } 1011b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn if (index < 0) { 1012b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn return false; 1013b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn } 1014b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn if ((flags&Activity.POP_BACK_STACK_INCLUSIVE) != 0) { 1015b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn index--; 1016b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn // Consume all following entries that match. 1017b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn while (index >= 0) { 1018c6669ca63299219d815464129dac051ab2404286Dianne Hackborn BackStackRecord bss = mBackStack.get(index); 1019b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn if ((name != null && name.equals(bss.getName())) 1020b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn || (id >= 0 && id == bss.mIndex)) { 1021b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn index--; 1022b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn continue; 1023b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn } 1024b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn break; 1025b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn } 1026f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } 1027dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn } 1028dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn if (index == mBackStack.size()-1) { 1029f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn return false; 1030f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } 1031c6669ca63299219d815464129dac051ab2404286Dianne Hackborn final ArrayList<BackStackRecord> states 1032c6669ca63299219d815464129dac051ab2404286Dianne Hackborn = new ArrayList<BackStackRecord>(); 1033f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn for (int i=mBackStack.size()-1; i>index; i--) { 1034f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn states.add(mBackStack.remove(i)); 1035ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn } 1036445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn enqueueAction(new Runnable() { 1037f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn public void run() { 10385f36c96f6d3623a826466db68cc1586f078ac307Dianne Hackborn final int LAST = states.size()-1; 10395f36c96f6d3623a826466db68cc1586f078ac307Dianne Hackborn for (int i=0; i<=LAST; i++) { 1040445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn if (DEBUG) Log.v(TAG, "Popping back stack state: " + states.get(i)); 10415f36c96f6d3623a826466db68cc1586f078ac307Dianne Hackborn states.get(i).popFromBackStack(i == LAST); 1042f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } 1043c6669ca63299219d815464129dac051ab2404286Dianne Hackborn reportBackStackChanged(); 1044f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } 1045f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn }); 1046f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } 1047ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn return true; 1048ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn } 1049ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn 1050b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn ArrayList<Fragment> retainNonConfig() { 1051b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn ArrayList<Fragment> fragments = null; 10526e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (mActive != null) { 10536e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn for (int i=0; i<mActive.size(); i++) { 10546e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn Fragment f = mActive.get(i); 10556e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (f != null && f.mRetainInstance) { 1056b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn if (fragments == null) { 1057b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn fragments = new ArrayList<Fragment>(); 1058b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 1059b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn fragments.add(f); 1060b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn f.mRetaining = true; 1061b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 1062b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 1063b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 1064b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn return fragments; 1065b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 1066b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn 1067b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn void saveFragmentViewState(Fragment f) { 10686e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (f.mView == null) { 1069b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn return; 1070b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 1071b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn if (mStateArray == null) { 1072b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn mStateArray = new SparseArray<Parcelable>(); 1073b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 1074b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn f.mView.saveHierarchyState(mStateArray); 1075b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn if (mStateArray.size() > 0) { 1076b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn f.mSavedViewState = mStateArray; 1077b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn mStateArray = null; 1078b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 1079b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 1080b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn 10816e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn Parcelable saveAllState() { 10823e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn mStateSaved = true; 10833e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn 10846e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (mActive == null || mActive.size() <= 0) { 10856e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn return null; 1086b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 1087b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn 10886e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn // First collect all active fragments. 10896e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn int N = mActive.size(); 10906e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn FragmentState[] active = new FragmentState[N]; 10916e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn boolean haveFragments = false; 10926e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn for (int i=0; i<N; i++) { 10936e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn Fragment f = mActive.get(i); 10946e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (f != null) { 10956e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn haveFragments = true; 10966e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn 10976e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn FragmentState fs = new FragmentState(f); 10986e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn active[i] = fs; 10996e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn 1100625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn if (f.mState > Fragment.INITIALIZING && fs.mSavedFragmentState == null) { 1101625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn if (mStateBundle == null) { 1102625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn mStateBundle = new Bundle(); 1103625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn } 1104625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn f.onSaveInstanceState(mStateBundle); 1105625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn if (!mStateBundle.isEmpty()) { 1106625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn fs.mSavedFragmentState = mStateBundle; 1107625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn mStateBundle = null; 1108625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn } 1109625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn 1110625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn if (f.mView != null) { 1111625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn saveFragmentViewState(f); 1112625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn if (f.mSavedViewState != null) { 1113625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn if (fs.mSavedFragmentState == null) { 1114625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn fs.mSavedFragmentState = new Bundle(); 1115625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn } 1116625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn fs.mSavedFragmentState.putSparseParcelableArray( 1117625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn FragmentManagerImpl.VIEW_STATE_TAG, f.mSavedViewState); 1118625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn } 1119625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn } 1120625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn 1121625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn if (f.mTarget != null) { 11226e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (fs.mSavedFragmentState == null) { 11236e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn fs.mSavedFragmentState = new Bundle(); 11246e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } 1125625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn putFragment(fs.mSavedFragmentState, 1126625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn FragmentManagerImpl.TARGET_STATE_TAG, f.mTarget); 1127625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn if (f.mTargetRequestCode != 0) { 1128625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn fs.mSavedFragmentState.putInt( 1129625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn FragmentManagerImpl.TARGET_REQUEST_CODE_STATE_TAG, 1130625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn f.mTargetRequestCode); 1131625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn } 1132def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn } 1133def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn 1134625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn } else { 1135625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn fs.mSavedFragmentState = f.mSavedFragmentState; 11366e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } 11376e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn 1138b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn if (DEBUG) Log.v(TAG, "Saved state of " + f + ": " 1139b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn + fs.mSavedFragmentState); 1140b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 1141b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 1142b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn 11436e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (!haveFragments) { 1144b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn if (DEBUG) Log.v(TAG, "saveAllState: no fragments!"); 1145b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn return null; 1146b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 1147b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn 1148b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn int[] added = null; 1149b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn BackStackState[] backStack = null; 1150b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn 11516e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn // Build list of currently added fragments. 1152625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn if (mAdded != null) { 1153625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn N = mAdded.size(); 1154625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn if (N > 0) { 1155625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn added = new int[N]; 1156625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn for (int i=0; i<N; i++) { 1157625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn added[i] = mAdded.get(i).mIndex; 1158625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn if (DEBUG) Log.v(TAG, "saveAllState: adding fragment #" + i 1159625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn + ": " + mAdded.get(i)); 1160625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn } 1161b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 1162b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 1163b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn 1164b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn // Now save back stack. 1165b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn if (mBackStack != null) { 1166b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn N = mBackStack.size(); 1167b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn if (N > 0) { 1168b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn backStack = new BackStackState[N]; 1169b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn for (int i=0; i<N; i++) { 1170b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn backStack[i] = new BackStackState(this, mBackStack.get(i)); 1171b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn if (DEBUG) Log.v(TAG, "saveAllState: adding back stack #" + i 1172b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn + ": " + mBackStack.get(i)); 1173b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 1174b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 1175b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 1176b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn 1177b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn FragmentManagerState fms = new FragmentManagerState(); 11786e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn fms.mActive = active; 1179b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn fms.mAdded = added; 1180b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn fms.mBackStack = backStack; 1181b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn return fms; 1182b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 1183b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn 1184b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn void restoreAllState(Parcelable state, ArrayList<Fragment> nonConfig) { 1185b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn // If there is no saved state at all, then there can not be 1186b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn // any nonConfig fragments either, so that is that. 1187b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn if (state == null) return; 1188b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn FragmentManagerState fms = (FragmentManagerState)state; 11896e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (fms.mActive == null) return; 1190b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn 11916e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn // First re-attach any non-config instances we are retaining back 11926e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn // to their saved state, so we don't try to instantiate them again. 1193b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn if (nonConfig != null) { 1194b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn for (int i=0; i<nonConfig.size(); i++) { 1195b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn Fragment f = nonConfig.get(i); 1196b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn if (DEBUG) Log.v(TAG, "restoreAllState: re-attaching retained " + f); 11976e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn FragmentState fs = fms.mActive[f.mIndex]; 1198b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn fs.mInstance = f; 1199b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn f.mSavedViewState = null; 12006e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn f.mBackStackNesting = 0; 1201625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn f.mInLayout = false; 12026e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn f.mAdded = false; 1203b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn if (fs.mSavedFragmentState != null) { 12045164246d7e47b9c995ca1e1587f3056eb777f60bDianne Hackborn fs.mSavedFragmentState.setClassLoader(mActivity.getClassLoader()); 1205b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn f.mSavedViewState = fs.mSavedFragmentState.getSparseParcelableArray( 1206def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn FragmentManagerImpl.VIEW_STATE_TAG); 1207b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 1208b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 1209b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 1210b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn 12116e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn // Build the full list of active fragments, instantiating them from 12126e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn // their saved state. 12136e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn mActive = new ArrayList<Fragment>(fms.mActive.length); 12146e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (mAvailIndices != null) { 12156e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn mAvailIndices.clear(); 12166e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } 12176e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn for (int i=0; i<fms.mActive.length; i++) { 12186e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn FragmentState fs = fms.mActive[i]; 12196e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (fs != null) { 1220b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn Fragment f = fs.instantiate(mActivity); 1221b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn if (DEBUG) Log.v(TAG, "restoreAllState: adding #" + i + ": " + f); 1222b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn mActive.add(f); 12236e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } else { 1224b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn if (DEBUG) Log.v(TAG, "restoreAllState: adding #" + i + ": (null)"); 12256e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn mActive.add(null); 12266e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (mAvailIndices == null) { 12276e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn mAvailIndices = new ArrayList<Integer>(); 12286e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } 1229b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn if (DEBUG) Log.v(TAG, "restoreAllState: adding avail #" + i); 12306e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn mAvailIndices.add(i); 1231b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 12326e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } 12336e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn 12343e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn // Update the target of all retained fragments. 12353e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn if (nonConfig != null) { 12363e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn for (int i=0; i<nonConfig.size(); i++) { 12373e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn Fragment f = nonConfig.get(i); 12383e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn if (f.mTarget != null) { 12393e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn if (f.mTarget.mIndex < mActive.size()) { 12403e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn f.mTarget = mActive.get(f.mTarget.mIndex); 12413e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn } else { 12423e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn Log.w(TAG, "Re-attaching retained fragment " + f 12433e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn + " target no longer exists: " + f.mTarget); 12443e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn f.mTarget = null; 12453e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn } 12463e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn } 12473e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn } 12483e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn } 12493e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn 12506e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn // Build the list of currently added fragments. 12516e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (fms.mAdded != null) { 12526e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn mAdded = new ArrayList<Fragment>(fms.mAdded.length); 1253b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn for (int i=0; i<fms.mAdded.length; i++) { 12546e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn Fragment f = mActive.get(fms.mAdded[i]); 12556e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (f == null) { 12566e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn throw new IllegalStateException( 12576e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn "No instantiated fragment for index #" + fms.mAdded[i]); 1258b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 12596e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn f.mAdded = true; 1260b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn f.mImmediateActivity = mActivity; 1261b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn if (DEBUG) Log.v(TAG, "restoreAllState: making added #" + i + ": " + f); 12626e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn mAdded.add(f); 1263b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 12646e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } else { 12656e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn mAdded = null; 1266b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 12676e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn 12686e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn // Build the back stack. 1269b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn if (fms.mBackStack != null) { 1270c6669ca63299219d815464129dac051ab2404286Dianne Hackborn mBackStack = new ArrayList<BackStackRecord>(fms.mBackStack.length); 1271b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn for (int i=0; i<fms.mBackStack.length; i++) { 1272c6669ca63299219d815464129dac051ab2404286Dianne Hackborn BackStackRecord bse = fms.mBackStack[i].instantiate(this); 1273b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn if (DEBUG) Log.v(TAG, "restoreAllState: adding bse #" + i 1274b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn + " (index " + bse.mIndex + "): " + bse); 1275b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn mBackStack.add(bse); 1276dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn if (bse.mIndex >= 0) { 1277dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn setBackStackIndex(bse.mIndex, bse); 1278dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn } 1279b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 12806e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } else { 12816e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn mBackStack = null; 1282b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 1283b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 1284b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn 12852dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn public void attachActivity(Activity activity) { 12862dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn if (mActivity != null) throw new IllegalStateException(); 12872dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn mActivity = activity; 12882dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 12892dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn 1290fb3cffeb35368da22f99b85d45039c4e6e471c06Dianne Hackborn public void noteStateNotSaved() { 1291fb3cffeb35368da22f99b85d45039c4e6e471c06Dianne Hackborn mStateSaved = false; 1292fb3cffeb35368da22f99b85d45039c4e6e471c06Dianne Hackborn } 1293fb3cffeb35368da22f99b85d45039c4e6e471c06Dianne Hackborn 1294b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn public void dispatchCreate() { 12953e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn mStateSaved = false; 1296ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn moveToState(Fragment.CREATED, false); 12972dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 12982dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn 1299c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn public void dispatchActivityCreated() { 13003e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn mStateSaved = false; 1301c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn moveToState(Fragment.ACTIVITY_CREATED, false); 1302c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn } 1303c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn 13042dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn public void dispatchStart() { 13053e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn mStateSaved = false; 1306ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn moveToState(Fragment.STARTED, false); 13072dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 13082dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn 13092dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn public void dispatchResume() { 13103e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn mStateSaved = false; 1311ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn moveToState(Fragment.RESUMED, false); 13122dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 13132dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn 13142dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn public void dispatchPause() { 1315ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn moveToState(Fragment.STARTED, false); 13162dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 13172dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn 13182dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn public void dispatchStop() { 1319c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn moveToState(Fragment.ACTIVITY_CREATED, false); 13202dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 13212dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn 13222dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn public void dispatchDestroy() { 1323ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn moveToState(Fragment.INITIALIZING, false); 13242dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn mActivity = null; 13252dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 1326f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn 1327b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn public boolean dispatchCreateOptionsMenu(Menu menu, MenuInflater inflater) { 1328b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn boolean show = false; 13298eb2e244f9b14d946ee587d0b673b866865026c0Dianne Hackborn ArrayList<Fragment> newMenus = null; 1330b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn if (mActive != null) { 1331b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn for (int i=0; i<mAdded.size(); i++) { 1332b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn Fragment f = mAdded.get(i); 1333b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn if (f != null && !f.mHidden && f.mHasMenu) { 1334b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn show = true; 1335b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn f.onCreateOptionsMenu(menu, inflater); 13368eb2e244f9b14d946ee587d0b673b866865026c0Dianne Hackborn if (newMenus == null) { 13378eb2e244f9b14d946ee587d0b673b866865026c0Dianne Hackborn newMenus = new ArrayList<Fragment>(); 13388eb2e244f9b14d946ee587d0b673b866865026c0Dianne Hackborn } 13398eb2e244f9b14d946ee587d0b673b866865026c0Dianne Hackborn newMenus.add(f); 1340b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn } 1341b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn } 1342b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn } 13438eb2e244f9b14d946ee587d0b673b866865026c0Dianne Hackborn 13448eb2e244f9b14d946ee587d0b673b866865026c0Dianne Hackborn if (mCreatedMenus != null) { 13458eb2e244f9b14d946ee587d0b673b866865026c0Dianne Hackborn for (int i=0; i<mCreatedMenus.size(); i++) { 13468eb2e244f9b14d946ee587d0b673b866865026c0Dianne Hackborn Fragment f = mCreatedMenus.get(i); 13478eb2e244f9b14d946ee587d0b673b866865026c0Dianne Hackborn if (newMenus == null || !newMenus.contains(f)) { 13488eb2e244f9b14d946ee587d0b673b866865026c0Dianne Hackborn f.onDestroyOptionsMenu(); 13498eb2e244f9b14d946ee587d0b673b866865026c0Dianne Hackborn } 13508eb2e244f9b14d946ee587d0b673b866865026c0Dianne Hackborn } 13518eb2e244f9b14d946ee587d0b673b866865026c0Dianne Hackborn } 13528eb2e244f9b14d946ee587d0b673b866865026c0Dianne Hackborn 13538eb2e244f9b14d946ee587d0b673b866865026c0Dianne Hackborn mCreatedMenus = newMenus; 13548eb2e244f9b14d946ee587d0b673b866865026c0Dianne Hackborn 1355b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn return show; 1356b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn } 1357b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn 1358b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn public boolean dispatchPrepareOptionsMenu(Menu menu) { 1359b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn boolean show = false; 1360b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn if (mActive != null) { 1361b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn for (int i=0; i<mAdded.size(); i++) { 1362b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn Fragment f = mAdded.get(i); 1363b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn if (f != null && !f.mHidden && f.mHasMenu) { 1364b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn show = true; 1365b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn f.onPrepareOptionsMenu(menu); 1366b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn } 1367b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn } 1368b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn } 1369b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn return show; 1370b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn } 1371b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn 1372b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn public boolean dispatchOptionsItemSelected(MenuItem item) { 1373b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn if (mActive != null) { 1374b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn for (int i=0; i<mAdded.size(); i++) { 1375b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn Fragment f = mAdded.get(i); 1376b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn if (f != null && !f.mHidden && f.mHasMenu) { 1377b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn if (f.onOptionsItemSelected(item)) { 1378b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn return true; 1379b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn } 1380b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn } 1381b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn } 1382b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn } 1383b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn return false; 1384b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn } 1385b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn 13865ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn public boolean dispatchContextItemSelected(MenuItem item) { 13875ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn if (mActive != null) { 13885ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn for (int i=0; i<mAdded.size(); i++) { 13895ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn Fragment f = mAdded.get(i); 13905ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn if (f != null && !f.mHidden) { 13915ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn if (f.onContextItemSelected(item)) { 13925ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn return true; 13935ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn } 13945ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn } 13955ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn } 13965ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn } 13975ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn return false; 13985ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn } 13995ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn 1400b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn public void dispatchOptionsMenuClosed(Menu menu) { 1401b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn if (mActive != null) { 1402b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn for (int i=0; i<mAdded.size(); i++) { 1403b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn Fragment f = mAdded.get(i); 1404b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn if (f != null && !f.mHidden && f.mHasMenu) { 1405b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn f.onOptionsMenuClosed(menu); 1406b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn } 1407b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn } 1408b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn } 1409b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn } 1410b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn 1411f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn public static int reverseTransit(int transit) { 1412f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn int rev = 0; 1413f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn switch (transit) { 1414811ed1065f39469cf2cf6adba22cab397ed88d5eChet Haase case FragmentTransaction.TRANSIT_FRAGMENT_OPEN: 1415811ed1065f39469cf2cf6adba22cab397ed88d5eChet Haase rev = FragmentTransaction.TRANSIT_FRAGMENT_CLOSE; 1416f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn break; 1417811ed1065f39469cf2cf6adba22cab397ed88d5eChet Haase case FragmentTransaction.TRANSIT_FRAGMENT_CLOSE: 1418811ed1065f39469cf2cf6adba22cab397ed88d5eChet Haase rev = FragmentTransaction.TRANSIT_FRAGMENT_OPEN; 1419f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn break; 14209ff82bf2b33513052500473d0d6d025a80dcecbfChet Haase case FragmentTransaction.TRANSIT_FRAGMENT_NEXT: 14219ff82bf2b33513052500473d0d6d025a80dcecbfChet Haase rev = FragmentTransaction.TRANSIT_FRAGMENT_PREV; 14229ff82bf2b33513052500473d0d6d025a80dcecbfChet Haase break; 14239ff82bf2b33513052500473d0d6d025a80dcecbfChet Haase case FragmentTransaction.TRANSIT_FRAGMENT_PREV: 14249ff82bf2b33513052500473d0d6d025a80dcecbfChet Haase rev = FragmentTransaction.TRANSIT_FRAGMENT_NEXT; 14259ff82bf2b33513052500473d0d6d025a80dcecbfChet Haase break; 1426f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } 1427f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn return rev; 1428f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn 1429f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } 1430f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn 1431f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn public static int transitToStyleIndex(int transit, boolean enter) { 1432f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn int animAttr = -1; 1433f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn switch (transit) { 1434811ed1065f39469cf2cf6adba22cab397ed88d5eChet Haase case FragmentTransaction.TRANSIT_FRAGMENT_OPEN: 1435f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn animAttr = enter 1436811ed1065f39469cf2cf6adba22cab397ed88d5eChet Haase ? com.android.internal.R.styleable.FragmentAnimation_fragmentOpenEnterAnimation 1437811ed1065f39469cf2cf6adba22cab397ed88d5eChet Haase : com.android.internal.R.styleable.FragmentAnimation_fragmentOpenExitAnimation; 1438f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn break; 1439811ed1065f39469cf2cf6adba22cab397ed88d5eChet Haase case FragmentTransaction.TRANSIT_FRAGMENT_CLOSE: 1440f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn animAttr = enter 1441811ed1065f39469cf2cf6adba22cab397ed88d5eChet Haase ? com.android.internal.R.styleable.FragmentAnimation_fragmentCloseEnterAnimation 1442811ed1065f39469cf2cf6adba22cab397ed88d5eChet Haase : com.android.internal.R.styleable.FragmentAnimation_fragmentCloseExitAnimation; 1443f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn break; 14449ff82bf2b33513052500473d0d6d025a80dcecbfChet Haase case FragmentTransaction.TRANSIT_FRAGMENT_NEXT: 14459ff82bf2b33513052500473d0d6d025a80dcecbfChet Haase animAttr = enter 14469ff82bf2b33513052500473d0d6d025a80dcecbfChet Haase ? com.android.internal.R.styleable.FragmentAnimation_fragmentNextEnterAnimation 14479ff82bf2b33513052500473d0d6d025a80dcecbfChet Haase : com.android.internal.R.styleable.FragmentAnimation_fragmentNextExitAnimation; 14489ff82bf2b33513052500473d0d6d025a80dcecbfChet Haase break; 14499ff82bf2b33513052500473d0d6d025a80dcecbfChet Haase case FragmentTransaction.TRANSIT_FRAGMENT_PREV: 14509ff82bf2b33513052500473d0d6d025a80dcecbfChet Haase animAttr = enter 14519ff82bf2b33513052500473d0d6d025a80dcecbfChet Haase ? com.android.internal.R.styleable.FragmentAnimation_fragmentPrevEnterAnimation 14529ff82bf2b33513052500473d0d6d025a80dcecbfChet Haase : com.android.internal.R.styleable.FragmentAnimation_fragmentPrevExitAnimation; 14539ff82bf2b33513052500473d0d6d025a80dcecbfChet Haase break; 1454f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } 1455f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn return animAttr; 1456f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } 14572dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn} 1458