FragmentManager.java revision fb3cffeb35368da22f99b85d45039c4e6e471c06
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; 2712dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn 272dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn // Must be accessed while locked. 273c6669ca63299219d815464129dac051ab2404286Dianne Hackborn ArrayList<BackStackRecord> mBackStackIndices; 274dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn ArrayList<Integer> mAvailBackStackIndices; 275dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn 276c6669ca63299219d815464129dac051ab2404286Dianne Hackborn ArrayList<OnBackStackChangedListener> mBackStackChangeListeners; 277c6669ca63299219d815464129dac051ab2404286Dianne Hackborn 2782dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn int mCurState = Fragment.INITIALIZING; 2792dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn Activity mActivity; 2802dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn 281b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn boolean mNeedMenuInvalidate; 2823e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn boolean mStateSaved; 283fb3cffeb35368da22f99b85d45039c4e6e471c06Dianne Hackborn String mNoTransactionsBecause; 284b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn 285b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn // Temporary vars for state save and restore. 286b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn Bundle mStateBundle = null; 287b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn SparseArray<Parcelable> mStateArray = null; 288b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn 289445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn Runnable mExecCommit = new Runnable() { 290445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn @Override 291445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn public void run() { 292445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn execPendingActions(); 293445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn } 294445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn }; 295625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn 296625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn @Override 297b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn public FragmentTransaction openTransaction() { 298c6669ca63299219d815464129dac051ab2404286Dianne Hackborn return new BackStackRecord(this); 299b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn } 300b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn 301625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn @Override 302b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn public boolean popBackStack() { 303b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn return popBackStackState(mActivity.mHandler, null, -1, 0); 304b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn } 305b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn 306625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn @Override 307b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn public boolean popBackStack(String name, int flags) { 308b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn return popBackStackState(mActivity.mHandler, name, -1, flags); 309b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn } 310b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn 311625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn @Override 312b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn public boolean popBackStack(int id, int flags) { 313b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn if (id < 0) { 314b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn throw new IllegalArgumentException("Bad id: " + id); 315b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn } 316b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn return popBackStackState(mActivity.mHandler, null, id, flags); 317b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn } 318b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn 319625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn @Override 320c6669ca63299219d815464129dac051ab2404286Dianne Hackborn public int countBackStackEntries() { 321c6669ca63299219d815464129dac051ab2404286Dianne Hackborn return mBackStack != null ? mBackStack.size() : 0; 322c6669ca63299219d815464129dac051ab2404286Dianne Hackborn } 323c6669ca63299219d815464129dac051ab2404286Dianne Hackborn 324625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn @Override 325c6669ca63299219d815464129dac051ab2404286Dianne Hackborn public BackStackEntry getBackStackEntry(int index) { 326c6669ca63299219d815464129dac051ab2404286Dianne Hackborn return mBackStack.get(index); 327c6669ca63299219d815464129dac051ab2404286Dianne Hackborn } 328c6669ca63299219d815464129dac051ab2404286Dianne Hackborn 329625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn @Override 330c6669ca63299219d815464129dac051ab2404286Dianne Hackborn public void addOnBackStackChangedListener(OnBackStackChangedListener listener) { 331c6669ca63299219d815464129dac051ab2404286Dianne Hackborn if (mBackStackChangeListeners == null) { 332c6669ca63299219d815464129dac051ab2404286Dianne Hackborn mBackStackChangeListeners = new ArrayList<OnBackStackChangedListener>(); 333c6669ca63299219d815464129dac051ab2404286Dianne Hackborn } 334c6669ca63299219d815464129dac051ab2404286Dianne Hackborn mBackStackChangeListeners.add(listener); 335c6669ca63299219d815464129dac051ab2404286Dianne Hackborn } 336c6669ca63299219d815464129dac051ab2404286Dianne Hackborn 337625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn @Override 338c6669ca63299219d815464129dac051ab2404286Dianne Hackborn public void removeOnBackStackChangedListener(OnBackStackChangedListener listener) { 339c6669ca63299219d815464129dac051ab2404286Dianne Hackborn if (mBackStackChangeListeners != null) { 340c6669ca63299219d815464129dac051ab2404286Dianne Hackborn mBackStackChangeListeners.remove(listener); 341c6669ca63299219d815464129dac051ab2404286Dianne Hackborn } 342c6669ca63299219d815464129dac051ab2404286Dianne Hackborn } 343c6669ca63299219d815464129dac051ab2404286Dianne Hackborn 344625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn @Override 345b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn public void putFragment(Bundle bundle, String key, Fragment fragment) { 346b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn if (fragment.mIndex < 0) { 347b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn throw new IllegalStateException("Fragment " + fragment 348b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn + " is not currently in the FragmentManager"); 349b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn } 350b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn bundle.putInt(key, fragment.mIndex); 351b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn } 352b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn 353625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn @Override 354b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn public Fragment getFragment(Bundle bundle, String key) { 355def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn int index = bundle.getInt(key, -1); 356def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn if (index == -1) { 357def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn return null; 358def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn } 359b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn if (index >= mActive.size()) { 360b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn throw new IllegalStateException("Fragement no longer exists for key " 361b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn + key + ": index " + index); 362b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn } 363b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn Fragment f = mActive.get(index); 364b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn if (f == null) { 365b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn throw new IllegalStateException("Fragement no longer exists for key " 366b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn + key + ": index " + index); 367b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn } 368b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn return f; 369b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn } 370b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn 371625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn @Override 372625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn public void dump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args) { 373625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn if (mActive == null || mActive.size() <= 0) { 374625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn return; 375625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn } 376625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn 377625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn writer.print(prefix); writer.println("Active Fragments:"); 378625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn 379625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn String innerPrefix = prefix + " "; 380625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn 381625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn int N = mActive.size(); 382625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn for (int i=0; i<N; i++) { 383625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn Fragment f = mActive.get(i); 384625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn if (f != null) { 385625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn writer.print(prefix); writer.print(" #"); writer.print(i); 386625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn writer.print(": "); writer.println(f.toString()); 387625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn f.dump(innerPrefix, fd, writer, args); 388625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn } 389625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn } 390625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn 391625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn if (mAdded != null) { 392625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn N = mAdded.size(); 393625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn if (N > 0) { 394625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn writer.print(prefix); writer.println("Added Fragments:"); 395625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn for (int i=0; i<N; i++) { 396625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn Fragment f = mAdded.get(i); 397625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn writer.print(prefix); writer.print(" #"); writer.print(i); 398625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn writer.print(": "); writer.println(f.toString()); 399625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn } 400625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn } 401625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn } 402625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn 403625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn if (mBackStack != null) { 404625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn N = mBackStack.size(); 405625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn if (N > 0) { 406625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn writer.print(prefix); writer.println("Back Stack:"); 407625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn for (int i=0; i<N; i++) { 408625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn BackStackRecord bs = mBackStack.get(i); 409625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn writer.print(prefix); writer.print(" #"); writer.print(i); 410625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn writer.print(": "); writer.println(bs.toString()); 411625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn } 412625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn } 413625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn } 414625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn } 415625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn 416a18a86b43e40e3c15dcca0ae0148d641be9b25feChet Haase Animator loadAnimator(Fragment fragment, int transit, boolean enter, 417f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn int transitionStyle) { 418a18a86b43e40e3c15dcca0ae0148d641be9b25feChet Haase Animator animObj = fragment.onCreateAnimator(transit, enter, 4195ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn fragment.mNextAnim); 420f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn if (animObj != null) { 421f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn return animObj; 422f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } 423f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn 4245ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn if (fragment.mNextAnim != 0) { 425a18a86b43e40e3c15dcca0ae0148d641be9b25feChet Haase Animator anim = AnimatorInflater.loadAnimator(mActivity, fragment.mNextAnim); 4265ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn if (anim != null) { 4275ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn return anim; 4285ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn } 4295ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn } 4305ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn 431f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn if (transit == 0) { 432f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn return null; 433f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } 434f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn 435f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn int styleIndex = transitToStyleIndex(transit, enter); 436f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn if (styleIndex < 0) { 437f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn return null; 438f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } 439f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn 440f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn if (transitionStyle == 0 && mActivity.getWindow() != null) { 441f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn transitionStyle = mActivity.getWindow().getAttributes().windowAnimations; 442f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } 443f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn if (transitionStyle == 0) { 444f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn return null; 445f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } 446f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn 447f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn TypedArray attrs = mActivity.obtainStyledAttributes(transitionStyle, 448811ed1065f39469cf2cf6adba22cab397ed88d5eChet Haase com.android.internal.R.styleable.FragmentAnimation); 449f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn int anim = attrs.getResourceId(styleIndex, 0); 450f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn attrs.recycle(); 451f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn 452f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn if (anim == 0) { 453f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn return null; 454f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } 455f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn 456a18a86b43e40e3c15dcca0ae0148d641be9b25feChet Haase return AnimatorInflater.loadAnimator(mActivity, anim); 457f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } 458f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn 459f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn void moveToState(Fragment f, int newState, int transit, int transitionStyle) { 4606e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn // Fragments that are not currently added will sit in the onCreate() state. 4616e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (!f.mAdded && newState > Fragment.CREATED) { 4626e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn newState = Fragment.CREATED; 4636e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } 4646e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn 4652dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn if (f.mState < newState) { 4662dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn switch (f.mState) { 4672dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn case Fragment.INITIALIZING: 4685ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn if (DEBUG) Log.v(TAG, "moveto CREATED: " + f); 469def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn if (f.mSavedFragmentState != null) { 470def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn f.mSavedViewState = f.mSavedFragmentState.getSparseParcelableArray( 471def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn FragmentManagerImpl.VIEW_STATE_TAG); 472def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn f.mTarget = getFragment(f.mSavedFragmentState, 473def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn FragmentManagerImpl.TARGET_STATE_TAG); 474def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn if (f.mTarget != null) { 475def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn f.mTargetRequestCode = f.mSavedFragmentState.getInt( 476def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn FragmentManagerImpl.TARGET_REQUEST_CODE_STATE_TAG, 0); 477def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn } 478def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn } 4792dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn f.mActivity = mActivity; 4802dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn f.mCalled = false; 4812dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn f.onAttach(mActivity); 4822dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn if (!f.mCalled) { 4832dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn throw new SuperNotCalledException("Fragment " + f 4842dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn + " did not call through to super.onAttach()"); 4852dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 486c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn mActivity.onAttachFragment(f); 4872dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn 488b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn if (!f.mRetaining) { 489b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn f.mCalled = false; 490b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn f.onCreate(f.mSavedFragmentState); 491b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn if (!f.mCalled) { 492b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn throw new SuperNotCalledException("Fragment " + f 493b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn + " did not call through to super.onCreate()"); 4942dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 4952dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 496b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn f.mRetaining = false; 497b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn if (f.mFromLayout) { 498b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn // For fragments that are part of the content view 499b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn // layout, we need to instantiate the view immediately 500b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn // and the inflater will take care of adding it. 501b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn f.mView = f.onCreateView(mActivity.getLayoutInflater(), 502b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn null, f.mSavedFragmentState); 5036e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (f.mView != null) { 5046e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn f.mView.setSaveFromParentEnabled(false); 5056e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn f.restoreViewState(); 5065ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn if (f.mHidden) f.mView.setVisibility(View.GONE); 5076e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } 508b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 5096e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn case Fragment.CREATED: 5106e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (newState > Fragment.CREATED) { 5115ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn if (DEBUG) Log.v(TAG, "moveto CONTENT: " + f); 512b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn if (!f.mFromLayout) { 513b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn ViewGroup container = null; 514b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn if (f.mContainerId != 0) { 515b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn container = (ViewGroup)mActivity.findViewById(f.mContainerId); 516b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn if (container == null) { 517625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn throw new IllegalArgumentException("No view found for id 0x" 518b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn + Integer.toHexString(f.mContainerId) 519b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn + " for fragment " + f); 520b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 521b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 522b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn f.mContainer = container; 523b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn f.mView = f.onCreateView(mActivity.getLayoutInflater(), 524b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn container, f.mSavedFragmentState); 525b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn if (f.mView != null) { 526b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn f.mView.setSaveFromParentEnabled(false); 527b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn if (container != null) { 528a18a86b43e40e3c15dcca0ae0148d641be9b25feChet Haase Animator anim = loadAnimator(f, transit, true, 529b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn transitionStyle); 530b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn if (anim != null) { 531b20db3ec34e846010f389880b2cfab4d7bf79820Chet Haase anim.setTarget(f.mView); 532811ed1065f39469cf2cf6adba22cab397ed88d5eChet Haase anim.start(); 533b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 534b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn container.addView(f.mView); 535b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn f.restoreViewState(); 536b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 5375ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn if (f.mHidden) f.mView.setVisibility(View.GONE); 538b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 539b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 540b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn 541b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn f.mCalled = false; 542c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn f.onActivityCreated(f.mSavedFragmentState); 543b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn if (!f.mCalled) { 544b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn throw new SuperNotCalledException("Fragment " + f 545b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn + " did not call through to super.onReady()"); 546f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } 547b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn f.mSavedFragmentState = null; 5482dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 549c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn case Fragment.ACTIVITY_CREATED: 550c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn if (newState > Fragment.ACTIVITY_CREATED) { 5515ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn if (DEBUG) Log.v(TAG, "moveto STARTED: " + f); 5522dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn f.mCalled = false; 5532dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn f.onStart(); 5542dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn if (!f.mCalled) { 5552dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn throw new SuperNotCalledException("Fragment " + f 5562dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn + " did not call through to super.onStart()"); 5572dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 5582dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 5592dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn case Fragment.STARTED: 5602dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn if (newState > Fragment.STARTED) { 5615ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn if (DEBUG) Log.v(TAG, "moveto RESUMED: " + f); 5622dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn f.mCalled = false; 5632707d6026240bcca6f0e35e2e1138958882e90ceDianne Hackborn f.mResumed = true; 5642dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn f.onResume(); 5652dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn if (!f.mCalled) { 5662dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn throw new SuperNotCalledException("Fragment " + f 5672dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn + " did not call through to super.onResume()"); 5682dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 5692dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 5702dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 5712dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } else if (f.mState > newState) { 5722dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn switch (f.mState) { 5732dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn case Fragment.RESUMED: 5742dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn if (newState < Fragment.RESUMED) { 5755ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn if (DEBUG) Log.v(TAG, "movefrom RESUMED: " + f); 5762dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn f.mCalled = false; 5772dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn f.onPause(); 5782dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn if (!f.mCalled) { 5792dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn throw new SuperNotCalledException("Fragment " + f 5802dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn + " did not call through to super.onPause()"); 5812dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 5822707d6026240bcca6f0e35e2e1138958882e90ceDianne Hackborn f.mResumed = false; 5832dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 5842dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn case Fragment.STARTED: 5852dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn if (newState < Fragment.STARTED) { 5865ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn if (DEBUG) Log.v(TAG, "movefrom STARTED: " + f); 5872dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn f.mCalled = false; 5882707d6026240bcca6f0e35e2e1138958882e90ceDianne Hackborn f.performStop(); 5892dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn if (!f.mCalled) { 5902dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn throw new SuperNotCalledException("Fragment " + f 5912dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn + " did not call through to super.onStop()"); 5922dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 5932dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 594c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn case Fragment.ACTIVITY_CREATED: 595c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn if (newState < Fragment.ACTIVITY_CREATED) { 5965ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn if (DEBUG) Log.v(TAG, "movefrom CONTENT: " + f); 597b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn if (f.mView != null) { 598b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn // Need to save the current view state if not 599b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn // done already. 600625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn if (!mActivity.isFinishing() && f.mSavedViewState == null) { 601b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn saveFragmentViewState(f); 602b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 603def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn } 604def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn f.mCalled = false; 605def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn f.onDestroyView(); 606def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn if (!f.mCalled) { 607def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn throw new SuperNotCalledException("Fragment " + f 608def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn + " did not call through to super.onDestroyedView()"); 609def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn } 610def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn if (f.mView != null && f.mContainer != null) { 611b20db3ec34e846010f389880b2cfab4d7bf79820Chet Haase Animator anim = null; 612def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn if (mCurState > Fragment.INITIALIZING) { 613b20db3ec34e846010f389880b2cfab4d7bf79820Chet Haase anim = loadAnimator(f, transit, false, 614def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn transitionStyle); 615b20db3ec34e846010f389880b2cfab4d7bf79820Chet Haase } 616b20db3ec34e846010f389880b2cfab4d7bf79820Chet Haase if (anim != null) { 617b20db3ec34e846010f389880b2cfab4d7bf79820Chet Haase final ViewGroup container = f.mContainer; 618b20db3ec34e846010f389880b2cfab4d7bf79820Chet Haase final View view = f.mView; 619b20db3ec34e846010f389880b2cfab4d7bf79820Chet Haase container.startViewTransition(view); 620b20db3ec34e846010f389880b2cfab4d7bf79820Chet Haase anim.addListener(new AnimatorListenerAdapter() { 621b20db3ec34e846010f389880b2cfab4d7bf79820Chet Haase @Override 622b20db3ec34e846010f389880b2cfab4d7bf79820Chet Haase public void onAnimationEnd(Animator anim) { 623b20db3ec34e846010f389880b2cfab4d7bf79820Chet Haase container.endViewTransition(view); 624b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 625b20db3ec34e846010f389880b2cfab4d7bf79820Chet Haase }); 626b20db3ec34e846010f389880b2cfab4d7bf79820Chet Haase anim.setTarget(f.mView); 627b20db3ec34e846010f389880b2cfab4d7bf79820Chet Haase anim.start(); 628b20db3ec34e846010f389880b2cfab4d7bf79820Chet Haase 629f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } 630def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn f.mContainer.removeView(f.mView); 6312dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 6322dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn f.mContainer = null; 6332dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn f.mView = null; 634b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 635b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn case Fragment.CREATED: 636b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn if (newState < Fragment.CREATED) { 6375ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn if (DEBUG) Log.v(TAG, "movefrom CREATED: " + f); 638b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn if (!f.mRetaining) { 639b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn f.mCalled = false; 640b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn f.onDestroy(); 641b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn if (!f.mCalled) { 642b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn throw new SuperNotCalledException("Fragment " + f 643b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn + " did not call through to super.onDestroy()"); 644b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 6452dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 646b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn 6472dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn f.mCalled = false; 6482dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn f.onDetach(); 6492dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn if (!f.mCalled) { 6502dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn throw new SuperNotCalledException("Fragment " + f 6512dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn + " did not call through to super.onDetach()"); 6522dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 6533e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn f.mImmediateActivity = null; 6542dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn f.mActivity = null; 6552dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 6562dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 6572dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 6582dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn 6592dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn f.mState = newState; 6602dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 6612dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn 662625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn void moveToState(Fragment f) { 663625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn moveToState(f, mCurState, 0, 0); 664625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn } 665625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn 666ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn void moveToState(int newState, boolean always) { 667f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn moveToState(newState, 0, 0, always); 668f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } 669f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn 670f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn void moveToState(int newState, int transit, int transitStyle, boolean always) { 6712dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn if (mActivity == null && newState != Fragment.INITIALIZING) { 6722dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn throw new IllegalStateException("No activity"); 6732dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 6742dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn 675ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn if (!always && mCurState == newState) { 676ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn return; 677ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn } 678ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn 6792dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn mCurState = newState; 6806e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (mActive != null) { 6816e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn for (int i=0; i<mActive.size(); i++) { 6826e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn Fragment f = mActive.get(i); 6836e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (f != null) { 6846e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn moveToState(f, newState, transit, transitStyle); 6856e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } 6866e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } 6875f36c96f6d3623a826466db68cc1586f078ac307Dianne Hackborn 6885f36c96f6d3623a826466db68cc1586f078ac307Dianne Hackborn if (mNeedMenuInvalidate && mActivity != null) { 6895f36c96f6d3623a826466db68cc1586f078ac307Dianne Hackborn mActivity.invalidateOptionsMenu(); 6905f36c96f6d3623a826466db68cc1586f078ac307Dianne Hackborn mNeedMenuInvalidate = false; 6915f36c96f6d3623a826466db68cc1586f078ac307Dianne Hackborn } 6926e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } 6936e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } 6946e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn 6956e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn void makeActive(Fragment f) { 6966e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (f.mIndex >= 0) { 6976e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn return; 6986e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } 6996e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn 7006e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (mAvailIndices == null || mAvailIndices.size() <= 0) { 7016e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (mActive == null) { 7026e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn mActive = new ArrayList<Fragment>(); 703ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn } 7046e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn f.setIndex(mActive.size()); 7056e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn mActive.add(f); 7066e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn 7076e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } else { 7086e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn f.setIndex(mAvailIndices.remove(mAvailIndices.size()-1)); 7096e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn mActive.set(f.mIndex, f); 7102dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 7112dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 7122dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn 7136e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn void makeInactive(Fragment f) { 7146e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (f.mIndex < 0) { 7156e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn return; 7166e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } 7176e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn 718b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn if (DEBUG) Log.v(TAG, "Freeing fragment index " + f.mIndex); 7196e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn mActive.set(f.mIndex, null); 7206e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (mAvailIndices == null) { 7216e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn mAvailIndices = new ArrayList<Integer>(); 7226e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } 7236e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn mAvailIndices.add(f.mIndex); 7249e14e9f33a66b864b98c6ff9517988bafbca3301Dianne Hackborn mActivity.invalidateFragmentIndex(f.mIndex); 7256e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn f.clearIndex(); 7266e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } 7276e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn 728ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn public void addFragment(Fragment fragment, boolean moveToStateNow) { 7296e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (mAdded == null) { 7306e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn mAdded = new ArrayList<Fragment>(); 731ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn } 7326e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn mAdded.add(fragment); 7336e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn makeActive(fragment); 7345e0d59547c4042037e23a42ba4e2521721e9c7d3Dianne Hackborn if (DEBUG) Log.v(TAG, "add: " + fragment); 7356e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn fragment.mAdded = true; 736b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn if (fragment.mHasMenu) { 737b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn mNeedMenuInvalidate = true; 738b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn } 739ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn if (moveToStateNow) { 740625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn moveToState(fragment); 741ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn } 7422dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 7432dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn 744f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn public void removeFragment(Fragment fragment, int transition, int transitionStyle) { 7455e0d59547c4042037e23a42ba4e2521721e9c7d3Dianne Hackborn if (DEBUG) Log.v(TAG, "remove: " + fragment + " nesting=" + fragment.mBackStackNesting); 7466e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn mAdded.remove(fragment); 7476e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn final boolean inactive = fragment.mBackStackNesting <= 0; 748b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn if (fragment.mHasMenu) { 749b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn mNeedMenuInvalidate = true; 750b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn } 7516e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn fragment.mAdded = false; 7526e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn moveToState(fragment, inactive ? Fragment.INITIALIZING : Fragment.CREATED, 7536e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn transition, transitionStyle); 7545e0d59547c4042037e23a42ba4e2521721e9c7d3Dianne Hackborn if (inactive) { 7555e0d59547c4042037e23a42ba4e2521721e9c7d3Dianne Hackborn makeInactive(fragment); 7565e0d59547c4042037e23a42ba4e2521721e9c7d3Dianne Hackborn } 757f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } 758f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn 7595ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn public void hideFragment(Fragment fragment, int transition, int transitionStyle) { 7605ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn if (DEBUG) Log.v(TAG, "hide: " + fragment); 7615ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn if (!fragment.mHidden) { 7625ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn fragment.mHidden = true; 7635ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn if (fragment.mView != null) { 764a18a86b43e40e3c15dcca0ae0148d641be9b25feChet Haase Animator anim = loadAnimator(fragment, transition, true, 7655ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn transitionStyle); 7665ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn if (anim != null) { 767b20db3ec34e846010f389880b2cfab4d7bf79820Chet Haase anim.setTarget(fragment.mView); 768811ed1065f39469cf2cf6adba22cab397ed88d5eChet Haase anim.start(); 7695ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn } 7705ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn fragment.mView.setVisibility(View.GONE); 7715ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn } 772b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn if (fragment.mAdded && fragment.mHasMenu) { 773b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn mNeedMenuInvalidate = true; 774b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn } 7755ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn fragment.onHiddenChanged(true); 7765ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn } 7775ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn } 7785ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn 7795ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn public void showFragment(Fragment fragment, int transition, int transitionStyle) { 7805ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn if (DEBUG) Log.v(TAG, "show: " + fragment); 7815ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn if (fragment.mHidden) { 7825ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn fragment.mHidden = false; 7835ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn if (fragment.mView != null) { 784a18a86b43e40e3c15dcca0ae0148d641be9b25feChet Haase Animator anim = loadAnimator(fragment, transition, true, 7855ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn transitionStyle); 7865ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn if (anim != null) { 787b20db3ec34e846010f389880b2cfab4d7bf79820Chet Haase anim.setTarget(fragment.mView); 788811ed1065f39469cf2cf6adba22cab397ed88d5eChet Haase anim.start(); 7895ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn } 7905ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn fragment.mView.setVisibility(View.VISIBLE); 7915ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn } 792b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn if (fragment.mAdded && fragment.mHasMenu) { 793b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn mNeedMenuInvalidate = true; 794b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn } 7955ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn fragment.onHiddenChanged(false); 7965ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn } 7975ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn } 7985ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn 799f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn public Fragment findFragmentById(int id) { 8006e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (mActive != null) { 8015ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn // First look through added fragments. 8025ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn for (int i=mAdded.size()-1; i>=0; i--) { 8035ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn Fragment f = mAdded.get(i); 8045ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn if (f != null && f.mFragmentId == id) { 8055ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn return f; 8065ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn } 8075ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn } 8085ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn // Now for any known fragment. 8096e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn for (int i=mActive.size()-1; i>=0; i--) { 8106e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn Fragment f = mActive.get(i); 8116e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (f != null && f.mFragmentId == id) { 812b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn return f; 813b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 814b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 815b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 816b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn return null; 817b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 818b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn 819b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn public Fragment findFragmentByTag(String tag) { 8206e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (mActive != null && tag != null) { 8215ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn // First look through added fragments. 8225ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn for (int i=mAdded.size()-1; i>=0; i--) { 8235ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn Fragment f = mAdded.get(i); 8245ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn if (f != null && tag.equals(f.mTag)) { 8255ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn return f; 8265ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn } 8275ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn } 8285ae74d6e89a30e79ea85c487b32223ef55314985Dianne Hackborn // Now for any known fragment. 8296e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn for (int i=mActive.size()-1; i>=0; i--) { 8306e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn Fragment f = mActive.get(i); 8316e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (f != null && tag.equals(f.mTag)) { 8326e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn return f; 8336e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } 8346e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } 8356e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } 8366e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn return null; 8376e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } 8386e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn 8396e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn public Fragment findFragmentByWho(String who) { 8406e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (mActive != null && who != null) { 8416e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn for (int i=mActive.size()-1; i>=0; i--) { 8426e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn Fragment f = mActive.get(i); 8436e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (f != null && who.equals(f.mWho)) { 844f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn return f; 845f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } 846f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } 847f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } 848f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn return null; 8492dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 8502dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn 851445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn public void enqueueAction(Runnable action) { 8523e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn if (mStateSaved) { 8533e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn throw new IllegalStateException( 8543e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn "Can not perform this action after onSaveInstanceState"); 8553e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn } 856fb3cffeb35368da22f99b85d45039c4e6e471c06Dianne Hackborn if (mNoTransactionsBecause != null) { 857fb3cffeb35368da22f99b85d45039c4e6e471c06Dianne Hackborn throw new IllegalStateException( 858fb3cffeb35368da22f99b85d45039c4e6e471c06Dianne Hackborn "Can not perform this action inside of " + mNoTransactionsBecause); 859fb3cffeb35368da22f99b85d45039c4e6e471c06Dianne Hackborn } 860445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn synchronized (this) { 861445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn if (mPendingActions == null) { 862445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn mPendingActions = new ArrayList<Runnable>(); 863445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn } 864445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn mPendingActions.add(action); 865445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn if (mPendingActions.size() == 1) { 866445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn mActivity.mHandler.removeCallbacks(mExecCommit); 867445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn mActivity.mHandler.post(mExecCommit); 868445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn } 869445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn } 870445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn } 871445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn 872c6669ca63299219d815464129dac051ab2404286Dianne Hackborn public int allocBackStackIndex(BackStackRecord bse) { 873dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn synchronized (this) { 874dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn if (mAvailBackStackIndices == null || mAvailBackStackIndices.size() <= 0) { 875dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn if (mBackStackIndices == null) { 876c6669ca63299219d815464129dac051ab2404286Dianne Hackborn mBackStackIndices = new ArrayList<BackStackRecord>(); 877dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn } 878dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn int index = mBackStackIndices.size(); 879dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn if (DEBUG) Log.v(TAG, "Setting back stack index " + index + " to " + bse); 880dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn mBackStackIndices.add(bse); 881dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn return index; 882dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn 883dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn } else { 884dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn int index = mAvailBackStackIndices.remove(mAvailBackStackIndices.size()-1); 885dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn if (DEBUG) Log.v(TAG, "Adding back stack index " + index + " with " + bse); 886dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn mBackStackIndices.set(index, bse); 887dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn return index; 888dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn } 889dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn } 890dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn } 891dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn 892c6669ca63299219d815464129dac051ab2404286Dianne Hackborn public void setBackStackIndex(int index, BackStackRecord bse) { 893dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn synchronized (this) { 894dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn if (mBackStackIndices == null) { 895c6669ca63299219d815464129dac051ab2404286Dianne Hackborn mBackStackIndices = new ArrayList<BackStackRecord>(); 896dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn } 897dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn int N = mBackStackIndices.size(); 898dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn if (index < N) { 899dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn if (DEBUG) Log.v(TAG, "Setting back stack index " + index + " to " + bse); 900dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn mBackStackIndices.set(index, bse); 901dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn } else { 902dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn while (N < index) { 903dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn mBackStackIndices.add(null); 904dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn if (mAvailBackStackIndices == null) { 905dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn mAvailBackStackIndices = new ArrayList<Integer>(); 906dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn } 907dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn if (DEBUG) Log.v(TAG, "Adding available back stack index " + N); 908dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn mAvailBackStackIndices.add(N); 909dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn N++; 910dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn } 911dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn if (DEBUG) Log.v(TAG, "Adding back stack index " + index + " with " + bse); 912dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn mBackStackIndices.add(bse); 913dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn } 914dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn } 915dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn } 916dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn 917dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn public void freeBackStackIndex(int index) { 918dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn synchronized (this) { 919dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn mBackStackIndices.set(index, null); 920dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn if (mAvailBackStackIndices == null) { 921dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn mAvailBackStackIndices = new ArrayList<Integer>(); 922dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn } 923dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn if (DEBUG) Log.v(TAG, "Freeing back stack index " + index); 924dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn mAvailBackStackIndices.add(index); 925dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn } 926dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn } 927dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn 928445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn /** 929445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn * Only call from main thread! 930445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn */ 931445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn public void execPendingActions() { 932445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn if (mExecutingActions) { 933445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn throw new IllegalStateException("Recursive entry to execPendingActions"); 934445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn } 935445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn 936445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn while (true) { 937445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn int numActions; 938445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn 939445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn synchronized (this) { 940445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn if (mPendingActions == null || mPendingActions.size() == 0) { 941445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn return; 942445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn } 943445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn 944445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn numActions = mPendingActions.size(); 945445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn if (mTmpActions == null || mTmpActions.length < numActions) { 946445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn mTmpActions = new Runnable[numActions]; 947445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn } 948445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn mPendingActions.toArray(mTmpActions); 949445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn mPendingActions.clear(); 950445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn mActivity.mHandler.removeCallbacks(mExecCommit); 951445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn } 952445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn 953445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn mExecutingActions = true; 954445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn for (int i=0; i<numActions; i++) { 955445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn mTmpActions[i].run(); 956445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn } 957445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn mExecutingActions = false; 958445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn } 959445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn } 960445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn 961c6669ca63299219d815464129dac051ab2404286Dianne Hackborn void reportBackStackChanged() { 962c6669ca63299219d815464129dac051ab2404286Dianne Hackborn if (mBackStackChangeListeners != null) { 963c6669ca63299219d815464129dac051ab2404286Dianne Hackborn for (int i=0; i<mBackStackChangeListeners.size(); i++) { 964c6669ca63299219d815464129dac051ab2404286Dianne Hackborn mBackStackChangeListeners.get(i).onBackStackChanged(); 965c6669ca63299219d815464129dac051ab2404286Dianne Hackborn } 966c6669ca63299219d815464129dac051ab2404286Dianne Hackborn } 967c6669ca63299219d815464129dac051ab2404286Dianne Hackborn } 968c6669ca63299219d815464129dac051ab2404286Dianne Hackborn 969c6669ca63299219d815464129dac051ab2404286Dianne Hackborn void addBackStackState(BackStackRecord state) { 970ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn if (mBackStack == null) { 971c6669ca63299219d815464129dac051ab2404286Dianne Hackborn mBackStack = new ArrayList<BackStackRecord>(); 972ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn } 973ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn mBackStack.add(state); 974c6669ca63299219d815464129dac051ab2404286Dianne Hackborn reportBackStackChanged(); 975ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn } 976ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn 977dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn boolean popBackStackState(Handler handler, String name, int id, int flags) { 978ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn if (mBackStack == null) { 979ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn return false; 980ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn } 981b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn if (name == null && id < 0 && (flags&Activity.POP_BACK_STACK_INCLUSIVE) == 0) { 982f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn int last = mBackStack.size()-1; 983f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn if (last < 0) { 984f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn return false; 985f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } 986c6669ca63299219d815464129dac051ab2404286Dianne Hackborn final BackStackRecord bss = mBackStack.remove(last); 987445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn enqueueAction(new Runnable() { 988f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn public void run() { 989445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn if (DEBUG) Log.v(TAG, "Popping back stack state: " + bss); 9905f36c96f6d3623a826466db68cc1586f078ac307Dianne Hackborn bss.popFromBackStack(true); 991c6669ca63299219d815464129dac051ab2404286Dianne Hackborn reportBackStackChanged(); 992f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } 993f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn }); 994f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } else { 995b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn int index = -1; 996b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn if (name != null || id >= 0) { 997b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn // If a name or ID is specified, look for that place in 998b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn // the stack. 999b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn index = mBackStack.size()-1; 1000b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn while (index >= 0) { 1001c6669ca63299219d815464129dac051ab2404286Dianne Hackborn BackStackRecord bss = mBackStack.get(index); 1002b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn if (name != null && name.equals(bss.getName())) { 1003b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn break; 1004b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn } 1005b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn if (id >= 0 && id == bss.mIndex) { 1006b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn break; 1007b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn } 1008b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn index--; 1009dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn } 1010b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn if (index < 0) { 1011b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn return false; 1012b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn } 1013b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn if ((flags&Activity.POP_BACK_STACK_INCLUSIVE) != 0) { 1014b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn index--; 1015b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn // Consume all following entries that match. 1016b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn while (index >= 0) { 1017c6669ca63299219d815464129dac051ab2404286Dianne Hackborn BackStackRecord bss = mBackStack.get(index); 1018b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn if ((name != null && name.equals(bss.getName())) 1019b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn || (id >= 0 && id == bss.mIndex)) { 1020b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn index--; 1021b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn continue; 1022b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn } 1023b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn break; 1024b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn } 1025f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } 1026dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn } 1027dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn if (index == mBackStack.size()-1) { 1028f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn return false; 1029f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } 1030c6669ca63299219d815464129dac051ab2404286Dianne Hackborn final ArrayList<BackStackRecord> states 1031c6669ca63299219d815464129dac051ab2404286Dianne Hackborn = new ArrayList<BackStackRecord>(); 1032f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn for (int i=mBackStack.size()-1; i>index; i--) { 1033f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn states.add(mBackStack.remove(i)); 1034ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn } 1035445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn enqueueAction(new Runnable() { 1036f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn public void run() { 10375f36c96f6d3623a826466db68cc1586f078ac307Dianne Hackborn final int LAST = states.size()-1; 10385f36c96f6d3623a826466db68cc1586f078ac307Dianne Hackborn for (int i=0; i<=LAST; i++) { 1039445646c52128a763b56ed7bb3bd009e2f33e3e4fDianne Hackborn if (DEBUG) Log.v(TAG, "Popping back stack state: " + states.get(i)); 10405f36c96f6d3623a826466db68cc1586f078ac307Dianne Hackborn states.get(i).popFromBackStack(i == LAST); 1041f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } 1042c6669ca63299219d815464129dac051ab2404286Dianne Hackborn reportBackStackChanged(); 1043f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } 1044f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn }); 1045f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } 1046ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn return true; 1047ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn } 1048ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn 1049b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn ArrayList<Fragment> retainNonConfig() { 1050b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn ArrayList<Fragment> fragments = null; 10516e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (mActive != null) { 10526e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn for (int i=0; i<mActive.size(); i++) { 10536e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn Fragment f = mActive.get(i); 10546e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (f != null && f.mRetainInstance) { 1055b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn if (fragments == null) { 1056b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn fragments = new ArrayList<Fragment>(); 1057b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 1058b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn fragments.add(f); 1059b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn f.mRetaining = true; 1060b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 1061b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 1062b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 1063b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn return fragments; 1064b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 1065b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn 1066b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn void saveFragmentViewState(Fragment f) { 10676e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (f.mView == null) { 1068b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn return; 1069b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 1070b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn if (mStateArray == null) { 1071b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn mStateArray = new SparseArray<Parcelable>(); 1072b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 1073b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn f.mView.saveHierarchyState(mStateArray); 1074b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn if (mStateArray.size() > 0) { 1075b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn f.mSavedViewState = mStateArray; 1076b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn mStateArray = null; 1077b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 1078b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 1079b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn 10806e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn Parcelable saveAllState() { 10813e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn mStateSaved = true; 10823e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn 10836e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (mActive == null || mActive.size() <= 0) { 10846e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn return null; 1085b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 1086b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn 10876e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn // First collect all active fragments. 10886e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn int N = mActive.size(); 10896e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn FragmentState[] active = new FragmentState[N]; 10906e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn boolean haveFragments = false; 10916e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn for (int i=0; i<N; i++) { 10926e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn Fragment f = mActive.get(i); 10936e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (f != null) { 10946e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn haveFragments = true; 10956e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn 10966e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn FragmentState fs = new FragmentState(f); 10976e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn active[i] = fs; 10986e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn 1099625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn if (f.mState > Fragment.INITIALIZING && fs.mSavedFragmentState == null) { 1100625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn if (mStateBundle == null) { 1101625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn mStateBundle = new Bundle(); 1102625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn } 1103625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn f.onSaveInstanceState(mStateBundle); 1104625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn if (!mStateBundle.isEmpty()) { 1105625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn fs.mSavedFragmentState = mStateBundle; 1106625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn mStateBundle = null; 1107625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn } 1108625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn 1109625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn if (f.mView != null) { 1110625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn saveFragmentViewState(f); 1111625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn if (f.mSavedViewState != null) { 1112625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn if (fs.mSavedFragmentState == null) { 1113625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn fs.mSavedFragmentState = new Bundle(); 1114625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn } 1115625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn fs.mSavedFragmentState.putSparseParcelableArray( 1116625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn FragmentManagerImpl.VIEW_STATE_TAG, f.mSavedViewState); 1117625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn } 1118625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn } 1119625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn 1120625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn if (f.mTarget != null) { 11216e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (fs.mSavedFragmentState == null) { 11226e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn fs.mSavedFragmentState = new Bundle(); 11236e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } 1124625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn putFragment(fs.mSavedFragmentState, 1125625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn FragmentManagerImpl.TARGET_STATE_TAG, f.mTarget); 1126625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn if (f.mTargetRequestCode != 0) { 1127625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn fs.mSavedFragmentState.putInt( 1128625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn FragmentManagerImpl.TARGET_REQUEST_CODE_STATE_TAG, 1129625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn f.mTargetRequestCode); 1130625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn } 1131def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn } 1132def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn 1133625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn } else { 1134625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn fs.mSavedFragmentState = f.mSavedFragmentState; 11356e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } 11366e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn 1137b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn if (DEBUG) Log.v(TAG, "Saved state of " + f + ": " 1138b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn + fs.mSavedFragmentState); 1139b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 1140b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 1141b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn 11426e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (!haveFragments) { 1143b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn if (DEBUG) Log.v(TAG, "saveAllState: no fragments!"); 1144b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn return null; 1145b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 1146b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn 1147b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn int[] added = null; 1148b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn BackStackState[] backStack = null; 1149b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn 11506e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn // Build list of currently added fragments. 1151625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn if (mAdded != null) { 1152625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn N = mAdded.size(); 1153625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn if (N > 0) { 1154625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn added = new int[N]; 1155625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn for (int i=0; i<N; i++) { 1156625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn added[i] = mAdded.get(i).mIndex; 1157625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn if (DEBUG) Log.v(TAG, "saveAllState: adding fragment #" + i 1158625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn + ": " + mAdded.get(i)); 1159625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn } 1160b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 1161b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 1162b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn 1163b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn // Now save back stack. 1164b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn if (mBackStack != null) { 1165b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn N = mBackStack.size(); 1166b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn if (N > 0) { 1167b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn backStack = new BackStackState[N]; 1168b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn for (int i=0; i<N; i++) { 1169b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn backStack[i] = new BackStackState(this, mBackStack.get(i)); 1170b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn if (DEBUG) Log.v(TAG, "saveAllState: adding back stack #" + i 1171b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn + ": " + mBackStack.get(i)); 1172b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 1173b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 1174b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 1175b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn 1176b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn FragmentManagerState fms = new FragmentManagerState(); 11776e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn fms.mActive = active; 1178b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn fms.mAdded = added; 1179b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn fms.mBackStack = backStack; 1180b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn return fms; 1181b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 1182b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn 1183b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn void restoreAllState(Parcelable state, ArrayList<Fragment> nonConfig) { 1184b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn // If there is no saved state at all, then there can not be 1185b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn // any nonConfig fragments either, so that is that. 1186b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn if (state == null) return; 1187b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn FragmentManagerState fms = (FragmentManagerState)state; 11886e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (fms.mActive == null) return; 1189b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn 11906e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn // First re-attach any non-config instances we are retaining back 11916e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn // to their saved state, so we don't try to instantiate them again. 1192b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn if (nonConfig != null) { 1193b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn for (int i=0; i<nonConfig.size(); i++) { 1194b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn Fragment f = nonConfig.get(i); 1195b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn if (DEBUG) Log.v(TAG, "restoreAllState: re-attaching retained " + f); 11966e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn FragmentState fs = fms.mActive[f.mIndex]; 1197b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn fs.mInstance = f; 1198b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn f.mSavedViewState = null; 11996e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn f.mBackStackNesting = 0; 1200625ac271f80777668f832a344486a6fcdc06d0aeDianne Hackborn f.mInLayout = false; 12016e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn f.mAdded = false; 1202b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn if (fs.mSavedFragmentState != null) { 1203b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn f.mSavedViewState = fs.mSavedFragmentState.getSparseParcelableArray( 1204def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn FragmentManagerImpl.VIEW_STATE_TAG); 1205b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 1206b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 1207b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 1208b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn 12096e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn // Build the full list of active fragments, instantiating them from 12106e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn // their saved state. 12116e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn mActive = new ArrayList<Fragment>(fms.mActive.length); 12126e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (mAvailIndices != null) { 12136e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn mAvailIndices.clear(); 12146e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } 12156e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn for (int i=0; i<fms.mActive.length; i++) { 12166e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn FragmentState fs = fms.mActive[i]; 12176e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (fs != null) { 1218b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn Fragment f = fs.instantiate(mActivity); 1219b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn if (DEBUG) Log.v(TAG, "restoreAllState: adding #" + i + ": " + f); 1220b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn mActive.add(f); 12216e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } else { 1222b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn if (DEBUG) Log.v(TAG, "restoreAllState: adding #" + i + ": (null)"); 12236e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn mActive.add(null); 12246e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (mAvailIndices == null) { 12256e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn mAvailIndices = new ArrayList<Integer>(); 12266e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } 1227b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn if (DEBUG) Log.v(TAG, "restoreAllState: adding avail #" + i); 12286e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn mAvailIndices.add(i); 1229b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 12306e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } 12316e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn 12323e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn // Update the target of all retained fragments. 12333e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn if (nonConfig != null) { 12343e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn for (int i=0; i<nonConfig.size(); i++) { 12353e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn Fragment f = nonConfig.get(i); 12363e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn if (f.mTarget != null) { 12373e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn if (f.mTarget.mIndex < mActive.size()) { 12383e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn f.mTarget = mActive.get(f.mTarget.mIndex); 12393e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn } else { 12403e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn Log.w(TAG, "Re-attaching retained fragment " + f 12413e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn + " target no longer exists: " + f.mTarget); 12423e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn f.mTarget = null; 12433e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn } 12443e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn } 12453e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn } 12463e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn } 12473e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn 12486e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn // Build the list of currently added fragments. 12496e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (fms.mAdded != null) { 12506e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn mAdded = new ArrayList<Fragment>(fms.mAdded.length); 1251b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn for (int i=0; i<fms.mAdded.length; i++) { 12526e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn Fragment f = mActive.get(fms.mAdded[i]); 12536e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn if (f == null) { 12546e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn throw new IllegalStateException( 12556e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn "No instantiated fragment for index #" + fms.mAdded[i]); 1256b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 12576e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn f.mAdded = true; 1258b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn f.mImmediateActivity = mActivity; 1259b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn if (DEBUG) Log.v(TAG, "restoreAllState: making added #" + i + ": " + f); 12606e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn mAdded.add(f); 1261b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 12626e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } else { 12636e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn mAdded = null; 1264b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 12656e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn 12666e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn // Build the back stack. 1267b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn if (fms.mBackStack != null) { 1268c6669ca63299219d815464129dac051ab2404286Dianne Hackborn mBackStack = new ArrayList<BackStackRecord>(fms.mBackStack.length); 1269b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn for (int i=0; i<fms.mBackStack.length; i++) { 1270c6669ca63299219d815464129dac051ab2404286Dianne Hackborn BackStackRecord bse = fms.mBackStack[i].instantiate(this); 1271b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn if (DEBUG) Log.v(TAG, "restoreAllState: adding bse #" + i 1272b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn + " (index " + bse.mIndex + "): " + bse); 1273b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn mBackStack.add(bse); 1274dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn if (bse.mIndex >= 0) { 1275dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn setBackStackIndex(bse.mIndex, bse); 1276dd913a50cd72d6dd23c4ea437f0ebe2be05ca2e8Dianne Hackborn } 1277b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 12786e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn } else { 12796e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn mBackStack = null; 1280b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 1281b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn } 1282b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn 12832dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn public void attachActivity(Activity activity) { 12842dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn if (mActivity != null) throw new IllegalStateException(); 12852dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn mActivity = activity; 12862dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 12872dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn 1288fb3cffeb35368da22f99b85d45039c4e6e471c06Dianne Hackborn public void noteStateNotSaved() { 1289fb3cffeb35368da22f99b85d45039c4e6e471c06Dianne Hackborn mStateSaved = false; 1290fb3cffeb35368da22f99b85d45039c4e6e471c06Dianne Hackborn } 1291fb3cffeb35368da22f99b85d45039c4e6e471c06Dianne Hackborn 1292b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn public void dispatchCreate() { 12933e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn mStateSaved = false; 1294ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn moveToState(Fragment.CREATED, false); 12952dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 12962dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn 1297c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn public void dispatchActivityCreated() { 12983e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn mStateSaved = false; 1299c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn moveToState(Fragment.ACTIVITY_CREATED, false); 1300c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn } 1301c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn 13022dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn public void dispatchStart() { 13033e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn mStateSaved = false; 1304ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn moveToState(Fragment.STARTED, false); 13052dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 13062dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn 13072dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn public void dispatchResume() { 13083e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn mStateSaved = false; 1309ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn moveToState(Fragment.RESUMED, false); 13102dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 13112dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn 13122dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn public void dispatchPause() { 1313ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn moveToState(Fragment.STARTED, false); 13142dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 13152dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn 13162dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn public void dispatchStop() { 1317c801768e4d29667a2608695449ebc2833ba0f200Dianne Hackborn moveToState(Fragment.ACTIVITY_CREATED, false); 13182dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 13192dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn 13202dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn public void dispatchDestroy() { 1321ba51c3d02d08709e933de6f6c76dee3fd2f4bfa1Dianne Hackborn moveToState(Fragment.INITIALIZING, false); 13222dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn mActivity = null; 13232dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn } 1324f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn 1325b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn public boolean dispatchCreateOptionsMenu(Menu menu, MenuInflater inflater) { 1326b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn boolean show = false; 1327b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn if (mActive != null) { 1328b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn for (int i=0; i<mAdded.size(); i++) { 1329b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn Fragment f = mAdded.get(i); 1330b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn if (f != null && !f.mHidden && f.mHasMenu) { 1331b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn show = true; 1332b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn f.onCreateOptionsMenu(menu, inflater); 1333b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn } 1334b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn } 1335b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn } 1336b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn return show; 1337b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn } 1338b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn 1339b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn public boolean dispatchPrepareOptionsMenu(Menu menu) { 1340b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn boolean show = false; 1341b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn if (mActive != null) { 1342b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn for (int i=0; i<mAdded.size(); i++) { 1343b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn Fragment f = mAdded.get(i); 1344b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn if (f != null && !f.mHidden && f.mHasMenu) { 1345b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn show = true; 1346b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn f.onPrepareOptionsMenu(menu); 1347b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn } 1348b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn } 1349b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn } 1350b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn return show; 1351b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn } 1352b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn 1353b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn public boolean dispatchOptionsItemSelected(MenuItem item) { 1354b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn if (mActive != null) { 1355b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn for (int i=0; i<mAdded.size(); i++) { 1356b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn Fragment f = mAdded.get(i); 1357b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn if (f != null && !f.mHidden && f.mHasMenu) { 1358b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn if (f.onOptionsItemSelected(item)) { 1359b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn return true; 1360b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn } 1361b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn } 1362b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn } 1363b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn } 1364b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn return false; 1365b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn } 1366b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn 13675ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn public boolean dispatchContextItemSelected(MenuItem item) { 13685ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn if (mActive != null) { 13695ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn for (int i=0; i<mAdded.size(); i++) { 13705ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn Fragment f = mAdded.get(i); 13715ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn if (f != null && !f.mHidden) { 13725ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn if (f.onContextItemSelected(item)) { 13735ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn return true; 13745ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn } 13755ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn } 13765ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn } 13775ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn } 13785ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn return false; 13795ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn } 13805ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn 1381b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn public void dispatchOptionsMenuClosed(Menu menu) { 1382b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn if (mActive != null) { 1383b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn for (int i=0; i<mAdded.size(); i++) { 1384b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn Fragment f = mAdded.get(i); 1385b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn if (f != null && !f.mHidden && f.mHasMenu) { 1386b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn f.onOptionsMenuClosed(menu); 1387b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn } 1388b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn } 1389b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn } 1390b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn } 1391b31e84bc4513e46bac4be8f8d0513f78e360fb11Dianne Hackborn 1392f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn public static int reverseTransit(int transit) { 1393f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn int rev = 0; 1394f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn switch (transit) { 1395811ed1065f39469cf2cf6adba22cab397ed88d5eChet Haase case FragmentTransaction.TRANSIT_FRAGMENT_OPEN: 1396811ed1065f39469cf2cf6adba22cab397ed88d5eChet Haase rev = FragmentTransaction.TRANSIT_FRAGMENT_CLOSE; 1397f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn break; 1398811ed1065f39469cf2cf6adba22cab397ed88d5eChet Haase case FragmentTransaction.TRANSIT_FRAGMENT_CLOSE: 1399811ed1065f39469cf2cf6adba22cab397ed88d5eChet Haase rev = FragmentTransaction.TRANSIT_FRAGMENT_OPEN; 1400f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn break; 14019ff82bf2b33513052500473d0d6d025a80dcecbfChet Haase case FragmentTransaction.TRANSIT_FRAGMENT_NEXT: 14029ff82bf2b33513052500473d0d6d025a80dcecbfChet Haase rev = FragmentTransaction.TRANSIT_FRAGMENT_PREV; 14039ff82bf2b33513052500473d0d6d025a80dcecbfChet Haase break; 14049ff82bf2b33513052500473d0d6d025a80dcecbfChet Haase case FragmentTransaction.TRANSIT_FRAGMENT_PREV: 14059ff82bf2b33513052500473d0d6d025a80dcecbfChet Haase rev = FragmentTransaction.TRANSIT_FRAGMENT_NEXT; 14069ff82bf2b33513052500473d0d6d025a80dcecbfChet Haase break; 1407f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } 1408f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn return rev; 1409f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn 1410f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } 1411f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn 1412f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn public static int transitToStyleIndex(int transit, boolean enter) { 1413f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn int animAttr = -1; 1414f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn switch (transit) { 1415811ed1065f39469cf2cf6adba22cab397ed88d5eChet Haase case FragmentTransaction.TRANSIT_FRAGMENT_OPEN: 1416f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn animAttr = enter 1417811ed1065f39469cf2cf6adba22cab397ed88d5eChet Haase ? com.android.internal.R.styleable.FragmentAnimation_fragmentOpenEnterAnimation 1418811ed1065f39469cf2cf6adba22cab397ed88d5eChet Haase : com.android.internal.R.styleable.FragmentAnimation_fragmentOpenExitAnimation; 1419f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn break; 1420811ed1065f39469cf2cf6adba22cab397ed88d5eChet Haase case FragmentTransaction.TRANSIT_FRAGMENT_CLOSE: 1421f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn animAttr = enter 1422811ed1065f39469cf2cf6adba22cab397ed88d5eChet Haase ? com.android.internal.R.styleable.FragmentAnimation_fragmentCloseEnterAnimation 1423811ed1065f39469cf2cf6adba22cab397ed88d5eChet Haase : com.android.internal.R.styleable.FragmentAnimation_fragmentCloseExitAnimation; 1424f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn break; 14259ff82bf2b33513052500473d0d6d025a80dcecbfChet Haase case FragmentTransaction.TRANSIT_FRAGMENT_NEXT: 14269ff82bf2b33513052500473d0d6d025a80dcecbfChet Haase animAttr = enter 14279ff82bf2b33513052500473d0d6d025a80dcecbfChet Haase ? com.android.internal.R.styleable.FragmentAnimation_fragmentNextEnterAnimation 14289ff82bf2b33513052500473d0d6d025a80dcecbfChet Haase : com.android.internal.R.styleable.FragmentAnimation_fragmentNextExitAnimation; 14299ff82bf2b33513052500473d0d6d025a80dcecbfChet Haase break; 14309ff82bf2b33513052500473d0d6d025a80dcecbfChet Haase case FragmentTransaction.TRANSIT_FRAGMENT_PREV: 14319ff82bf2b33513052500473d0d6d025a80dcecbfChet Haase animAttr = enter 14329ff82bf2b33513052500473d0d6d025a80dcecbfChet Haase ? com.android.internal.R.styleable.FragmentAnimation_fragmentPrevEnterAnimation 14339ff82bf2b33513052500473d0d6d025a80dcecbfChet Haase : com.android.internal.R.styleable.FragmentAnimation_fragmentPrevExitAnimation; 14349ff82bf2b33513052500473d0d6d025a80dcecbfChet Haase break; 1435f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } 1436f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn return animAttr; 1437f121be737c59390d97e21a92be8e166001534c7dDianne Hackborn } 14382dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn} 1439